Erreurs
Un format unique pour toutes les erreurs, avec un code stable lisible par les machines et un message destiné aux humains.
{ "error": "entitlement_required", "message": "Guard is not enabled for this organisation", "details": { "upgrade": "/settings#plan" } }| Statut | error | Quand |
|---|---|---|
| 400 | invalid_body | Le corps n’a pas passé la validation ; details.fieldErrors indique les champs |
| 400 | invalid_json · invalid_query · empty | JSON mal formé, chaîne de requête invalide, contenu vide |
| 400 | no_agent_build · endpoint_required · no_connection | Projet pas prêt pour une exécution ou pour Guard |
| 400 | invalid_cron · unknown_template · no_scenarios | Planifications et exécutions |
| 400 | missing_signature · invalid_signature · turnstile_failed | Vérification des webhooks et des formulaires publics |
| 400 | config_error · invalid_provider · weak_password | Validation des paramètres |
| 400 | restricted_key_required · invalid_key_format · stripe_key_rejected · missing_permission · mode_mismatch · account_mismatch | Connexion ou renouvellement de Stripe : les clés live doivent être restreintes ; details.missing indique les permissions manquantes |
| 400 | project_required · egress_blocked · secret_required · not_configured | Observations et service d’accès |
| 401 | unauthorized · invalid_credentials | Identifiant absent ou incorrect |
| 402 | plan_limit_reached | Exécutions mensuelles de l’offre épuisées |
| 403 | forbidden · entitlement_required · wrong_password | Rôle insuffisant, fonctionnalité non débloquée |
| 404 | not_found · mandate_not_found · project_not_found · connection_not_found · agent_build_not_found | Inconnu ou ne vous appartenant pas |
| 409 | idempotency_key_reused · business_key_conflict | Même clé avec un corps différent ; même effet déjà proposé |
| 409 | digest_mismatch · approval_expired · not_reviewable · no_pending_approval · already_decided | Approbations |
| 409 | mandate_inactive · project_paused | Autorité terminée, ou le kill-switch est activé |
| 409 | slug_taken · exists · already_enabled · already_onboarded | Conflits |
| 409 | use_billing · billing_not_configured · already_subscribed · no_billing_account | Les changements d’offre passent par la facturation |
| 409 | connection_in_use | Des mandats actifs ou des opérations non terminées utilisent encore la connexion |
| 413 | payload_too_large | Corps au-delà de la limite |
| 422 | no_priced_models · no_valid_cases | Catalogue IA ou entrées de red team inutilisables |
| 429 | rate_limited | Trop de requêtes depuis cette IP |
| 500 | internal_error | Imprévu ; réessayez une fois, puis contactez le support en indiquant l’heure de la requête |
| 502 | sandbox_unavailable · sync_failed · stripe_unreachable | Une dépendance n’a pas répondu |
Les décisions ne sont pas des erreurs : un DENY est un 202 avec decision: "DENY" et des decision_reasons explicites. Les verdicts ne sont pas non plus des erreurs.