Toutes les réponses d'erreur de l'API REST Coffrify partagent une structure unique et un comportement prévisible. Quel que soit l'endpoint appelé, une requête qui échoue renvoie un code HTTP cohérent avec la nature du problème et un corps JSON décrivant précisément la cause. Cette page documente cette structure, la liste des codes HTTP que vous pouvez recevoir, les codes applicatifs textuels qui les accompagnent, et la réaction recommandée pour chacun. Elle vous sert de référence lorsque vous écrivez la logique de gestion d'erreurs de votre intégration.
Structure d'une erreur
Toute réponse en échec renvoie un objet JSON contenant une seule clé racine error. Cet objet expose trois champs : code (un identifiant textuel stable, fait pour être testé dans votre code), message (une phrase lisible décrivant le problème, destinée aux logs et au débogage) et request_id (l'identifiant unique de la requête, à fournir au support pour toute investigation). Branchez votre logique métier sur code, jamais sur le texte de message, qui peut évoluer.
Codes HTTP
Le code HTTP de la réponse indique la grande famille du problème. La règle générale est classique : les codes 4xx signalent une erreur de votre côté (requête à corriger avant de réessayer), les codes 5xx signalent un incident côté Coffrify (l'appel pourra être rejoué tel quel). Le tableau ci-dessous récapitule les codes que l'API peut renvoyer.
| Code HTTP | Signification | Réaction recommandée |
|---|---|---|
| 400 Bad Request | Requête malformée : JSON invalide, paramètre hors limites, en-tête mal formé. | Corrigez la requête. Ne rejouez pas à l'identique, l'erreur se reproduira. |
| 401 Unauthorized | Authentification absente ou invalide : clé manquante, inconnue, expirée ou révoquée. | Vérifiez l'en-tête Authorization: Bearer <clé> et la validité de la clé. Ne réessayez pas avant correction. |
| 402 Payment Required | Fonctionnalité ou quota non disponible sur le plan courant de l'espace. | Faites évoluer le plan ou libérez du quota. Inutile de rejouer en l'état. |
| 403 Forbidden | Authentification valide mais autorisation insuffisante : scope manquant, ressource d'un autre espace, IP non autorisée. | Vérifiez les scopes de la clé et l'espace ciblé. Corrigez avant de réessayer. |
| 404 Not Found | Ressource introuvable dans cet espace, ou chemin inexistant. | Vérifiez l'identifiant et l'URL. Ne rejouez pas tel quel. |
| 409 Conflict | Conflit d'état : clé d'idempotence réutilisée avec un corps différent, requête identique en cours, ou ressource déjà dans un état terminal. | Voir la section idempotence ci-dessous. Selon le cas : nouvelle clé, ou attente puis nouvelle tentative. |
| 413 Payload Too Large | Charge utile trop volumineuse pour l'endpoint. | Réduisez la taille du corps ou découpez la requête. |
| 422 Unprocessable Entity | Validation échouée : le corps est bien formé mais ses valeurs sont invalides ou incohérentes. | Lisez message pour identifier le champ fautif, corrigez puis réessayez. |
| 429 Too Many Requests | Limite de débit atteinte pour cette classe d'endpoint. | Lisez l'en-tête Retry-After, attendez le délai indiqué, puis réessayez avec un repli exponentiel. |
| 5xx Server Error | Incident côté Coffrify (500 et apparentés). | Réessayez avec un repli exponentiel. Si cela persiste, contactez le support avec le request_id. |
Codes applicatifs
Le champ code du corps précise la cause exacte, plus finement que le code HTTP. C'est sur cette valeur que vous devez construire votre logique de gestion d'erreurs, car elle est stable dans le temps. Le tableau suivant liste les codes applicatifs principaux, le code HTTP associé et la réaction attendue.
| Code applicatif | HTTP | Cause | Réaction recommandée |
|---|---|---|---|
| invalid_api_key | 401 | Le préfixe de la clé n'est pas reconnu (attendu : cof_live_, cof_test_, cof_sandbox_, cof_rk_, cof_mcp_) ou la clé n'existe pas. | Vérifiez que la variable d'environnement contient la clé complète, non tronquée. Régénérez une clé si besoin. |
| scope_missing | 403 | La clé est valide mais ne porte pas le scope requis par l'endpoint (ex. transfers:write). | Identifiez le scope manquant dans message, régénérez une clé incluant ce scope, puis mettez à jour votre configuration. |
| validation_error | 400 ou 422 | Un paramètre est manquant, hors limites ou incohérent (par ex. Idempotency-Key hors de la plage 8 à 255 caractères). | Lisez message, corrigez le champ concerné, puis réessayez. |
| not_found | 404 | L'identifiant fourni n'existe pas dans cet espace. Par sécurité, l'API ne révèle pas s'il existe ailleurs. | Vérifiez l'identifiant et l'espace ciblé. Préférez la pagination par curseur aux identifiants codés en dur. |
| rate_limited | 429 | Le quota de requêtes par minute de l'espace est dépassé pour cette classe d'endpoint. | Lisez Retry-After, patientez, puis réessayez avec un repli exponentiel. |
| idempotency_conflict | 409 | Une Idempotency-Key déjà utilisée a été renvoyée avec un corps de requête différent. | Utilisez une Idempotency-Key neuve pour toute requête dont le contenu diffère. |
Erreurs d'idempotence
Lorsque vous fournissez un en-tête Idempotency-Key sur une écriture, deux situations particulières produisent un code HTTP 409. Avec le code idempotency_conflict, la même clé a déjà servi pour une requête dont le corps était différent : générez alors une nouvelle clé pour cette nouvelle requête. À l'inverse, un rejeu réussi (même clé, même corps) ne renvoie pas d'erreur : vous recevez la réponse d'origine, accompagnée de l'en-tête X-Coffrify-Idempotent-Replay: true qui signale qu'aucune nouvelle opération n'a été effectuée.
Lire les en-têtes de débit
Sur un code 429, l'en-tête Retry-After indique le nombre de secondes à attendre avant de réessayer. Sans attendre l'erreur, chaque réponse renvoie aussi les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset et X-RateLimit-Policy, qui vous permettent d'anticiper et de lisser votre cadence d'appels.
Bonnes pratiques de gestion
- Testez
error.codeplutôt que le texte deerror.message: seul le code est stable dans le temps. - Sur 429 et 5xx, mettez en place des nouvelles tentatives automatiques (repli exponentiel pour les 5xx, respect de
Retry-Afterpour les 429). - Ne rejouez jamais une 400, 401, 403, 404, 413 ou 422 à l'identique : corrigez d'abord la requête.
- Conservez systématiquement
request_iddans vos logs et transmettez-le au support pour toute investigation. - Pour les écritures, utilisez une
Idempotency-Keyde 8 à 255 caractères et générez-en une nouvelle dès que le corps de la requête change.