Comptes connectés

Exemples cURL, Python, Node par endpoint : connecter Google/Facebook, lister les comptes, apparier/lier les fiches, dossiers, création GMB, déconnexion.

Un compte connecté correspond à une autorisation OAuth accordée par un propriétaire Google Business Profile ou Facebook Pages, qui permet à l’API de lire et de gérer les fiches auxquelles ce compte a accès. Cette ressource remplit trois fonctions : créer les liens OAuth, associer ou lier les fiches du compte à vos établissements, et supprimer la connexion. Les deux opérations de lecture GET, pour la liste et les détails, fonctionnent avec une clé Read (lecture) ; chaque opération POST, y compris la récupération des fiches en lecture seule, nécessite une clé Write (écriture), et l’utilisation d’une clé Read pour une écriture renvoie HTTP 400 avec SY90016.

Chaque exemple ci-dessous suppose que le client a été créé une seule fois, comme dans le premier exemple, et lit LISTINGSAPI_KEY depuis l’environnement. Les identifiants sont l’UUID connectedAccountId fourni par le point de terminaison de liste et l’identifiant d’établissement en base64 (TG9jYXRpb246MTgwMDI4OQ==) ; n’appliquez jamais d’encodage URL à l’un ou à l’autre.

Aperçu des points de terminaison

MéthodeCheminFonctionRéférence
POST/connected-accounts/connect-googleCréer un lien de connexion en masse valable 24 heures pour un compte Google.Connecter un compte Google
POST/connected-accounts/connect-facebookCréer un lien de connexion en masse valable 24 heures pour un compte Facebook.Connecter un compte Facebook
POST/locations/oauth_connect_urlCréer un lien de connexion à usage unique associé à un seul établissement.URL de connexion OAuth pour un établissement
GET/connected-accountsLister les comptes connectés avec leur état de fonctionnement et le nombre de fiches liées.Lister les comptes connectés
GET/connected-accounts/{connectedAccountId}/detailsConsulter un compte, y compris l’état de la tâche de rapprochement.Obtenir les détails d’un compte connecté
POST/connected-accounts/connected-account-listingsLister les fiches des plateformes de publication auxquelles un compte a accès.Récupérer les fiches d’un compte connecté
POST/connected-accounts/trigger-matchesMettre en file d’attente la tâche de récupération et de rapprochement pour un ou plusieurs comptes.Déclencher le rapprochement des établissements
GET/connected-accounts/{connectedAccountId}/connection-suggestionsConsulter les associations suggérées entre établissements et fiches.Lister les suggestions de connexion
POST/connected-accounts/confirm-matchesAccepter les suggestions et créer les liens actifs.Confirmer les correspondances de connexion
POST/connected-accounts/connect-listingLier une fiche choisie à un établissement.Connecter une fiche à un établissement
POST/connected-accounts/disconnect-listingDissocier un établissement d’une plateforme de publication.Déconnecter une fiche d’un établissement
POST/connected-accounts/create-location-from-listingCréer un établissement à partir d’une fiche sur une plateforme de publication.Créer un établissement à partir d’une fiche
GET/connected-accounts/{connectedAccountId}/foldersLister les groupes du compte Google (dossiers).Lister les dossiers GMB
POST/locations/create/gmb-listingCréer une nouvelle fiche Google Business Profile pour un établissement.Créer une fiche GMB
POST/connected-accounts/disconnect-googleDéconnecter un compte Google entier.Déconnecter un compte Google
POST/connected-accounts/disconnect-facebookDéconnecter un compte Facebook entier.Déconnecter un compte Facebook
POST/locations/oauth-disconnectDéconnecter un établissement d’une plateforme de publication (même opération que disconnect-listing).Déconnecter un établissement d’une plateforme de publication

POST /connected-accounts/connect-google

Renvoie une URL OAuth à durée de validité limitée. Redirigez le propriétaire du compte vers cette URL ; Google le redirige ensuite vers votre successUrl ou votre errorUrl. Le lien est limité au compte auquel appartient la clé API ; le corps ne contient donc que vos deux URL de redirection. Générer un nouveau lien pour un compte dont l’autorisation a expiré actualise la connexion existante au lieu de la dupliquer.

NomEmplacementObligatoireRemarques
inputbodyouiObjet englobant ; tout le corps est imbriqué dans cet objet.
input.successUrlbodyouiURL https absolue que vous contrôlez. Le propriétaire y est redirigé après avoir donné son consentement.
input.errorUrlbodyouiURL https absolue que vous contrôlez. Le propriétaire y est redirigé en cas d’annulation ou d’échec.
Connect Google
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-google \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "successUrl": "https://app.example.com/connect/google/success",    "errorUrl": "https://app.example.com/connect/google/error"  }}'
JSON
{  "data": {    "bulkConnectLinkForGoogle": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

La valeur url ci-dessus est une valeur de remplacement. Dirigez le propriétaire vers la valeur url renvoyée dans votre propre réponse.

Le lien est valable 24 heures. errors n’est renseigné que si la génération échoue ; vérifiez donc que url n’est pas null. Un corps sans imbrication, ou contenant un accountId, est rejeté avec HTTP 400.

POST /connected-accounts/connect-facebook

L’équivalent pour Facebook, avec le même corps. Au cours de la procédure, le propriétaire accepte les conditions de Facebook et accorde les autorisations de gestion des pages dont l’API a besoin ; s’il omet une autorisation, la connexion ne peut pas effectuer de synchronisation, vous devez donc générer un nouveau lien et lui demander de donner à nouveau son consentement.

NomEmplacementObligatoireRemarques
inputbodyouiObjet englobant.
input.successUrlbodyouiURL https absolue que vous contrôlez.
input.errorUrlbodyouiURL https absolue que vous contrôlez.
Connect Facebook
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-facebook \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "successUrl": "https://app.example.com/connect/facebook/success",    "errorUrl": "https://app.example.com/connect/facebook/error"  }}'
JSON
{  "data": {    "bulkConnectLinkForFacebook": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

La valeur url ci-dessus est une valeur de remplacement. Dirigez le propriétaire vers la valeur url renvoyée dans votre propre réponse.

La clé de la réponse est bulkConnectLinkForFacebook ; pour le reste, interprétez la réponse exactement comme celle du lien Google. Une fois que le propriétaire a terminé, le compte apparaît dans les résultats du point de terminaison de liste en tant que FacebookAccount.

POST /locations/oauth_connect_url

Utilisez cette méthode lorsque vous savez déjà quel établissement le propriétaire souhaite connecter. Le lien est associé à l'établissement que vous indiquez ; aucune étape de rapprochement ne suit donc : lorsque le propriétaire donne son consentement, les identifiants sont directement rattachés à cet établissement. Les 2 liens de connexion en masse ci-dessus connectent quant à eux un compte entier.

NomEmplacementObligatoireRemarques
inputbodyouiObjet enveloppe.
input.locationIdbodyouiIdentifiant de l'établissement encodé en Base64, ou identifiant numérique brut.
input.sitebodyouiGOOGLE, FACEBOOK ou APPLE.
input.successUrlbodyouiURL absolue vers laquelle rediriger après l'octroi de l'autorisation.
input.errorUrlbodyouiURL absolue vers laquelle rediriger en cas d'annulation ou d'échec.
Single-location link
curl -X POST https://listingsapi.com/api/v4/locations/oauth_connect_url \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "site": "GOOGLE",    "successUrl": "https://app.example.com/locations/1800289/connected",    "errorUrl": "https://app.example.com/locations/1800289/connect-failed"  }}'
JSON
{  "data": {    "createConnectUrl": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

La valeur url ci-dessus est un exemple. Dirigez le propriétaire vers la valeur url renvoyée dans votre propre réponse.

Le lien est à usage unique ; créez-en donc un nouveau à chaque tentative au lieu de le mettre en cache. Une URL de redirection relative ou impossible à analyser entraîne une réponse success: true avec un url égal à null ; vérifiez donc url et pas seulement success. Une clé qui n'est pas autorisée à accéder à cet établissement reçoit un code 403 avec SY90003. Les SDK convertissent site en majuscules pour vous.

Lister les comptes connectés

GET /connected-accounts

Renvoie tous les comptes autorisés auprès de votre compte API, avec l'état de leur connexion et le nombre d'établissements auxquels chacun est lié. La pagination se fait par décalage : records[] et pageInfo.totalRecords, avec les paramètres de requête non imbriqués page et perPage. Le tri est fixé à l'ordre croissant des adresses e-mail des comptes.

NomEmplacementObligatoireRemarques
pagequerynonNuméro de page commençant à 1. Valeur par défaut : 1.
perPagequerynonNombre d'enregistrements par page. Valeur par défaut : 20.
publisherquerynonGoogleAccount, FacebookAccount, AppleAccount, YelpAccount, TripadvisorAccount, LinkedinAccount, PinterestAccount ou TwitterAccount.
statusquerynonConnected, NotConnected ou ConnectionIssue. Mélange de majuscules et de minuscules.
List accounts
curl "https://listingsapi.com/api/v4/connected-accounts?publisher=GoogleAccount&status=Connected&page=1&perPage=20" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectedAccountsInfo": {      "pageInfo": { "hasNextPage": false, "hasPreviousPage": false, "totalPages": 1, "totalRecords": 1 },      "records": [        {          "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",          "connectedAccountType": "GoogleAccount",          "email": "owner@brightsmile-dental.com",          "status": "CONNECTED",          "connectivityIssue": null,          "connectedLocationsCount": 0,          "requestMatchesStatus": "MATCH_COMPLETED",          "lastFetchMatchesRequestedAt": "2026-07-06 21:43:07 UTC"        }      ]    }  }}

Sélectionnez l'enregistrement dont email correspond au propriétaire qui a donné son consentement et conservez son connectedAccountId ; chaque appel ultérieur l'utilise. Tout élément autre que les 4 paramètres de requête est ignoré plutôt que rejeté ; un pageInfo JSON renvoie donc la page 1 sans signaler d'erreur.

status de l'enregistrementSignification
CONNECTEDLes identifiants sont valides. Vous pouvez lancer le rapprochement ou publier.
MATCH_IN_PROGRESSUne opération de rapprochement est en attente ou en cours.
CONNECTIVITY_ISSUEL'autorisation a expiré. connectivityIssue en indique la raison ; générez un nouveau lien de connexion.

Le filtre status et le champ status de l'enregistrement n'utilisent pas les mêmes valeurs. Réutiliser CONNECTED comme filtre fournit une valeur d'énumération non valide et entraîne le renvoi d'un code 400.

Obtenir les détails d'un compte

GET /connected-accounts/{connectedAccountId}/details

Renvoie les mêmes champs qu'un enregistrement de la liste, pour un seul compte. Utilisez cet appel pour consulter périodiquement requestMatchesStatus après avoir lancé les rapprochements, ou pour vérifier status et connectivityIssue avant d'envoyer une mise à jour via le compte.

NomEmplacementObligatoireRemarques
connectedAccountIdpathouiUUID renvoyé par le point de terminaison de liste.
Account details
curl https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/details \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectedAccountDetails": {      "details": {        "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",        "connectedAccountType": "GoogleAccount",        "status": "CONNECTED",        "connectivityIssue": null,        "connectedLocationsCount": 0,        "requestMatchesStatus": "MATCH_COMPLETED"      }    }  }}

L'enregistrement se trouve au niveau inférieur, dans data.connectedAccountDetails.details. requestMatchesStatus passe de MATCH_IN_PROGRESS à MATCH_COMPLETED lorsque les suggestions sont prêtes. Completed signifie que le moteur de rapprochement a terminé, et non qu'un élément a été lié : connectedLocationsCount reste à 0 tant que vous n'avez pas confirmé ou connecté une fiche.

Récupérer les fiches accessibles à un compte

POST /connected-accounts/connected-account-listings

Liste toutes les fiches Google Business Profile ou Facebook auxquelles le compte a accès, qu'elles soient liées ou non à l'un de vos établissements. Le champ id de chaque enregistrement est le connectedAccountListingId utilisé par connect-listing et create-location-from-listing. Cet appel POST effectue uniquement une lecture et renvoie une page avec pagination par décalage : records[] et pageInfo, avec les clés non imbriquées page et perPage dans le corps.

NomEmplacementObligatoireRemarques
connectedAccountIdbodyouiUUID du compte dont vous souhaitez récupérer les fiches. Ne doit pas être placé dans input.
pagebodynonNuméro de page. Valeur par défaut : 1.
perPagebodynonNombre d'enregistrements par page. Valeur par défaut : 500, qui est également le maximum.
locationInfobodynonRecherche en texte libre dans le nom, l'adresse, la localité, le code postal, le code du magasin et le numéro de téléphone.
Account listings
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connected-account-listings \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5", "perPage": 50, "locationInfo": "William St" }'
JSON
{  "data": {    "connectedAccountListings": {      "pageInfo": { "hasNextPage": false, "totalPages": 1, "totalRecords": 60 },      "records": [        {          "id": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA==",          "accountTypeName": "Google",          "locationName": "Trial",          "address": "123 William St, NY 10038, Manhattan, US",          "phone": "(718) 667-7787",          "liveLink": null        }      ]    }  }}

Parcourez les pages de l'ensemble avec pageInfo.hasNextPage et pageInfo.totalPages. Les SDK placent connectedAccountId dans le corps pour vous ; cela ne concerne donc que les appels REST écrits manuellement.

Déclencher la mise en correspondance

POST /connected-accounts/trigger-matches

Place dans la file d’attente la tâche qui récupère tous les profils accessibles aux comptes indiqués et associe chacun à l’un de vos établissements. La mise en correspondance prend en compte tous les établissements actifs, non archivés et qui ne sont pas déjà connectés. Elle enregistre uniquement des suggestions ; aucun lien n’est créé avant votre confirmation.

NomEmplacementObligatoireRemarques
inputbodyouiObjet conteneur.
input.connectedAccountIdsbodyouiTableau des UUID de comptes provenant du point de terminaison de liste.
Trigger matches
curl -X POST https://listingsapi.com/api/v4/connected-accounts/trigger-matches \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountIds": ["4f712c17-4f95-42dd-90f4-97171a2e67b5"] } }'
JSON
{  "data": {    "connectedAccountsTriggerMatches": {      "success": true,      "failedIds": null    }  }}

success: true signifie que la tâche a été placée dans la file d’attente, et non que la mise en correspondance est terminée. Tout compte qui n’a pas pu être placé dans la file d’attente figure dans failedIds et success vaut false. Interrogez régulièrement le point de terminaison de détails jusqu’à ce que requestMatchesStatus vaille MATCH_COMPLETED avant de lire les suggestions ; un intervalle de 15 secondes dans une boucle bornée permet de respecter la limite de 10 requêtes par minute de l’offre Launch.

Consulter les suggestions de connexion

GET /connected-accounts/{connectedAccountId}/connection-suggestions

Renvoie les associations proposées par le mécanisme de mise en correspondance : votre établissement d’un côté (locationInfo, dont le champ databaseId vaut locationId) et la fiche sur la plateforme de publication de l’autre (suggestedLocationInfo). La pagination repose sur un décalage et utilise les paramètres de requête non imbriqués page et perPage ; le tri est fixé à l’ordre croissant des informations sur l’établissement.

NomEmplacementObligatoireRemarques
connectedAccountIdpathouiUUID du compte.
pagequerynonNuméro de page commençant à 1. Valeur par défaut : 1.
perPagequerynonNombre d’enregistrements par page. Valeur par défaut : 20.
Suggestions
curl "https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/connection-suggestions?page=1&perPage=20" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectionSuggestionsForAccount": {      "pageInfo": { "hasNextPage": false, "totalPages": 1, "totalRecords": 2 },      "records": [        {          "accountType": "GMB",          "matchedDataDatabaseId": "0d5e306f-0da0-46e3-929f-fd3c67ccd8cc",          "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",          "locationId": "73415",          "locationInfo": { "name": "My Business", "city": "Lincoln", "stateIso": "NE" },          "suggestedLocationInfo": { "locationInfo": { "name": "My Business", "city": "Lincoln" } }        }      ]    }  }}

Une suggestion n’a pas de id. Conservez matchedDataDatabaseId et accountType ensemble ; confirm-matches a besoin des deux pour construire son id. Si vous le consultez trop tôt, avant MATCH_COMPLETED, le point de terminaison renvoie records: [] avec totalRecords: 0, ce qui ressemble exactement à une absence de correspondances.

accountTypePlateforme de publicationType d’enregistrement de correspondance
GMBGoogle Business ProfileGmbLocationMatchedData
FBFacebook PagesFbLocationMatchedData
APPLEApple Business ConnectAppleLocationMatchedData

Confirmer les correspondances

POST /connected-accounts/confirm-matches

Accepte les suggestions que vous approuvez et crée les liens actifs. Chaque id est l’encodage en base64 de <MatchRecordType>:<matchedDataDatabaseId>, avec le type choisi dans le tableau ci-dessus. Le compte est déduit des enregistrements, il n’y a donc pas de champ connectedAccountId ; tout champ inconnu dans input est rejeté avec un statut 400.

NomEmplacementObligatoireRemarques
inputbodyouiObjet conteneur. Seul matchRecordIds est déclaré.
input.matchRecordIdsbodyouiTableau des id d’enregistrements de correspondance encodés en base64. Au moins un.
Confirm matches
# base64 of GmbLocationMatchedData:0d5e306f-0da0-46e3-929f-fd3c67ccd8cccurl -X POST https://listingsapi.com/api/v4/connected-accounts/confirm-matches \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "matchRecordIds": ["R21iTG9jYXRpb25NYXRjaGVkRGF0YTowZDVlMzA2Zi0wZGEwLTQ2ZTMtOTI5Zi1mZDNjNjdjY2Q4Y2M="] } }'
JSON
{  "data": {    "confirmConnectMatches": {      "success": true,      "failedIds": null    }  }}

failedIds contient les valeurs décodées de matchedDataDatabaseId qui n’ont pas pu être confirmées, par exemple un enregistrement déjà utilisé ou un établissement archivé depuis la mise en correspondance ; comparez-les donc aux enregistrements de suggestion pour les retrouver. Les suggestions non envoyées restent inchangées. La confirmation relie l’établissement à la fiche ; elle n’envoie pas à elle seule de données à la plateforme de publication.

Connecter une fiche à un établissement

POST /connected-accounts/connect-listing

Relie une seule fiche que vous avez déjà choisie à un seul établissement, sans étape de suggestion ni de confirmation. Utilisez ce point de terminaison lorsque la mise en correspondance est ambiguë, par exemple lorsque 2 commerces proches portent des noms similaires et qu’un opérateur choisit la bonne fiche parmi celles du compte.

NomEmplacementObligatoireRemarques
inputbodyouiObjet conteneur.
input.locationIdbodyouiid de l’établissement encodé en base64.
input.connectedAccountIdbodyouiUUID du compte propriétaire de la fiche.
input.connectedAccountListingIdbodyouiLe id d’un enregistrement provenant du point de terminaison des fiches du compte. Pas listingId.
Connect listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "connectedAccountListingId": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA=="  }}'
JSON
{  "data": {    "connectListing": {      "success": true,      "message": null    }  }}

Un échec de connexion renvoie success: false avec un message non nul, par exemple Listing record not found lorsque l’id de la fiche ne correspond à aucune fiche, ou un message indiquant que la fiche est déjà connectée à un autre établissement. Dans les 2 SDK, cette méthode se trouve sur la ressource des fiches, et non sur celle des comptes connectés.

Déconnecter une fiche d’un établissement

POST /connected-accounts/disconnect-listing

Supprime le lien entre un établissement et une plateforme de publication. L’établissement et ses données sont conservés ; seule la synchronisation sortante vers cette plateforme de publication s’arrête. Ce point de terminaison ne permet pas les opérations en masse ; parcourez donc les établissements dans une boucle. Pour rattacher un commerce à un autre compte Google, déconnectez-le d’abord ici, puis effectuez la mise en correspondance ou la connexion sur le nouveau compte.

NomEmplacementObligatoireRemarques
inputbodyouiObjet conteneur.
input.locationIdbodyouiid encodé en base64 de l’unique établissement concerné.
input.sitebodyl’un des paramètresGOOGLE, FACEBOOK ou APPLE. Obligatoire sauf si providerId est envoyé.
input.providerIdbodyl’un des paramètresL’identifiant de compte propre à la plateforme de publication, à la place de site.
Disconnect listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "site": "GOOGLE" } }'
JSON
{  "data": {    "disconnectConnectedAccountsLocations": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

Si vous n’envoyez ni site ni providerId, le point de terminaison renvoie SY10056. Pour un établissement sans connexion active à ce site, le point de terminaison renvoie SY10057 plutôt que de signaler un succès sans rien modifier ; success: true signifie donc bien qu’un lien a été supprimé. Les SDK acceptent uniquement site et le convertissent en majuscules.

Créer un établissement à partir d'une fiche

POST /connected-accounts/create-location-from-listing

La mise en correspondance associe uniquement les fiches aux établissements que vous possédez déjà. Pour une fiche sans établissement, cette opération crée un établissement à partir des données de la plateforme de publication et l'associe immédiatement à la fiche. Google importe le nom, l'adresse, les coordonnées géographiques, le téléphone, le site web, la description, les horaires habituels et exceptionnels, les catégories, la date d'ouverture, le code du magasin et le fuseau horaire, ainsi que les moyens de paiement et les liens vers les réseaux sociaux issus des attributs Google de la fiche. Facebook importe le nom, l'emplacement, les horaires, les catégories, la description et les coordonnées de contact.

Lors d'un import depuis Google, les données ne sont pas renvoyées à Google ; la fiche conserve donc le statut IN_PROGRESS jusqu'à ce que votre première mise à jour de l'établissement y soit publiée. Les données sont envoyées normalement à toutes les autres plateformes de publication, et ce point de terminaison n'accepte aucun périmètre de sites ; l'établissement est donc créé pour l'ensemble des plateformes de publication de votre compte. Réduisez ce périmètre avec enabledSiteIds juste après la création et envoyez cette mise à jour immédiatement : les éléments de commande destinés aux autres plateformes de publication sont générés peu après la création, et la mise à jour ne retire pas ceux qui ont déjà été générés.

Aucun des deux SDK ne propose encore de méthode pour ce point de terminaison ; les exemples Python et Node appellent donc REST avec le même en-tête.

NomDansObligatoireRemarques
inputbodyouiObjet enveloppe.
input.connectedAccountIdbodyouiUUID du compte propriétaire de la fiche.
input.connectedAccountListingIdbodyouiLe id d'un enregistrement renvoyé par le point de terminaison des fiches du compte. Pas listingId.
Create from listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/create-location-from-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "connectedAccountListingId": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA=="  }}'
JSON
{  "data": {    "createLocationFromConnectedAccountListing": {      "success": true,      "locationId": 88277,      "errors": null    }  }}

locationId est le simple databaseId du nouvel établissement. En cas d'échec, success vaut false, locationId vaut null et errors contient un code indiquant la cause, tel que SY81067 (l'identifiant de la fiche n'a pas permis de la retrouver) ; les autres causes possibles sont une fiche déjà associée à un autre établissement ou un compte dont les identifiants ont expiré. Une fois l'établissement créé, gérez-le comme n'importe quel autre.

Lister les dossiers d'un compte Google

GET /connected-accounts/{connectedAccountId}/folders

Renvoie les groupes de comptes Google Business Profile (dossiers) auxquels le compte Google connecté peut accéder. Utilisez ce point de terminaison avant de créer une fiche GMB afin que le nouveau profil soit créé dans le groupe attendu par le propriétaire. La réponse contient un simple tableau sous getFoldersUnderGoogleAccount, et non une page. Le chemin n'est valide que pour les connexions GoogleAccount.

NomDansObligatoireRemarques
connectedAccountIdpathouiUUID d'un compte de type Google.
Folders
curl https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/folders \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getFoldersUnderGoogleAccount": [      { "folderId": "accounts/104890024806530350198", "folderName": "Bright Smile Dental", "locationCount": null }    ]  }}

Utilisez folderId sans le modifier ; il s'agit de la chaîne accounts/{id}, et non d'un nombre. locationCount peut valoir null lorsque Google ne le fournit pas ; traitez-le donc comme facultatif.

Créer un profil Google Business Profile pour un établissement

POST /locations/create/gmb-listing

Crée une nouvelle fiche Google pour un établissement qui n'en possède aucune, sous un compte Google connecté et, éventuellement, dans un dossier. Cette opération diffère de connect-listing, qui associe une fiche déjà existante. L'établissement doit déjà comporter un nom, une adresse et un numéro de téléphone, et une seule fiche Google peut exister par établissement.

NomDansObligatoireRemarques
inputbodyouiObjet enveloppe.
input.locationIdbodyouiIdentifiant de l'établissement encodé en Base64.
input.connectedAccountIdbodyouiUUID du compte Google sous lequel créer la fiche.
input.folderIdbodynonChaîne accounts/{id} provenant du point de terminaison des dossiers. Omettez ce champ pour utiliser la racine du compte.
Create GMB listing
curl -X POST https://listingsapi.com/api/v4/locations/create/gmb-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "folderId": "accounts/104890024806530350198"  }}'
JSON
{  "data": {    "createGmbListingForLocation": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

La création est asynchrone : success: true signifie que la requête a été acceptée, et Google examine les nouveaux profils avant leur publication. Lorsque success vaut false, errors indique la cause : des champs obligatoires manquants, une fiche Google existante, un établissement archivé ou un compte inactif.

Déconnecter un compte Google entier

POST /connected-accounts/disconnect-google

Supprime la connexion pour l'ensemble du compte : tous les établissements qui y sont associés cessent de se synchroniser. Il n'existe pas de champ locationIds ; pour dissocier un seul établissement et conserver le compte, utilisez plutôt disconnect-listing. Utilisez cette opération lorsqu'un client part ou lorsqu'une autorisation défectueuse ne peut pas être supprimée et que vous souhaitez recommencer avec un nouveau lien de connexion.

NomDansObligatoireRemarques
inputbodyouiObjet englobant.
input.connectedAccountIdbodyouiUUID du compte Google. Le compte entier est déconnecté.
Disconnect Google
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-google \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountId": "d2397854-52c2-41d7-95f1-b90cba16498d" } }'
JSON
{  "data": {    "gmbBulkDisconnect": {      "success": true    }  }}

success: true est renvoyé même pour un connectedAccountId inconnu ; cela signifie donc « la requête a été traitée » et non « une connexion active a été supprimée ». Récupérez à nouveau la liste des comptes connectés si vous avez besoin d'une confirmation.

Déconnecter un compte Facebook entier

POST /connected-accounts/disconnect-facebook

L'équivalent pour Facebook, avec le même corps de requête. Les Pages associées via ce compte cessent de se synchroniser et les interactions Facebook cessent d'apparaître.

NomDansObligatoireRemarques
inputbodyouiObjet englobant.
input.connectedAccountIdbodyouiUUID du compte Facebook. Le compte entier est déconnecté.
Disconnect Facebook
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-facebook \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountId": "d2397854-52c2-41d7-95f1-b90cba16498d" } }'
JSON
{  "data": {    "fbBulkDisconnect": {      "success": true    }  }}

La clé de réponse est fbBulkDisconnect. Comme pour Google, success: true pour un id inconnu signifie que la requête a été traitée, et non qu'une connexion a été supprimée.

Déconnecter un établissement d'une plateforme de publication

POST /locations/oauth-disconnect

L'étape de déconnexion du flux OAuth par établissement. Il s'agit de la même opération que disconnect-listing, accessible par un second chemin : un corps input identique et la même clé de réponse disconnectConnectedAccountsLocations. Choisissez le chemin le plus lisible dans votre intégration.

NomDansObligatoireRemarques
inputbodyouiObjet englobant.
input.locationIdbodyouiid en Base64 de l'unique établissement concerné.
input.sitebodyl'un des deuxGOOGLE, FACEBOOK ou APPLE. Obligatoire sauf si providerId est envoyé.
input.providerIdbodyl'un des deuxL'identifiant de compte propre à la plateforme de publication, à la place de site.
OAuth disconnect
curl -X POST https://listingsapi.com/api/v4/locations/oauth-disconnect \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "site": "GOOGLE" } }'
JSON
{  "data": {    "disconnectConnectedAccountsLocations": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

Les mêmes règles concernant SY10056 et SY10057 s'appliquent, et une clé qui n'est pas autorisée à agir sur cet établissement reçoit un statut 403 avec SY90003. La déconnexion conserve l'établissement et ses données ; seule la synchronisation sortante vers cette plateforme de publication s'arrête. Redirigez le propriétaire vers l'URL de connexion, ou exécutez la mise en correspondance puis connect-listing, pour associer ensuite la bonne fiche.

Erreurs que vous rencontrerez

Les requêtes mal formées et les clés non valides entraînent une réponse 4xx avec un élément errors[] au premier niveau, dont message commence par le code. Les opérations d'écriture peuvent aussi renvoyer un statut 200 avec success: false et la raison dans data.<operation> ; vérifiez donc le corps de la réponse de chaque opération d'écriture. La liste complète se trouve dans Codes d'erreur.

Code ou statutSignificationSolution
SY90016 (400)Une clé Read a été utilisée sur un POST.Utilisez une clé Write.
SY90003 (403)La clé n'est pas autorisée à connecter ou à déconnecter cet établissement.Utilisez une clé ayant accès à l'établissement.
SY10056 (200)La requête de déconnexion ne contenait ni site ni providerId.Envoyez l'un des deux.
SY10057 (200)L'établissement n'a aucune connexion active pour ce site.Il n'y a rien à supprimer ; vérifiez les fiches de l'établissement.
SY81067 (200)connectedAccountListingId n'a pas pu être résolu lors de l'appel à create-from-listing.Récupérez à nouveau les fiches du compte et utilisez le id d'un enregistrement.
400, Variable "$input" ... was not providedLe corps de la requête n'était pas encapsulé dans input, ou un champ obligatoire était manquant.Placez le corps de la requête sous input ; utilisez connectedAccountListingId, et non listingId.
400, invalid enumLe statut CONNECTED d'un enregistrement a été réutilisé comme filtre status de la liste.Filtrez avec Connected, NotConnected ou ConnectionIssue.
429Limite de débit dépassée.Attendez selon les indications de Retry-After ; consultez Limites de débit.

Étapes suivantes