Avis

Endpoints avis : exemples cURL, Python et Node ; sources, paramètres, liste, agrégation, détails, réponse, édition, archivage, expressions et analyses.

Les avis sont les notes en étoiles et les commentaires que les clients laissent sur Google, Facebook et Yelp. L’API en stocke une copie, vous permet d’y répondre et calcule des statistiques sur les avis. Les chemins REST utilisent reviews ; les clés de réponse et les titres des pages de référence utilisent interactions, l’ancien nom interne du même objet. Ce guide utilise le terme avis partout. Les opérations de lecture nécessitent une clé Read (lecture). Les réponses, les modifications, l’archivage et les changements de paramètres nécessitent une clé Write (écriture) ; une opération d’écriture effectuée avec une clé Read renvoie 400 avec SY90016.

Vue d’ensemble des endpoints

MéthodeCheminFonctionRéférence
GET/reviews/site-configSources d’avis autorisées par l’offre du compte.Lister les sources d’avis d’un compte
GET/locations/{locationId}/reviews/settingsSources configurées pour un établissement.Lister les sources d’avis d’un établissement
POST/locations/reviews/settings/editDéfinir les sources d’un établissement et le seuil des avis positifs.Modifier les paramètres des avis
GET/locations/{locationId}/reviewsListe des avis d’un établissement avec pagination par curseur.Lister les avis
GET/rollup_interactionsListe couvrant tous les établissements avec pagination par curseur.Obtenir les avis agrégés
GET/reviewDetailsCopies à jour des avis obtenus par identifiant, avec leurs réponses.Obtenir les avis par identifiants
Référence des champs des objets d’avis et de réponse.Attributs des avis
POST/locations/reviews/respondPublier une réponse du propriétaire.Répondre à un avis
POST/locations/reviews/respond/editModifier le texte d’une réponse.Modifier une réponse
POST/locations/reviews/respond/archiveRetirer une réponse du suivi.Archiver une réponse
GET/review-phrasesExpressions récurrentes des clients, avec statistiques.Lister les expressions des avis
GET/locations/{locationId}/review-analytics-overview4 indicateurs clés de performance avec leurs variations entre périodes.Vue d’ensemble des analyses des avis
GET/locations/{locationId}/review-analytics-timelineNombre d’avis et note moyenne par jour.Évolution chronologique des statistiques des avis
GET/locations/{locationId}/review-analytics-sites-statsNote, volume et récence par source.Analyse des avis par site

Lister les sources d’avis autorisées par votre offre

GET /reviews/site-config renvoie le catalogue des plateformes d’avis auxquelles le compte a droit. Cet endpoint ne prend aucun paramètre et s’applique à l’ensemble du compte ; mettez donc son résultat en cache plutôt que de l’appeler pour chaque établissement. Les valeurs de siteUrl sont les noms d’hôte acceptés par tous les autres filtres de cette ressource.

NomEmplacementObligatoireRemarques
aucunAucun paramètre.
Account sources
curl https://listingsapi.com/api/v4/reviews/site-config \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionSiteConfig": [      { "site": "Google", "siteUrl": "maps.google.com" },      { "site": "Facebook", "siteUrl": "facebook.com" },      { "site": "Yelp", "siteUrl": "yelp.com" }    ]  }}

Consultez data.interactionSiteConfig[]. L’exemple correspond à un compte avec l’offre Launch ; l’ensemble exact dépend de l’offre et du secteur d’activité. Utilisez siteUrl pour le filtre siteUrls des endpoints de liste et pour siteUrls[].name lors de la modification des paramètres.

Lister les sources configurées pour un établissement

GET /locations/{locationId}/reviews/settings renvoie une entrée par plateforme prise en charge par l’offre, avec l’URL depuis laquelle les avis sont récupérés. Cet endpoint est le pendant en lecture de l’endpoint de modification ci-dessous. Le chemin accepte l’identifiant encodé en base64 ou le nombre brut.

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant Relay encodé en base64 ou databaseId numérique.
Location sources
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/reviews/settings \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsSetting": {      "siteSettings": [        { "name": "maps.google.com", "url": null },        { "name": "facebook.com", "url": null },        { "name": "yelp.com", "url": null }      ]    }  }}

Consultez data.interactionsSetting.siteSettings[]. Une valeur non nulle de url signifie que la plateforme est connectée et que les avis sont récupérés depuis cette page. Une valeur null pour url signifie que la plateforme est disponible, mais non configurée. Les entrées Google et Facebook se remplissent automatiquement lorsque vous connectez ces comptes via OAuth et ne peuvent pas être remplacées par l’endpoint de modification. Yelp doit être indiqué explicitement.

Modifier les paramètres des avis d’un établissement

POST /locations/reviews/settings/edit définit les sources sur lesquelles les avis d’un établissement sont suivis et la note en étoiles à partir de laquelle un avis est considéré comme positif. Les champs sont placés directement dans le corps de la requête, et non dans un objet englobant input. L’ajout d’une source met une extraction en file d’attente ; les avis du nouveau site arrivent donc plus tard, et non dans cette réponse.

NomEmplacementObligatoireRemarques
locationIdbodyOuiIdentifiant Relay encodé en base64 uniquement. Un identifiant numérique dans le corps de la requête provoque un échec avec SY90002.
siteUrlsbodyNonL’ensemble complet des sources, sous forme de paires name et url. Remplace la sélection actuelle.
siteUrls[].namebodyNonClé du site provenant de siteSettings[].name, telle que maps.google.com ou yelp.com.
siteUrls[].urlbodyNonLa page de l’établissement sur ce site. La valeur null ou l’omission du champ arrête le suivi d’une source qui nécessite une URL.
positiveInteractionThresholdbodyNonNote à partir de laquelle un avis est considéré comme positif. Envoyée seule, elle laisse les sources inchangées.
Edit settings
curl -X POST https://listingsapi.com/api/v4/locations/reviews/settings/edit \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "locationId": "TG9jYXRpb246MTgwMDI4OQ==",  "positiveInteractionThreshold": 4,  "siteUrls": [    { "name": "maps.google.com", "url": null },    { "name": "yelp.com", "url": "https://www.yelp.com/biz/blue-bottle-coffee-oakland" }  ]}'
JSON
{  "data": {    "editInteractionsSetting": {      "errors": null,      "interactionSetting": {        "locationId": "1800289",        "positiveInteractionThreshold": 4,        "siteSettings": [          { "name": "maps.google.com", "url": null, "monitored": true, "canRespond": true },          { "name": "yelp.com", "url": "https://www.yelp.com/biz/blue-bottle-coffee-oakland", "monitored": true, "canRespond": false }        ]      }    }  }}

Consultez data.editInteractionsSetting.interactionSetting.siteSettings[] pour connaître la sélection enregistrée. monitored indique que la source est active ; canRespond indique si des réponses du propriétaire peuvent y être publiées via l’API. Une source rejetée lors de la validation, par exemple à cause d’une URL inaccessible ou d’un site non inclus dans l’offre, est renvoyée dans errors sans modification du paramètre ; vérifiez donc errors lorsque vous recevez 200. Les SDK lèvent ValidationError dans ce cas.

Lister les avis d'un établissement

GET /locations/{locationId}/reviews est une connexion à curseur accessible à data.interactions, avec les avis les plus récents en premier. first vaut 20 par défaut ; un seul appel ne renvoie donc jamais l'historique complet. Les filtres sous forme de tableaux sont des chaînes JSON dans la chaîne de requête et doivent être encodés pour les URL ; l'exemple cURL utilise -G avec --data-urlencode à cet effet.

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant Relay en Base64 ou databaseId numérique.
first, afterqueryNonPagination vers l'avant. Transmettez pageInfo.endCursor comme valeur de after.
last, beforequeryNonPagination vers l'arrière. pageInfo ne contient pas de startCursor ; transmettez donc le cursor de la première arête.
siteUrlsqueryNonTableau JSON de noms d'hôte, par exemple ["maps.google.com"].
ratingFiltersqueryNonTableau JSON de notes en étoiles, par exemple [1,2].
responseStatusqueryNonTableau JSON : ["PENDING"] ou ["RESPONDED"].
sortOrderqueryNonTableau JSON : ["NEWEST_FIRST"], ["OLDEST_FIRST"] ou ["LAST_RESPONDED"].
startDate, endDatequeryNonYYYY-MM-DD, chaînes simples.
searchStringqueryNonRecherche en texte intégral dans le corps de l'avis.

S'ajoutent les paramètres facultatifs category, categories et ratingFilter, ce dernier n'acceptant qu'une seule valeur, répertoriés sur la page de référence.

List reviews
curl -G "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/reviews" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'ratingFilters=[1,2]' \--data-urlencode 'responseStatus=["PENDING"]' \--data-urlencode 'sortOrder=["NEWEST_FIRST"]' \--data-urlencode 'first=25'
JSON
{  "data": {    "interactions": {      "pageInfo": { "hasNextPage": true, "endCursor": "SW50ZXJhY3Rpb246MV8xNTU0..." },      "edges": [        {          "node": {            "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",            "source": "maps.google.com",            "content": "nice place for family together",            "authorName": "vaibhav nakate",            "rating": 5,            "date": "2019-04-02T22:11:13.036997+00:00",            "type": "Review",            "responded": false,            "responseCount": 0,            "canRespond": true,            "permalink": "https://maps.google.com/maps?cid=..."          },          "cursor": "SW50ZXJhY3Rpb246MV8xNTU0..."        }      ],      "totalCount": 425    }  }}

Lisez edges[].node. Vous transmettez id lorsque vous répondez, et canRespond indique si cette source accepte les réponses du propriétaire. totalCount correspond au nombre de correspondances dans l'ensemble des résultats, et non sur cette page. Arrêtez la pagination lorsque hasNextPage vaut false ou qu'une page renvoie un edges vide ; lorsqu'une limite de page tombe sur l'avis le plus ancien, une page vide suit.

FiltreValeurs
responseStatusRESPONDED, PENDING
sortOrderNEWEST_FIRST, OLDEST_FIRST, LAST_RESPONDED
categoryREVIEW, ainsi que d'autres catégories disponibles selon le compte

Parcourir tous les établissements avec la vue agrégée

GET /rollup_interactions est la même connexion à curseur, accessible à data.rollupInteractions, couvrant tous les établissements auxquels la clé donne accès, avec un locationId numérique sur chaque nœud. Elle accepte les mêmes filtres que la liste par établissement. Il n'existe aucun filtre par établissement ; un argument locationIds est ignoré, et non rejeté. Aucun des deux SDK ne prend encore en charge ce point de terminaison ; les exemples utilisent donc requests et fetch.

NomEmplacementObligatoireRemarques
tagqueryNonÉtiquette d'établissement à laquelle limiter la portée. La valeur par défaut est all. Omettez ce paramètre sauf si vous attribuez des étiquettes aux établissements.
first, after, last, beforequeryNonPagination par curseur, comme pour le point de terminaison de liste.
siteUrls, ratingFilters, responseStatus, sortOrderqueryNonTableaux JSON encodés pour les URL, avec les mêmes valeurs que pour le point de terminaison de liste.
startDate, endDate, searchStringqueryNonIdentique au point de terminaison de liste.
Account rollup
curl -G "https://listingsapi.com/api/v4/rollup_interactions" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'responseStatus=["PENDING"]' \--data-urlencode 'sortOrder=["NEWEST_FIRST"]' \--data-urlencode 'first=50'
JSON
{  "data": {    "rollupInteractions": {      "pageInfo": { "hasNextPage": true, "hasPreviousPage": false },      "edges": [        {          "node": {            "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",            "source": "maps.google.com",            "content": "Excellent service, highly recommend.",            "rating": 5,            "responded": false,            "canRespond": true,            "locationId": 1800289          },          "cursor": "SW50ZXJhY3Rpb246OWUyNmQyYTg="        }      ],      "totalCount": 1284    }  }}

Regroupez les nœuds par locationId, le databaseId du magasin. Le pageInfo de la vue agrégée peut omettre endCursor ; utilisez donc le cursor de la dernière arête comme valeur de after ; les deux valeurs sont équivalentes. Délimitez les exécutions planifiées avec startDate et endDate plutôt que de relire l'historique, et respectez Retry-After lors d'un 429.

Récupérer les avis par identifiant

GET /reviewDetails renvoie des copies à jour des avis stockés, sans pagination. La réponse est un simple tableau à data.interactionDetails.interactions, sans edges ni pageInfo, et chaque avis inclut son responses. Utilisez ce point de terminaison pour réhydrater une liste de suivi et trouver le responseId nécessaire à la modification ou à l'archivage.

NomEmplacementObligatoireRemarques
interactionIdsqueryOuiTableau JSON d'UUID d'avis, encodé pour les URL. Si vous l'omettez, la réponse est SY90006.
Details by id
curl -G "https://listingsapi.com/api/v4/reviewDetails" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'interactionIds=["b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0"]'
JSON
{  "data": {    "interactionDetails": {      "interactions": [        {          "id": "b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0",          "source": "maps.google.com",          "content": "Great place for dessert!",          "rating": 5,          "responded": true,          "responseCount": 1,          "canRespond": true,          "responses": [            {              "id": "2090753a-ece6-4837-8336-8494ad308523",              "content": "Thank you so much for the kind words!",              "interactionStatus": "CONFIRMED",              "editedResponse": false            }          ]        }      ]    }  }}

responses[].id est le responseId pour les points de terminaison de modification et d'archivage. Une requête utilisant un identifiant d'un autre compte renvoie 200 avec interactionDetails: null et une erreur SY90001 ; vérifiez donc la présence de null avant d'accéder à un élément par son indice.

Champs des avis et des réponses

La référence des attributs est une page purement documentaire qui répertorie tous les champs de l'objet avis et de l'objet réponse. Les champs que vous utiliserez le plus :

ChampTypeSignification
id, interactionIdstringLe même UUID ; transmettez-le comme valeur de interactionId lorsque vous répondez.
sourcestringNom d'hôte du site, par exemple maps.google.com.
content, authorName, rating, datemixedCorps du texte, auteur de l'avis, note de 1 à 5 étoiles, horodatage ISO 8601.
typestringReview, Question, Comment, Recommendation, Post, Photo, Message ou Response.
categorystringCatégorie générale, Review ou Social.
responded, responseCount, responsesmixedIndique s'il existe une réponse du propriétaire, le nombre de réponses et les objets réponse.
canRespondbooleanIndique si une réponse peut être publiée sur cette source via l'API.
permalinkstringLien vers l'avis sur le site source.
locationIdintegerdatabaseId numérique de l'établissement.

Chaque réponse dans responses[] contient id, content, authorName, date, interactionStatus, editedResponse, respondedWith (identifiant du modèle) et remarks (détail de l'échec). interactionStatus passe par les états suivants :

StatutSignification
CREATEDAcceptée et mise en file d'attente pour la plateforme de publication.
COMPLETEDPubliée sur la plateforme de publication. Certaines plateformes s'arrêtent à ce stade.
CONFIRMEDPubliée et confirmée par la plateforme de publication.
FAILEDLa plateforme de publication l'a rejetée. remarks en indique la raison.

Publier une réponse du propriétaire

POST /locations/reviews/respond publie une réponse publique sur la plateforme source. Les champs sont placés directement dans le corps de la requête. La réponse est acceptée immédiatement et transmise de manière asynchrone, donc interactionStatus commence à CREATED. Vérifiez d'abord canRespond sur l'avis.

NomDansObligatoireRemarques
interactionIdbodyOuiLe id de l'avis.
responseContentbodyOuiTexte de la réponse.
respondedWithbodyNonIdentifiant du modèle de réponse, si la réponse provient d'un modèle.
Respond
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "interactionId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",  "responseContent": "Thank you for visiting Jenny Home: we are glad you enjoyed your experience!"}'
JSON
{  "data": {    "respondToInteraction": {      "interaction": {        "id": "2090753a-ece6-4837-8336-8494ad308523",        "interactionId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",        "content": "Thank you for visiting Jenny Home: we are glad you enjoyed your experience!",        "interactionStatus": "CREATED",        "editedResponse": false      },      "errors": null    }  }}

Conservez interaction.id : il s'agit du responseId utilisé pour la modification et l'archivage. Une réponse rejetée est renvoyée sous la forme 200 avec errors renseigné dans data.respondToInteraction, donc lisez le corps ; les SDK lèvent ValidationError. Récupérez à nouveau l'avis par son identifiant après une courte attente pour vérifier que la réponse atteint COMPLETED ou CONFIRMED.

Modifier une réponse

POST /locations/reviews/respond/edit modifie le texte d'une réponse existante. La modification est soumise à nouveau à la plateforme, donc interactionStatus revient à CREATED et editedResponse devient true une fois la modification appliquée. Privilégiez cette opération plutôt que l'archivage suivi d'une nouvelle publication sur les plateformes qui autorisent une seule réponse.

NomDansObligatoireRemarques
reviewIdbodyOuiLe id de l'avis.
responseIdbodyOuiLe id de la réponse provenant de responses[].
responseContentbodyOuiNouveau texte de la réponse.
templateIdbodyNonIdentifiant du modèle de réponse auquel réattribuer la réponse.
Edit reply
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond/edit \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "reviewId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",  "responseId": "2090753a-ece6-4837-8336-8494ad308523",  "responseContent": "Thank you again: we have updated our reply to include our new store hours."}'
JSON
{  "data": {    "editResponse": {      "status": "true",      "reviewId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",      "responseId": "2090753a-ece6-4837-8336-8494ad308523"    }  }}

status est la chaîne "true" lorsque la modification est acceptée. Confirmez le nouveau texte avec un appel de récupération des détails et vérifiez le interactionStatus de la réponse.

Archiver une réponse

POST /locations/reviews/respond/archive retire une réponse du responses de l'avis suivi de notre côté. Il s'agit d'une suppression logique : une réponse déjà publiée sur Google, Yelp ou Facebook y reste. Utilisez cette opération pour supprimer un brouillon dont la publication a échoué ou qui a été remplacé ; utilisez la modification pour toute réponse publiée.

NomDansObligatoireRemarques
responseIdbodyOuiLe id de la réponse provenant de responses[].
Archive reply
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond/archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "responseId": "2090753a-ece6-4837-8336-8494ad308523" }'
JSON
{  "data": {    "archiveResponse": {      "status": "true"    }  }}

Après l'archivage, le responseCount de l'avis diminue et responded reflète les réponses restantes.

Lister les expressions que les clients répètent

GET /review-phrases renvoie un simple tableau dans data.newReviewPhrases, avec une entrée par expression récurrente, chacune accompagnée de statistiques calculées uniquement sur les avis qui la contiennent. Il n'est pas paginé ; limitez sa taille avec phraseCount. Tous les filtres sont facultatifs et se combinent, donc ratingFilters=[1,2] avec un startDate donne les plaintes du trimestre dernier.

NomDansObligatoireRemarques
locationIdsqueryNonTableau JSON d'identifiants numériques d'établissements, par exemple [1800289]. Omettez ce paramètre pour couvrir tous les établissements auxquels la clé donne accès en lecture.
siteUrlsqueryNonTableau JSON de noms d'hôtes.
startDate, endDatequeryNonYYYY-MM-DD.
ratingFiltersqueryNonTableau JSON de notes en étoiles.
responseStatusqueryNonTableau JSON de RESPONDED ou de PENDING.
sortOrderqueryNonNEWEST_FIRST, OLDEST_FIRST, LAST_RESPONDED, LOWEST_RATING ou HIGHEST_RATING.
phraseCountqueryNonNombre maximal d'expressions à renvoyer.
searchStringqueryNonUniquement les expressions contenant cette sous-chaîne.

Ainsi que le paramètre facultatif categories et les paramètres obsolètes à valeur unique category et ratingFilter répertoriés sur la page de référence.

Phrases
curl -G "https://listingsapi.com/api/v4/review-phrases" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'locationIds=[1800289]' \--data-urlencode 'ratingFilters=[1,2]' \--data-urlencode 'startDate=2026-06-01' \--data-urlencode 'endDate=2026-08-31' \--data-urlencode 'phraseCount=10'
JSON
{  "data": {    "newReviewPhrases": [      {        "reviewPhrase": "friendly staff",        "phraseStats": {          "stats": [            { "name": "total-reviews", "value": 46, "delta": 12.5, "abs": 5 },            { "name": "overall-rating", "value": 4.7, "delta": 1.1, "abs": 0.05 }          ]        }      },      {        "reviewPhrase": "long wait",        "phraseStats": {          "stats": [            { "name": "total-reviews", "value": 11, "delta": 37.5, "abs": 3 },            { "name": "overall-rating", "value": 2.9, "delta": -8.4, "abs": -0.27 }          ]        }      }    ]  }}

total-reviews indique la fréquence d'apparition de l'expression, overall-rating est la note moyenne de ces avis, delta est la variation en pourcentage par rapport à la période précédente et abs est la variation absolue. Un 403 avec SY90003 signifie que la clé ne donne pas accès en lecture à l'un des établissements demandés.

Consulter les indicateurs clés des avis d'un établissement

GET /locations/{locationId}/review-analytics-overview renvoie 4 statistiques dans data.interactionsAnalyticsStats.stats. La plage de dates est facultative ; elle restreint la période sur laquelle les valeurs et leurs variations sont calculées. Chaque delta représente la variation en pourcentage par rapport à la période précédente de même durée.

NomDansObligatoireRemarques
locationIdpathOuiIdentifiant Relay en Base64 ou databaseId numérique.
startDate, endDatequeryNonYYYY-MM-DD. Facultatif ici, contrairement à la chronologie.
Overview
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-overview?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsAnalyticsStats": {      "stats": [        { "name": "total-reviews", "value": 128, "delta": 6.67 },        { "name": "new-reviews", "value": 9, "delta": -25 },        { "name": "overall-rating", "value": 4.43, "delta": 2.31 },        { "name": "review-response-rate", "value": 62.5, "delta": 12.5 }      ]    }  }}
namevalueInterprétation
total-reviewsNombreTous les avis de l'établissement.
new-reviewsNombreAvis reçus pendant la période.
overall-rating1 à 5Note moyenne en étoiles.
review-response-ratePourcentagePart des avis ayant une réponse du propriétaire.

Un nouveau compte sans période antérieure affiche un delta de 100, donc n'interprétez pas les variations du premier mois comme une croissance.

Récupérer la chronologie quotidienne des avis

GET /locations/{locationId}/review-analytics-timeline renvoie une entrée par jour dans data.interactionsChartData.data. Fournissez startDate et endDate chaque fois que la période du graphique importe ; si vous les omettez, le service choisit sa propre période. Ajoutez site pour représenter une seule source.

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant Relay en base64 ou databaseId numérique.
startDate, endDatequeryNonYYYY-MM-DD. Fournissez les deux pour obtenir une période prévisible.
sitequeryNonUn nom d'hôte issu de siteSettings[].name, par exemple maps.google.com. Aucun des deux SDK ne l'expose ; utilisez l'appel REST.
Timeline
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-timeline?startDate=2026-08-01&endDate=2026-08-31&site=maps.google.com" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsChartData": {      "data": [        { "date": "2026-08-01", "interactionCount": 4, "averageRating": 4.5 },        { "date": "2026-08-02", "interactionCount": 0, "averageRating": null },        { "date": "2026-08-03", "interactionCount": 7, "averageRating": 4.285714285714286 }      ]    }  }}

Représentez interactionCount par des barres et averageRating par une courbe. La moyenne porte uniquement sur le jour concerné, ce n'est pas une moyenne cumulative, et elle vaut null les jours sans avis ; laissez donc un espace vide plutôt que de représenter un zéro.

Ventiler les analyses des avis par source

GET /locations/{locationId}/review-analytics-sites-stats renvoie une entrée par source d'avis dans data.interactionsSitesStats.stats. Utilisez-le pour déterminer quelle plateforme a fait évoluer la moyenne.

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant Relay en base64 ou databaseId numérique.
startDate, endDatequeryNonYYYY-MM-DD. Les écarts comparent cette période à la période précédente de même durée.
By source
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-sites-stats?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsSitesStats": {      "stats": [        {          "key": "google",          "siteUrl": "maps.google.com",          "averageRating": { "value": 4.6, "delta": 2.2 },          "totalInteractions": { "value": 412, "delta": 6.1 },          "newInteractions": { "value": 24, "delta": 33.3 },          "recency": "2026-09-06T14:12:00Z",          "baseRating": 4.5,          "baseInteractions": 388,          "humanizedRecency": "3 days ago"        },        {          "key": "facebook",          "siteUrl": "facebook.com",          "averageRating": { "value": 4.1, "delta": -1.4 },          "newInteractions": { "value": 0, "delta": -100 },          "recency": null,          "humanizedRecency": null        }      ]    }  }}

averageRating, totalInteractions et newInteractions contiennent chacun un value et un delta ; baseRating et baseInteractions sont les valeurs au début de la période à partir de laquelle l'écart est mesuré. recency correspond à l'horodatage de l'avis le plus récent et vaut null lorsque la source n'en a jamais renvoyé. Un newInteractions de 0 avec un recency datant de plusieurs mois signifie généralement que la connexion à la source est devenue inactive ; vérifiez donc les sources de l'établissement.

Erreurs que vous rencontrerez

CodeSignificationSolution
SY90016Clé Read utilisée pour une opération d'écriture.Utilisez une clé Write.
SY90001Non autorisé : clé incorrecte ou identifiant d'avis provenant d'un autre compte. Sur /reviewDetails, cette erreur se présente sous la forme 200 avec interactionDetails: null.Vérifiez la clé et l'identifiant.
SY90002Identifiant invalide. Un locationId numérique dans le corps de la requête settings-edit.Envoyez l'identifiant Relay en base64.
SY90003403, la clé ne permet pas de lire ou de modifier cet établissement.Utilisez une clé qui y donne accès.
SY90006interactionIds manquant sur /reviewDetails.Fournissez un tableau JSON d'identifiants.
SY50121Deuxième réponse du propriétaire à un avis Google.Modifiez la réponse existante.
429Limite de débit.Attendez Retry-After. Consultez Limites de débit.

Les opérations d'écriture peuvent également renvoyer 200 avec errors renseigné dans data.<op> ; lisez donc le corps de la réponse de chaque opération d'écriture. La liste complète figure dans Codes d'erreur.

Étapes suivantes

  • Récupérer les avis : créez une file d'attente des avis à traiter et recevez des notifications par webhook.
  • Répondre aux avis : répondez, confirmez, modifiez, archivez.
  • Analyses des avis : tableau de synthèse, graphique, panneau des réclamations, instantanés quotidiens.
  • Analyses : métriques des profils Google, Facebook et Bing du même établissement.
  • Page d'accueil de la référence : Avis. SDK : Avis Python, Avis Node.