Gestion des erreurs
L’API renvoie des erreurs dans un format JSON cohérent. Le code HTTP indique la catégorie, le corps de la réponse donne le détail.
{
"timestamp": "2026-04-18T14:30:00Z",
"status": 400,
"error": "Bad Request",
"message": "L'email est déjà utilisé",
"path": "/api/auth/candidate/register"
}
Codes HTTP
| Code | Signification | Cause typique |
|---|
200 OK | Succès | Requête réussie |
201 Created | Ressource créée | Inscription, création d’offre |
204 No Content | Succès sans corps | Suppression, mise à jour silencieuse |
400 Bad Request | Requête invalide | Validation échouée, données manquantes |
401 Unauthorized | Non authentifié | Token absent, expiré ou invalide |
403 Forbidden | Non autorisé | Rôle insuffisant |
404 Not Found | Ressource introuvable | ID inexistant |
409 Conflict | Conflit | Email déjà inscrit, doublon |
422 Unprocessable Entity | Règle métier violée | Candidature déjà envoyée |
429 Too Many Requests | Rate limit dépassé | Trop de tentatives |
500 Internal Server Error | Erreur serveur | Bug ou panne ponctuelle |
Erreurs de validation
Pour une erreur de validation (code 400), les détails par champ sont fournis dans fieldErrors :
{
"timestamp": "2026-04-18T14:30:00Z",
"status": 400,
"error": "Validation failed",
"message": "Un ou plusieurs champs sont invalides",
"path": "/api/auth/candidate/register",
"fieldErrors": {
"email": "Format d'email invalide",
"password": "Doit contenir au moins 8 caractères",
"phoneNumber": "Numéro de téléphone camerounais requis"
}
}
Erreurs métier
| Message | HTTP | Contexte |
|---|
| ”Compte recruteur en attente de validation” | 403 | Recruteur non validé par l’admin |
| ”Entreprise non vérifiée” | 403 | L’entreprise n’est pas encore approuvée |
| ”Offre d’emploi non publiée” | 404 | Offre en brouillon ou fermée |
| ”Candidature déjà envoyée” | 409 | Le candidat a déjà postulé à cette offre |
| ”CV requis pour postuler” | 400 | Profil candidat incomplet |
| ”Limite d’offres actives atteinte” | 422 | Quota de publication dépassé |
Rate limiting
Les endpoints sensibles (login, register, forgot-password) sont limités par IP via Bucket4j. Un 429 Too Many Requests inclut l’en-tête Retry-After indiquant le délai en secondes avant de réessayer.