De l'analyse du besoin au dossier#
Le parcours complet d'un dossier de formation, piloté depuis votre système. Votre portail client (« Nouveau devis ») appelle exactement ces routes.
- Choisir les offres au tarif du client,
GET /formations - Déposer l'analyse du besoin,
POST /analyses-besoin - Créer le dossier (le devis) à partir d'elle,
POST /dossiers - Inscrire les apprenants : voir le guide suivant
Les portées requises : clients:dossiers:read, clients:analyses:write, clients:dossiers:write ; clients:analyses:read pour relire vos analyses.
1. Choisir les offres#
Voir Consulter le catalogue. Retenez les offres[].id voulus.
2. Déposer l'analyse du besoin#
L'analyse du besoin est une exigence Qualiopi : qui former, pourquoi, avec quel parcours. L'entreprise elle-même est reprise de la fiche client ELRM, elle n'est pas dans le corps.
curl -X POST "https://developer.elrm.app/sandbox/v1/analyses-besoin" \
-H "Authorization: Bearer pk_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"offre_ids": ["a1b2…"],
"contact_nom": "Marie Dupont",
"contact_email": "m.dupont@exemple.fr",
"contact_telephone": "01 23 45 67 89",
"nb_personnes": 4,
"profil_personnes": "Conducteurs d’engins, 2 à 10 ans d’expérience",
"objectifs_pro": "Renouvellement CACES R482 catégories A et C1",
"parcours_souhaite": "Formation courte, examen en fin de session",
"financements": ["opco"]
}'
analyse = api.post(f"/analyses-besoin", json={
"offre_ids": ["a1b2…"],
"contact_nom": "Marie Dupont",
"contact_email": "m.dupont@exemple.fr",
"contact_telephone": "01 23 45 67 89",
"nb_personnes": 4,
"profil_personnes": "Conducteurs d’engins, 2 à 10 ans d’expérience",
"objectifs_pro": "Renouvellement CACES R482 catégories A et C1",
"parcours_souhaite": "Formation courte, examen en fin de session",
"financements": ["opco"],
}, headers={"Idempotency-Key": str(uuid.uuid4())}).json()
analyse_id = analyse["id"]
Réponse 201 :
{
"id": "7d1e…", "client_id": "…", "dossier_id": null,
"label": "Analyse du besoin, CERTALIS", "formation": "R482, 3 catégories, expérimenté",
"contact_nom": "Marie Dupont", "contact_email": "m.dupont@exemple.fr",
"offre_ids": ["a1b2…"], "created_at": "…", "updated_at": "…"
}
financements accepte entreprise, opco, cpf, france_travail, prive, autre. dossier_id restera null jusqu'à l'étape suivante.
3. Créer le dossier#
Le dossier référence l'analyse et décrit les lignes : une offre, un nombre d'apprenants, une période souhaitée, et le cas échéant les catégories d'engins à passer. Vous ne saisissez aucun prix : un champ de prix dans le corps répond 422.
curl -X POST "https://developer.elrm.app/sandbox/v1/dossiers" \
-H "Authorization: Bearer pk_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"analyse_besoin_id": "7d1e…",
"lignes": [
{ "offre_id": "a1b2…", "nb_apprenants": 4, "date_debut": "2026-10-01", "date_fin": "2026-10-31", "categories_session": ["A", "C1"] }
],
"financement": "opco",
"chez_le_client": false,
"commentaire": "Merci de privilégier le centre de Gennevilliers."
}'
dossier = api.post(f"/dossiers", json={
"analyse_besoin_id": analyse_id,
"lignes": [{
"offre_id": "a1b2…", "nb_apprenants": 4,
"date_debut": "2026-10-01", "date_fin": "2026-10-31",
"categories_session": ["A", "C1"],
}],
"financement": "opco",
"commentaire": "Merci de privilégier le centre de Gennevilliers.",
}, headers={"Idempotency-Key": str(uuid.uuid4())}).json()
dossier_id = dossier["id"]
print(dossier["numero"], dossier["stage"], dossier["montant_ht"])
Réponse 201 :
{
"id": "…", "numero": "D2026-1400", "statut": "accepte",
"stage": "inscriptions_ouvertes", "allowed_actions": ["set_apprenants", "validate_inscriptions"],
"client_id": "…", "analyse_besoin_id": "7d1e…",
"montant_ht": 2808.0, "montant_ttc": 2808.0, "remise_pct": 10.0,
"lignes": [
{ "offre_id": "a1b2…", "formation_label": "R482, 3 catégories, expérimenté", "nb_apprenants": 4,
"date_debut": "2026-10-01", "date_fin": "2026-10-31", "categories_session": ["A", "C1"],
"prix_unitaire_ht": 780.0, "remise_pct": 10.0, "montant_ht": 2808.0 }
],
"reference_client": "", "created_at": "…", "updated_at": "…"
}
Autres champs utiles : centre_id (centre souhaité, voir GET /centres), chez_le_client + lieu_adresse / lieu_code_postal / lieu_ville (formation dans vos locaux). financement accepte entreprise, opco, cpf, france_travail, prive, autre.
4. Et ensuite#
Le dossier est accepté et les inscriptions sont ouvertes dès la réponse 201 : aucune confirmation, aucun bon de commande à envoyer. (Créé depuis votre portail client, le même dossier part d'abord en signature à votre contact : il est accepté à la signature.) Les prix sont ceux du catalogue à votre remise, calculés par l'organisme. Si le dossier doit être retouché (dates, effectifs), c'est ELRM qui le fait dans le CRM ; vous le voyez dans le journal des événements.
Place aux apprenants : Inscrire et répartir les apprenants.
Relire ses analyses et dossiers#
GET /analyses-besoin({ items, total }) et…/analyses-besoin/{id}(portéeclients:analyses:read) : vos analyses, celles déposées par l'API ou depuis votre portail.GET /dossiers: tous vos dossiers, y compris ceux créés hors API ; filtrable parstage(?stage=inscriptions_ouvertes: ceux où vous avez quelque chose à faire) etupdated_since.GET /dossiers/{id}/suivi: étape, actions, montants, lignes.