PrevenAPI

Documentation

Spécification 2026-02 · API v1

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ésentielPRESENTIEL), 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.