L'API Coffrify suit une convention d'erreur uniforme inspirée de Stripe : toute réponse non-2xx contient un objet error avec un code machine-lisible, un message humain et, le cas échéant, un param (champ invalide), des details et un doc_url. Le handler withApiHandler applique ce format à tous les endpoints et expose systématiquement les headers de rate-limit : X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-RateLimit-Policy (format <limite>;w=60). En cas de 429, le header Retry-After indique le nombre de secondes à attendre. Deux endpoints spécialisés complètent cet outillage : GET /v1/diagnostics/error/:code pour obtenir la documentation d'un code d'erreur, et GET /v1/status/services pour connaître l'état opérationnel de chaque service.
/v1/diagnostics/error/{code}Retourne la documentation enrichie d'un code d'erreur Coffrify : titre, explication, étapes de résolution et lien vers la doc officielle.GET/v1/status/servicesRetourne l'état opérationnel de chaque service Coffrify ainsi qu'un statut global agrégé (operational, degraded, partial_outage, major_outage, maintenance).Authentification
Ces deux endpoints acceptent une clé API valide dans l'en-tête Authorization: Bearer <clé>. Les préfixes reconnus sont cof_live_…, cof_test_…, cof_sandbox_… (clés complètes), cof_rk_live_… / cof_rk_test_… (clés restreintes) et cof_mcp_live_… / cof_mcp_test_… (tokens MCP). Aucun scope particulier n'est requis pour ces deux endpoints : la clé sert uniquement au passage par le rate-limiter.
Structure d'une réponse d'erreur
Toutes les erreurs partagent la même enveloppe : un objet error contenant un code stable (à tester dans votre logique) et un message lisible (à journaliser, pas à analyser). Le statut HTTP indique la famille, le code la cause précise.
Codes d'erreur réels
Le tableau ci-dessous liste les codes réellement renvoyés par l'API, leur statut HTTP et la marche à suivre. Distinguez les erreurs définitives (4xx, à corriger côté client) des erreurs transitoires (429, 5xx) qui justifient un retry.
| Code | HTTP | Quand | Résolution |
|---|---|---|---|
| missing_api_key | 401 | Aucun header Authorization fourni | Ajouter Authorization: Bearer cof_live_… à chaque requête |
| invalid_api_key | 401 | Préfixe non reconnu ou clé absente en base | Vérifier la clé complète (sans troncature) et la régénérer sur /developer/api-keys |
| expired_api_key | 401 | La clé avait une date d'expiration dépassée | Régénérer une clé sans expiration ou avec une date plus lointaine |
| revoked_api_key | 401 | Clé révoquée manuellement ou désactivée | Créer une nouvelle clé et mettre à jour les variables d'environnement |
| scope_missing | 403 | Le token ne possède pas le scope requis par l'endpoint | Régénérer un token avec le scope manquant (voir message d'erreur) |
| ip_not_allowed | 403 | L'IP du client ne figure pas dans la liste blanche de la clé | Ajouter l'IP ou désactiver la restriction IP sur la clé |
| rate_limited | 429 | Quota req/min dépassé sur la classe read, write ou expensive | Lire le header Retry-After et attendre avant de relancer |
| idempotency_conflict | 409 | Clé d'idempotence déjà utilisée avec un body différent | Utiliser une nouvelle clé d'idempotence ou rejouer le même body |
| validation_error | 400 | Champ manquant ou format invalide dans le body | Lire le champ param pour identifier le champ fautif |
| not_found | 404 | L'ID passé n'existe pas dans ce workspace | Vérifier l'ID dans le dashboard ou via pagination cursor |
| plan_limit | 403 | Fonctionnalité non disponible sur le plan courant | Consulter coffrify_list_pricing_plans et upgrader si nécessaire |
| quota_exceeded | 403 | Storage, bandwidth ou nombre de transferts actifs dépassé | Supprimer des transferts ou upgrader le plan |
| mfa_required | 403 | Scope sensible nécessitant un step-up MFA | Compléter le challenge MFA dans l'interface avant de relancer |
| internal_error | 500 | Erreur serveur inattendue | Réessayer avec backoff exponentiel, contacter le support avec X-Request-Id |
Interroger le catalogue d'erreurs
L'endpoint /v1/diagnostics/error/{code} renvoie la documentation enrichie d'un code donné (explication, étapes de résolution). Pratique pour afficher un message d'aide contextuel ou enrichir vos logs.
Implémenter un retry avec backoff exponentiel
Ne réessayez que les erreurs transitoires, et toujours avec un backoff exponentiel agrémenté d'un jitter, en respectant l'en-tête Retry-After lorsqu'il est présent. L'exemple ci-dessous implémente ce schéma dans chaque langage.
Voir aussi
- Authentification et clés API
- Rate limits et quotas
- Idempotence des requêtes POST
- Superviser l'état des services en temps réel
- Webhooks et événements api_key.expired
- Premiers pas avec le SDK Node