L'API des séances — récupérer les séances pour n'importe quelle date
PremiumQuand quelque chose hors d'Omniscol a besoin de savoir ce qui se passe, et quand, c'est ce point d'accès qu'on appelle :
GET /api/schedules/lessons/{datesrange}
Il renvoie les séances datées de vos emplois du temps — chaque séance posée sur sa date réelle — pour les dates et les entités demandées. Presque toute intégration (un intranet, un ETL, un outil partenaire) part de là. Cette page parcourt les leviers qui en font un seul point d'accès pour de nombreux usages.
Séances vs structures
Deux points d'accès, deux rôles :
GET /api/schedules/lessons/{datesrange}— les séances : chaque séance posée sur une date réelle, avec sa matière, ses enseignants, sa salle, son groupe et sa durée. C'est ce qu'on lit pour savoir qui est où et quand.GET /api/schedules/— les structures : les emplois du temps publiés eux-mêmes (classes, matières, sites, la grille). À lire quand on a besoin du modèle sous-jacent plutôt que des séances datées.
On peut aussi replier les structures dans l'appel des séances avec
with_timetables=true (voir plus bas) : une seule requête renvoie alors
les deux.
Choisir les dates
{datesrange} s'écrit en YYYYMMDD et se veut volontairement souple :
| Forme | Signification |
|---|---|
20261005 |
Un jour précis |
20261005-20261011 |
Un intervalle fermé (une semaine) |
20260901- / -20260630 |
Ouvert d'un côté |
20261005,20261012,20261019 |
Dates éparses — trois lundis précis |
20261005-20261011,20261102-20261108 |
Plusieurs intervalles à la fois |
`` ou - |
Toutes les dates |
La forme éparse (séparée par des virgules) est ce qui fait d'une question comme « ces trois lundis » un seul appel.
Cibler ce dont vous avez besoin
Un filter restreint la requête aux entités qui comptent — la même
grammaire de filtre que les points d'accès de disponibilité
(Requêtage avancé) :
- une simple liste d'identifiants —
{"classes":["3a","3b"]}, - un joker —
{"teachers":"*"}, - une correspondance de champ simple —
{"classrooms":[{"site":"nord"}]}, - ou un
$wherestructuré —{"classrooms":[{"$where":{"capacity":{"$gte":30}}}]}.
Le résultat est groupé par type de filtre, puis par identifiant
d'entité — par exemple schedules.classes.3a.courses[],
schedules.teachers.j-doe.courses[].
Deux autres réglages cadrent l'extraction, et un dernier la plafonne :
timetables_restrict/timetables_exclude— limiter ou exclure des identifiants d'emploi du temps (chaîne, CSV ou tableau).limit— plafonner le nombre de séances renvoyées par filtre.
À quoi ressemble une séance
Chaque entrée de courses[] est une séance posée :
{
"position": { "day": "2026-10-05", "period": 0, "start": "8:15", "end": "9:10" },
"duration": 2,
"subject": "maths",
"teachers": ["j-doe"],
"classroom": "nord:B12",
"class": "3a",
"schedid": "3"
}
position.dayest la date de la séance.position.periodest l'indice de la séance sur la grille de l'emploi du temps — présent pour les séances posées sur la grille. Une séance hors-grille (avec ses propresstart/endexplicites, hors des créneaux réguliers) portestart/endà la place, sansperiod.position.start/position.end(horaires) accompagnent toujours une séance hors-grille, et s'ajoutent aux séances de grille quand vous passezwith_hours=true(horaires pré-calculés). À activer quand votre système cible a besoin des heures d'horloge plutôt que de l'indice de grille.
Absences, annulations et remplacements
Par défaut, le point d'accès consolide les absences : un enseignant absent est retiré de la séance, et une séance sans enseignant restant est considérée comme annulée et écartée. Plusieurs indicateurs changent cela :
without_absences— ignorer complètement les absences ; renvoyer la grille planifiée brute.with_absences— ajouter les absences brutes de la période à côté des séances.with_cancelcourses— conserver les séances annulées (tous les enseignants absents) au lieu de les écarter.with_studentcancelcourses— ne garder que les séances annulées par l'absence d'un élève.with_removedcourses— renvoyer les séances retirées (exclusif avecwith_cancelcourses).without_teacher_consolidation— garder les enseignants absents dans la listeteachersde chaque séance au lieu de les retirer.without_holidays— ne pas injecter les vacances dans la plage.
Par défaut, lorsqu'un remplaçant a été désigné pour une absence, il
remplace simplement l'enseignant absent dans la liste teachers de
la séance — la substitution est transparente, sans champ
supplémentaire. Passez with_cancelcourses ou
without_teacher_consolidation et la séance porte en plus un bloc
substitutes (l'identifiant du remplaçant, le motif d'absence et
l'absence qui l'a imposé), pour voir qui a été remplacé et pourquoi dans
la même charge utile.
Structures et annuaires
Attachez les données de référence utiles, dans le même appel :
with_timetables=true— les structures brutes des emplois du temps ayant servi à calculer les séances (classes, matières, grille, par identifiant). À activer pour résoudre les identifiants ; à laisser désactivé pour une réponse compacte.with_entities=true— nom/code légers (et champs de nom de personne) des entités du résultat.with_teachers/with_all_teachers— les enseignants utilisés sur les séances, ou tous les enseignants de l'emploi du temps et de l'annuaire.with_students— les élèves, avec leurs placements par date.with_events=true— les événements hors grille (conseils, rencontres parents-professeurs…) sur la même plage.
Un tirage ETL nocturne
Récupérer une semaine de séances pour toutes les classes, avec les horaires, et la charger dans votre système d'information :
curl -G "https://votre-etablissement.omniscol.com/api/schedules/lessons/20261005-20261011" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
--data-urlencode 'filter={"classes":"*"}' \
--data-urlencode "with_hours=true"
La réponse groupe les séances sous schedules.classes.<id>.courses[].
Les absences sont déjà consolidées : ce que vous chargez reflète l'emploi
du temps réel et à jour — ajoutez with_absences=true si vous voulez
aussi enregistrer la raison d'un changement.
Pousser vers Omniscol
L'intégration fonctionne aussi dans l'autre sens — pour garder Omniscol aligné sur une source de vérité externe. Ces points d'accès existent uniquement pour cette synchronisation externe ; l'interface Omniscol ne les appelle jamais elle-même :
POST /api/external/classes(os_external_classes_post) — mettre à jour des classes existantes (nom, site, niveau, salle, effectif) depuis une charge utile indexée par identifiant de classe. Il met à jour les classes connues ; il n'en crée pas de nouvelles. Mettez un champ ànullpour l'effacer (le nom de la classe excepté — une classe garde son nom).POST /api/external/teachers(os_external_teachers_post) — insérer ou mettre à jour des enseignants par identifiant, à la fois dans les emplois du temps et dans l'annuaire (en créant l'utilisateur avec le rôle enseignant et un login auto-généré au besoin). Les variantesDELETEretirent une classe ou un enseignant.POST /api/admin/subjects/custom(os_admin_subjects-custom_post) — charger un catalogue de matières personnalisées. Le corps est{ "subjects": [ … ], "replace": false, "nodoubles": true }: incrémental par défaut,replace: truepour un rafraîchissement complet,nodoubles: truepour rapprocher les matières existantes par identifiant externe, code ou nom. C'est le point d'accès d'un push nocturne de matières.
Il existe aussi un point d'accès spécial, uniquement surchargeable,
os_external_classes_get : Omniscol n'en livre aucune implémentation par
défaut, mais lorsqu'un partenaire ou un fournisseur le pointe vers son
propre service (via Personnalisation d'API), l'écran de
création de classe se pré-remplit depuis cette liste fermée de
classes au lieu du formulaire manuel. Sans surcharge, il ne fait
simplement rien.
Pour un progiciel SIS / ERP (Aurion, Auriga…), préférez le connecteur dédié à ces points d'accès bruts — voir Synchronisation avec des systèmes externes.