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. Formations

Formations

CRUD complet sur le catalogue de formations. Requiert le rôle ADMIN ou CREATOR.

Endpoints disponibles

  • GET/api/v1/coursesLister les formations (paginé)
  • POST/api/v1/coursesCréer une formation (status: DRAFT)
  • GET/api/v1/courses/:idRécupérer une formation par ID
  • PATCH/api/v1/courses/:idModifier une formation (partial update)
  • DELETE/api/v1/courses/:idArchiver (soft delete — status: ARCHIVED)

Schéma Course

Champs du modèle Course de l'API REST QualiForma
ChampTypeRequisDescription
idstringNonIdentifiant unique (crs_...)
titlestringOuiTitre de la formation (max 200 chars)
descriptionstringOuiDescription longue (markdown supporté)
pricenumberOuiPrix en centimes (49900 = 499,00 €)
currencystringOuiCode ISO 4217 (EUR, USD...)
statusenumNonDRAFT | PUBLISHED | ARCHIVED
durationnumberNonDurée en heures
levelenumNonBEGINNER | INTERMEDIATE | ADVANCED | EXPERT
languagestringNonCode BCP 47 (fr, en...)
tagsstring[]NonTags pour la recherche
createdAtstringNonISO 8601 — lecture seule
updatedAtstringNonISO 8601 — lecture seule

GET/courses

Retourne la liste paginée des formations du tenant. Paramètres query : page, perPage, status, q (recherche).

Lister les formations · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/courses',
    headers={
        'Authorization': f'Bearer {access_token}',
        'X-Tenant-ID': 'votre-tenant'
    },
    params={
        'page': 1,
        'perPage': 20,
        'status': 'PUBLISHED',  # DRAFT | PUBLISHED | ARCHIVED
        'q': 'excel'            # recherche texte (optionnel)
    }
)

result = response.json()
courses = result['data']
total = result['meta']['total']

for c in courses:
    print(f"[{c['status']}] {c['title']} — {c['price'] / 100:.2f} €")
Lister les formations · cURL / Shell
TOKEN="eyJhbGci..."

curl "https://api.qualiforma.site/api/v1/courses?page=1&perPage=20&status=PUBLISHED" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'X-Tenant-ID: votre-tenant'
Lister les formations · TypeScript
const params = new URLSearchParams({ page: '1', perPage: '20', status: 'PUBLISHED' });
const response = await fetch(
  `https://api.qualiforma.site/api/v1/courses?${params}`,
  {
    headers: {
      Authorization: `Bearer ${accessToken}`,
      'X-Tenant-ID': tenantId,
    },
  }
);
const { data: courses, meta } = await response.json();
Lister les formations · PHP
<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

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

try {
    $response = $client->get('courses', [
        'headers' => [
            'Authorization' => 'Bearer ' . $accessToken,
            'X-Tenant-ID' => 'votre-tenant',
        ],
        'query' => [
            'page' => 1,
            'perPage' => 20,
            'status' => 'PUBLISHED', // DRAFT | PUBLISHED | ARCHIVED
            'q' => 'excel',          // recherche texte (optionnel)
        ],
    ]);
    $result = json_decode($response->getBody()->getContents(), true);
    $courses = $result['data'];
    $total = $result['meta']['total'];

    foreach ($courses as $c) {
        printf("[%s] %s - %.2f EUR\n", $c['status'], $c['title'], $c['price'] / 100);
    }
} catch (GuzzleException $e) {
    fwrite(STDERR, "Erreur: " . $e->getMessage() . PHP_EOL);
}

POST/courses

Crée une formation avec le statut DRAFT. Requiert ADMIN ou CREATOR.

Créer une formation · Python
course_data = {
    'title': 'Excel Avancé pour Professionnels RH',
    'description': "Maîtrisez les fonctions avancées d'Excel...",
    'price': 49900,          # centimes : 499 €
    'currency': 'EUR',
    'duration': 14,          # heures
    'level': 'INTERMEDIATE', # BEGINNER | INTERMEDIATE | ADVANCED | EXPERT
    'language': 'fr',
    'tags': ['excel', 'rh', 'bureautique'],
    'methods': ['E_LEARNING', 'BLENDED'] # méthodes pédagogiques
}

response = requests.post(
    'https://api.qualiforma.site/api/v1/courses',
    headers={
        'Authorization': f'Bearer {access_token}',
        'X-Tenant-ID': 'votre-tenant',
        'Content-Type': 'application/json'
    },
    json=course_data
)

course = response.json()['data']
print(f"Formation créée : {course['id']} (statut : {course['status']})")
# statut initial = DRAFT
Créer une formation · cURL / Shell
TOKEN="eyJhbGci..."

curl -X POST https://api.qualiforma.site/api/v1/courses \
  -H "Authorization: Bearer $TOKEN" \
  -H 'X-Tenant-ID: votre-tenant' \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "Excel Avancé pour Professionnels RH",
    "description": "Maîtrisez les fonctions avancées d'\''Excel...",
    "price": 49900,
    "currency": "EUR",
    "duration": 14,
    "level": "INTERMEDIATE",
    "language": "fr"
  }'
Créer une formation · TypeScript
interface CreateCourseInput {
  title: string;
  description: string;
  price: number;       // centimes
  currency: string;
  duration?: number;   // heures
  level?: 'BEGINNER' | 'INTERMEDIATE' | 'ADVANCED' | 'EXPERT';
  language?: string;
  tags?: string[];
  methods?: string[];
}

async function createCourse(input: CreateCourseInput, accessToken: string, tenantId: string) {
  const response = await fetch('https://api.qualiforma.site/api/v1/courses', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${accessToken}`,
      'X-Tenant-ID': tenantId,
    },
    body: JSON.stringify(input),
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Erreur ${response.status}: ${JSON.stringify(error)}`);
  }

  const { data } = await response.json();
  return data; // Course créée avec status = 'DRAFT'
}
Créer une formation · PHP
<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

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

$courseData = [
    'title' => 'Excel Avance pour Professionnels RH',
    'description' => "Maitrisez les fonctions avancees d'Excel...",
    'price' => 49900,           // centimes : 499 EUR
    'currency' => 'EUR',
    'duration' => 14,           // heures
    'level' => 'INTERMEDIATE',  // BEGINNER | INTERMEDIATE | ADVANCED | EXPERT
    'language' => 'fr',
    'tags' => ['excel', 'rh', 'bureautique'],
    'methods' => ['E_LEARNING', 'BLENDED'], // methodes pedagogiques
];

try {
    $response = $client->post('courses', [
        'headers' => [
            'Authorization' => 'Bearer ' . $accessToken,
            'X-Tenant-ID' => 'votre-tenant',
            'Content-Type' => 'application/json',
        ],
        'json' => $courseData,
    ]);
    $course = json_decode($response->getBody()->getContents(), true)['data'];
    echo "Formation creee : {$course['id']} (statut : {$course['status']})\n";
    // statut initial = DRAFT
} catch (GuzzleException $e) {
    fwrite(STDERR, "Erreur: " . $e->getMessage() . PHP_EOL);
}

PATCH/courses/:id

Mise à jour partielle (partial update). Envoyer uniquement les champs à modifier. Pour publier : passer status: "PUBLISHED".

Publier une formation · cURL / Shell
TOKEN="eyJhbGci..."
COURSE_ID="crs_abc123"

# Publier une formation (DRAFT → PUBLISHED)
curl -X PATCH "https://api.qualiforma.site/api/v1/courses/$COURSE_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'X-Tenant-ID: votre-tenant' \
  -H 'Content-Type: application/json' \
  -d '{"status": "PUBLISHED"}'

# Réponse 200 :
# { "data": { "id": "crs_abc123", "status": "PUBLISHED", ... } }

Réponses d'erreur

Exemples d'erreurs · JSON
// 401 — Token invalide ou expiré
{
  "statusCode": 401,
  "message": "Token invalide",
  "error": "Unauthorized"
}

// 403 — Rôle insuffisant
{
  "statusCode": 403,
  "message": "Accès refusé : rôle ADMIN ou CREATOR requis",
  "error": "Forbidden"
}

// 422 — Validation métier
{
  "statusCode": 422,
  "message": "Validation failed",
  "errors": {
    "price": ["Le prix doit être supérieur à 0"],
    "title": ["Le titre est requis"]
  }
}
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