Aller au contenu principal

Erreurs

Toutes les erreurs API retournent un corps de réponse JSON cohérent. Il existe deux formats d'erreur selon la source de l'erreur.

Erreurs de validation​

Renvoyées avec HTTP 400 lorsque la définition du document est refusée avant tout rendu ou toute facturation : un texte qui n'est pas du JSON, une clé ou une valeur que le schéma ne nomme pas, un membre obligatoire manquant, ou une limite dépassée. La définition est lue exactement comme le schéma publié l'énonce : une clé dans une autre casse, une orthographe retirée ou une définition sans sa racine est refusée, jamais devinée.

{
"code": "SCHEMA",
"path": "document.content.0",
"message": "\"tabel\" is not in this schema; this object takes: source, break, p, th, td, h1, h2, h3, h4, h5, h6, title, lang, id, ol, ul, table, image, hr, columns, svg, toc, style, header, and 8 more"
}
ChampTypeDescription
codestringCode d'erreur lisible par machine
pathstringL'endroit dans la définition, en clés et indices séparés par des points (document.content.0)
messagestringCe qui ne va pas, et ce que cet endroit accepte à la place

Codes d'erreur de validation​

CodeDescription
INVALID_JSONLe corps de la requête n'est pas du JSON
SCHEMAUne clé que le schéma ne nomme pas, une valeur du mauvais type, un membre obligatoire manquant, ou une définition sans racine document ni component
EMPTY_CONTENTUn document dont le tableau content est vide
UNRESOLVED_COMPONENTUn use nomme un composant que le locataire n'a pas

Une définition qui dépasse une des limites de ressources du moteur (trop de pages, un tableau ou une image trop grands, une imbrication trop profonde) est refusée avec un code qui nomme la limite, comme TOO_MANY_PAGES ou NESTING_TOO_DEEP.

Exemples​

Faute de frappe dans un nom de propriété, pour { "document": { "content": [{ "tabel": {} }] } } : la réponse ci-dessus.

Mauvais type, pour { "document": { "pageSetup": { "margin": true }, "content": [{ "p": "Hi" }] } } :

{
"code": "SCHEMA",
"path": "document.pageSetup.margin",
"message": "Expected a number, CSS's spacing shorthand (\"20mm\", \"10mm 20mm\") or a list of four lengths - numbers in points or unit strings (\"0.5in\", \"12.7mm\", \"48px\", \"36pt\")."
}

Contenu vide, pour { "document": { "content": [] } } :

{
"code": "EMPTY_CONTENT",
"path": "document.content",
"message": "the content array is empty, so the document draws nothing; give it at least one node (a component may be config-only, a document may not)"
}

La clé racine est obligatoire​

Une définition s'écrit dans document, un composant dans component. Un { "content": [...] } nu est refusé avec SCHEMA, et le message dit où le placer :

{
"code": "SCHEMA",
"path": "$",
"message": "\"content\" is not in this schema; this object takes: $schema, document, component; a definition is written inside \"document\" ({\"document\": ...}), a component inside \"component\""
}

Erreurs serveur​

Retourné par le gestionnaire d'exception global pour les erreurs d'infrastructure, d'autorisation et d'exécution. Utilise le format RFC 7807 Problem Details.

{
"status": 503,
"title": "Service Unavailable",
"detail": "Database service is temporarily unavailable.",
"instance": "/v1/{tenantId}/documents/generate-from-payload",
"traceId": "00-abc123def456-789012-00",
"errorCode": "DATABASE_UNAVAILABLE",
"isRetryable": true,
"retryAfterSeconds": 30
}
ChampTypeDescription
statusintegerCode de statut HTTP
titlestringPhrase de raison HTTP standard
detailstringDescription lisible par l'humain
instancestringChemin de la requête qui a déclenché l'erreur
traceIdstringID de trace unique pour les demandes de support
errorCodestringCode d'erreur lisible par machine
isRetryablebooleanSi la requête peut être relancée
retryAfterSecondsintegerSecondes à attendre avant de relancer (si relançable)

Codes de statut HTTP​

ÉtatQuandRelançable
400JSON invalide, erreurs de schéma, contenu vide, paramètres de requête incorrectsNon
401Jeton d'accès manquant, invalide ou expiré, ou identifiants client incorrectsNon
403Permissions insuffisantes ou incompatibilité de locataireNon
404Modèle ou document non trouvéNon
429Limite de débit dépasséeOui — attendez les secondes indiquées par l'en-tête Retry-After
500Échec de la génération de PDF ou erreur serveur inattenduePeut-être — relancer une fois
503Base de données, stockage ou service externe temporairement indisponibleOui — vérifiez retryAfterSeconds

Codes d'erreur serveur​

CodeÉtatDescription
VALIDATION_ERROR400Paramètres de requête invalides
INVALID_OPERATION400Opération non valide à l'état actuel
ACCESS_DENIED401Échec de l'authentification
TENANT_CLAIM_MISSING403Informations de locataire manquantes du jeton
TENANT_MISMATCH403Accès à une ressource d'un locataire différent
FILE_NOT_FOUND404Le fichier demandé n'existe pas
REQUEST_CANCELLED400Le client a annulé la requête
DATABASE_UNAVAILABLE503Base de données temporairement indisponible (relançable)
AZURE_SERVICE_ERROR503Service de stockage temporairement indisponible (relançable)
EXTERNAL_SERVICE_ERROR503Dépendance externe temporairement indisponible (relançable)
NETWORK_ERROR503Problème de connectivité réseau (relançable)
SERVICE_TIMEOUT503Délai d'attente de la requête dépassé
INTERNAL_ERROR500Erreur serveur inattendue

Limitation du débit​

Une requête au-delà d'une limite de débit reçoit 429 Too Many Requests. L'en-tête Retry-After donne le nombre de secondes à attendre avant la réinitialisation de la limite :

HTTP/1.1 429 Too Many Requests
Retry-After: 37

{"error": "rate_limit_exceeded", "message": "Too many requests. Please try again later."}

Les limites elles-mêmes sont indiquées dans Limites de débit.

Bonnes pratiques​

  1. Vérifiez le code de statut HTTP en premier avant d'analyser le corps de la réponse.
  2. Utilisez code pour la gestion programmatique — correspondsur les codes d'erreur, pas sur les chaînes de message.
  3. Utilisez path pour localiser le problème dans les erreurs de validation — il pointe vers la propriété JSON exacte.
  4. Relancez sur 429 et 503 avec backoff. Utilisez retryAfterSeconds ou l'en-tête Retry-After pour déterminer le temps d'attente.
  5. Ne relancez pas sur 400, 401, 403 ou 404 — corrigez d'abord la requête.
  6. Enregistrez traceId pour les erreurs serveur — incluez-le lors de la prise de contact avec le support.
  7. Validez localement avec le schéma JSON pour détecter les erreurs avant d'envoyer à l'API.