Erreurs
La forme
Chaque erreur renvoie le même JSON, sans trace de pile, SQL ni chemin de fichier :
{ "error": { "code": "authenticate_user.invalid_credentials", "message": "authenticate_user.invalid_credentials" } }
Le code est une clé de traduction stable, pas du texte localisé. Votre client la mappe vers un message dans la langue de l'utilisateur au rendu : le texte des erreurs vit donc chez vous et ne change jamais sous vos pieds.
Codes de statut
- 400 Bad Request : entrée malformée (email invalide, UUID incorrect, valeur de query inconnue).
- 401 Unauthorized : clé ou jeton manquant ou invalide.
- 402 Payment Required : le portefeuille n'a pas de solde pour réserver le job. Distinct de
403pour proposer une recharge plutôt qu'un correctif de permission. - 403 Forbidden : la clé n'a pas la portée ou le contrôle requis.
- 404 Not Found : ressource inexistante pour votre compte (un UUID appartenant à autrui est indistinguable d'un UUID absent).
- 408 Request Timeout : la requête a dépassé le budget de traitement du serveur (
request.timeout) ; réessayez sans risque. - 409 Conflict : par exemple une clé d'idempotence réutilisée avec un corps différent.
- 429 Too Many Requests : limite de débit dépassée. La réponse porte
Retry-After.
Pas d'énumération
Les échecs d'authentification renvoient la même erreur pour un email inconnu et un mauvais mot de passe : les réponses ne révèlent jamais si un compte existe.