Filtrage organisation
Chaque cle API est rattachee a une seule organisation.
Documentation API SKILL LMS
Lisez vos formations, apprenants, inscriptions et progression avec une API OAuth en lecture seule, incluse à partir du forfait Orga. Retrouvez vos identifiants et la documentation directement dans votre espace.
Base URL
https://mcp.skill-lms.fr/api/v1
Autorisez la connexion OAuth avec PKCE et le scope read, puis utilisez le jeton dédié obtenu. Aucun accès à un autre organisme ni aucune écriture.
curl https://mcp.skill-lms.fr/api/v1/learners \
-H "Authorization: Bearer <read_api_access_token>" \
-H "Accept: application/json"Créez votre accès dans Paramètres → Intégrations → API REST : Client ID, secret serveur affiché une seule fois, renouvellement et révocation. Un responsable autorise la connexion OAuth avec PKCE (S256), un état aléatoire vérifié au retour et le scope read.
Base : https://mcp.skill-lms.fr/api/v1.
Autorisation : https://mcp.skill-lms.fr/oauth/read-api/authorize.
Jetons et renouvellement : https://mcp.skill-lms.fr/oauth/read-api/token.
Les lectures disponibles sont /organization, /courses,/learners et /enrollments (progression incluse). Pagination : limit de 1 à 100, offset de 0 à 100 000 ; les réponses utilisent data et meta. L’organisme est déterminé par le compte qui autorise la connexion. Le jeton dédié ne permet aucune écriture et ne fonctionne que sur cette API.
Le cadrage Enterprise ci-dessous décrit des extensions à convenir avec notre équipe. Le contrat OpenAPI ci-dessus est la référence pour les endpoints livrés.
Pour un site web ou une SPA, effectuez les échanges de jetons et les lectures depuis votre backend sécurisé. Cette API ne fournit pas d’autorisation CORS pour des appels directs depuis un navigateur. Le mode client public est réservé aux applications mobiles ou natives avec PKCE, sans secret embarqué.
Préparez un vérificateur PKCE aléatoire de 43 à 128 caractères, son challenge S256 en base64url sans remplissage, et un état aléatoire. Ouvrez l’URL d’autorisation ci-dessous dans le navigateur du responsable. Au retour sur votre callback, vérifiez l’état reçu avant d’échanger le code depuis votre serveur ou, pour un client public mobile ou natif, depuis votre application.
https://mcp.skill-lms.fr/oauth/read-api/authorize?response_type=code&client_id=<client_id>&redirect_uri=<callback_encodee>&scope=read&state=<etat_aleatoire>&code_challenge=<challenge_s256>&code_challenge_method=S256curl --request POST https://mcp.skill-lms.fr/oauth/read-api/token \
--user "$CLIENT_ID:$CLIENT_SECRET" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=$CODE" \
--data-urlencode "redirect_uri=$CALLBACK_URL" \
--data-urlencode "code_verifier=$PKCE_VERIFIER"curl --request POST https://mcp.skill-lms.fr/oauth/read-api/token \
--data-urlencode "client_id=$CLIENT_ID" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=$CODE" \
--data-urlencode "redirect_uri=$CALLBACK_URL" \
--data-urlencode "code_verifier=$PKCE_VERIFIER"Conservez les jetons côté serveur pour un client confidentiel, ou dans le stockage sécurisé du système pour une application mobile ou native. Un client public transmet son client_id dans le corps de la requête, sans secret ni HTTP Basic. Le seul scope est read. Envoyez access_token comme Bearer sur les quatre endpoints documentés dans le contrat OpenAPI ; /enrollments inclut la progression. Les listes utilisent limit et offset, avec une réponse data et meta. Aucun identifiant d’organisme ne peut remplacer le périmètre du compte connecté.
curl --request POST https://mcp.skill-lms.fr/oauth/read-api/token \
--user "$CLIENT_ID:$CLIENT_SECRET" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "refresh_token=$REFRESH_TOKEN"curl --request POST https://mcp.skill-lms.fr/oauth/read-api/token \
--data-urlencode "client_id=$CLIENT_ID" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "refresh_token=$REFRESH_TOKEN"Après chaque renouvellement réussi, remplacez les deux jetons conservés : les anciens ne sont plus valides. Renouvelez avant l’expiration de l’access_token, indiquée en secondes par expires_in dans chaque réponse de jetons. Séparément, l’autorisation expire après 30 jours sans renouvellement ; une nouvelle autorisation est alors nécessaire. Renouveler le secret client ou révoquer l’intégration depuis les paramètres coupe immédiatement les connexions existantes. Une nouvelle autorisation est alors nécessaire.
Les propositions ci-dessous ne constituent pas le contrat de l’API disponible. Utilisez le guide OAuth et le contrat OpenAPI ci-dessus pour votre intégration actuelle.
Vue generale
L API Enterprise v1 est pensee pour alimenter un reporting SI, un data warehouse, un CRM ou un tableau de bord franchise, sans donner d acces brut a la plateforme.
Chaque cle API est rattachee a une seule organisation.
Reponses previsibles, pagination obligatoire et erreurs standardisees.
Scopes, rate limits et webhooks sont valides pendant l onboarding.
Authentification
Les appels utilisent un jeton bearer transmis depuis un backend client. La cle ne doit jamais etre exposee dans un navigateur, une app mobile publique ou un depot Git.
Authorization: Bearer <enterprise_api_key>
Accept: application/jsonPagination
Les endpoints de liste accepteront un parametre limit et retourneront un curseur opaque pour la page suivante apres activation API Enterprise.
GET /api/enterprise/v1/learners?limit=50&cursor=eyJwYWdlIjoyfQ{
"data": [],
"pagination": {
"limit": 50,
"next_cursor": null,
"has_more": false
}
}`limit` vaut 50 par defaut et ne depasse pas 100 en v1.
Endpoints
Les exemples ci-dessous sont des propositions à cadrer avec votre DSI ; consultez le contrat OpenAPI de lecture pour les endpoints actuellement livrés. Les écritures restent hors périmètre.
/healthVerifier que l API Enterprise repond.
{
"status": "ok",
"version": "1.0.0"
}/organizationLire les informations de l organisation associee a la cle API.
{
"data": {
"id": "org_01J...",
"name": "Groupe Exemple",
"plan": "enterprise"
}
}/learnersLister les apprenants rattaches a l organisation.
{
"data": [
{
"id": "usr_01J...",
"email": "[email protected]",
"first_name": "Manon",
"last_name": "Martin",
"status": "active"
}
],
"pagination": { "limit": 50, "next_cursor": null, "has_more": false }
}/coursesLister les formations visibles dans le perimetre organisationnel.
{
"data": [
{
"id": "crs_01J...",
"title": "Onboarding reseau",
"status": "published",
"updated_at": "2026-06-09T10:00:00Z"
}
],
"pagination": { "limit": 50, "next_cursor": null, "has_more": false }
}/enrollmentsLister les inscriptions, filtrables par apprenant ou formation.
{
"data": [
{
"id": "enr_01J...",
"learner_id": "usr_01J...",
"course_id": "crs_01J...",
"status": "active",
"enrolled_at": "2026-06-09T10:00:00Z"
}
],
"pagination": { "limit": 50, "next_cursor": null, "has_more": false }
}/progressLire les taux de progression, filtrables par apprenant ou formation.
{
"data": [
{
"learner_id": "usr_01J...",
"course_id": "crs_01J...",
"completion_rate": 72,
"last_activity_at": "2026-06-09T10:00:00Z"
}
],
"pagination": { "limit": 50, "next_cursor": null, "has_more": false }
}/certificatesLister les certificats emis dans le perimetre client.
{
"data": [
{
"id": "cert_01J...",
"learner_id": "usr_01J...",
"course_id": "crs_01J...",
"issued_at": "2026-06-09T10:00:00Z",
"verification_url": "https://skill-lms.fr/certificate/verify/cert_01J..."
}
],
"pagination": { "limit": 50, "next_cursor": null, "has_more": false }
}Erreurs
Chaque erreur retourne un code lisible, un message court et un identifiant de requete a transmettre au support si necessaire.
{
"error": {
"code": "unauthorized",
"message": "Authentication is required.",
"request_id": "req_01J..."
}
}Parametre invalide
Authentification absente ou invalide
Scope insuffisant
Ressource introuvable dans l organisation
Rate limit depasse
Erreur interne
Webhooks
Les webhooks sont actives par organisation pendant l onboarding. Les evenements, retries, signatures et journaux de livraison sont cadrables selon le besoin client.
learner.createdenrollment.createdprogress.updatedcertificate.issued{
"id": "evt_01J...",
"type": "certificate.issued",
"created_at": "2026-06-09T10:00:00Z",
"organization_id": "org_01J...",
"data": {
"certificate_id": "cert_01J...",
"learner_id": "usr_01J...",
"course_id": "crs_01J..."
}
}Identite
La connexion enterprise demande une configuration IdP, des domaines, certificats, attributs et tests de recette. SCIM peut automatiser le cycle de vie des utilisateurs dans un perimetre defini.
SAML ou OIDC selon l IdP client, avec mapping des attributs et strategie de fallback.
Provisioning encadre pour creation, synchronisation et desactivation des utilisateurs.
Limites v1
Cette documentation est partageable en avant-vente, mais elle reste volontairement prudente sur les actions sensibles.
Gestion de vos préférences