Codes d'erreur

Codes de statut HTTP de Listings API, codes d’erreur SYxxxxx pour Listings et Social, et trois formats de réponse d’erreur de l’API v4.

Listings API utilise les codes de statut HTTP conventionnels pour indiquer le résultat d'une requête. Les codes d'erreur portent le préfixe SY et sont inclus dans la chaîne message de l'erreur, au format SYxxxxx: <human-readable reason>.

Codes de statut HTTP

HTTP status code summary

StatutSignificationCode SY typiqueException du Python SDK
200 OKLa requête a réussi. Pour les écritures, vérifiez également le corps de la réponse (voir ci-dessous).--
400 Bad RequestRequête mal formée, filtre impossible à analyser, valeur d'énumération invalide ou identifiant mal formé.SY90006, SY90001ValidationError
401 UnauthorizedLa clé API est absente, mal formée ou révoquée. Vous n'avez pas encore de clé ? Obtenez un accès à la journée gratuit à l'environnement de test lorsque cette offre est disponible.SY90005AuthenticationError
402 Payment RequiredLe compte a une facture impayée, l'accès à l'API est donc suspendu. Une facture impayée concernant uniquement Social suspend uniquement les points de terminaison Social. Consultez payment_required et social_payment_required.-APIError
403 ForbiddenLa clé est valide, mais n'autorise pas l'accès à la ressource.SY90003PermissionDeniedError
404 Not FoundLe chemin ou la ressource désignée par son identifiant n'existe pas.SY90002NotFoundError
422 Unprocessable EntityLa requête était bien formée, mais une valeur n'a pas pu être traitée (par exemple, une catégorie inconnue ou ambiguë).-ValidationError
429 Too Many RequestsVous avez dépassé la limite de débit de votre forfait. Respectez l'en-tête Retry-After.-RateLimitError
5xxErreur serveur. Vous pouvez réessayer sans risque avec un délai d'attente croissant pour une lecture ; consultez la réserve ci-dessous concernant les écritures avant de répéter une écriture.SY90007InternalServerError

Trois structures de réponse

La plupart des échecs contiennent un tableau errors, soit au premier niveau, soit imbriqué dans le résultat de l'opération, comme le montrent les sections ci-dessous. Quelques échecs renvoient à la place un seul objet error : la limitation de débit (429) et certains échecs au niveau de la requête (400/500 avec un code tel que INTERNAL_SERVER_ERROR). Vérifiez les deux cas : errors est un tableau, error est un objet.

1. Au niveau de la requête : errors[] au premier niveau

Les échecs d'authentification, d'autorisation et ceux dus à une requête mal formée interrompent le traitement avant l'exécution de l'opération. Ils renvoient le statut 4xx correspondant (ci-dessus), avec l'erreur au premier niveau de la réponse.

JSON
{  "data": { "createLocation": null },  "errors": [{ "message": "SY90005: Invalid Token" }]}

2. Validation des écritures : data.<operation>.errors[] imbriqué

Une requête de création, de mise à jour ou de publication par ailleurs bien formée renvoie HTTP 200. Si les données d'entrée enfreignent une règle métier, l'échec est signalé dans data.<operation>.errors, imbriqué dans la charge utile propre à l'opération. En cas de succès, ce tableau est présent et vide ("errors": []).

JSON
{  "data": {    "createLocation": {      "errors": [        { "message": "SY10126: City is Mandatory" },        { "message": "SY10010: state_iso" }      ],      "location": null    }  }}

3. Au niveau de la passerelle : un seul objet error au premier niveau

La limitation de débit et les défaillances inattendues de la passerelle interrompent le traitement avant la traduction et renvoient un objet error contenant un code, un message et un correlation_id. Consultez rate_limited ci-dessous pour le corps de la réponse 429.

Lisez toujours data.<operation>.errors lors d'une écriture, même en cas de statut 200 avec un objet data.<operation> renseigné : une écriture peut échouer partiellement et le signaler ici.

Une réponse 402 Payment Required ne comporte pas d'enveloppe error : code, message, doc_url et, lorsqu'une facture est à payer, pay_url se trouvent au premier niveau. Consultez payment_required ci-dessous.

Réessayer une écriture n'est pas sans conséquences

L'API v4 ne prend pas en charge Idempotency-Key : l'en-tête est ignoré et aucun point de terminaison ne détecte les écritures répétées. Un appel de création, de mise à jour ou de publication qui dépasse le délai d'attente ou renvoie un statut 5xx peut tout de même avoir été enregistré sur le serveur ; réessayer sans vérification peut donc créer un doublon d'établissement, de publication ou de réponse à un avis.

Vous pouvez réessayer librement les lectures avec un délai d'attente croissant. Pour une écriture, effectuez d'abord une lecture de vérification : recherchez l'enregistrement à l'aide d'une clé que vous maîtrisez (storeId, un code de magasin, la liste des réponses de l'interaction) et ne répétez l'appel que si l'enregistrement est réellement absent.

Codes courants

Common SY error codes

CodeMessageStatut HTTPSignification
SY90005Invalid Token401La clé API est absente, mal formée ou révoquée. Générez une nouvelle clé depuis le tableau de bord et envoyez-la sous la forme Authorization: API <your-key>.
SY90001Not authorized to access this resource401 / 403La clé a été rejetée pour cette ressource. Les SDK Python et Node lèvent tous deux cette erreur sous la forme AuthenticationError.
SY90002Invalid Id404 / 400Un chemin ou un ID fourni en argument n’a pas pu être résolu (souvent un ID relay incorrect ou non encodé en base64).
SY10126City is Mandatory200 (corps de la réponse)Un champ obligatoire (city) a été omis des données d’entrée.
SY10010state_iso200 (corps de la réponse)La valeur de stateIso est absente ou invalide. Consultez le point de terminaison des pays et des États pour connaître les valeurs valides.

Les codes de validation de la plage SY10xxx correspondent à un champ d’entrée précis ; message indique le champ ou la règle dont la validation a échoué. Les codes d’authentification et d’autorisation de la plage SY90xxx concernent la requête et sont renvoyés au niveau supérieur avec le statut correspondant.

Codes des comptes connectés

Les codes de la plage SY810xx proviennent des points de terminaison Connected Accounts qui importent ou associent une fiche d’une plateforme de publication. Ils sont imbriqués dans le corps de la réponse lors d’un HTTP 200 (structure de réponse 2 ci-dessus), donc lisez data.<operation>.errors même lorsque le statut indique un succès.

SY810xx connected-account and import codes

CodeSignificationAction à effectuer
SY81019Aucun utilisateur n’a pu être identifié pour le compte associé à la clé.Contactez l’assistance : le compte ne possède aucun utilisateur principal actif.
SY81066connectedAccountId n’existe pas, ou le compte est archivé.Relisez l’ID dans GET /connected-accounts.
SY81067connectedAccountListingId n’a pas pu être décodé ou résolu.Récupérez-le à nouveau depuis le champ id d’un enregistrement connected-account-listings.
SY81068Cette fiche est déjà associée à un établissement.Dissociez-la d’abord, ou choisissez une autre fiche.
SY81069Les identifiants du compte connecté ne sont plus valides.Reconnectez le compte via connect-google ou connect-facebook.
SY81070La fiche n’appartient pas au compte connecté que vous avez indiqué.Associez chaque fiche au compte dont elle provient. Une cause fréquente est la récupération de fiches sans connectedAccountId dans le corps de la requête, ce qui renvoie les fiches d’un autre compte.
SY81071Une erreur inattendue s’est produite lors de la création de l’établissement.Réessayez ; si le problème persiste, contactez l’assistance.
SY81072La création de l’établissement a échoué lors de la construction ou de l’enregistrement.Réessayez ; si le problème persiste, contactez l’assistance.
SY81073Ce type de fiche n’est pas pris en charge pour l’importation.Seules les fiches Google et Facebook peuvent être importées.
SY81074Google n’a renvoyé aucune donnée pour la fiche.Vérifiez que la fiche existe toujours et que le compte la gère toujours.
SY81075La limite de fréquence des requêtes à l’API Google a été dépassée.Réessayez plus tard en espaçant progressivement les tentatives.
SY81076La récupération de la fiche depuis Google a échoué.Réessayez ; vérifiez les autorisations Google du compte.
SY81077Le pays n’a pas pu être déterminé à partir de la page Facebook.Ajoutez un pays à l’adresse de la page sur Facebook, puis réessayez.
SY81078La construction des données de l’établissement à partir de la page Facebook a échoué.Réessayez ; si le problème persiste, contactez l’assistance.
SY81081Aucune catégorie principale n’est définie pour la fiche.Définissez une catégorie principale pour la fiche, puis réessayez.
SY81082Le pays de la fiche n’est pas pris en charge.Consultez le point de terminaison des pays et des États pour connaître les pays pris en charge.
SY81083La fiche Google n’a pas pu être importée.Contactez l’assistance en fournissant l’horodatage.
SY81084Une erreur interne s’est produite lors de la préparation de l’importation depuis Facebook.Réessayez ; si le problème persiste, contactez l’assistance en fournissant l’horodatage.
SY81085La page Facebook n’a pas pu être importée.Contactez l’assistance en fournissant l’horodatage.
SY81086La création de l’établissement a été rejetée par une règle métier. Le champ imbriqué message contient le code sous-jacent, par exemple SY10151 lorsque le compte ne dispose plus d’emplacements disponibles pour des établissements.Lisez le message imbriqué ; pour SY10151, ajoutez une option d’établissement supplémentaire ou passez à une offre supérieure.
SY81087La demande de création de l’établissement a échoué.Réessayez ; si le problème persiste, contactez l’assistance en fournissant l’horodatage.
SY81088La création de l’établissement a échoué pour une raison non reconnue.Contactez l’assistance en fournissant l’horodatage.
SY81089Un appel à un service interne a renvoyé un statut n’indiquant pas un succès. Le problème ne vient pas de votre requête.Réessayez une fois ; si le problème persiste, contactez l’assistance en fournissant l’horodatage afin que nous puissions retrouver la trace de l’appel interne.
SY81090Une erreur inattendue s’est produite lors de l’appel interne de création de l’établissement.Réessayez ; si le problème persiste, contactez l’assistance en fournissant l’horodatage.

Codes Social

Les codes de la plage SY950xx proviennent des endpoints Social : marques, connexions et publications sur les réseaux sociaux. Comme les codes des comptes connectés, ils sont imbriqués dans le corps de la réponse lors d’un HTTP 200 ; lisez donc data.<operation>.error (et data.<operation>.errors sur les routes de traitement en masse), même lorsque le statut indique un succès.

SY950xx Social codes

CodeSignificationMarche à suivre
SY95041Le compte a atteint sa limite de marques. Ce cas ne peut pas se produire avec un forfait API : le nombre de marques y est illimité.Aucune action n’est nécessaire avec un forfait API. Si vous rencontrez ce code, signalez-le : GET /social/limits devrait renvoyer brands: null.
SY95042Le compte a atteint sa limite de connexions pour la période de facturation en cours.Le plafond est comparé à usage.connections provenant de GET /social/limits — le nombre facturable : les connexions actuellement actives plus celles libérées pendant cette période. Un emplacement libéré par une déconnexion ou par l’archivage d’une marque reste réservé jusqu’à la fin de la période ; une déconnexion récente ne fait donc pas disparaître cette erreur. Reconnectez l’un des comptes que vous avez libérés à la marque à laquelle il était associé (gratuit, car il réutilise cet emplacement), achetez un pack supplémentaire de 5 connexions (immédiat) ou attendez le renouvellement, lorsque les emplacements usage.connectionsReleased redeviennent disponibles. Rattacher un compte libéré à une autre marque ne réutilise pas l’emplacement. Consultez Forfaits et options.
SY95043Aucune marque avec cet ID n’existe sur ce compte, ou la marque est archivée.Relisez l’ID dans GET /social/brands. Les ID de marque sont de simples UUID, et non des ID relay encodés en Base64.
SY95044Cette plateforme n’est pas activée pour ce compte.Le forfait Social du compte ne couvre pas la plateforme que vous avez demandé à connecter. Contactez l’assistance ou choisissez une plateforme dont le compte dispose.
SY95045La marque ne possède aucun canal connecté pour cette plateforme.Dirigez l’utilisateur vers un lien de connexion pour cette plateforme, ou retirez-la de platforms. Ce code apparaît également lorsque le canal a été déconnecté après la programmation de la publication.
SY95046La programmation ou le fuseau horaire n’est pas valide.Envoyez scheduledAt ou scheduleDate + scheduleTime, jamais les deux. scheduledAt nécessite un décalage UTC ; scheduleTime est HH:MM. Les fuseaux horaires sont des identifiants IANA (tzCode).
SY95047Aucune tâche de traitement en masse avec cet ID n’existe sur ce compte.Relisez job.id dans la réponse de création en masse. Les tâches ne sont pas conservées indéfiniment.
SY95048La requête de traitement en masse dépasse la limite de lignes.Envoyez au maximum 500 lignes par requête et répartissez le reste en lots supplémentaires. Rien n’a été créé.
SY95049L’URL de redirection n’est pas valide.redirectUrl et errorUrl d’un lien de connexion doivent être des URL https absolues que vous contrôlez.
SY95050La validation du traitement en masse a échoué ; consultez les erreurs pour chaque ligne.Rien n’a été créé. Lisez job.results[] : chaque ligne rejetée contient son index indexé à partir de 0, son clientReference et le motif dans errors[]. Corrigez ces lignes et renvoyez le lot entier.
SY95051La marque ne satisfait pas à l’exigence d’ancienneté de 90 jours.Une marque ne peut pas être archivée avant d’avoir 90 jours d’ancienneté. La réponse indique également status: "TENURE_NOT_MET" et rien n’a changé. Réessayez après le 90e jour : la marque et ses connexions sont alors archivées immédiatement, mais leurs emplacements de connexion restent réservés jusqu’à la fin de la période de facturation. Consultez la règle d’ancienneté.
SY95052Le canal connecté n’appartient pas à cette marque.Associez chaque connexion à la marque pour laquelle elle a été créée. Ce cas est fréquent lorsqu’un appel de statistiques utilise une publication d’une marque et l’ID de canal d’une autre marque.

SY95042 et SY95044 sont des erreurs liées aux droits du forfait, et non des erreurs de saisie : réessayer sans changer de forfait produira le même échec. SY95045, SY95046, SY95049 et SY95052 sont des erreurs de saisie qui peuvent être corrigées dans la requête suivante.

Codes de droits d'accès à Listings

Listings plan codes

CodeSignificationMarche à suivre
SY10150Le compte a atteint sa limite d'établissements.Archivez un établissement, achetez une option pour un établissement supplémentaire ou passez à une offre supérieure. Consultez Offres et options.
SY10151Le compte n'a plus de places disponibles pour des établissements dans cette offre. Avec un accès à la journée en environnement de test, ses 2 établissements sont utilisés.Les solutions sont les mêmes que pour SY10150. Avec un accès à la journée, mettez à jour un établissement existant ou choisissez une offre payante. Ce code apparaît également au sein de SY81086 lorsqu'un établissement est créé à partir d'une fiche d'un compte connecté.
SY10152L'établissement n'est pas actif depuis assez longtemps pour être archivé.Les établissements doivent être actifs pendant la durée minimale requise pour le compte, soit 90 jours par défaut, avant que POST /locations/archive ne les accepte. Attendez que cette durée soit écoulée.
SY10155Le compte ne dispose d'aucune offre Listings, ce qui empêche la création d'établissements.La clé API appartient à un compte sans abonnement Listings, par exemple un compte disposant uniquement d'un abonnement Social. Les établissements font partie du produit Listings ; abonnez-vous à ce produit avant d'appeler POST /locations.

rate_limited

429 Too Many Requests : le compte a dépassé la limite de débit de son offre. Le corps est la réponse d'erreur standard contenant une indication retry_after_seconds, un correlation_id à citer dans les demandes d'assistance et un doc_url qui renvoie à cette section :

JSON
{  "error": {    "code": "RATE_LIMITED",    "message": "Too many requests. Slow down.",    "retry_after_seconds": 30,    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#rate_limited"  }}

Attendez le délai indiqué par retry_after_seconds (ou par l'en-tête Retry-After lorsqu'il est présent), puis réessayez en augmentant le délai de façon exponentielle entre les tentatives. Consultez Limites de débit pour connaître les limites par offre et obtenir une implémentation de référence de cette temporisation.

payment_required

402 : Le dernier paiement de ce compte a échoué, ce qui suspend tous les points de terminaison /api/v4. Le corps inclut pay_url, la page Stripe de la facture impayée, lorsqu'une telle page est disponible, et l'en-tête de réponse X-Error-Code contient le même code. Vous pouvez toujours ouvrir la page Facturation du tableau de bord pour payer.

JSON
{  "code": "payment_required",  "message": "This account has an unpaid invoice, so API access is paused. Pay the invoice to restore access.",  "pay_url": "https://invoice.stripe.com/i/acct_123/test_abc",  "doc_url": "https://listingsapi.com/docs/error-codes#payment_required"}

L'accès est rétabli dans la minute qui suit le règlement de la dernière facture en attente. Si la facture est toujours impayée 3 jours après le premier échec de paiement, l'abonnement Listings est résilié et les établissements du compte sont archivés. Si le compte dispose également d'un abonnement Social actif, il conserve son accès à Social ; sinon, le compte est fermé et ses clés API cessent de fonctionner.

social_payment_required

402 : Le dernier paiement de l'abonnement Social a échoué, ce qui suspend les points de terminaison Social (/api/v4/social/*). Les points de terminaison Listings continuent de fonctionner. Le corps contient les mêmes champs que payment_required, avec "code": "social_payment_required". Si la facture est toujours impayée 3 jours après le premier échec de paiement, l'abonnement Social est résilié et les marques du compte sont archivées. Un compte sans abonnement Listings est fermé et ses clés API cessent de fonctionner.

Erreurs du plan de contrôle du portail développeur

Les points de terminaison de gestion des comptes et des clés du portail développeur (les routes API propres au tableau de bord) renvoient une réponse d'erreur structurée de format unique, distincte des formats REST errors[] ci-dessus. Chaque code contient un correlation_id et un doc_url qui renvoie à la section correspondante de cette page.

JSON
{  "error": {    "code": "AUTH_INVALID_KEY",    "message": "Session is invalid or expired.",    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#auth_invalid_key"  }}

auth_missing_key

401 : Aucun identifiant n'a été fourni. Reconnectez-vous ou envoyez votre clé sous la forme Authorization: API <your-key>.

auth_invalid_key

401 : La session ou la clé est invalide ou a expiré. Authentifiez-vous à nouveau ou générez une nouvelle clé depuis le tableau de bord.

auth_insufficient_scope

403 : L'identifiant est valide, mais n'autorise pas cette action. Une clé limitée à la lecture ne peut pas appeler les points de terminaison d'écriture ; générez une clé d'écriture si vous en avez besoin.

not_found

404 : La ressource demandée, ou une ressource désignée par son ID, n'existe pas.

conflict

409 : La requête entre en conflit avec l'état actuel de la ressource (par exemple, la révocation d'une clé déjà révoquée).

validation_failed

422 : La validation du corps de la requête a échoué. Les champs field et details de la réponse indiquent la donnée d'entrée en cause.

internal_error

500 : Une erreur inattendue côté serveur. Réessayez une lecture en augmentant le délai de façon exponentielle entre les tentatives ; pour une écriture, relisez d'abord l'enregistrement (consultez Réessayer une écriture n'est pas sans coût). Citez le correlation_id si vous contactez l'assistance.

dependency_unavailable

503 : Un service dont dépend l'API est temporairement indisponible. Réessayez en augmentant le délai entre les tentatives.

Pour 429, consultez rate_limited ci-dessus.

Gestion des erreurs dans le code

Vérifiez d’abord le statut HTTP ; puis, pour les opérations d’écriture, recherchez un tableau errors imbriqué dans le corps de la réponse :

Python
from listingsapi import APIError, ListingsAPI client = ListingsAPI(api_key=os.environ["LISTINGSAPI_KEY"]) try:    location = client.locations.create(input=payload)except APIError as e:    # Raised for a non-2xx status (AuthenticationError, ValidationError, and    # so on) and for an error payload returned inside a 200 body.    raise RuntimeError(f"Listings API error: {e}") from e

Avec l’API HTTP brute, les deux mêmes vérifications sont explicites : d’abord le code de statut, puis le contenu de la réponse :

Python
resp = requests.post(    "https://listingsapi.com/api/v4/locations",    headers={"Authorization": f"API {os.environ['LISTINGSAPI_KEY']}"},    json=payload,    timeout=30,)resp.raise_for_status()body = resp.json() op = (body.get("data") or {}).get("createLocation") or {}if op.get("errors"):    messages = [e["message"] for e in op["errors"]]    raise RuntimeError(f"Listings API error: {messages}")

Le Python SDK effectue ces deux vérifications pour vous : il associe chaque statut HTTP à une exception typée et lève également une exception lorsque des données d’erreur sont renvoyées dans le corps d’une réponse 200.