Aller au contenu

Erreurs

Toute erreur renvoie un statut HTTP 4xx ou 5xx et le même corps JSON : un code stable (à tester dans votre code), un message en français (à afficher ou journaliser) et parfois des details.

Corps d’une erreur
{
  "error": {
    "code": "string",
    "message": "string",
    "details": "(facultatif)"
  }
}

Exemple : adresse postale incomplète

Réponse 422
{
  "error": {
    "code": "address_invalid",
    "message": "Pour un envoi postal, les adresses doivent comporter un nom, une rue (ou une boîte postale : BP, TSA, CS), un code postal à 5 chiffres et une ville.",
    "details": {
      "missing": [
        {
          "key": "sender",
          "label": "Adresse de l’expéditeur (nom, rue, code postal et ville)"
        },
        {
          "key": "recipient",
          "label": "Adresse du destinataire (nom, rue ou boîte postale, code postal et ville)"
        }
      ]
    }
  }
}

Codes

HTTPCodeSignification
400validation_errorCorps ou paramètres invalides ; details.issues liste les champs fautifs. Corrigez la requête.
400bad_requestCorps illisible (JSON mal formé) ou en-tête invalide (Idempotency-Key de plus de 255 caractères…). Corrigez la requête.
400invalid_cursorCurseur de pagination illisible : reprenez la liste sans cursor.
401invalid_api_keyClé absente, mal formée ou inconnue.
401revoked_api_keyClé révoquée : utilisez une clé active.
402insufficient_balanceCrédit insuffisant pour cet appel payant : rien n’a été exécuté ni débité. details donne balanceCents et priceCents. Rechargez depuis l’espace développeur.
403live_not_enabledClé live alors que la production n’est pas ouverte.
403account_suspendedCompte suspendu : écrivez-nous.
403test_onlyRoute réservée au bac à sable (clé test).
403insufficient_scopeLa clé n’a pas le droit de cette route (details.required, details.granted) : utilisez ou créez une clé avec ce droit.
404not_foundLettre, fournisseur, envoi, établissement ou itinéraire introuvable ; details.reason précise le cas quand il y en a un (route_not_found : aucun itinéraire entre les deux adresses).
409conflictOpération impossible dans l’état actuel (envoi déjà à sa dernière étape…).
409idempotency_in_progressUne requête avec la même Idempotency-Key est encore en cours : réessayez après Retry-After (1 s).
422address_invalidAdresse postale incomplète ; details.missing liste les adresses à corriger.
413payload_too_largeCorps de plus de 1 Mo : allégez la requête (signature PNG comprise).
422letter_incompleteLettre du catalogue : champs obligatoires manquants (details.missing). Complétez values.
422recipient_email_requiredRecommandé électronique (mode lre) : l’e-mail du destinataire est obligatoire.
422mode_unavailableMode d’envoi indisponible chez le prestataire postal actuel : choisissez un autre mode.
422address_not_foundDevis ou calculateur : adresse introuvable (details.field) ; utilisez /v1/geo/addresses.
422commune_requiredDevis : la commune est obligatoire (champ commune, valeur label de /v1/geo/cities).
422commune_not_foundDevis : commune introuvable (details.field) ; utilisez /v1/geo/cities.
422expense_invalidPartage de dépenses : un index de participant dépasse la liste people (details.expense).
422idempotency_key_reusedCette Idempotency-Key a déjà servi pour une autre requête : une clé neuve par opération.
422inputs_incompleteOutil IA : champs obligatoires manquants (details.missing).
422inputs_too_longOutil IA : texte trop long (details.max).
422inputs_invalidOutil IA : un lien seul ou un texte trop court a été envoyé à la place du texte à traiter (details.invalid).
429rate_limitedTrop d’appels : attendez Retry-After secondes.
429test_quota_exceededQuota quotidien du bac à sable atteint.
502upstream_errorUn prestataire (La Poste, annuaire, IA) n’a pas répondu. Pour un envoi, rien n’est facturé ; réessayez.
503unavailableService momentanément indisponible ; réessayez.
503prices_unavailableGrille tarifaire momentanément illisible : aucun appel payant n’est exécuté ni débité ; réessayez.
503ai_unavailableOutil IA momentanément indisponible (coupe-circuit) : rien n’est débité ; réessayez plus tard.
500internal_errorErreur inattendue, nos équipes sont prévenues ; réessayez.

Réessayer sans risque

  • 4xx : ne réessayez pas à l’identique, corrigez d’abord (sauf 429 : attendez Retry-After).
  • 502, 503, 500, délai dépassé ou connexion coupée : réessayez avec un délai croissant (1 s, 5 s, 30 s…), avec la même Idempotency-Key. Vous ne savez pas si la première requête a abouti ; la clé garantit qu’elle ne s’exécute qu’une fois (voir idempotence).
  • Une erreur n’est pas facturée, sauf un appel IA auquel le modèle a répondu (sortie tronquée, refusée ou inexploitable) : son débit est conservé et details.charged vaut true. Au-delà de 50 appels IA en échec dans la journée, l’IA de votre compte répond 429 ai_failure_limit jusqu’à minuit. Un envoi en 502 a été refusé par le prestataire : il est marqué en erreur, recrédité, et son identifiant figure dans details.mailingId.

Étape suivante : les limites de débit