/api/v4/locations/{locationId}/postsObtener publicaciones de una ubicación
Devuelve una página de campañas de publicaciones en redes sociales (anuncios, eventos y ofertas) dirigidas a una única ubicación.
Parámetros
Ruta
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| locationId | string | obligatorio | Base64-encoded location cursor / global ID (e.g. `TG9jYXRpb246MTgwMDI4OQ==`). Pass it unchanged, do not URL-encode it. The base64 cursor always resolves; the raw numeric database ID also works on this endpoint, but the base64 form is the portable choice across the API. |
Consulta
| Nombre | Tipo | Obligatorio | Descripción | Predeterminado |
|---|---|---|---|---|
| page | integer | opcional | 1-based page number for offset pagination. | 1 |
| perPage | integer | opcional | Number of records per page. Must not exceed 50. | 10 |
Respuestas
200A page of post campaigns for the location, under `data.postsByLocation`. `records` is empty when the location has no posts yet.
{ "data": { "postsByLocation": { "records": [ { "id": "U29jaWFsUG9zdDo0NDEyMg==", "name": "Summer Hours Update", "status": "SUCCESS", "type": "ANNOUNCEMENT", "createdAt": "2026-06-28", "scheduledStartDate": "2026-06-28", "scheduledEndDate": "2026-07-28", "views": 128, "clicks": 14, "shares": 0, "reactions": 3, "comments": 1, "sites": ["GOOGLE"], "message": [ { "site": "GOOGLE", "message": "We have extended our summer hours! Open until 9pm on weekdays." } ], "cta": [ { "type": { "value": "LEARN_MORE", "label": "Learn more" }, "url": "https://jennyhome.example/hours", "site": "GOOGLE", "tinyUrl": "https://tiny.cc/jh-hours" } ], "contextInfo": null, "mediaUrl": [ { "url": "https://cdn.listingsapi.com/posts/44122/summer.jpg", "site": "GOOGLE", "type": "IMAGE" } ], "publishDetails": [ { "site": "GOOGLE", "status": "PUBLISHED", "createdDate": "2026-06-28", "publishedDate": "2026-06-28", "submissionError": null } ], "postLinks": [ { "site": "GOOGLE", "link": "https://www.google.com/maps/place/?post=44122" } ], "locationIds": [1800289], "clientName": "Jenny Home" } ], "locationDetails": [ { "id": "TG9jYXRpb246MTgwMDI4OQ==", "name": "Jenny Home", "street": "600 Congress Ave, Suite 200", "city": "Austin", "postalCode": "78701", "countryIso": "US", "stateIso": "TX", "stateName": "Texas", "storeId": null } ], "pageInfo": { "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false, "totalRecords": 1 } } }}401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
Usa este endpoint para recuperar el historial de publicaciones de un único establecimiento: todas las campañas de anuncios, eventos y ofertas que incluyen la ubicación, con su status de ciclo de vida y los contadores de interacción de cada publicación (views, clicks, reactions).
Caso de uso: auditoría previa a una campaña. Antes de programar una nueva publicación de Google para Jenny Home, llama a GET /locations/TG9jYXRpb246MTgwMDI4OQ==/posts para ver qué contenido ya está publicado, qué publicaciones siguen en SCHEDULED y qué resultados obtuvo el último anuncio. Lee type en cada registro para identificar las ofertas; este endpoint no tiene un filtro por tipo en el servidor.
Aspectos que debes tener en cuenta.
- Los únicos argumentos que acepta este endpoint son
pageyperPage. Aquí no hay ningún parámetrofilters,sortFields,locationIdsnicomponentIdentifier(estos pertenecen al endpoint de publicaciones en bloque), y si envías alguno, se ignora en lugar de rechazarse. Filtra y ordena los datos devueltos enrecordsen tu propio código. tagse rechaza directamente en esta ruta, contag is not a supported parameter for this query. Usa el endpoint de publicaciones en bloque cuando necesites determinar un conjunto de ubicaciones a partir de una etiqueta.perPagetiene un límite de 50; un valor mayor provoca un errorper_page must not exceed 50.- Pasa
locationIdcomo cursor en base64 (e.g.TG9jYXRpb246MTgwMDI4OQ==) exactamente como lo devuelven los endpoints de listado o búsqueda, sin aplicarle codificación URL. - La paginación se basa en desplazamientos: usa
pageyperPage(10 de forma predeterminada), y leepageInfo.totalPages/pageInfo.totalRecordspara saber cuándo detenerte. - Las consultas periódicas continuadas pueden alcanzar el límite de solicitudes de la cuenta (HTTP 429); respeta la cabecera
Retry-After.
El array records del ejemplo anterior es representativo. La ubicación precargada en el entorno real (Jenny Home) actualmente no tiene publicaciones en redes sociales, por lo que una llamada real devuelve records: [] con pageInfo.totalRecords: 0.
Relacionado: crea publicaciones con POST /posts, obtén una campaña con GET /posts/{postId} o enumera las campañas en bloque (para varias ubicaciones) con GET /locations/{locationId}/bulk-posts, que sí acepta filters y sortFields y devuelve la respuesta bajo rollupSocialPosts.
curl -X GET 'https://listingsapi.com/api/v4/locations/<locationId>/posts' \ -H "Authorization: API $LISTINGSAPI_KEY"