Cet article est aussi disponible en :

📩 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

Cet article a-t-il répondu à vos questions ?

Partagez vos commentaires

Annuler

Merci !