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

Questionnaires — PRE / POST / SATISFACTION

Questionnaires d’évaluation avant/après formation et de satisfaction. Génération automatisée via Mistral (IA), analyse de sentiment et soumission des réponses apprenant.

Types de questions supportés

  • SCALE — échelle numérique (min/max, défaut 0–10). Exemple : satisfaction, niveau perçu.
  • CHOICE — choix unique ou multiple (champ multi: boolean), avec liste d’options.
  • TEXT — réponse libre. Analysée par IA dans /analyze (thèmes, sentiment, verbatims).

Crédits IA

Les endpoints marqués IA consomment des crédits du module ai-credits. Pattern guard-then-consume : le solde est vérifié avant d’exécuter l’appel Mistral. Solde insuffisant → 402 sans facturation. Voir le Credit Store pour recharger.

Endpoints détaillés

get/api/v1/questionnaires

Lister les questionnaires

Liste paginée des questionnaires du tenant. Filtrable par type et par cours.

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
pagequerynon1—
perPagequerynon20—
typequerynonPREPRE | POST | SATISFACTION
courseIdquerynoncrs_abc123Filtrer par formation

Réponses

  • 200Liste paginée
    Réponse 200 · JSON
    {
      "data": [
        {
          "id": "qst_abc123",
          "type": "PRE",
          "title": "Évaluation pré-formation Excel",
          "courseId": "crs_abc123",
          "questionsCount": 8,
          "createdAt": "2026-05-01T10:00:00Z"
        }
      ],
      "meta": {
        "page": 1,
        "perPage": 20,
        "total": 24
      }
    }

Exemples

GET /api/v1/questionnaires · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/questionnaires?page=1&perPage=20&type=PRE&courseId=crs_abc123 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/questionnaires · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires?page=1&perPage=20&type=PRE&courseId=crs_abc123', {
  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/questionnaires · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/questionnaires?page=1&perPage=20&type=PRE&courseId=crs_abc123',
    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/questionnaires · PHP
<?php

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

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

try {
    $response = $client->get('questionnaires?page=1&perPage=20&type=PRE&courseId=crs_abc123', [
        '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/questionnaires/:id

Détail d’un questionnaire

Retourne le questionnaire complet avec toutes ses questions et leurs options.

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Réponses

  • 200OK
    Réponse 200 · JSON
    {
      "data": {
        "id": "qst_abc123",
        "type": "PRE",
        "title": "Évaluation pré-formation Excel",
        "questions": [
          {
            "id": "qn_1",
            "type": "SCALE",
            "prompt": "Votre niveau actuel en Excel ?",
            "min": 0,
            "max": 10
          },
          {
            "id": "qn_2",
            "type": "CHOICE",
            "prompt": "Quelles fonctions connaissez-vous ?",
            "multi": true,
            "options": [
              "VLOOKUP",
              "INDEX/MATCH",
              "TCD",
              "Power Query"
            ]
          },
          {
            "id": "qn_3",
            "type": "TEXT",
            "prompt": "Vos attentes ?"
          }
        ]
      }
    }
  • 404Questionnaire introuvable

Exemples

GET /api/v1/questionnaires/:id · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/questionnaires/qst_abc123 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/questionnaires/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123', {
  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/questionnaires/:id · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123',
    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/questionnaires/: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('questionnaires/qst_abc123', [
        '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/questionnaires

Créer un questionnaire (manuel)

Création manuelle. Pour générer via IA, utiliser /regenerate-with-ai ou /course/:courseId/generate-all.

  • Questionnaires

Corps de requête

Content-Type : application/json

Body · JSON
{
  "type": "PRE",
  "title": "Évaluation pré-formation Excel",
  "courseId": "crs_abc123",
  "questions": [
    {
      "type": "SCALE",
      "prompt": "Votre niveau actuel ?",
      "min": 0,
      "max": 10
    },
    {
      "type": "CHOICE",
      "prompt": "Fonctions maîtrisées ?",
      "multi": true,
      "options": [
        "VLOOKUP",
        "INDEX/MATCH",
        "TCD"
      ]
    },
    {
      "type": "TEXT",
      "prompt": "Vos attentes ?"
    }
  ]
}

Réponses

  • 201Questionnaire créé
    Réponse 201 · JSON
    {
      "data": {
        "id": "qst_new",
        "type": "PRE",
        "questionsCount": 3
      }
    }
  • 422Validation échouée

Exemples

POST /api/v1/questionnaires · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/questionnaires \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "PRE",
  "title": "Évaluation pré-formation Excel",
  "courseId": "crs_abc123",
  "questions": [
    {
      "type": "SCALE",
      "prompt": "Votre niveau actuel ?",
      "min": 0,
      "max": 10
    },
    {
      "type": "CHOICE",
      "prompt": "Fonctions maîtrisées ?",
      "multi": true,
      "options": [
        "VLOOKUP",
        "INDEX/MATCH",
        "TCD"
      ]
    },
    {
      "type": "TEXT",
      "prompt": "Vos attentes ?"
    }
  ]
}'
POST /api/v1/questionnaires · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "type": "PRE",
    "title": "Évaluation pré-formation Excel",
    "courseId": "crs_abc123",
    "questions": [
      {
        "type": "SCALE",
        "prompt": "Votre niveau actuel ?",
        "min": 0,
        "max": 10
      },
      {
        "type": "CHOICE",
        "prompt": "Fonctions maîtrisées ?",
        "multi": true,
        "options": [
          "VLOOKUP",
          "INDEX/MATCH",
          "TCD"
        ]
      },
      {
        "type": "TEXT",
        "prompt": "Vos attentes ?"
      }
    ]
  }),
});

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

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

response = requests.post(
    'https://api.qualiforma.site/api/v1/questionnaires',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'type': 'PRE',
        'title': 'Évaluation pré-formation Excel',
        'courseId': 'crs_abc123',
        'questions': [
            {
                'type': 'SCALE',
                'prompt': 'Votre niveau actuel ?',
                'min': 0,
                'max': 10,
            },
            {
                'type': 'CHOICE',
                'prompt': 'Fonctions maîtrisées ?',
                'multi': True,
                'options': [
                    'VLOOKUP',
                    'INDEX/MATCH',
                    'TCD',
                ],
            },
            {
                'type': 'TEXT',
                'prompt': 'Vos attentes ?',
            },
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/questionnaires · PHP
<?php

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

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

try {
    $response = $client->post('questionnaires', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'type' => 'PRE',
            'title' => 'Évaluation pré-formation Excel',
            'courseId' => 'crs_abc123',
            'questions' => [
                [
                    'type' => 'SCALE',
                    'prompt' => 'Votre niveau actuel ?',
                    'min' => 0,
                    'max' => 10,
                ],
                [
                    'type' => 'CHOICE',
                    'prompt' => 'Fonctions maîtrisées ?',
                    'multi' => true,
                    'options' => [
                        'VLOOKUP',
                        'INDEX/MATCH',
                        'TCD',
                    ],
                ],
                [
                    'type' => 'TEXT',
                    'prompt' => 'Vos attentes ?',
                ],
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
patch/api/v1/questionnaires/:id

Modifier un questionnaire

Mise à jour partielle (titre, questions). Envoyer uniquement les champs modifiés.

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "title": "Évaluation pré-formation Excel — v2"
}

Réponses

  • 200Mis à jour
  • 404Introuvable

Exemples

PATCH /api/v1/questionnaires/:id · cURL / Shell
curl -X PATCH https://api.qualiforma.site/api/v1/questionnaires/qst_abc123 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Évaluation pré-formation Excel — v2"
}'
PATCH /api/v1/questionnaires/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123', {
  method: 'PATCH',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "title": "Évaluation pré-formation Excel — v2"
  }),
});

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

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

response = requests.patch(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'title': 'Évaluation pré-formation Excel — v2',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
PATCH /api/v1/questionnaires/: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('questionnaires/qst_abc123', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'title' => 'Évaluation pré-formation Excel — v2',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
delete/api/v1/questionnaires/:id

Supprimer un questionnaire

Supprime un questionnaire. Si des réponses existent, le questionnaire est archivé (soft delete).

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Réponses

  • 204Supprimé / archivé
  • 404Introuvable

Exemples

DELETE /api/v1/questionnaires/:id · cURL / Shell
curl -X DELETE https://api.qualiforma.site/api/v1/questionnaires/qst_abc123 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
DELETE /api/v1/questionnaires/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123', {
  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/questionnaires/:id · Python
import requests

response = requests.delete(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123',
    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/questionnaires/: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('questionnaires/qst_abc123', [
        '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/questionnaires/:id/regenerate-with-ai

Régénérer via IA (Mistral)

Régénère le contenu (questions et options) via Mistral en se basant sur la formation associée. Coût : 20 crédits AI. Pattern guard-then-consume : le solde est vérifié AVANT consommation.

  • Questionnaires
  • AI
  • Credits

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "tone": "professional",
  "questionCount": 8,
  "keepExistingQuestions": false
}

Réponses

  • 200Questionnaire régénéré, crédits décomptés
    Réponse 200 · JSON
    {
      "data": {
        "id": "qst_abc123",
        "questionsCount": 8,
        "creditsConsumed": 20,
        "creditsRemaining": 130
      }
    }
  • 402Solde de crédits insuffisant
  • 404Questionnaire ou formation introuvable

Exemples

POST /api/v1/questionnaires/:id/regenerate-with-ai · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/regenerate-with-ai \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "tone": "professional",
  "questionCount": 8,
  "keepExistingQuestions": false
}'
POST /api/v1/questionnaires/:id/regenerate-with-ai · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/regenerate-with-ai', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "tone": "professional",
    "questionCount": 8,
    "keepExistingQuestions": false
  }),
});

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

const data = await response.json();
console.log(data);
POST /api/v1/questionnaires/:id/regenerate-with-ai · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/regenerate-with-ai',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'tone': 'professional',
        'questionCount': 8,
        'keepExistingQuestions': False,
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/questionnaires/:id/regenerate-with-ai · PHP
<?php

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

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

try {
    $response = $client->post('questionnaires/qst_abc123/regenerate-with-ai', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'tone' => 'professional',
            'questionCount' => 8,
            'keepExistingQuestions' => false,
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/questionnaires/course/:courseId/generate-all

Générer PRE + POST + SATISFACTION pour un cours

Génère les 3 questionnaires (PRE, POST, SATISFACTION) pour une formation via Mistral. Coût : 15 crédits × 3 = 45 crédits AI. Guard de 75 crédits min imposé avant exécution (marge de sécurité).

  • Questionnaires
  • AI
  • Credits

Paramètres

NomTypeRequisExempleDescription
courseIdpathouicrs_abc123Identifiant de la formation

Corps de requête

Content-Type : application/json

Body · JSON
{
  "questionCountPerType": 8,
  "tone": "professional"
}

Réponses

  • 201Les 3 questionnaires créés
    Réponse 201 · JSON
    {
      "data": {
        "pre": {
          "id": "qst_pre_x",
          "questionsCount": 8
        },
        "post": {
          "id": "qst_post_x",
          "questionsCount": 8
        },
        "satisfaction": {
          "id": "qst_sat_x",
          "questionsCount": 8
        },
        "creditsConsumed": 45,
        "creditsRemaining": 105
      }
    }
  • 402Solde insuffisant (guard 75 crédits min)
    Réponse 402 · JSON
    {
      "statusCode": 402,
      "message": "Crédits IA insuffisants : 50 disponibles, 75 requis (guard de sécurité)",
      "error": "PaymentRequired"
    }

Exemples

POST /api/v1/questionnaires/course/:courseId/generate-all · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/questionnaires/course/crs_abc123/generate-all \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "questionCountPerType": 8,
  "tone": "professional"
}'
POST /api/v1/questionnaires/course/:courseId/generate-all · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/course/crs_abc123/generate-all', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "questionCountPerType": 8,
    "tone": "professional"
  }),
});

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

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

response = requests.post(
    'https://api.qualiforma.site/api/v1/questionnaires/course/crs_abc123/generate-all',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'questionCountPerType': 8,
        'tone': 'professional',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/questionnaires/course/:courseId/generate-all · PHP
<?php

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

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

try {
    $response = $client->post('questionnaires/course/crs_abc123/generate-all', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'questionCountPerType' => 8,
            'tone' => 'professional',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/questionnaires/:id/responses

Soumettre des réponses (apprenant)

L’apprenant soumet ses réponses au questionnaire. Le scoring (si applicable) est calculé côté serveur.

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "answers": [
    {
      "questionId": "qn_1",
      "value": 4
    },
    {
      "questionId": "qn_2",
      "value": [
        "VLOOKUP",
        "TCD"
      ]
    },
    {
      "questionId": "qn_3",
      "value": "Apprendre Power Query."
    }
  ]
}

Réponses

  • 201Réponse enregistrée
    Réponse 201 · JSON
    {
      "data": {
        "id": "qrs_xyz",
        "submittedAt": "2026-05-15T10:00:00Z"
      }
    }
  • 409Déjà répondu (un seul envoi par apprenant)

Exemples

POST /api/v1/questionnaires/:id/responses · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "answers": [
    {
      "questionId": "qn_1",
      "value": 4
    },
    {
      "questionId": "qn_2",
      "value": [
        "VLOOKUP",
        "TCD"
      ]
    },
    {
      "questionId": "qn_3",
      "value": "Apprendre Power Query."
    }
  ]
}'
POST /api/v1/questionnaires/:id/responses · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "answers": [
      {
        "questionId": "qn_1",
        "value": 4
      },
      {
        "questionId": "qn_2",
        "value": [
          "VLOOKUP",
          "TCD"
        ]
      },
      {
        "questionId": "qn_3",
        "value": "Apprendre Power Query."
      }
    ]
  }),
});

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

const data = await response.json();
console.log(data);
POST /api/v1/questionnaires/:id/responses · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'answers': [
            {
                'questionId': 'qn_1',
                'value': 4,
            },
            {
                'questionId': 'qn_2',
                'value': [
                    'VLOOKUP',
                    'TCD',
                ],
            },
            {
                'questionId': 'qn_3',
                'value': 'Apprendre Power Query.',
            },
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/questionnaires/:id/responses · PHP
<?php

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

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

try {
    $response = $client->post('questionnaires/qst_abc123/responses', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'answers' => [
                [
                    'questionId' => 'qn_1',
                    'value' => 4,
                ],
                [
                    'questionId' => 'qn_2',
                    'value' => [
                        'VLOOKUP',
                        'TCD',
                    ],
                ],
                [
                    'questionId' => 'qn_3',
                    'value' => 'Apprendre Power Query.',
                ],
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
get/api/v1/questionnaires/:id/responses

Lister les réponses (admin/creator)

Réservé aux rôles ADMIN ou CREATOR du tenant. Retourne les réponses anonymisées par défaut.

  • Questionnaires

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—
pagequerynon1—
perPagequerynon50—
anonymizedquerynontrueSi false, inclut l’ID apprenant

Réponses

  • 200OK
    Réponse 200 · JSON
    {
      "data": [
        {
          "id": "qrs_xyz",
          "submittedAt": "2026-05-15T10:00:00Z",
          "answers": [
            {
              "questionId": "qn_1",
              "value": 4
            },
            {
              "questionId": "qn_2",
              "value": [
                "VLOOKUP",
                "TCD"
              ]
            }
          ]
        }
      ],
      "meta": {
        "page": 1,
        "perPage": 50,
        "total": 87
      }
    }
  • 403Rôle insuffisant

Exemples

GET /api/v1/questionnaires/:id/responses · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses?page=1&perPage=50&anonymized=true \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/questionnaires/:id/responses · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses?page=1&perPage=50&anonymized=true', {
  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/questionnaires/:id/responses · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/responses?page=1&perPage=50&anonymized=true',
    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/questionnaires/:id/responses · PHP
<?php

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

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

try {
    $response = $client->get('questionnaires/qst_abc123/responses?page=1&perPage=50&anonymized=true', [
        '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/questionnaires/:id/analyze

Analyse IA (satisfaction)

Lance une analyse IA agrégée des réponses (sentiment, thèmes saillants, verbatims clés, score NPS). Coût : 10 crédits AI.

  • Questionnaires
  • AI
  • Credits

Paramètres

NomTypeRequisExempleDescription
idpathouiqst_abc123—

Réponses

  • 200Analyse générée
    Réponse 200 · JSON
    {
      "data": {
        "sentiment": {
          "positive": 0.72,
          "neutral": 0.21,
          "negative": 0.07
        },
        "npsScore": 48,
        "topThemes": [
          "rythme adapté",
          "contenus pratiques",
          "support trop dense"
        ],
        "verbatims": [
          {
            "question": "qn_3",
            "text": "Formation très enrichissante",
            "sentiment": "positive"
          }
        ],
        "creditsConsumed": 10,
        "creditsRemaining": 95
      }
    }
  • 402Solde insuffisant

Exemples

GET /api/v1/questionnaires/:id/analyze · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/analyze \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/questionnaires/:id/analyze · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/analyze', {
  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/questionnaires/:id/analyze · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/questionnaires/qst_abc123/analyze',
    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/questionnaires/:id/analyze · PHP
<?php

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

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

try {
    $response = $client->get('questionnaires/qst_abc123/analyze', [
        '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