📦 Créer son export xAPI pour LRS
Le format xAPI (Experience API, anciennement Tin Can API) permet un suivi beaucoup plus fin que le SCORM : au lieu de remonter juste un statut et un score à un LMS, votre export envoie des "statements" (relevés d'activité) directement à un LRS (Learning Record Store), avec ou sans LMS autour.
Définition du format xAPI
Un statement xAPI se lit comme une phrase acteur - verbe - objet, envoyée par requête HTTP au LRS :
- Acteur : qui a réalisé l'action (email ou identifiant de l'apprenant)
- Verbe : l'action réalisée (ex : initialized, completed, passed, progressed)
- Objet : l'activité concernée (votre module Celestory)
- Résultat (optionnel) : score, réussite, progression, durée...
Caractéristiques du format xAPI
- Peut fonctionner sans LMS : votre export peut envoyer ses statements directement à un LRS autonome (Learning Locker, Watershed, SCORM Cloud LRS...)
- Suivi granulaire : chaque interaction peut être remontée, pas seulement un score final comme en SCORM
- Ne définit aucune règle de complétion automatique : c'est vous qui décidez quand chaque statement est envoyé
- ⚠️ Contrairement au SCORM (communication avec la fenêtre parente), xAPI envoie de vraies requêtes réseau : le LRS doit autoriser le CORS depuis l'origine de votre export, sous peine d'erreurs silencieuses (vérifiez la console)
Ressource d'exemple
Le placement des blocs dans le graphe suit exactement la même logique que le tuto SCORM : reprenez le graphe d'exemple SCORM (https://creator.celestory.io/project/phHUew7e6) et remplacez les blocs SCORM par les blocs xAPI ci-dessous, aux mêmes emplacements (début, étapes intermédiaires, fin).
Note importante : Seuls les blocs commençant par xAPI sont à rajouter où vous le souhaitez dans votre graphe.
Étape 1 : Ajouter les blocs Javascript
Bloc 1 : xAPI - Configuration
window.XAPI = {
endpoint: "https://VOTRE-LRS.exemple.com/xapi/",
auth: "Basic VOTRE_CLE_EN_BASE64",
actor: {
objectType: "Agent",
name: "Joueur Celestory",
mbox: "mailto:joueur@exemple.com"
},
activityId: "https://votredomaine.com/activities/nom-du-module"
};
Récupérez l'endpoint et la clé d'authentification auprès de votre LRS (ou de votre LMS, si le LRS y est intégré). Si votre export est lancé depuis un LMS compatible Tin Can Launch, vous pouvez remplacer ces valeurs fixes par une lecture des paramètres transmis dans l'URL au lancement plutôt que de les coder en dur.
Bloc 2 : xAPI - Fonction d'envoi + Initialize
function xAPI_sendStatement(verbId, verbDisplay, resultObj) {
const statement = {
actor: window.XAPI.actor,
verb: {
id: verbId,
display: { "fr-FR": verbDisplay }
},
object: {
id: window.XAPI.activityId,
objectType: "Activity"
}
};
if (resultObj) {
statement.result = resultObj;
}
fetch(window.XAPI.endpoint + "statements", {
method: "POST",
headers: {
"Authorization": window.XAPI.auth,
"Content-Type": "application/json",
"X-Experience-API-Version": "1.0.3"
},
body: JSON.stringify(statement)
}).then(() => console.log("xAPI : statement envoyé -", verbDisplay))
.catch(error => console.log("xAPI erreur envoi", error));
}
xAPI_sendStatement("http://adlnet.gov/expapi/verbs/initialized", "initialisé");
Le verbId (en anglais, normalisé par l'ADL) est ce qui compte pour l'interopérabilité. Le verbDisplay n'est qu'un libellé lisible dans le LRS, vous pouvez le traduire librement.
Bloc 3 : xAPI - Step
const step = 70;
xAPI_sendStatement(
"http://adlnet.gov/expapi/verbs/progressed",
"progression",
{
extensions: {
"http://id.tincanapi.com/extension/progress": step
}
}
);
Vous pouvez rajouter autant d'étapes que vous le souhaitez en dupliquant ce bloc avec différents pourcentages (ex : 10%, 50%, 70%), comme pour les steps SCORM.
Bloc 4 : xAPI - Complete
const scorePercent = 100;
xAPI_sendStatement(
"http://adlnet.gov/expapi/verbs/completed",
"complété",
{
score: {
scaled: scorePercent / 100,
raw: scorePercent,
min: 0,
max: 100
},
completion: true,
success: true
}
);
Bloc 5 : xAPI - Finish Session
xAPI_sendStatement("http://adlnet.gov/expapi/verbs/terminated", "clôturé");
console.log("xAPI : session terminée");
Étape 2 : Exporter le projet
Exportez votre projet au format Web ou PWA.
Étape 3 : (optionnel) Ajouter un fichier tincan.xml
Certains LMS/LRS exigent un package Tin Can plutôt qu'un simple lien direct. Dans ce cas, ajoutez un fichier tincan.xml à la racine de votre export :
<?xml version="1.0" encoding="utf-8"?>
<tincan xmlns="http://projecttincan.com/tincan.xsd">
<activities>
<activity id="https://votredomaine.com/activities/nom-du-module" type="http://adlnet.gov/expapi/activities/module">
<name>Nom du module</name>
<description lang="fr-FR">Description de votre module Celestory</description>
<launch lang="fr-FR">index.html</launch>
</activity>
</activities>
</tincan>
Étape 4 : Compresser et tester
Si un package est exigé, compressez votre dossier en ZIP (comme pour le SCORM). Si votre LRS reçoit les statements directement en HTTP, vous pouvez déployer le contenu Web tel quel (ex : export Lien Direct ou HTML5).
Pour tester, vous pouvez utiliser un site comme https://app.cloud.scorm.com/sc/user/Home (compatible Tin Can/xAPI) ou consulter directement le flux de statements reçus dans le tableau de bord de votre LRS.
Mis à jour le : 02/07/2026
Merci !
