---
title: "Soumet une candidature publique à une offre."
method: POST
path: "/api/v1/recrutement/public/applications"
tags: ["Recrutement / ATS (V2)"]
---

# Soumet une candidature publique à une offre.

`POST /api/v1/recrutement/public/applications`

## Request

- Base URL: `https://erp.eyeot.fr/api/v1`
- URL: `https://erp.eyeot.fr/api/v1/api/v1/recrutement/public/applications`
- Auth: none declared

Soumet une candidature publique à une offre.

    Accepte :
    - `application/json` (form classique sans CV)
    - `multipart/form-data` (form avec champ `cv` upload PDF/DOCX 5MB max, Lot 7)

    Défense en profondeur (cf docs/patterns/integrations-public-endpoints.md) :
    1. Schema valide (firstname/lastname/email/posting_id obligatoires)
    2. Honeypot `website` vide → sinon 422 (bot detecté)
    3. Posting existe, status=published, is_active=True
    4. Dedup Redis (email, posting, 24h) → sinon 200 idempotent silencieux
    5. hCaptcha vérifié (si HCAPTCHA_SECRET configuré)
    6. Anti-discrimination : schema rejette déjà les 24 champs interdits
    7. CV : MIME whitelist + magic-bytes + size 5MB max (Lot 7)

## Request body

- PublicApplicationCreate
  - `consent_vivier` boolean
  - `cover_letter` string, nullable
  - `email` string, email, required
  - `firstname` string, required
  - `hcaptcha_token` string, nullable
  - `lastname` string, required
  - `phone` string, nullable
  - `posting_id` string, uuid, required
  - `prequalif_answers` object, nullable
  - `website` string, nullable
  - `years_experience` integer, nullable

## Response `200`

Succès — payload `{data, meta}` (cf. API-GUIDE §3.1)

## Other responses

- `201`: Ressource créée. ID dans `data.id`.
- `400`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `404`: Ressource introuvable (ou cross-tenant — équivalent à hidden).
- `409`: État incohérent (email dupliqué, ressource déjà dans cet état, etc.).
- `422`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `429`: Trop de requêtes. Honorer le header `Retry-After` (secondes).

---

[API](https://skmtc.dev/eyeot/apis/eyeot-erp-api.md) · [All operations](https://skmtc.dev/eyeot/apis/eyeot-erp-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eyeot/apis/eyeot-erp-api/revisions/42ab95222a89?raw)
