Aller au contenu principal
QualiForma
CatalogueDevenir formateurQualiopiIADéveloppeurs
Connexion
  • Catalogue
  • Devenir formateur
  • Qualiopi
  • IA
  • Développeurs
  • Connexion
  • Vue d'ensemble

Démarrage

  • Quickstart
  • Authentification

Référence

  • API Reference (Scalar)

Endpoints

  • Tous les endpoints

Cœur LMS

  • Tenants
  • Utilisateurs
  • Formations
  • Inscriptions
  • Sessions live

Conformité Qualiopi

  • Dashboard Qualiopi
  • Conformité
  • Émargement
  • Questionnaires
  • Réclamations
  • Plans d'amélioration
  • Parcours adaptatifs
  • Compétences formateurs
  • BPF
  • Médiateurs

Paiements & Facturation

  • Paiements
  • Facturation Factur-X
  • Webhooks

Design System

  • Vue d'ensemble
  • Couleurs
  • Typographie
  • Espacement
  • Elevation
  • Motion
  • Radius
  • Composants
  • · Formulaires
  • · Feedback
  • · Navigation
  • · Progression
  • · Données
Swagger UI (s'ouvre dans un nouvel onglet)
  1. Développeurs
  2. Endpoints
  3. Parcours adaptatifs

Parcours adaptatifs

Critère Qualiopi 3 — adaptation de la formation aux besoins du bénéficiaire. Génération d’un quiz POSITIONING via Mistral (25 cr), puis d’un parcours 1:1 par apprenant (30 cr) appliquant des règles de skip et d’extra lessons. Le LessonAccessGuard verrouille les leçons en fonction du parcours.

Endpoints

get/api/v1/adaptive-paths

Lister les définitions de parcours adaptatifs

Retourne toutes les définitions de parcours adaptatifs du tenant. Une définition est attachée à un cours et peut générer N parcours individualisés (1 par enrollment).

  • AdaptivePaths
  • Qualiopi
  • AI

Paramètres

NomTypeRequisExempleDescription
courseIdquerynoncrs_excel_adv_2026Filtrer par cours associé

Réponses

  • 200Définitions paginées
    Réponse 200 · JSON
    {
      "data": [
        {
          "id": "apt_3f9a12",
          "name": "Excel Avancé — parcours adaptatif",
          "description": "Skip des leçons fondamentales si le quiz de positionnement dépasse 80%. Ajoute un module Power Query si score Macros >= 60%.",
          "baseCourseId": "crs_excel_adv_2026",
          "rules": [
            {
              "skipIfScoreAbove": 80,
              "lessonId": "les_intro_excel"
            },
            {
              "skipIfScoreAbove": 80,
              "lessonId": "les_formules_base"
            }
          ],
          "extraLessons": [
            {
              "triggerScore": 60,
              "lessonId": "les_power_query_intro"
            }
          ],
          "createdAt": "2026-04-01T10:00:00Z"
        }
      ],
      "meta": {
        "total": 1,
        "page": 1,
        "perPage": 20
      }
    }
  • 401Non authentifié

Exemples

GET /api/v1/adaptive-paths · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/adaptive-paths?courseId=crs_excel_adv_2026 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/adaptive-paths · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/adaptive-paths?courseId=crs_excel_adv_2026', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
GET /api/v1/adaptive-paths · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/adaptive-paths?courseId=crs_excel_adv_2026',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
GET /api/v1/adaptive-paths · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->get('adaptive-paths?courseId=crs_excel_adv_2026', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
get/api/v1/adaptive-paths/:id

Détail d’une définition de parcours

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
idpathouiapt_3f9a12—

Réponses

  • 200Définition trouvée
    Réponse 200 · JSON
    {
      "data": {
        "id": "apt_3f9a12",
        "name": "Excel Avancé — parcours adaptatif",
        "description": "Skip des leçons fondamentales si le quiz de positionnement dépasse 80%. Ajoute un module Power Query si score Macros >= 60%.",
        "baseCourseId": "crs_excel_adv_2026",
        "rules": [
          {
            "skipIfScoreAbove": 80,
            "lessonId": "les_intro_excel"
          },
          {
            "skipIfScoreAbove": 80,
            "lessonId": "les_formules_base"
          }
        ],
        "extraLessons": [
          {
            "triggerScore": 60,
            "lessonId": "les_power_query_intro"
          }
        ],
        "createdAt": "2026-04-01T10:00:00Z"
      }
    }
  • 404Définition introuvable

Exemples

GET /api/v1/adaptive-paths/:id · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/adaptive-paths/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
GET /api/v1/adaptive-paths/:id · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
GET /api/v1/adaptive-paths/:id · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->get('adaptive-paths/apt_3f9a12', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/adaptive-paths

Créer une définition de parcours adaptatif

Définit les règles de skip et d'extra lessons à appliquer en fonction du score du quiz de positionnement. À créer une fois par cours.

  • AdaptivePaths
  • AI

Corps de requête

Content-Type : application/json

Body · JSON
{
  "name": "Excel Avancé — parcours adaptatif",
  "description": "Skip des leçons fondamentales si quiz >= 80%.",
  "baseCourseId": "crs_excel_adv_2026",
  "rules": [
    {
      "skipIfScoreAbove": 80,
      "lessonId": "les_intro_excel"
    },
    {
      "skipIfScoreAbove": 80,
      "lessonId": "les_formules_base"
    }
  ],
  "extraLessons": [
    {
      "triggerScore": 60,
      "lessonId": "les_power_query_intro"
    }
  ]
}

Réponses

  • 201Définition créée
    Réponse 201 · JSON
    {
      "data": {
        "id": "apt_3f9a12"
      }
    }
  • 400Validation échouée (cours introuvable, leçon hors cours)

Exemples

POST /api/v1/adaptive-paths · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/adaptive-paths \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Excel Avancé — parcours adaptatif",
  "description": "Skip des leçons fondamentales si quiz >= 80%.",
  "baseCourseId": "crs_excel_adv_2026",
  "rules": [
    {
      "skipIfScoreAbove": 80,
      "lessonId": "les_intro_excel"
    },
    {
      "skipIfScoreAbove": 80,
      "lessonId": "les_formules_base"
    }
  ],
  "extraLessons": [
    {
      "triggerScore": 60,
      "lessonId": "les_power_query_intro"
    }
  ]
}'
POST /api/v1/adaptive-paths · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/adaptive-paths', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Excel Avancé — parcours adaptatif",
    "description": "Skip des leçons fondamentales si quiz >= 80%.",
    "baseCourseId": "crs_excel_adv_2026",
    "rules": [
      {
        "skipIfScoreAbove": 80,
        "lessonId": "les_intro_excel"
      },
      {
        "skipIfScoreAbove": 80,
        "lessonId": "les_formules_base"
      }
    ],
    "extraLessons": [
      {
        "triggerScore": 60,
        "lessonId": "les_power_query_intro"
      }
    ]
  }),
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
POST /api/v1/adaptive-paths · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/adaptive-paths',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'name': 'Excel Avancé — parcours adaptatif',
        'description': 'Skip des leçons fondamentales si quiz >= 80%.',
        'baseCourseId': 'crs_excel_adv_2026',
        'rules': [
            {
                'skipIfScoreAbove': 80,
                'lessonId': 'les_intro_excel',
            },
            {
                'skipIfScoreAbove': 80,
                'lessonId': 'les_formules_base',
            },
        ],
        'extraLessons': [
            {
                'triggerScore': 60,
                'lessonId': 'les_power_query_intro',
            },
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/adaptive-paths · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->post('adaptive-paths', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'name' => 'Excel Avancé — parcours adaptatif',
            'description' => 'Skip des leçons fondamentales si quiz >= 80%.',
            'baseCourseId' => 'crs_excel_adv_2026',
            'rules' => [
                [
                    'skipIfScoreAbove' => 80,
                    'lessonId' => 'les_intro_excel',
                ],
                [
                    'skipIfScoreAbove' => 80,
                    'lessonId' => 'les_formules_base',
                ],
            ],
            'extraLessons' => [
                [
                    'triggerScore' => 60,
                    'lessonId' => 'les_power_query_intro',
                ],
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
patch/api/v1/adaptive-paths/:id

Mettre à jour une définition de parcours

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
idpathouiapt_3f9a12—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "rules": [
    {
      "skipIfScoreAbove": 75,
      "lessonId": "les_intro_excel"
    }
  ]
}

Réponses

  • 200Définition mise à jour
    Réponse 200 · JSON
    {
      "data": {
        "id": "apt_3f9a12"
      }
    }
  • 404Définition introuvable

Exemples

PATCH /api/v1/adaptive-paths/:id · cURL / Shell
curl -X PATCH https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "rules": [
    {
      "skipIfScoreAbove": 75,
      "lessonId": "les_intro_excel"
    }
  ]
}'
PATCH /api/v1/adaptive-paths/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12', {
  method: 'PATCH',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "rules": [
      {
        "skipIfScoreAbove": 75,
        "lessonId": "les_intro_excel"
      }
    ]
  }),
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
PATCH /api/v1/adaptive-paths/:id · Python
import requests

response = requests.patch(
    'https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'rules': [
            {
                'skipIfScoreAbove': 75,
                'lessonId': 'les_intro_excel',
            },
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
PATCH /api/v1/adaptive-paths/:id · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->patch('adaptive-paths/apt_3f9a12', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'rules' => [
                [
                    'skipIfScoreAbove' => 75,
                    'lessonId' => 'les_intro_excel',
                ],
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
delete/api/v1/adaptive-paths/:id

Supprimer une définition

Supprime la définition. Les parcours individuels déjà générés (LearnerAdaptivePath) restent intacts.

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
idpathouiapt_3f9a12—

Réponses

  • 204Définition supprimée
  • 404Définition introuvable

Exemples

DELETE /api/v1/adaptive-paths/:id · cURL / Shell
curl -X DELETE https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
DELETE /api/v1/adaptive-paths/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
DELETE /api/v1/adaptive-paths/:id · Python
import requests

response = requests.delete(
    'https://api.qualiforma.site/api/v1/adaptive-paths/apt_3f9a12',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
DELETE /api/v1/adaptive-paths/:id · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->delete('adaptive-paths/apt_3f9a12', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/courses/:courseId/positioning-quiz/generate

Générer un quiz de positionnement (Mistral)

Génère via Mistral un quiz POSITIONING basé sur les objectifs et le contenu du cours. Coût : 25 crédits IA. Le quiz est rattaché au cours et présenté en début d'enrollment.

  • AdaptivePaths
  • AI
  • Credits

Paramètres

NomTypeRequisExempleDescription
courseIdpathouicrs_excel_adv_2026—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "questionCount": 12,
  "difficultyMix": {
    "easy": 0.3,
    "medium": 0.5,
    "hard": 0.2
  },
  "topics": [
    "formules",
    "tcd",
    "macros"
  ]
}

Réponses

  • 201Quiz généré
    Réponse 201 · JSON
    {
      "data": {
        "questionnaireId": "qst_pos_b2c1f4",
        "type": "POSITIONING",
        "questionCount": 12,
        "creditsConsumed": 25
      }
    }
  • 402Crédits IA insuffisants (75 requis pour la salle d’IA, voir credit-store)
  • 404Cours introuvable

Exemples

POST /api/v1/courses/:courseId/positioning-quiz/generate · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/courses/crs_excel_adv_2026/positioning-quiz/generate \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "questionCount": 12,
  "difficultyMix": {
    "easy": 0.3,
    "medium": 0.5,
    "hard": 0.2
  },
  "topics": [
    "formules",
    "tcd",
    "macros"
  ]
}'
POST /api/v1/courses/:courseId/positioning-quiz/generate · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/courses/crs_excel_adv_2026/positioning-quiz/generate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "questionCount": 12,
    "difficultyMix": {
      "easy": 0.3,
      "medium": 0.5,
      "hard": 0.2
    },
    "topics": [
      "formules",
      "tcd",
      "macros"
    ]
  }),
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
POST /api/v1/courses/:courseId/positioning-quiz/generate · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/courses/crs_excel_adv_2026/positioning-quiz/generate',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'questionCount': 12,
        'difficultyMix': {
            'easy': 0.3,
            'medium': 0.5,
            'hard': 0.2,
        },
        'topics': [
            'formules',
            'tcd',
            'macros',
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/courses/:courseId/positioning-quiz/generate · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->post('courses/crs_excel_adv_2026/positioning-quiz/generate', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'questionCount' => 12,
            'difficultyMix' => [
                'easy' => 0.3,
                'medium' => 0.5,
                'hard' => 0.2,
            ],
            'topics' => [
                'formules',
                'tcd',
                'macros',
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/learner-adaptive-paths/generate

Générer un parcours individualisé (Mistral)

Calcule le parcours adaptatif d'un apprenant à partir de ses réponses au quiz POSITIONING. Coût : 30 crédits IA. Le parcours résultant est stocké en 1:1 avec l'Enrollment.

  • AdaptivePaths
  • AI
  • Credits

Corps de requête

Content-Type : application/json

Body · JSON
{
  "enrollmentId": "enr_a1b2c3",
  "positioningResponseId": "qresp_d4e5f6"
}

Réponses

  • 201Parcours généré
    Réponse 201 · JSON
    {
      "data": {
        "id": "lap_9c8b7a",
        "enrollmentId": "enr_a1b2c3",
        "skippedLessons": [
          "les_intro_excel",
          "les_formules_base"
        ],
        "extraLessons": [
          "les_power_query_intro"
        ],
        "orderedLessonIds": [
          "les_tcd_intro",
          "les_tcd_avance",
          "les_power_query_intro",
          "les_macros_vba"
        ],
        "creditsConsumed": 30
      }
    }
  • 400Quiz POSITIONING non passé (enrollment toujours en PENDING_POSITIONING)
  • 402Crédits IA insuffisants

Exemples

POST /api/v1/learner-adaptive-paths/generate · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/learner-adaptive-paths/generate \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "enrollmentId": "enr_a1b2c3",
  "positioningResponseId": "qresp_d4e5f6"
}'
POST /api/v1/learner-adaptive-paths/generate · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/learner-adaptive-paths/generate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "enrollmentId": "enr_a1b2c3",
    "positioningResponseId": "qresp_d4e5f6"
  }),
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
POST /api/v1/learner-adaptive-paths/generate · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/learner-adaptive-paths/generate',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'enrollmentId': 'enr_a1b2c3',
        'positioningResponseId': 'qresp_d4e5f6',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/learner-adaptive-paths/generate · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->post('learner-adaptive-paths/generate', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'enrollmentId' => 'enr_a1b2c3',
            'positioningResponseId' => 'qresp_d4e5f6',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
get/api/v1/learner-adaptive-paths/:enrollmentId

Parcours adaptatif d’un apprenant

Retourne le parcours adaptatif lié à l'inscription. Si l'enrollment n'a pas encore généré de parcours, renvoie 404 — le quiz POSITIONING doit avoir été complété.

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
enrollmentIdpathouienr_a1b2c3Identifiant Enrollment 1:1

Réponses

  • 200Parcours trouvé
    Réponse 200 · JSON
    {
      "data": {
        "id": "lap_9c8b7a",
        "enrollmentId": "enr_a1b2c3",
        "skippedLessons": [
          "les_intro_excel",
          "les_formules_base"
        ],
        "extraLessons": [
          "les_power_query_intro"
        ],
        "orderedLessonIds": [
          "les_tcd_intro",
          "les_tcd_avance",
          "les_macros_vba"
        ],
        "generatedAt": "2026-04-12T14:32:00Z",
        "lastRecalculatedAt": "2026-05-02T09:15:00Z"
      }
    }
  • 404Aucun parcours généré pour cet enrollment

Exemples

GET /api/v1/learner-adaptive-paths/:enrollmentId · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/learner-adaptive-paths/:enrollmentId · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
GET /api/v1/learner-adaptive-paths/:enrollmentId · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
GET /api/v1/learner-adaptive-paths/:enrollmentId · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->get('learner-adaptive-paths/enr_a1b2c3', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/learner-adaptive-paths/:enrollmentId/recalculate

Recalculer le parcours en cours de route

Réévalue le parcours à partir des derniers résultats de l'apprenant (mid-course quiz, progression). Gratuit (sans crédits IA) si réutilise le contexte déjà persisté.

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
enrollmentIdpathouienr_a1b2c3—

Réponses

  • 200Parcours recalculé
    Réponse 200 · JSON
    {
      "data": {
        "id": "lap_9c8b7a",
        "extraLessons": [
          "les_power_query_intro",
          "les_pivot_avance"
        ],
        "lastRecalculatedAt": "2026-05-15T11:00:00Z"
      }
    }
  • 404Parcours inexistant — appeler /generate d’abord

Exemples

POST /api/v1/learner-adaptive-paths/:enrollmentId/recalculate · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recalculate \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
POST /api/v1/learner-adaptive-paths/:enrollmentId/recalculate · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recalculate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
POST /api/v1/learner-adaptive-paths/:enrollmentId/recalculate · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recalculate',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/learner-adaptive-paths/:enrollmentId/recalculate · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->post('learner-adaptive-paths/enr_a1b2c3/recalculate', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
get/api/v1/learner-adaptive-paths/:enrollmentId/recommended-next

Prochaine leçon recommandée

Retourne la prochaine leçon à présenter à l'apprenant dans son parcours adaptatif. Respecte les règles skip/extra et le verrouillage du LessonAccessGuard.

  • AdaptivePaths
  • AI

Paramètres

NomTypeRequisExempleDescription
enrollmentIdpathouienr_a1b2c3—

Réponses

  • 200Leçon recommandée
    Réponse 200 · JSON
    {
      "data": {
        "lessonId": "les_tcd_avance",
        "title": "Tableaux croisés dynamiques — usages avancés",
        "positionInPath": 3,
        "totalLessons": 11
      }
    }
  • 204Parcours terminé — aucune leçon recommandée
  • 404Parcours inexistant

Exemples

GET /api/v1/learner-adaptive-paths/:enrollmentId/recommended-next · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recommended-next \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/learner-adaptive-paths/:enrollmentId/recommended-next · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recommended-next', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
  },
});

if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data);
GET /api/v1/learner-adaptive-paths/:enrollmentId/recommended-next · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/learner-adaptive-paths/enr_a1b2c3/recommended-next',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
GET /api/v1/learner-adaptive-paths/:enrollmentId/recommended-next · PHP
<?php

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

$client = new Client(['base_uri' => 'https://api.qualiforma.site/api/v1/']);

try {
    $response = $client->get('learner-adaptive-paths/enr_a1b2c3/recommended-next', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
QualiForma

La plateforme de formation professionnelle certifiee Qualiopi.

Plateforme

  • Catalogue
  • Espace formateur
  • Étude de besoin

Societe

  • A propos
  • Contact

Ressources

  • Développeurs
  • Référence API
  • Webhooks

Legal

  • CGV
  • Mentions legales
  • Confidentialite

Catalogue par catégorie

  • Management
  • Digital
  • Communication
  • Langues
  • Sécurité
  • Gestion

Comparatifs

  • QualiForma vs Didask
  • QualiForma vs Edusign
  • QualiForma vs Klaxoon
  • QualiForma vs 360Learning

Glossaire Qualiopi

  • I01 — Conditions d'information
  • I05 — Adaptation des prestations
  • I11 — Évaluations en cours
  • I22 — Compétences des intervenants
  • I30 — Recueil des appréciations
  • Voir les 32 indicateurs →

© 2026 QualiForma. Tous droits reserves.

Certifie Qualiopi