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.
{
"error": {
"code": "unknown_signer_role",
"message": "One or more recipient roles do not match this template.",
"details": { },
"reference": "0190f3a2-7b6c-7e21-9a3f-2c9b1d4e5f60"
}
}| Champ | Toujours présent | À quoi il sert |
|---|---|---|
code | Oui | La valeur stable sur laquelle brancher. Toutes les valeurs possibles sont listées ci-dessous. |
message | Oui | Explication lisible par un humain. Peut changer sans préavis. |
details | Non | Contexte structuré, lorsqu'il y en a — voir ci-dessous. |
reference | Non | Un 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 :
{
"error": {
"code": "insufficient_scope",
"message": "This API key is missing the required scope \"envelopes:send\".",
"details": { "required_scope": "envelopes:send", "granted_scopes": ["templates:read"] }
}
}{
"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
| HTTP | error.code | Signification |
|---|---|---|
401 | missing_api_key | En-tête X-API-Key absent sur la requête de jeton. |
401 | invalid_api_key | La clé est inconnue, révoquée, expirée, ou n'est pas en mode réel. |
401 | missing_token | Aucun jeton Authorization: Bearer n'a été envoyé. |
401 | invalid_token | Le jeton est malformé ou expiré. Demandez-en un nouveau. |
401 | key_revoked | La clé derrière ce jeton a été révoquée : ses jetons ne fonctionnent plus. |
403 | insufficient_scope | La clé ne porte pas le scope requis par cet endpoint. |
403 | forbidden | Le 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. |
403 | signing_links_disabled | L'enveloppe ne partage pas les liens de signature avec l'expéditeur. |
402 | quota_exceeded | Plus aucune demande de signature API disponible (à l'envoi). |
403 | quota_exceeded | Une limite de ressource est atteinte — celle des contacts, ou celle des endpoints webhook. |
404 | template_not_found | Aucun modèle avec cet id dans votre entreprise. |
404 | envelope_not_found | Aucune enveloppe avec cet id dans votre entreprise. |
404 | webhook_not_found | Aucun abonnement webhook avec cet id dans votre entreprise. |
422 | unknown_signer_role | Un rôle de destinataire ne correspond pas au modèle, ou un rôle verrouillé a été fourni. |
422 | sender_not_found | sender_email n'est pas un utilisateur actif disposant d'un siège de signature électronique dans votre entreprise. |
422 | sender_fields_incomplete | Le rôle expéditeur du modèle (« Me ») a des champs obligatoires sans valeur : le document ne peut pas partir. |
400 422 | validation_failed | Le 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. |
429 | rate_limited | Trop de requêtes — patientez puis réessayez. |
5xx | send_failed | L'enveloppe a été créée mais n'a pas pu être envoyée, donc elle a été supprimée. Rien n'a été livré. |
500 | internal_error | Un 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 surmessage. - Réessayez les
5xx,429et erreurs réseau avec une temporisation progressive, en respectant l'en-têteRetry-Aftersur un429. Ne réessayez pas les autres4xx: la requête nous est parvenue et a été rejetée ; corrigez-la. - Renouvelez sur
401 invalid_tokenen échangeant votre clé contre un nouveau jeton, puis réessayez une fois. Si vous recevezkey_revoked, la clé elle-même a été révoquée : chargez la clé de remplacement au lieu de réessayer. - Traitez
quota_exceededcomme 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_failedsignifie 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
referencedès qu'elle est présente.
Webhooks
Recevez des événements en temps réel — enveloppe envoyée, vue, signée, terminée, et plus — poussés vers un endpoint HTTPS que vous contrôlez, sans jamais interroger l'API.
API de facturation
Il n'existe pas encore d'API publique de facturation. Voici ce que vous pouvez automatiser aujourd'hui pour les factures, devis et dépenses, et ce qui arrive ensuite.