> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wethehivers.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Erreurs

> Format des erreurs et codes HTTP renvoyés par l'API

# 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.

## Format standard

```json theme={null}
{
  "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` :

```json theme={null}
{
  "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

<Tip>
  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.
</Tip>
