MeetingHub MeetingHub Télécharger la collection Postman

Référence — emploi du temps

L’objet Cours, la lecture, le dépôt et l’annulation.

Lire les cours, déposer un emploi du temps, annuler un cours. Ces routes s'appellent avec une clé d'intégration : voir Conventions. Toutes sont sous /api/institutions/:institutionId, où :institutionId est l'identifiant de l'établissement de la clé, rendu par GET /api/me.

L'objet Cours

{
  "id": "9214f192-5c1e-4a0e-9b6e-1c2d3e4f5a6b",
  "roomId": "0b6a1f4e-2c3d-4e5f-8a9b-7c6d5e4f3a2b",
  "roomShortId": "ABCD2345",
  "roomName": "Salle 204",
  "occurrenceId": null,
  "groupId": "3c2b1a09-8f7e-4d6c-9b5a-4e3d2c1b0a9f",
  "groupName": "BTS SIO 1",
  "audiences": [],
  "teacherId": null,
  "title": "Mathématiques",
  "startsAt": "2026-10-14T08:00:00.000Z",
  "endsAt": "2026-10-14T10:00:00.000Z",
  "opensAt": "2026-10-14T07:50:00.000Z",
  "closesAt": "2026-10-14T10:15:00.000Z",
  "status": "scheduled",
  "lastActiveAt": null,
  "externalRef": "ENT-12345"

}
ChampTypeDescription
iduuidIdentifiant du cours dans MeetingHub, le :lessonId des adresses. C'est lui que porte le webhook attendance.closed, dans sessionId
roomIduuidLa salle du cours
roomShortIdstring ou nullL'identifiant court de la salle, 8 caractères. Les participants rejoignent la salle à l'adresse /app/?room= suivie de cet identifiant
roomNamestring ou nullLe nom de la salle ; null si la salle a été supprimée
occurrenceIduuid ou nullLa série dont le cours est issu ; null pour un cours isolé, dont tous ceux déposés par l'API
groupIduuid ou nullLa classe attendue ; null si aucune
groupNamestring ou nullLe nom de cette classe
audiencesobject[]Les classes d'autres centres à qui le cours est aussi diffusé, chacune avec son id et son name ; vide le plus souvent
teacherIduuid ou nullL'enseignant désigné pour le cours ; null si aucun
titlestring ou nullL'intitulé du cours
startsAtdatetimeL'heure de début du cours
endsAtdatetimeL'heure de fin du cours
opensAtdatetimeL'heure d'ouverture de la salle, avant le début. Voir Fenêtre d'accès
closesAtdatetimeL'heure de fermeture de la salle, après la fin
statusstringL'état du cours. Voir Statuts
lastActiveAtdatetime ou nullLa dernière activité observée dans la salle pendant ce cours ; null si personne n'est venu
externalRefstring ou nullVotre ref pour ce cours ; null s'il a été créé dans MeetingHub et non par un dépôt

Statuts

ValeurSignification
scheduledÀ venir : la salle n'est pas encore ouverte
dormantLa salle est ouverte, mais personne n'y est connecté, ou plus personne depuis 90 secondes
liveAu moins un participant est connecté
heldTerminé : la fenêtre d'accès est passée, et la feuille de présence a été arrêtée s'il y avait de quoi l'établir
cancelledAnnulé

Le statut suit les connexions et un balayage qui passe toutes les 15 minutes. Un cours auquel personne ne s'est connecté peut donc rester scheduled jusqu'à ce que ce balayage le passe held, au plus tard 15 minutes après closesAt.

Fenêtre d'accès

La salle s'ouvre avant le début du cours et se ferme après sa fin. Les deux marges dépendent du type de la salle ; elles ne se fixent pas dans un dépôt.

Type de salleOuverture avant le débutFermeture après la fin
interview — entretien5 minutes10 minutes
meeting — réunion10 minutes15 minutes
class — cours10 minutes15 minutes
lecture — amphithéâtre20 minutes20 minutes
conference — conférence30 minutes30 minutes

Une salle créée par un dépôt est toujours de type class.

GET /api/institutions/:institutionId/lessons

Les cours d'une période. Exige schedule.read — la portée schedule:read.

Paramètre de requêteTypeDéfautDescription
fromdatetimemaintenant moins 7 joursDébut de la période
todatetimemaintenant plus 30 joursFin de la période
groupIduuidabsentNe rend que les cours de cette classe

La période ne peut pas dépasser 400 jours, et to ne peut pas précéder from. Un cours est rendu s'il chevauche la période : sa fin est postérieure ou égale à from, et son début antérieur ou égal à to. Tous les statuts sont rendus, cours annulés compris.

Réponse 200 :

{
  "lessons": [ { "id": "9214f192-…", "status": "scheduled", "…": "…" } ],
  "from": "2026-10-12T00:00:00.000Z",
  "to": "2026-10-19T00:00:00.000Z"

}
ChampTypeDescription
lessonsCours[]Les cours, triés par heure de début. Voir L'objet Cours
fromdatetimeLe début de la période retenue
todatetimeLa fin de la période retenue
CodeCorpsCause
400date de début illisiblefrom n'est pas une date
400date de fin illisibleto n'est pas une date
400la fin précède le débutto est avant from
400fenêtre trop large — 400 jours au maximumLa période dépasse 400 jours
403cet accès ne permet pas cela — il faut : schedule.readPortée absente

PUT /api/institutions/:institutionId/lessons

Dépose un emploi du temps. Exige schedule.write — la portée schedule:write.

Le dépôt est rejouable : chaque cours est reconnu par votre ref, et un même corps envoyé deux fois ne change rien. Un cours absent du dépôt n'est PAS annulé.

Paramètre de requêteTypeDéfautDescription
dryRunstringabsentAbsent, false ou 0 : le dépôt est appliqué. Toute autre valeur — true, 1, vide — fait un essai à blanc, qui n'écrit rien

Corps de la requête

{
  "sessions": [
    {
      "ref": "ENT-12345",
      "room": { "ref": "salle-204", "name": "Salle 204" },
      "group": { "ref": "bts-sio-1", "name": "BTS SIO 1" },
      "title": "Mathématiques",
      "startsAt": "2026-10-14T08:00:00Z",
      "durationMinutes": 120,
      "cancelled": false
    }
  ]

}
ChampTypeObligatoireRègles
sessionsobject[]ouiLes cours, de 1 à 5 000 entrées

Chaque entrée de sessions :

ChampTypeObligatoireRègles
refstringouiVotre identifiant du cours. 1 à 200 caractères, espaces de bord retirés, tronqué au-delà
roomobject ou stringouiLa salle. Une chaîne vaut { "ref": … } sans nom
room.refstringouiVotre identifiant de la salle, mêmes règles que ref
room.namestringnonLe nom de la salle, 200 caractères au plus. Utilisé seulement si la salle est créée par ce dépôt ; ignoré sinon
room.centrestringnonLe centre de la salle : sa référence dans l'établissement, à défaut son nom. Donné à une salle créée, ou à une salle qui n'a pas encore de centre ; une salle déjà rangée dans un centre n'en change pas
groupobject ou nullnonLa classe attendue. Absent ou null : aucune classe
group.refstringoui, si group est fourniVotre identifiant de la classe, mêmes règles que ref
group.namestringnonLe nom de la classe, 200 caractères au plus. Utilisé seulement si la classe est créée par ce dépôt
group.centrestringnonLe centre de la classe, mêmes règles que room.centre
titlestring ou nullnonL'intitulé, 200 caractères au plus. Vide : null
startsAtdatetimeouiL'heure de début. Au plus 90 jours dans le passé, au plus 400 jours dans le futur
durationMinutesnumberouiLa durée en minutes, de 1 à 1 440, arrondie à l'entier
cancelledbooleannontrue annule le cours. Toute autre valeur est ignorée

Traitement

  1. Chaque entrée est lue et vérifiée seule. Une entrée fautive est refusée, les autres continuent.
  2. Le dépôt est confronté à lui-même : deux entrées de même ref, ou deux cours non annulés qui se chevauchent dans la même salle, sont refusés TOUS LES DEUX. Deux créneaux qui se touchent — fin de l'un égale au début de l'autre — ne se chevauchent pas. Une entrée dont room.centre ou group.centre ne désigne aucun centre de l'établissement est refusée.
  3. Les salles et les classes sont cherchées par leur ref. Celles qui n'existent pas sont créées, sauf en essai à blanc : une salle de type class et de capacité 80, nommée room.name, ou room.ref à défaut ; une classe nommée group.name, ou group.ref à défaut. Chacune reçoit le centre donné par le dépôt, s'il y en a un.
  4. Chaque entrée restante est appliquée. Une entrée cancelled: true annule le cours s'il existe. Sinon, le cours est refusé si un AUTRE cours non annulé occupe déjà la salle sur ce créneau ; il est laissé tel quel si rien n'a changé ; il est déplacé s'il existe ; il est créé sinon.

Règles qui en découlent :

Réponse

201 si le dépôt est appliqué, 200 si c'est un essai à blanc — dans les deux cas même si des entrées sont refusées.

{
  "dryRun": false,
  "read": 3,
  "created": 1,
  "updated": 1,
  "unchanged": 0,
  "cancelled": 0,
  "rejected": 1,
  "roomsCreated": 1,
  "groupsCreated": 0,
  "lines": [
    { "ref": "ENT-12345", "outcome": "created", "sessionId": "9214f192-…" },
    { "ref": "ENT-12346", "outcome": "updated", "sessionId": "7a1b2c3d-…" },
    {
      "ref": "ENT-12347",
      "outcome": "rejected",
      "sessionId": null,
      "reason": "salle « salle-204 » déjà occupée de 2026-10-14T08:00:00.000Z à 2026-10-14T10:00:00.000Z"
    }
  ]

}
ChampTypeDescription
dryRunbooleantrue pour un essai à blanc
readintegerLe nombre d'entrées reçues
createdintegerCours créés, ou qui le seraient en essai à blanc
updatedintegerCours déplacés ou modifiés
unchangedintegerCours déjà à jour, et annulations sans effet
cancelledintegerCours annulés par ce dépôt
rejectedintegerEntrées refusées
roomsCreatedintegerSalles créées ; toujours 0 en essai à blanc
groupsCreatedintegerClasses créées ; toujours 0 en essai à blanc
linesLigneDuRapport[]Une ligne par entrée reçue, triées par ref dans l'ordre alphabétique

Chaque ligne du rapport :

ChampTypeDescription
refstringVotre ref. Pour une entrée refusée sans ref lisible : ligne N, où N est sa position dans sessions, en comptant à partir de 0
outcomestringcreated, updated, unchanged, cancelled ou rejected
sessionIduuid ou nullLe cours dans MeetingHub — son :lessonId. null pour une création en essai à blanc et pour la plupart des refus
reasonstringPrésent seulement quand outcome vaut rejected : la cause du refus

Causes de refus d'une entrée

reasonCause
ligne illisibleL'entrée n'est pas un objet
« ref » manquante — c’est elle qui rend le dépôt rejouableref absente ou vide
« room.ref » manquanteSalle absente, ou sans ref
« group.ref » manquantegroup fourni sans ref
centre « … » inconnu de l’établissementroom.centre ou group.centre ne désigne aucun centre, ni par sa référence ni par son nom
« startsAt » absente ou illisiblestartsAt absente ou pas une date
cours vieux de plus de 90 jours — …startsAt plus de 90 jours dans le passé
cours au-delà de 400 jours — année scolaire dépasséestartsAt plus de 400 jours dans le futur
« durationMinutes » absente ou nulleDurée absente, pas un nombre, ou inférieure à 1
un cours de plus de vingt-quatre heures est une erreur de saisieDurée supérieure à 1 440 minutes
« … » apparaît N fois dans ce dépôtPlusieurs entrées portent la même ref
chevauchement dans « … » entre « … » et « … »Deux entrées du dépôt se chevauchent dans la même salle
salle « … » déjà occupée de … à …Un cours déjà enregistré occupe le créneau ; les heures sont en ISO 8601
cours déjà tenu — sa feuille de présence porte l’heure réelleLe cours est held
N salle(s) de ce type déjà retenue(s) sur ce créneau — le plafond est de MLe plafond de simultanéité de votre offre est atteint

Erreurs de la requête entière

CodeCorpsCause
400attendu : { "sessions": [...] }Le corps n'a pas de tableau sessions
400dépôt videsessions est vide
400N cours — le maximum est 5000 par dépôtPlus de 5 000 entrées
403cet accès ne permet pas cela — il faut : schedule.writePortée absente
503dépôt indisponible pour le momentL'instance tourne sans base de données

DELETE /api/institutions/:institutionId/lessons/by-ref/:ref

Annule un cours déposé, par votre ref. Exige schedule.write — la portée schedule:write.

Paramètre de cheminTypeDescription
refstringVotre ref du cours, encodée pour une URL

Réponse 200 :

{ "ref": "ENT-12345", "outcome": "cancelled", "sessionId": "9214f192-5c1e-4a0e-9b6e-1c2d3e4f5a6b" 
}
ChampTypeDescription
refstringLa ref demandée
outcomestringcancelled si le cours vient d'être annulé ; unchanged s'il l'était déjà
sessionIduuidLe cours dans MeetingHub — son :lessonId

L'annulation libère la place que le cours retenait dans le plafond de simultanéité. Elle n'émet pas l'événement session.cancelled.

CodeCorpsCause
400référence manquanteref vide
403cet accès ne permet pas cela — il faut : schedule.writePortée absente
404cours « … » inconnuAucun cours ne porte cette ref dans l'établissement
409cours déjà tenu — sa feuille de présence porte l’heure réelleLe cours est held

Les autres routes des cours

La même clé atteint aussi, selon ses portées, GET …/lessons/:lessonId (un cours), GET …/lessons/conflicts (les chevauchements d'une période) et les écritures à l'unité : poser un cours, une série, désigner l'enseignant, diffuser à d'autres classes, annuler par DELETE …/lessons/:lessonId. Cette dernière annulation, elle, émet session.cancelled. Chaque route, et ce qu'elle exige, est dans Conventions.