Erreurs

Toute erreur — y compris celles levées avant que votre requête n'atteigne le handler — est renvoyée sous forme de document Problem Details, avec le type de contenu application/problem+json. Il n'existe pas de seconde forme d'erreur, plus ancienne, à gérer en parallèle.

{
  "type": "errors/not-found",
  "title": "Demande de congé introuvable",
  "detail": "Aucune demande de congé ne correspond à l'identifiant fourni.",
  "status": 404,
  "instance": "/api/v1/client/…",
  "traceId": "00-4bf92f…-00f067aa0ba902b7-01"
}
Champ À quoi il sert
type C'est là-dessus qu'on branche. Un slug stable, insensible à la formulation et à la langue.
title / detail Lisibles, localisés. À afficher, jamais à parser.
status Même valeur que le code HTTP.
instance Le chemin qui a produit l'erreur.
traceId À communiquer au support — il identifie votre requête exacte dans nos traces.

Types d'erreur

type Statut Signification
errors/bad-request 400 La requête est malformée ou échoue à la validation.
errors/forbidden 403 Authentifié, mais pas autorisé à faire cela.
errors/not-found 404 La ressource n'existe pas, ou ne vous est pas visible.
errors/conflict 409 La requête entre en conflit avec l'état courant.
errors/module-disabled 403 Aucun établissement de votre périmètre n'a activé le module requis par cette opération. Il suffit qu'un seul l'ait activé pour que l'opération réponde, sur cet établissement seul.
errors/perimeter-unresolved 403 Aucun établissement que votre accès désigne n'existe encore : tous ont été fermés. Distinct de module-disabled, et pour une raison pratique — il n'y a rien à souscrire ici. Votre mandat doit être repointé sur des établissements existants, ce que seule la société cliente peut faire.
errors/feature-not-in-plan 403 L'offre souscrite par la société n'inclut pas cette fonctionnalité.
errors/gone 410 La ressource a existé et n'existe plus — un fichier stocké au-delà de sa durée de rétention. Délibérément pas un 404, qui dirait qu'elle n'a jamais existé et vous ferait chercher une erreur dans votre propre code. Redemandez-la plutôt que de réessayer celle-ci.
errors/payload-too-large 413 La réponse que nous devrions vous envoyer est trop volumineuse pour être servie — un document stocké au-delà de la taille que cette API accepte de matérialiser. À ne pas confondre avec quota/payload-too-large, qui porte sur le corps que vous envoyez : ici, il n'y a rien à réduire de votre côté.
errors/service-unavailable 503 La ressource existe et relève bien de votre périmètre, mais une dépendance nécessaire pour la produire n'a pas répondu. Réessayez après Retry-After secondes.
errors/internal 500 Quelque chose a échoué de notre côté. Réessayez plus tard, en citant le traceId.
scopes/insufficient 403 Le jeton n'a pas le scope exigé — le detail le nomme. Voir Authentification.
quota/exceeded 429 Limite de débit du plan atteinte. Voir Limites de débit.
quota/payload-too-large 413 Le corps de la requête dépasse le plafond de votre plan.
idempotency/key-required 400 L'opération exige un Idempotency-Key. Voir Idempotence.
idempotency/in-progress 409 La même clé est déjà en cours de traitement.

Ce qu'une erreur ne contient jamais

Les corps d'erreur ne portent aucune donnée personnelle. Une défaillance inattendue est nettoyée en un errors/internal générique plutôt que d'exposer un message interne — un 500 ne vous apprendra donc pas grand-chose, et c'est voulu. C'est à cela que sert le traceId : il permet au support de retrouver le contexte complet sans le faire transiter sur le réseau.

Réessayer

Statut Réessayer ?
400, 403, 404, 409 Non. Corrigez la requête.
410 Non — la ressource a définitivement disparu. Redemandez-en une ; réessayer cet identifiant ne réussira jamais.
413 Non — mais regardez lequel. quota/payload-too-large porte sur le corps de votre requête : envoyez moins. errors/payload-too-large porte sur un document stocké que nous ne pouvons pas servir, et rien de votre côté ne peut y changer quoi que ce soit.
429 Oui, après Retry-After secondes.
503 Oui, après Retry-After secondes. Plafonnez vos réessais : le statut ne dit pas si la dépendance va revenir, donc une ressource définitivement perdue serait sinon réessayée indéfiniment. Ouvrez un ticket plutôt que de boucler.
500, 502, 504 Oui, avec un backoff exponentiel.

Pour une écriture qui n'est pas naturellement idempotente, réessayez avec le même Idempotency-Key — c'est ce qui rend le réessai sûr. Voir Idempotence.