/api/v4/locations/{locationId}/postsRécupérer les publications d’un établissement
Renvoie une page de campagnes de publications sur les réseaux sociaux (annonces, événements, offres) qui ciblent un seul établissement.
Paramètres
Chemin
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
| locationId | string | obligatoire | 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. |
Chaîne de requête
| Nom | Type | Obligatoire | Description | Par défaut |
|---|---|---|---|---|
| page | integer | facultatif | 1-based page number for offset pagination. | 1 |
| perPage | integer | facultatif | Number of records per page. Must not exceed 50. | 10 |
Réponses
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.
Utilisez cet endpoint pour récupérer l’historique des publications d’un seul point de vente : toutes les campagnes d’annonces, d’événements et d’offres qui incluent l’établissement, avec leur status de cycle de vie et leurs compteurs d’engagement par publication (views, clicks, reactions).
Cas d’utilisation : audit avant une campagne. Avant de programmer une nouvelle publication Google pour Jenny Home, appelez GET /locations/TG9jYXRpb246MTgwMDI4OQ==/posts pour voir ce qui est déjà en ligne, quelles publications sont encore SCHEDULED et quelles ont été les performances de la dernière annonce. Lisez type dans chaque enregistrement pour repérer les offres ; cet endpoint ne propose aucun filtre par type côté serveur.
Points de vigilance.
- Les seuls arguments acceptés par cet endpoint sont
pageetperPage. Il n’existe ici aucun paramètrefilters,sortFields,locationIdsoucomponentIdentifier(ils appartiennent à l’endpoint bulk-posts), et tout paramètre de ce type envoyé est ignoré plutôt que rejeté. Filtrez et triez lesrecordsrenvoyés dans votre propre code. tagest systématiquement rejeté sur cette route, avectag is not a supported parameter for this query. Utilisez l’endpoint bulk-posts lorsque vous devez déterminer un ensemble d’établissements à partir d’une étiquette.perPageest limité à 50 ; une valeur supérieure entraîne un échec avecper_page must not exceed 50.- Transmettez
locationIdsous forme de curseur base64 (e.g.TG9jYXRpb246MTgwMDI4OQ==) exactement tel qu’il est renvoyé par les endpoints de liste ou de recherche, sans l’encoder pour une URL. - La pagination repose sur un décalage : utilisez
pageetperPage(10 par défaut), et consultezpageInfo.totalPages/pageInfo.totalRecordspour savoir quand vous arrêter. - Des interrogations répétées et prolongées peuvent atteindre la limite de requêtes du compte (HTTP 429) ; respectez l’en-tête
Retry-After.
Le tableau records dans l’exemple ci-dessus est représentatif. L’établissement servant de donnée initiale dans l’environnement réel (Jenny Home) ne possède actuellement aucune publication sur les réseaux sociaux ; un appel réel renvoie donc records: [] avec pageInfo.totalRecords: 0.
Voir aussi : créez des publications avec POST /posts, récupérez une campagne avec GET /posts/{postId} ou listez les campagnes groupées (portant sur plusieurs établissements) avec GET /locations/{locationId}/bulk-posts, qui accepte bien filters et sortFields et renvoie les résultats sous rollupSocialPosts.
curl -X GET 'https://listingsapi.com/api/v4/locations/<locationId>/posts' \ -H "Authorization: API $LISTINGSAPI_KEY"