BunnyDoc
APIAPI de signature électronique

Erreurs

Toutes les erreurs que l'API de signature électronique peut renvoyer, avec un code stable et lisible par machine sur lequel brancher.

Toutes les réponses d'erreur ont la même forme. Lisez error.code : c'est une valeur stable et lisible par machine. Le message est destiné aux humains et peut changer à tout moment, donc ne vous basez jamais sur le texte du message.

Forme de l'erreur
{
  "error": {
    "code": "unknown_signer_role",
    "message": "One or more recipient roles do not match this template.",
    "details": { },
    "reference": "0190f3a2-7b6c-7e21-9a3f-2c9b1d4e5f60"
  }
}
ChampToujours présentÀ quoi il sert
codeOuiLa valeur stable sur laquelle brancher. Toutes les valeurs possibles sont listées ci-dessous.
messageOuiExplication lisible par un humain. Peut changer sans préavis.
detailsNonContexte structuré, lorsqu'il y en a — voir ci-dessous.
referenceNonUn identifiant de support pour les échecs que nous journalisons côté serveur (5xx et 422).

details

Présent uniquement lorsqu'il y a quelque chose d'utile à dire. Deux cas méritent un traitement explicite :

403 insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This API key is missing the required scope \"envelopes:send\".",
    "details": { "required_scope": "envelopes:send", "granted_scopes": ["templates:read"] }
  }
}
429 rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Slow down and retry after the indicated interval.",
    "details": { "retry_after": "15 minutes" }
  }
}

Basez-vous sur l'en-tête Retry-After, pas sur details.retry_after

details.retry_after est une chaîne lisible par un humain ("15 minutes", "42 seconds") destinée aux logs et aux messages d'erreur — ne l'analysez pas. Chaque 429 porte aussi l'en-tête standard Retry-After, qui est un nombre entier de secondes. Utilisez l'en-tête pour votre temporisation.

reference

Un UUID identifiant l'entrée de journal côté serveur pour cet échec. Il apparaît sur les erreurs que nous conservons (5xx et 422) et est absent des erreurs d'authentification ou de validation qui ne génèrent aucun journal.

Journalisez-le. Lorsque vous nous signalez un problème, citer la reference nous permet de retrouver l'échec exact en une seule recherche, au lieu de vous demander de le reproduire.

Codes d'erreur

HTTPerror.codeSignification
401missing_api_keyEn-tête X-API-Key absent sur la requête de jeton.
401invalid_api_keyLa clé est inconnue, révoquée, expirée, ou n'est pas en mode réel.
401missing_tokenAucun jeton Authorization: Bearer n'a été envoyé.
401invalid_tokenLe jeton est malformé ou expiré. Demandez-en un nouveau.
401key_revokedLa clé derrière ce jeton a été révoquée : ses jetons ne fonctionnent plus.
403insufficient_scopeLa clé ne porte pas le scope requis par cet endpoint.
403forbiddenLe propriétaire de la clé n'a pas la permission sous-jacente, ou la fonctionnalité (accès API, webhooks) n'est pas dans votre offre.
403signing_links_disabledL'enveloppe ne partage pas les liens de signature avec l'expéditeur.
402quota_exceededPlus aucune demande de signature API disponible (à l'envoi).
403quota_exceededUne limite de ressource est atteinte — celle des contacts, ou celle des endpoints webhook.
404template_not_foundAucun modèle avec cet id dans votre entreprise.
404envelope_not_foundAucune enveloppe avec cet id dans votre entreprise.
404webhook_not_foundAucun abonnement webhook avec cet id dans votre entreprise.
422unknown_signer_roleUn rôle de destinataire ne correspond pas au modèle, ou un rôle verrouillé a été fourni.
422sender_not_foundsender_email n'est pas un utilisateur actif disposant d'un siège de signature électronique dans votre entreprise.
422sender_fields_incompleteLe rôle expéditeur du modèle (« Me ») a des champs obligatoires sans valeur : le document ne peut pas partir.
400 422validation_failedLe corps est malformé, un champ obligatoire manque, une limite de longueur est dépassée, ou il contient un placeholder inconnu ou un lien trompeur.
429rate_limitedTrop de requêtes — patientez puis réessayez.
5xxsend_failedL'enveloppe a été créée mais n'a pas pu être envoyée, donc elle a été supprimée. Rien n'a été livré.
500internal_errorUn problème de notre côté. Vous pouvez réessayer.

Pourquoi certaines erreurs sont volontairement vagues

Sur l'endpoint de jeton, « clé inexistante », « révoquée », « expirée » et « hors mode réel » renvoient toutes le même corps 401. De même, un modèle appartenant à une autre entreprise et un modèle inexistant renvoient tous deux 404 template_not_found. C'est volontaire : une erreur plus précise permettrait de sonder quels ids ou quelles clés existent.

Corriger sender_fields_incomplete

Celle-ci surprend, car la requête est parfaitement valide. Elle signifie que le modèle comporte des champs affectés à son propre rôle expéditeur (« Me ») qui sont obligatoires et vides — il n'y a donc pas de document complet à envoyer.

L'API remplit automatiquement les champs de l'expéditeur à partir de ce qui est enregistré sur le modèle ; elle ne peut pas inventer de valeurs. Corrigez-le sur le modèle, pas dans votre requête :

  • donnez une valeur à ces champs expéditeur sur le modèle,
  • rendez-les facultatifs, ou
  • supprimez-les.

Puis relancez le même appel.

Bien gérer les erreurs

  • Branchez sur error.code, jamais sur message.
  • Réessayez les 5xx, 429 et erreurs réseau avec une temporisation progressive, en respectant l'en-tête Retry-After sur un 429. Ne réessayez pas les autres 4xx : la requête nous est parvenue et a été rejetée ; corrigez-la.
  • Renouvelez sur 401 invalid_token en échangeant votre clé contre un nouveau jeton, puis réessayez une fois. Si vous recevez key_revoked, la clé elle-même a été révoquée : chargez la clé de remplacement au lieu de réessayer.
  • Traitez quota_exceeded comme un signal d'offre, pas comme une erreur transitoire : cela se résout quand la période se réinitialise ou que l'offre évolue. Réessayer ne sert à rien et, à l'envoi, cela signifie que rien n'a été livré.
  • send_failed signifie que rien n'est parti. L'enveloppe est supprimée, donc un nouvel essai en crée une nouvelle plutôt que de dupliquer une livraison.
  • Journalisez reference dès qu'elle est présente.

Sur cette page