Générer un CSV
POST /v1/files/generate
Le corps est identique à celui de POST /v1/declarations/validate. Si une seule ligne est invalide, aucun fichier n'est produit et rien n'est compté : le portail officiel rejetterait la déclaration de toute façon.
Corps de la requête
| Champ | Colonne officielle | Notes |
|---|---|---|
type |
— | adf ou jdr |
declarant |
— | employer ou training_organization |
spec_version |
— | Facultatif. Par défaut la version courante. |
declarations[].id |
ID_DECLARATION |
Identifie la session. 500 titulaires maximum. |
declarations[].reference |
REFERENCE_DECLARATION |
|
declarations[].transferable_skills |
COMPETENCE_TRANSFERABLE |
Codes ROME. OF : 3 à 10, obligatoire. Employeur : 0 à 10. |
declarations[].training.name |
NOM_FORMATION |
|
…training.start_date, end_date |
DATE_DEBUT_FORMATION, DATE_FIN_FORMATION |
AAAA-MM-JJ ou jj/mm/aaaa. Pas dans le futur. |
…training.delivery_mode |
MODALITE_DISPENSE |
A_DISTANCE, PRESENTIEL, MIXTE |
…training.trainer_qualification |
QUALIFICATION_FORMATEUR |
voir GET /v1/spec |
…training.certifying |
FORMATION_CERTIFIANTE |
true / false |
…training.certification_code |
CERTIFICATION_VISEE |
Code RS, seulement si certifying: true |
…training.formacodes |
DOMAINE_FORMATION |
5 au plus, seulement si certifying: false |
…training.nsf_codes |
SPECIALITE_FORMATION |
3 au plus, seulement si certifying: false |
declarations[].certificate.* |
TYPE_JDR, NOM_JDR, NOM_OPTION_SPECIALITE, MODE_OBTENTION |
jdr uniquement |
holders[].unique_id |
ID_UNIQUE_PARTENAIRE |
Voir ci-dessous |
holders[].nir |
NIR |
13 caractères |
holders[].birth_name |
NOM_TITULAIRE |
Nom de naissance, 30 caractères au plus, sans troncature |
holders[].employer_siret |
SIRET_EMPLOYEUR |
OF uniquement |
holders[].employer_agreement |
PRESENCE_EMPLOYEUR |
OF uniquement. Déduit : true si employer_siret est fourni. |
holders[].employer_reference |
REFERENCE_EMPLOYEUR |
|
holders[].validity_start, validity_end |
DATE_DEBUT_VALIDITE, DATE_FIN_VALIDITE |
|
holders[].result, mention, proof_url, proof_id |
RESULTAT_OBTENU, … |
jdr uniquement |
Pour un jdr, omettre training revient à PRESENCE_FORMATION = NON.
unique_id : à générer une fois pour toutes
Le portail refuse un ID_UNIQUE_PARTENAIRE déjà vu dans n'importe quel fichier que vous avez déposé auparavant. Nous ne pouvons pas le vérifier, et nous ne conservons pas ces identifiants. Construisez-le à partir de clés stables de votre base, par exemple {id_session}-{id_salarié}.
Options
| Option | Défaut | Effet |
|---|---|---|
store |
true |
false : le CSV revient dans content et n'est jamais écrit sur disque |
retention_hours |
24 | Durée de conservation, 24 au plus |
strict_references |
true |
false : un code absent des référentiels SST devient un avertissement |
formula_policy |
reject |
Valeurs de texte commençant par = + - @ : reject, warn ou allow |
Réponse
{
"success": true,
"file_id": "file_3f9a1c0e5b7d2a4c6e8f0a1b",
"mode": "live",
"spec_version": "2026-02",
"rows": 2,
"declarations": 1,
"filename": "prevenapi_adf_20260919_3f9a1c0e.csv",
"sha256": "…",
"stored": true,
"expires_at": "2026-09-20T09:12:44Z",
"download_url": "https://api.prevenapi.fr/v1/files/file_3f9a…/download",
"warnings": [],
"normalizations": [{"field": "declarations[0].training.nsf_codes", "column": "SPECIALITE_FORMATION", "rule": "CODE_NORMALIZED"}]
}
GET /v1/files/{id} renvoie les métadonnées, GET /v1/files/{id}/download le CSV (410 une fois expiré).
Ce qui est normalisé, et ce qui ne l'est jamais
Normalisé, et listé dans normalizations (sans jamais y recopier la valeur) : espaces, Unicode NFC, dates vers jj/mm/aaaa, casse des énumérations (présentiel → PRESENTIEL), séparateurs dans un SIRET ou un NIR, casse des codes NSF et RS, NIR à 15 caractères dont la clé est juste.
Jamais corrigé : un code qui n'existe pas, un nom, une date impossible, un SIRET à clé fausse. 24048 ne devient pas 24049.
Format produit
UTF-8 sans BOM, séparateur |, fins de ligne CRLF, aucun guillemet, en-têtes dans l'ordre de la trame officielle. Un | ou un saut de ligne dans une valeur est refusé (INVALID_CHARACTER) : le format ne permet pas de l'écrire.
Idempotence
Envoyez Idempotency-Key: <valeur unique> sur les appels que vous pourriez rejouer. Le même couple clé + corps renvoie le même file_id sans être recompté. La même clé avec un corps différent répond 409 IDEMPOTENCY_KEY_REUSED.