Fiches

Tous les endpoints : cURL/Python/Node, état de synchronisation premium, assistants vocaux, doublons par établissement/compte : détection et suppression.

Une fiche est l’entrée d’un établissement dans l’annuaire d’une plateforme de publication. La création d’un établissement met en file d’attente une fiche par plateforme de publication comprise dans votre forfait, et les endpoints de fiches permettent de consulter l’état de chacune, de répertorier les doublons détectés et de les confirmer ou de les écarter. Les quatre endpoints GET fonctionnent avec une clé Read (lecture) ; les deux endpoints POST nécessitent une clé Write (écriture).

Les endpoints en un coup d’œil

MéthodeCheminFonctionRéférence
GET/locations/{locationId}/listings/premiumÉtat de synchronisation de chaque plateforme de publication premium pour un établissement.Obtenir les fiches premium
GET/locations/{locationId}/voice-assistantsÉtat de synchronisation sur Google Assistant, Alexa, Siri, Cortana et Bixby.Obtenir les fiches des assistants vocaux
GET/locations/listings/duplicatesRécapitulatif paginé des doublons détectés à l’échelle d’un compte.Obtenir toutes les fiches en doublon d’un compte
GET/locations/{locationId}/listings/duplicatesDoublons d’un établissement, regroupés par site.Obtenir les fiches en doublon d’un établissement
POST/locations/listings/mark-as-duplicateConfirmer que des éléments de fiche sont des doublons à supprimer.Marquer une fiche comme doublon
POST/locations/listings/mark-as-not-duplicateÉcarter des éléments de fiche en tant que faux positifs.Marquer une fiche comme n’étant pas un doublon

Consulter l’état des fiches premium

GET /locations/{locationId}/listings/premium

Renvoie, sous data.listingsForLocation, un enregistrement par plateforme de publication premium comprise dans le forfait de l’établissement. Il s’agit d’un simple tableau, et non d’une liste paginée. Le chemin parallèle /listings/additional renvoie les annuaires gratuits sous la même forme ; il n’existe aucun paramètre de requête listingType, et toute valeur transmise à ce titre est ignorée.

Paramètres

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant en base64 ou databaseId numérique.
Premium listings
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "listingsForLocation": [      {        "id": "TGlzdGluZzoxMDQ0Njg3MjM=",        "site": { "databaseId": "1", "name": "Google Maps", "url": "maps.google.com" },        "syncStatus": "REQUIRING_ACTION",        "displayStatus": "Connect your account to sync the listing",        "actionRequired": true,        "listingUrl": null,        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:28Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3Mjc=",        "site": { "databaseId": "387", "name": "BeLocalFocussed", "url": "belocalfocussed.com" },        "syncStatus": "SYNCED",        "displayStatus": "Synced",        "actionRequired": false,        "listingUrl": "https://belocalfocussed.com/jenny-home-26x0ffkd0e",        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:30Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3MDk=",        "site": { "databaseId": "301", "name": "Local Mint", "url": "localmint.com" },        "syncStatus": "FAILED",        "displayStatus": "Partner experiencing issues; awaiting response",        "actionRequired": false,        "listingUrl": null,        "syncIssue": "Publisher requires website URL",        "lastUpdate": "2026-07-06T18:34:03Z"      }    ]  }}

Adaptez le traitement selon syncStatus. Affichez displayStatus à une personne, consultez syncIssue pour connaître le motif fourni par la plateforme de publication, et utilisez lastUpdate pour repérer une soumission qui n’avance plus. listingUrl n’est renseigné que pour les lignes correspondant à des fiches en ligne.

syncStatusSignification
AVAILABLEPrêt pour la synchronisation, qui n’a pas encore commencé.
IN_PROGRESSSoumis à la plateforme de publication, en attente d’une réponse.
PENDING_APPROVALLa plateforme de publication procède à son examen.
SYNCED ou COMPLETEDEn ligne. listingUrl est renseigné.
REQUIRING_ACTIONBloqué dans l’attente de votre intervention. actionRequired vaut true ; consultez displayStatus.
FAILEDLa synchronisation a échoué. Consultez syncIssue.
CANNOT_SUBMITCette plateforme de publication ne peut en aucun cas accepter cet établissement.

Google Maps, Facebook et Waze restent à l’état REQUIRING_ACTION avec displayStatus: "Connect your account to sync the listing" tant que le compte correspondant n’est pas connecté. Ce comportement est normal pour un nouvel établissement.

Consulter l’état des assistants vocaux

GET /locations/{locationId}/voice-assistants

Renvoie un enregistrement par assistant vocal sous data.voiceAssistantsForLocation : Google Assistant, Amazon Alexa, Apple Siri, Microsoft Cortana et Samsung Bixby. Il s’agit d’un simple tableau dont l’ensemble des états possibles est plus restreint que celui de l’endpoint premium.

Paramètres

NomEmplacementObligatoireRemarques
locationIdpathOuiIdentifiant en base64 ou databaseId numérique.
Voice assistants
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/voice-assistants \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "voiceAssistantsForLocation": [      {        "databaseId": "104468723",        "voiceIdentifier": "GOOGLE_ASSISTANT",        "name": "Google Assistant",        "connectedAccountId": null,        "syncStatus": "REQUIRING_ACTION",        "actionRequired": true,        "syncIssue": null,        "errors": []      },      {        "databaseId": "104468711",        "voiceIdentifier": "SIRI",        "name": "Siri",        "connectedAccountId": null,        "syncStatus": "IN_PROGRESS",        "actionRequired": false,        "syncIssue": null,        "errors": []      }    ]  }}

Signalez chaque ligne où actionRequired vaut true ou où syncIssue est renseigné. errors contient les chaînes d’erreur provenant de la plateforme de publication, et connectedAccountId identifie le compte connecté utilisé pour la synchronisation, le cas échéant. Les résultats de Google Assistant proviennent de la connexion à Google Business Profile ; l’absence de connexion à Google est donc la raison la plus fréquente pour laquelle Google Assistant nécessite votre attention. Les résultats de Siri proviennent de la fiche Apple Maps de l’établissement.

syncStatusSignification
NOT_SUBMITTEDPas encore envoyé à l’assistant.
IN_PROGRESSSoumission en cours.
REQUIRING_ACTIONUne intervention du client est nécessaire pour que la synchronisation puisse se poursuivre.
LIVEPublié. Il n’existe aucun lien vers une fiche en ligne pour un assistant vocal.

Regrouper les doublons à l’échelle du compte

GET /locations/listings/duplicates

Renvoie sous data.duplicateListingsRollup tous les doublons détectés auxquels la clé donne accès, pour l’ensemble des établissements et des plateformes de publication. La pagination repose sur un décalage : page et perPage en entrée, records[] ainsi que pageInfo.totalRecords, pageInfo.totalPages et pageInfo.hasNextPage en sortie. Les filtres sont des paramètres de requête à plat, et non du JSON. Si aucun paramètre n’est fourni, status prend par défaut la valeur POTENTIAL et tag la valeur all ; un appel sans paramètres renvoie donc les doublons ouverts du compte.

Paramètres

NomDansObligatoireRemarques
statusqueryNonPOTENTIAL (par défaut), PROCESSING, FIXED ou FAILED. Insensible à la casse. Toute autre valeur entraîne une erreur 400.
siteIdqueryNonLimitez les résultats à une seule plateforme de publication à l’aide de son identifiant numérique de site (le site.databaseId du point de terminaison premium, ou un identifiant plan-sites).
tagqueryNonLimitez le regroupement à une seule étiquette. La valeur par défaut est all.
pagequeryNonNuméro de page commençant à 1. La valeur par défaut est 1.
perPagequeryNonNombre d’enregistrements par page.

Les wrappers Python et Node exposent uniquement tag et page. Pour filtrer par status ou siteId, ou pour définir perPage, appelez directement la route comme indiqué dans Gérer les fiches en double.

Account rollup
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=POTENTIAL&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsRollup": {      "pageInfo": {        "hasNextPage": true,        "hasPreviousPage": false,        "totalPages": 34,        "totalRecords": 1673      },      "records": [        {          "id": "3329229",          "name": "Woodbury Train Station",          "nameValid": false,          "duplicateProcessingState": "POTENTIAL",          "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",          "locationId": "73451",          "siteName": "City Squares",          "siteUrl": "citysquares.com"        }      ]    }  }}

Le regroupement vous indique où se trouvent les doublons : chaque enregistrement précise le locationId et le siteName. duplicateProcessingState correspond au même statut de cycle de vie que celui renvoyé par le point de terminaison par établissement sous le nom status. Parcourez les pages une à une jusqu’à ce que hasNextPage ait la valeur false ; une boucle sans pause est le moyen le plus rapide de provoquer une erreur 429.

StatutSignification
POTENTIALDétecté, personne n’a encore agi.
PROCESSINGConfirmé comme doublon ; la suppression est en cours auprès de la plateforme de publication.
FIXEDLa plateforme de publication l’a supprimé ou fusionné.
FAILEDLa suppression n’a pas abouti. Vérifiez le liveLink.

Lister les doublons d’un établissement

GET /locations/{locationId}/listings/duplicates

Renvoie sous data.duplicateListingsForLocation tous les doublons détectés pour un seul établissement, regroupés par site de plateforme de publication. Il s’agit d’un simple tableau. Chaque groupe correspond à un site (name, url) avec un tableau listings, et chaque entrée contient le listingItemId accepté par les deux points de terminaison de marquage. Un tableau vide signifie qu’aucun doublon n’a été détecté.

Paramètres

NomDansObligatoireRemarques
locationIdpathOuiIdentifiant encodé en Base64 ou databaseId numérique.
Duplicates for a location
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/duplicates \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsForLocation": [      {        "id": "U2l0ZToxNTA=",        "name": "City Squares",        "url": "citysquares.com",        "listings": [          {            "id": "RHVwbGljYXRlOjIzNTk4NDUw",            "listingItemId": "TGlzdGluZ0l0ZW06MjM1OTg0NTA=",            "name": "Woodbury Train Station",            "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",            "status": "POTENTIAL"          }        ]      }    ]  }}

Ouvrez liveLink pour examiner l’entrée, puis conservez listingItemId. Dans le Node SDK, le d.id aplati est la valeur à transmettre. status utilise les mêmes quatre valeurs que le regroupement à l’échelle du compte ci-dessus.

Confirmer des éléments de fiche comme doublons

POST /locations/listings/mark-as-duplicate

Marque des éléments de fiche comme doublons confirmés afin qu’ils puissent être supprimés auprès de la plateforme de publication. Envoyez les valeurs listingItemId sous input et regroupez tous les éléments confirmés d’un établissement dans un seul appel plutôt que d’effectuer un appel par élément. Il s’agit d’une opération d’écriture qui nécessite une clé Write (écriture).

Paramètres

NomDansObligatoireRemarques
input.listingItemIdsbodyOuiTableau de valeurs listingItemId encodées en Base64 provenant des points de terminaison de doublons.
input.locationIdbodyNonIdentifiant d’établissement encodé en Base64 ou numérique. Limite l’opération à un seul établissement.
Mark as duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'
JSON
{  "data": {    "markAsDuplicate": {      "success": true,      "errors": null    }  }}

success: true signifie que les éléments ont été acceptés et passent au statut PROCESSING. Une réponse 200 avec success: false, ou une réponse 400, s’accompagne d’un tableau errors dont les entrées contiennent code, message et path ; un identifiant inconnu ou mal formé en est généralement la cause. Le Python SDK renvoie la charge utile ; le Node SDK lève à la place une exception ValidationError, donc une promesse résolue signifie que l’opération a réussi.

Écarter des éléments de fiche comme n’étant pas des doublons

POST /locations/listings/mark-as-not-duplicate

Écarte des doublons potentiels en les classant comme faux positifs. La détection est prudente et signalera un autre établissement de la même franchise, un second profil légitime ou un établissement renommé. Une fois écartés, les éléments cessent d’apparaître dans les résultats des deux points de terminaison de doublons. Ce point de terminaison accepte un corps identique à celui du point de terminaison ci-dessus et permet également d’annuler le marquage d’un élément signalé par erreur.

Paramètres

NomDansObligatoireRemarques
input.listingItemIdsbodyOuiTableau de valeurs listingItemId encodées en Base64 à écarter.
input.locationIdbodyNonIdentifiant d’établissement encodé en Base64 ou numérique. Limite l’opération à un seul établissement.
Mark as not duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-not-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'
JSON
{  "data": {    "markAsNotDuplicate": {      "success": true,      "errors": null    }  }}

La réponse est data.markAsNotDuplicate, avec les mêmes champs success et errors que l’appel de marquage comme doublon. Un élément écarté est enregistré comme confirmé non doublon et ne réapparaît pas lors du prochain passage de détection.

Erreurs que vous rencontrerez

Code ou statutSignificationSolution
401Clé API manquante ou non valide.Envoyez Authorization: API $LISTINGSAPI_KEY.
400 dans la synthèse du comptestatus ne correspond à aucune des valeurs suivantes : POTENTIAL, PROCESSING, FIXED, FAILED.Utilisez l’une des quatre valeurs.
400 sur un endpoint markIdentifiant d’élément de fiche inconnu ou mal formé. Consultez errors[].code et message.Envoyez les valeurs listingItemId provenant des endpoints de doublons.
200 avec success: falseLa requête a été exécutée, mais les données d’entrée ont été rejetées. Les détails se trouvent dans data.<op>.errors.Vérifiez le corps de la réponse à chaque opération d’écriture, pas seulement le statut.
SY90016 (HTTP 400)Une clé Read utilisée pour une opération d’écriture.Utilisez une clé Write pour les deux endpoints mark.
429Limite de requêtes dépassée. L’offre Launch autorise 10 requêtes par minute.Attendez Retry-After, puis reprenez. Consultez Limites de requêtes.

Chaque code figure dans la référence des erreurs.

Étapes suivantes