Erreurs & limites
Format unifié des erreurs et règles d'enforcement des plans SaaSes.
Format unifié
Toutes les erreurs suivent la même enveloppe JSON :
{
"error": "SNAKE_CASE_ERROR_CODE",
"message": "Description lisible",
"details": { /* contexte additionnel, optionnel */ }
}Codes HTTP utilisés
| Code | Signification |
|---|---|
| 200 | Succès |
| 201 | Ressource créée |
| 202 | Accepté (asynchrone — par exemple forgot-password) |
| 204 | Succès, pas de corps |
| 400 | Requête invalide — champs manquants ou transition d’état illégale |
| 401 | Authentification absente ou invalide |
| 402 | Limite de plan dépassée — upgrade requis |
| 403 | Authentifié mais pas autorisé (rôle insuffisant, tenant suspendu) |
| 404 | Ressource non trouvée |
| 409 | Conflit — slug déjà pris, tenant déjà abonné, etc. |
| 422 | Validation sémantique échouée (par ex. routingConfig mal formé) |
| 429 | Quota d’appels API mensuel épuisé |
| 500 | Erreur serveur interne |
Validation (422)
{
"error": "VALIDATION_FAILED",
"message": "Request validation failed",
"details": {
"fields": [
{ "field": "email", "message": "must be a valid email address" },
{ "field": "slug", "message": "must match pattern ^[a-z0-9-]{3,50}$" }
]
}
}Le tableau details.fieldscontient les erreurs par champ. L'UI les affiche directement sous chaque input concerné.
Limites de plan (402)
SaaSes vérifie de façon synchrone les limites de votre plan SaaSes avant chaque opération de création :
{
"error": "PLAN_LIMIT_EXCEEDED",
"limit": "maxApplications",
"current": 1,
"max": 1,
"upgradeTo": "Starter"
}Limites vérifiées : maxApplications, maxManagedTenants, maxMembers, apiCallsPerMonth.
Quota d'appels API mensuel
Reset le 1er du mois UTC
À 80% du quota, un avertissement est émis (visible dans le tableau de bord et envoyé par email si activé). À 100%, l'API de résolution renvoie 429 jusqu'au prochain reset ou jusqu'à un upgrade de plan.
Tout est audité
Chaque mutation est tracée dans le journal d'audit immuable. Vous y trouverez l'auteur (email ou systempour les jobs planifiés), l'entité concernée, les champs before et after, et la raison fournie.