Candidature
Une candidature (Candidature) est la soumission d’un candidat pour une offre donnée, avec CV et lettre de motivation.
Schéma
Exemple JSON
{
"id": 9001,
"offre": { "id": 123, "titre": "Développeur Backend Java (H/F)" },
"candidat": { "id": 42, "firstName": "Jean", "lastName": "Ngassa" },
"cv": { "id": 17, "fileName": "cv-jean-ngassa.pdf", "downloadUrl": "/v1/api/files/cv/17" },
"lettreMotivation": "Madame, Monsieur, je vous présente ma candidature...",
"status": "IN_PROGRESS",
"appliedAt": "2026-04-16T14:20:00Z",
"lastStatusChange": "2026-04-17T09:00:00Z",
"timeline": [
{ "type": "STATUS_CHANGE", "fromStatus": null, "toStatus": "NEW", "at": "2026-04-16T14:20:00Z" },
{ "type": "STATUS_CHANGE", "fromStatus": "NEW", "toStatus": "TO_MEET", "at": "2026-04-16T16:45:00Z" },
{ "type": "NOTE", "content": "Bon profil, à contacter", "authorId": 42, "at": "2026-04-17T09:00:00Z" },
{ "type": "STATUS_CHANGE", "fromStatus": "TO_MEET", "toStatus": "IN_PROGRESS", "at": "2026-04-17T09:00:00Z" }
]
}
Pipeline de statuts
| Statut | Description | Côté candidat |
|---|
NEW | Reçue, non traitée | ”En cours d’examen” |
TO_MEET | Recruteur intéressé | ”En cours d’examen” |
IN_PROGRESS | Traitement actif | ”En cours d’examen” |
INTERVIEWED | Entretien passé | ”Entretien effectué” |
HIRED | Retenu | ”Félicitations, retenu !” |
REJECTED | Refusé | ”Non retenu” (+ motif optionnel) |
WITHDRAWN | Retiré par candidat | ”Retirée” |
Transitions autorisées
Un rollback 24h est possible après HIRED / REJECTED pour corriger une erreur de clic. Passé ce délai, la décision est verrouillée.
Événements émis
Double-postulation interdite
CREATE UNIQUE INDEX uq_candidature_active
ON candidatures(offre_id, candidat_id)
WHERE status NOT IN ('REJECTED', 'WITHDRAWN');
Endpoints principaux
| Méthode | Path | Rôle |
|---|
POST | /v1/api/offres/{id}/apply | Candidat postule |
GET | /v1/api/candidats/me/candidatures | Historique candidat |
GET | /v1/api/recruteur/candidatures | File recruteur |
PATCH | /v1/api/recruteur/candidatures/{id} | Changer statut |
POST | /v1/api/candidats/me/candidatures/{id}/withdraw | Retirer |
GET | /v1/api/admin/candidatures/{id} | Admin |
Suppression / anonymisation
Une candidature ne peut pas être supprimée — elle peut être anonymisée en cas de droit à l’effacement du candidat. candidatId devient NULL, les notes recruteur sont conservées pour les stats.