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. Plans d’amélioration

Plans d’amélioration

Gestion du critère Qualiopi 7 — amélioration continue. Création, suivi des actions correctives, clôture avec rapport et statistiques agrégées pour le dossier d’audit. Lié au module Complaints (critère 6) et inclus dans l’export Audit Bundle.

Endpoints

get/api/v1/improvement-plans

Lister les plans d’amélioration

Retourne les plans d'amélioration du tenant courant, paginés. Filtrables par statut et par déclencheur.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
statusquerynonIN_PROGRESSDRAFT | IN_PROGRESS | COMPLETED | ARCHIVED
triggerquerynonCOMPLAINTCOMPLAINT | AUDIT | FEEDBACK | PROACTIVE
pagequerynon1Numéro de page (défaut : 1)
perPagequerynon20Éléments par page (défaut : 20, max 100)

Réponses

  • 200Plans paginés
    Réponse 200 · JSON
    {
      "data": [
        {
          "id": "imp_8f3b21",
          "title": "Améliorer la prise en charge du support N1",
          "trigger": "COMPLAINT",
          "status": "IN_PROGRESS",
          "owner": "usr_admin01",
          "targetDate": "2026-09-30",
          "linkedComplaintIds": [
            "cmp_a1b2c3"
          ],
          "actionsCount": 4,
          "actionsCompleted": 2,
          "createdAt": "2026-04-12T10:00:00Z"
        }
      ],
      "meta": {
        "total": 7,
        "page": 1,
        "perPage": 20
      }
    }
  • 401Non authentifié
  • 403Permission insuffisante (rôle ADMIN requis)

Exemples

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

response = requests.get(
    'https://api.qualiforma.site/api/v1/improvement-plans?status=IN_PROGRESS&trigger=COMPLAINT&page=1&perPage=20',
    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/improvement-plans · PHP
<?php

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

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

try {
    $response = $client->get('improvement-plans?status=IN_PROGRESS&trigger=COMPLAINT&page=1&perPage=20', [
        '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/improvement-plans/:id

Détail d’un plan d’amélioration

Retourne le plan complet avec ses actions correctives, le rapport de clôture éventuel et les réclamations liées.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21Identifiant du plan

Réponses

  • 200Plan trouvé
    Réponse 200 · JSON
    {
      "data": {
        "id": "imp_8f3b21",
        "title": "Améliorer la prise en charge du support N1",
        "description": "Réduction du temps de réponse moyen à moins de 4 h ouvrées.",
        "trigger": "COMPLAINT",
        "status": "IN_PROGRESS",
        "owner": "usr_admin01",
        "targetDate": "2026-09-30",
        "linkedComplaintIds": [
          "cmp_a1b2c3"
        ],
        "actions": [
          {
            "id": "act_001",
            "description": "Mettre en place un dashboard de suivi temps de réponse",
            "status": "DONE",
            "owner": "usr_admin01",
            "dueDate": "2026-05-15",
            "completedAt": "2026-05-12T14:30:00Z"
          },
          {
            "id": "act_002",
            "description": "Former l’équipe N1 sur les nouveaux process",
            "status": "IN_PROGRESS",
            "owner": "usr_lead02",
            "dueDate": "2026-07-01"
          }
        ]
      }
    }
  • 404Plan introuvable

Exemples

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

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

Créer un plan d’amélioration

Crée un nouveau plan d'amélioration continue. Le plan peut être lié à une ou plusieurs réclamations existantes (critère 6 → 7).

  • Improvements
  • Qualiopi

Corps de requête

Content-Type : application/json

Body · JSON
{
  "title": "Améliorer la prise en charge du support N1",
  "description": "Réduction du temps de réponse moyen à moins de 4 h ouvrées.",
  "trigger": "COMPLAINT",
  "linkedComplaintIds": [
    "cmp_a1b2c3"
  ],
  "targetDate": "2026-09-30",
  "owner": "usr_admin01",
  "actions": [
    {
      "description": "Mettre en place un dashboard de suivi temps de réponse",
      "owner": "usr_admin01",
      "dueDate": "2026-05-15"
    },
    {
      "description": "Former l’équipe N1 sur les nouveaux process",
      "owner": "usr_lead02",
      "dueDate": "2026-07-01"
    }
  ]
}

Réponses

  • 201Plan créé (status DRAFT par défaut)
    Réponse 201 · JSON
    {
      "data": {
        "id": "imp_8f3b21",
        "status": "DRAFT",
        "actionsCount": 2
      }
    }
  • 400Validation échouée (champ manquant ou trigger invalide)
  • 403Permission insuffisante

Exemples

POST /api/v1/improvement-plans · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/improvement-plans \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Améliorer la prise en charge du support N1",
  "description": "Réduction du temps de réponse moyen à moins de 4 h ouvrées.",
  "trigger": "COMPLAINT",
  "linkedComplaintIds": [
    "cmp_a1b2c3"
  ],
  "targetDate": "2026-09-30",
  "owner": "usr_admin01",
  "actions": [
    {
      "description": "Mettre en place un dashboard de suivi temps de réponse",
      "owner": "usr_admin01",
      "dueDate": "2026-05-15"
    },
    {
      "description": "Former l’équipe N1 sur les nouveaux process",
      "owner": "usr_lead02",
      "dueDate": "2026-07-01"
    }
  ]
}'
POST /api/v1/improvement-plans · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "title": "Améliorer la prise en charge du support N1",
    "description": "Réduction du temps de réponse moyen à moins de 4 h ouvrées.",
    "trigger": "COMPLAINT",
    "linkedComplaintIds": [
      "cmp_a1b2c3"
    ],
    "targetDate": "2026-09-30",
    "owner": "usr_admin01",
    "actions": [
      {
        "description": "Mettre en place un dashboard de suivi temps de réponse",
        "owner": "usr_admin01",
        "dueDate": "2026-05-15"
      },
      {
        "description": "Former l’équipe N1 sur les nouveaux process",
        "owner": "usr_lead02",
        "dueDate": "2026-07-01"
      }
    ]
  }),
});

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

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

response = requests.post(
    'https://api.qualiforma.site/api/v1/improvement-plans',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'title': 'Améliorer la prise en charge du support N1',
        'description': 'Réduction du temps de réponse moyen à moins de 4 h ouvrées.',
        'trigger': 'COMPLAINT',
        'linkedComplaintIds': [
            'cmp_a1b2c3',
        ],
        'targetDate': '2026-09-30',
        'owner': 'usr_admin01',
        'actions': [
            {
                'description': 'Mettre en place un dashboard de suivi temps de réponse',
                'owner': 'usr_admin01',
                'dueDate': '2026-05-15',
            },
            {
                'description': 'Former l’équipe N1 sur les nouveaux process',
                'owner': 'usr_lead02',
                'dueDate': '2026-07-01',
            },
        ],
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/improvement-plans · PHP
<?php

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

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

try {
    $response = $client->post('improvement-plans', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'title' => 'Améliorer la prise en charge du support N1',
            'description' => 'Réduction du temps de réponse moyen à moins de 4 h ouvrées.',
            'trigger' => 'COMPLAINT',
            'linkedComplaintIds' => [
                'cmp_a1b2c3',
            ],
            'targetDate' => '2026-09-30',
            'owner' => 'usr_admin01',
            'actions' => [
                [
                    'description' => 'Mettre en place un dashboard de suivi temps de réponse',
                    'owner' => 'usr_admin01',
                    'dueDate' => '2026-05-15',
                ],
                [
                    'description' => 'Former l’équipe N1 sur les nouveaux process',
                    'owner' => 'usr_lead02',
                    'dueDate' => '2026-07-01',
                ],
            ],
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
patch/api/v1/improvement-plans/:id

Mettre à jour un plan

Modifie les métadonnées d'un plan : titre, description, propriétaire, date cible, statut. Les actions sont gérées séparément.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "status": "IN_PROGRESS",
  "targetDate": "2026-10-31",
  "owner": "usr_admin02"
}

Réponses

  • 200Plan mis à jour
    Réponse 200 · JSON
    {
      "data": {
        "id": "imp_8f3b21"
      }
    }
  • 404Plan introuvable
  • 409Transition de statut invalide (ex. ARCHIVED → DRAFT)

Exemples

PATCH /api/v1/improvement-plans/:id · cURL / Shell
curl -X PATCH https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "IN_PROGRESS",
  "targetDate": "2026-10-31",
  "owner": "usr_admin02"
}'
PATCH /api/v1/improvement-plans/:id · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21', {
  method: 'PATCH',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "status": "IN_PROGRESS",
    "targetDate": "2026-10-31",
    "owner": "usr_admin02"
  }),
});

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

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

response = requests.patch(
    'https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'status': 'IN_PROGRESS',
        'targetDate': '2026-10-31',
        'owner': 'usr_admin02',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
PATCH /api/v1/improvement-plans/: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('improvement-plans/imp_8f3b21', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'status' => 'IN_PROGRESS',
            'targetDate' => '2026-10-31',
            'owner' => 'usr_admin02',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
delete/api/v1/improvement-plans/:id

Supprimer un plan

Soft-delete d'un plan en statut DRAFT. Un plan IN_PROGRESS, COMPLETED ou ARCHIVED ne peut pas être supprimé (intégrité audit Qualiopi).

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21—

Réponses

  • 204Plan supprimé
  • 409Plan non supprimable dans son statut actuel

Exemples

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

response = requests.delete(
    'https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21',
    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/improvement-plans/: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('improvement-plans/imp_8f3b21', [
        '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/improvement-plans/:id/actions

Ajouter une action corrective

Ajoute une nouvelle action corrective au plan. L'action est créée en statut TODO.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "description": "Auditer le process de remontée incident",
  "owner": "usr_lead02",
  "dueDate": "2026-08-15"
}

Réponses

  • 201Action créée
    Réponse 201 · JSON
    {
      "data": {
        "id": "act_003",
        "status": "TODO"
      }
    }
  • 404Plan introuvable

Exemples

POST /api/v1/improvement-plans/:id/actions · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "description": "Auditer le process de remontée incident",
  "owner": "usr_lead02",
  "dueDate": "2026-08-15"
}'
POST /api/v1/improvement-plans/:id/actions · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "description": "Auditer le process de remontée incident",
    "owner": "usr_lead02",
    "dueDate": "2026-08-15"
  }),
});

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

const data = await response.json();
console.log(data);
POST /api/v1/improvement-plans/:id/actions · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'description': 'Auditer le process de remontée incident',
        'owner': 'usr_lead02',
        'dueDate': '2026-08-15',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/improvement-plans/:id/actions · PHP
<?php

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

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

try {
    $response = $client->post('improvement-plans/imp_8f3b21/actions', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'description' => 'Auditer le process de remontée incident',
            'owner' => 'usr_lead02',
            'dueDate' => '2026-08-15',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
patch/api/v1/improvement-plans/:id/actions/:actionId

Mettre à jour une action corrective

Met à jour le statut, la date, ou le propriétaire d'une action. Passer status à DONE renseigne automatiquement completedAt.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21—
actionIdpathouiact_002—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "status": "DONE"
}

Réponses

  • 200Action mise à jour
    Réponse 200 · JSON
    {
      "data": {
        "id": "act_002",
        "status": "DONE",
        "completedAt": "2026-05-15T11:42:00Z"
      }
    }
  • 400Statut invalide (autorisés : TODO | IN_PROGRESS | DONE | CANCELLED)
  • 404Plan ou action introuvable

Exemples

PATCH /api/v1/improvement-plans/:id/actions/:actionId · cURL / Shell
curl -X PATCH https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions/act_002 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "DONE"
}'
PATCH /api/v1/improvement-plans/:id/actions/:actionId · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions/act_002', {
  method: 'PATCH',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "status": "DONE"
  }),
});

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

const data = await response.json();
console.log(data);
PATCH /api/v1/improvement-plans/:id/actions/:actionId · Python
import requests

response = requests.patch(
    'https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/actions/act_002',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'status': 'DONE',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
PATCH /api/v1/improvement-plans/:id/actions/:actionId · PHP
<?php

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

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

try {
    $response = $client->patch('improvement-plans/imp_8f3b21/actions/act_002', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'status' => 'DONE',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
post/api/v1/improvement-plans/:id/close

Clôturer un plan avec rapport

Clôture un plan d'amélioration et archive un rapport synthétique. Le plan passe automatiquement en statut COMPLETED. Toutes les actions doivent être DONE ou CANCELLED.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
idpathouiimp_8f3b21—

Corps de requête

Content-Type : application/json

Body · JSON
{
  "summary": "Temps de réponse moyen passé de 12 h à 3 h 20 sur 90 jours.",
  "outcomes": [
    "Réduction des réclamations de 42%",
    "Satisfaction support : 4,3 → 4,8 / 5"
  ],
  "attachmentS3Key": "tenants/qf-demo/improvements/imp_8f3b21/report.pdf"
}

Réponses

  • 200Plan clôturé
    Réponse 200 · JSON
    {
      "data": {
        "id": "imp_8f3b21",
        "status": "COMPLETED",
        "closedAt": "2026-09-28T16:00:00Z"
      }
    }
  • 409Actions non terminées : impossible de clôturer

Exemples

POST /api/v1/improvement-plans/:id/close · cURL / Shell
curl -X POST https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/close \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo" \
  -H "Content-Type: application/json" \
  -d '{
  "summary": "Temps de réponse moyen passé de 12 h à 3 h 20 sur 90 jours.",
  "outcomes": [
    "Réduction des réclamations de 42%",
    "Satisfaction support : 4,3 → 4,8 / 5"
  ],
  "attachmentS3Key": "tenants/qf-demo/improvements/imp_8f3b21/report.pdf"
}'
POST /api/v1/improvement-plans/:id/close · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/close', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-Tenant-ID': 'qualiforma-demo',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "summary": "Temps de réponse moyen passé de 12 h à 3 h 20 sur 90 jours.",
    "outcomes": [
      "Réduction des réclamations de 42%",
      "Satisfaction support : 4,3 → 4,8 / 5"
    ],
    "attachmentS3Key": "tenants/qf-demo/improvements/imp_8f3b21/report.pdf"
  }),
});

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

const data = await response.json();
console.log(data);
POST /api/v1/improvement-plans/:id/close · Python
import requests

response = requests.post(
    'https://api.qualiforma.site/api/v1/improvement-plans/imp_8f3b21/close',
    headers={
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'X-Tenant-ID': 'qualiforma-demo',
        'Content-Type': 'application/json',
    },
    json={
        'summary': 'Temps de réponse moyen passé de 12 h à 3 h 20 sur 90 jours.',
        'outcomes': [
            'Réduction des réclamations de 42%',
            'Satisfaction support : 4,3 → 4,8 / 5',
        ],
        'attachmentS3Key': 'tenants/qf-demo/improvements/imp_8f3b21/report.pdf',
    },
    timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
POST /api/v1/improvement-plans/:id/close · PHP
<?php

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

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

try {
    $response = $client->post('improvement-plans/imp_8f3b21/close', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_ACCESS_TOKEN',
            'X-Tenant-ID' => 'qualiforma-demo',
        ],
        'json' => [
            'summary' => 'Temps de réponse moyen passé de 12 h à 3 h 20 sur 90 jours.',
            'outcomes' => [
                'Réduction des réclamations de 42%',
                'Satisfaction support : 4,3 → 4,8 / 5',
            ],
            'attachmentS3Key' => 'tenants/qf-demo/improvements/imp_8f3b21/report.pdf',
        ],
    ]);
    $data = json_decode($response->getBody()->getContents(), true);
    var_dump($data);
} catch (GuzzleException $e) {
    fwrite(STDERR, $e->getMessage());
}
get/api/v1/improvement-plans/stats

Statistiques Qualiopi

Agrégats utilisés pour le dossier d'audit Qualiopi : taux de complétion, durée moyenne, répartition par déclencheur.

  • Improvements
  • Qualiopi

Paramètres

NomTypeRequisExempleDescription
fromquerynon2026-01-01Borne basse (format YYYY-MM-DD)
toquerynon2026-12-31Borne haute (format YYYY-MM-DD)

Réponses

  • 200Statistiques calculées
    Réponse 200 · JSON
    {
      "data": {
        "totalPlans": 23,
        "completed": 14,
        "inProgress": 7,
        "draft": 2,
        "completionRate": 0.61,
        "averageDurationDays": 87,
        "byTrigger": {
          "COMPLAINT": 9,
          "AUDIT": 4,
          "FEEDBACK": 6,
          "PROACTIVE": 4
        }
      }
    }

Exemples

GET /api/v1/improvement-plans/stats · cURL / Shell
curl -X GET https://api.qualiforma.site/api/v1/improvement-plans/stats?from=2026-01-01&to=2026-12-31 \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-ID: qualiforma-demo"
GET /api/v1/improvement-plans/stats · JavaScript
const response = await fetch('https://api.qualiforma.site/api/v1/improvement-plans/stats?from=2026-01-01&to=2026-12-31', {
  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/improvement-plans/stats · Python
import requests

response = requests.get(
    'https://api.qualiforma.site/api/v1/improvement-plans/stats?from=2026-01-01&to=2026-12-31',
    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/improvement-plans/stats · PHP
<?php

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

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

try {
    $response = $client->get('improvement-plans/stats?from=2026-01-01&to=2026-12-31', [
        '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