ELRM developer Bac à sable

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.

  1. Choisir les offres au tarif du client, GET /formations
  2. Déposer l'analyse du besoin, POST /analyses-besoin
  3. Créer le dossier (le devis) à partir d'elle, POST /dossiers
  4. 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ée clients: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 par stage (?stage=inscriptions_ouvertes : ceux où vous avez quelque chose à faire) et updated_since.
  • GET /dossiers/{id}/suivi : étape, actions, montants, lignes.