Skip to Content

Chapitre 11.3 — OneRoster : rosters & notes

⏱️ TL;DROneRoster (1EdTech) synchronise les listes (rosters) et les notes entre le SIS — le logiciel de scolarité de l’établissement — et le LMS. Fini la ressaisie : utilisateurs, établissements, cours, classes, inscriptions (enrollments) et carnet de notes (categories, lineItems, results) circulent automatiquement. Deux transports : une API REST (granulaire, à la demande) ou un échange CSV en masse (un .zip de fichiers, idéal pour une synchro nocturne). Le SIS reste la source de vérité des personnes et des classes ; le LMS les consomme — et lui renvoie souvent les notes. Versions 1.1 et 1.2. C’est le standard-roi du scolaire (K-12), là où une académie gère des milliers d’élèves et des centaines de classes.

🎯 Objectifs

  • Expliquer ce que OneRoster synchronise : utilisateurs, classes, enrollments, notes — et dans quel sens.
  • Situer OneRoster par rapport au SIS (rappel de la Partie 1).
  • Lire un enrollment et un result en JSON (API REST).
  • Choisir entre REST et CSV selon le besoin (temps réel granulaire vs synchro de masse).
  • Distinguer OneRoster (synchro de masse SIS↔LMS) de l’AGS de LTI (renvoi de note au lancement).

Le problème : le roster ressaisi

Une académie déploie ton LMS pour 3 000 élèves, 200 enseignants, 150 classes. Sans standard, quelqu’un doit créer 3 200 comptes, composer 150 classes, inscrire chaque élève dans les bonnes, puis recommencer à chaque rentrée, chaque changement de classe, chaque nouvel élève. C’est intenable — et c’est exactement ce que OneRoster supprime.

Le SIS (Student Information System, le logiciel de scolarité vu en Partie 1) détient déjà ces informations : qui est élève, qui enseigne quoi, qui est dans quelle classe. OneRoster les fait couler du SIS vers le LMS, automatiquement. Et dans l’autre sens, il peut renvoyer les notes du LMS vers le carnet du SIS.

Le modèle de données : deux services

OneRoster couvre deux domaines, souvent appelés services :

ServiceEntitésRôle
Rosteringorgs (établissements), users (students/teachers), courses, classes, enrollments, academicSessionsQui est
Gradebookcategories, lineItems, resultsQuelles notes

Le vocabulaire à retenir :

  • org : un établissement (école, collège, district/académie).
  • course vs class : le course est le programme (« Mathématiques 6e ») ; la class est une instance concrète (« Maths 6e A, salle 12, M. Durand, année 2026-2027 »). On inscrit les gens dans des class, pas dans des course.
  • enrollment : le lien une personne ↔ une classe, avec un rôle (student, teacher…).
  • lineItem : une colonne du carnet (un devoir, un contrôle) — le cousin OneRoster du lineitem d’AGS (Partie 10).
  • result : la note d’un élève pour un lineItem.
  • category : le type d’évaluation (contrôle, devoir maison…), pour pondérer.

Lire un enrollment (REST)

En REST, chaque entité est une ressource. Un appel GET sur une inscription :

GET /ims/oneroster/v1p1/enrollments/enr-4471 HTTP/1.1 Host: sis.academie.fr Authorization: Bearer eyJ0eXAiOiJKV1Qi...

Réponse (l’objet est enveloppé sous une clé nommée enrollment) :

{ "enrollment": { "sourcedId": "enr-4471", "status": "active", "dateLastModified": "2026-09-01T07:00:00.000Z", "role": "student", "primary": true, "beginDate": "2026-09-01", "endDate": "2027-07-04", "user": { "href": "https://sis.academie.fr/ims/oneroster/v1p1/users/usr-2342", "sourcedId": "usr-2342", "type": "user" }, "class": { "href": "https://sis.academie.fr/ims/oneroster/v1p1/classes/cls-6eA-math", "sourcedId": "cls-6eA-math", "type": "class" }, "school": { "href": "https://sis.academie.fr/ims/oneroster/v1p1/orgs/org-clg-jaures", "sourcedId": "org-clg-jaures", "type": "org" } } }

Champ par champ :

  • sourcedId : l’identifiant stable de l’entité, la clé qui permet de faire correspondre SIS et LMS d’une synchro à l’autre. C’est le pivot de tout OneRoster.
  • status : active ou tobedeleted — OneRoster ne « supprime » pas brutalement, il marque à supprimer, ce qui rend les synchros idempotentes et réversibles.
  • role : ici student (aussi teacher, administrator, parent, guardian…).
  • primary : pour un enseignant, distingue le titulaire principal d’un intervenant secondaire.
  • user / class / school : des GUIDRef — des références typées (href + sourcedId + type) vers d’autres entités. OneRoster est un graphe : l’inscription pointe vers la personne, la classe et l’établissement.

⚠️ Piège — Traiter le sourcedId comme jetable ou le régénérer à chaque export. C’est la clé de correspondance : si le SIS change le sourcedId d’un élève entre deux synchros, le LMS croit à un nouvel élève, duplique le compte et perd l’historique. Règle : le sourcedId est stable et pérenne côté source. Toute la fiabilité de la synchro repose dessus.

Lire un result (REST)

Une note est un result rattaché à un lineItem (la colonne) et à un student :

{ "result": { "sourcedId": "res-88120", "status": "active", "dateLastModified": "2026-05-12T14:35:00.000Z", "lineItem": { "href": "https://lms.formacampus.fr/ims/oneroster/v1p1/lineItems/li-fractions-01", "sourcedId": "li-fractions-01", "type": "lineItem" }, "student": { "href": "https://lms.formacampus.fr/ims/oneroster/v1p1/users/usr-2342", "sourcedId": "usr-2342", "type": "user" }, "scoreStatus": "fully graded", "score": 17, "scoreDate": "2026-05-12", "comment": "Bon travail. Revoir les fractions equivalentes." } }
  • scoreStatus : l’état de la note — fully graded, partially graded, submitted, not submitted, exempt. C’est l’équivalent du gradingProgress d’AGS : une note « déposée mais pas encore corrigée » n’est pas une note « définitive ».
  • score : la valeur, à interpréter dans les bornes du lineItem (resultValueMin/resultValueMax, ex. 0 à 20).
  • scoreDate : la date de la note.

Et la colonne à laquelle il se rattache, le lineItem :

{ "lineItem": { "sourcedId": "li-fractions-01", "status": "active", "title": "Calcul mental - fractions", "assignDate": "2026-05-05", "dueDate": "2026-05-12", "class": { "sourcedId": "cls-6eA-math", "type": "class", "href": "..." }, "category": { "sourcedId": "cat-controle", "type": "category", "href": "..." }, "resultValueMin": 0, "resultValueMax": 20 } }

💡 Réflexe — Le trio lineItemresultcategory se lit comme un carnet de notes classique : la colonne (le contrôle), la case (la note d’un élève), la rubrique (contrôle vs devoir maison, pour pondérer la moyenne). Si tu conçois l’export de notes de ton LMS, calque-toi sur ce trio : un lineItem par évaluation, un result par élève et par colonne, chaque lineItem classé dans une category.

REST vs CSV : deux transports

OneRoster définit deux liaisons pour les mêmes données. Le choix dépend de l’usage.

RESTCSV (bulk)
FormeAPI HTTP (JSON), entité par entitéUn .zip de fichiers .csv (un par entité)
GranularitéFine : GET /enrollments/{id}, filtres, paginationEn masse : tout le roster d’un coup
FraîcheurÀ la demande / temps réelBatch (souvent nocturne)
Idéal pourRequêtes ciblées, mises à jour incrémentalesSynchro complète régulière
AuthOAuth 2 (jeton)Fichiers déposés/récupérés (SFTP, etc.)

Le CSV est un jeu de fichiers normalisés — orgs.csv, users.csv, courses.csv, classes.csv, enrollments.csv, lineItems.csv, results.csv, categories.csv, academicSessions.csv — plus un manifest.csv qui décrit le lot. Exemple d’enrollments.csv :

sourcedId,status,dateLastModified,classSourcedId,schoolSourcedId,userSourcedId,role,primary,beginDate,endDate enr-4471,active,2026-09-01T07:00:00.000Z,cls-6eA-math,org-clg-jaures,usr-2342,student,true,2026-09-01,2027-07-04

Chaque colonne correspond à un champ du modèle ; les GUIDRef deviennent de simples références par sourcedId (classSourcedId, userSourcedId…). C’est plat, robuste, parfait pour un import de masse.

💡 RéflexeCSV pour la rentrée, REST pour la journée. Un établissement typique fait un import CSV complet chaque nuit (l’état de vérité du SIS, rechargé), et utilise REST pour les ajustements ponctuels en cours de journée (un élève arrive, une classe change). Beaucoup d’intégrations scolaires sont CSV-only : ne présume pas que la cible expose une API REST — demande quelle liaison elle supporte avant de coder.

OneRoster n’est pas l’AGS

Deux mécanismes déplacent des notes ; ne les confonds pas.

OneRoster (Gradebook)AGS (LTI Advantage)
DéclencheurSynchro planifiée ou à la demandeLancement LTI d’un outil
AxeSIS ↔ LMS, en masseOutil → LMS, à l’unité
TransporteRosters et notes (results)Des notes (Score) dans une colonne
Cas typiqueAlimenter le LMS, remonter les notes au SISUn outil externe qui écrit une note après usage

En clair : AGS répond à « mon outil vient de noter un élève, j’écris dans le carnet du LMS » (Partie 10). OneRoster répond à « je resynchronise tout le roster et toutes les notes entre le SIS et le LMS ». L’un est ponctuel et lié au lancement ; l’autre est massif et périodique.

🔌 Côté intégration — Dans le scolaire, la certification OneRoster de 1EdTech est souvent une exigence de marché : une collectivité ou une académie qui achète un LMS veut la garantie qu’il se branche sur le SIS déjà en place (ONDE, Pronote-like, districts US…) sans intégration sur mesure. Supporter OneRoster 1.1 en CSV ouvre la majorité des portes ; ajouter REST et 1.2 rassure les gros comptes. Rate la synchro roster, et c’est l’appel d’offres qui te rate.

🧭 Sur FormaCampus — Le versant « LMS scolaire » de FormaCampus dessert des collèges. Chaque nuit, le SIS de chaque établissement dépose un lot CSV OneRoster : users.csv, classes.csv, enrollments.csv. FormaCampus recompose comptes, classes et inscriptions sans qu’aucun secrétariat ne saisisse un nom — le sourcedId de chaque élève assure la correspondance d’une nuit à l’autre. En sens inverse, à chaque conseil de classe, FormaCampus exporte les results vers le carnet du SIS (via l’API REST du fournisseur, quand il en expose une). Le SIS reste la source de vérité des personnes ; FormaCampus, celle des notes qu’il produit. On boucle le fil de la Partie 1 : le SIS n’est plus une boîte noire, c’est un partenaire de synchro.

📚 La spec — OneRoster est publié par 1EdTech (1edtech.org), versions 1.1 et 1.2. Deux services : Rostering (orgs, users, courses, classes, enrollments, academicSessions) et Gradebook (categories, lineItems, results). Deux liaisons : REST (JSON, OAuth 2, entités enveloppées sous une clé nommée) et CSV (jeu de fichiers + manifest.csv). Le sourcedId est la clé de correspondance stable ; status = active/tobedeleted ; scoreStatus prend des valeurs comme fully graded, submitted, exempt. Valeurs exactes des rôles et des champs sur 1edtech.org.

✏️ Exercices

Exercice 1 — Lis l’inscription. D’après le enrollment enr-4471 plus haut, qui est inscrit, dans quelle classe, avec quel rôle, et où le LMS ira-t-il chercher le détail de l’élève ?

✅ Solution

L’utilisateur usr-2342 est inscrit comme student (role) dans la classe cls-6eA-math, au collège org-clg-jaures, du 1er septembre 2026 au 4 juillet 2027. Le LMS suit le GUIDRef user (son href) pour récupérer la fiche complète de l’élève : https://sis.academie.fr/ims/oneroster/v1p1/users/usr-2342. Tout tient par les sourcedId.

Exercice 2 — REST ou CSV ? (a) Recharger chaque nuit l’intégralité des inscriptions de 40 collèges. (b) Inscrire à 10 h un élève qui vient d’arriver, tout de suite, sans attendre la synchro nocturne. Quel transport pour chaque cas ?

✅ Solution

(a) CSV en masse : un lot complet par nuit est exactement le cas d’usage du bulk CSV (robuste, simple, gros volumes). (b) REST : une mise à jour ponctuelle et immédiate (POST/PUT sur l’entité concernée) sans recharger tout le roster. Le duo classique : CSV pour l’état de vérité nocturne, REST pour les ajustements du jour.

Exercice 3 — OneRoster ou AGS ? Ton studio d’exercices, lancé en LTI dans Moodle, vient de noter un élève 15/20. Tu veux que la note apparaisse dans le carnet Moodle. OneRoster ou AGS ? Et si tu voulais, à l’inverse, importer chaque nuit toutes les classes du collège ?

✅ Solution

Note issue d’un lancement d’outilAGS (Partie 10) : POST {lineitem}/scores vers le carnet du LMS, au fil de l’eau. Import massif et périodique des classes → OneRoster (Rostering, en CSV nocturne le plus souvent). Règle : AGS = ponctuel, lié au lancement, outil→LMS ; OneRoster = massif, planifié, SIS↔LMS.

🧠 Quiz de révision

1. Que synchronise OneRoster, et dans quel sens ?

Les rosters (utilisateurs, orgs, cours, classes, enrollments) et le carnet de notes (categories, lineItems, results) entre SIS et LMS. Sens dominant : rosters SIS → LMS (le SIS est la source de vérité des personnes/classes) ; notes souvent LMS → SIS.

2. Différence entre course et class ?

Le course est le programme (« Mathématiques 6e ») ; la class est une instance concrète (« Maths 6e A, M. Durand, 2026-2027 »). On inscrit les gens (enrollments) dans des class, pas dans des course.

3. À quoi sert le sourcedId et pourquoi doit-il être stable ?

C’est l’identifiant de correspondance entre SIS et LMS. S’il change entre deux synchros, le LMS croit à une nouvelle entité, la duplique et perd l’historique. Toute la fiabilité de la synchro repose sur des sourcedId stables et pérennes.

4. Quand choisir CSV plutôt que REST ?

CSV pour une synchro complète et périodique (typiquement nocturne, gros volumes, robuste) — un .zip de fichiers normalisés. REST pour des requêtes ciblées et à la demande (mises à jour incrémentales en cours de journée). Beaucoup d’intégrations scolaires sont CSV-only : vérifier la liaison supportée.

5. En quoi OneRoster diffère-t-il de l’AGS de LTI ?

AGS renvoie une note dans le carnet du LMS au fil d’un lancement d’outil (outil → LMS, ponctuel). OneRoster synchronise rosters et notes en masse entre SIS et LMS, de façon planifiée. L’un est lié au lancement, l’autre est un échange de masse.


Chapitre suivant : 11.4 — Caliper Analytics — capturer des événements d’apprentissage normalisés pour alimenter un tableau de bord.

Last updated on