MeetingHub MeetingHub Télécharger la collection Postman

Référence — conventions

Adresse, authentification, types, pagination et limites, pour toutes les routes.

Ce qui vaut pour toutes les routes de l'API : l'adresse, l'authentification, les types de données, la pagination, la taille des corps et les limites de débit. Chaque page de la référence s'appuie sur ces définitions.

Toutes les routes

Une seule API, /api, pour l'application, le logiciel d'un établissement et celui d'un éditeur partenaire. Cette table est générée depuis les déclarations qui gardent les routes : elle ne peut pas diverger de l'API.

La colonne « Exige » dit ce que l'appelant doit pouvoir faire. Une capacité d'établissement (schedule.read, institution.manage…) se mesure dans l'établissement désigné par l'adresse ; « ou » sépare des capacités dont une seule suffit.

MéthodeCheminExigeRôle
GET/api/meaucuneQui appelle, et où il peut agir.
GET/api/institutions/:institutionIdinstitution.viewL’établissement, son statut, et ce que l’appelant peut y faire.
GET/api/institutionsun appelant identifiéLes établissements que l’appelant atteint : les siens, celui de sa clé, ceux qu’il a ouverts.
POST/api/institutionsune clé d’éditeurOuvre un établissement pour un client ; à l’essai (sandbox), il n’expire pas.
GET/api/partner/webhooksune clé d’éditeurLes alertes de l’éditeur : posées une fois, valables dans tous ses établissements.
POST/api/partner/webhooksune clé d’éditeurPose une alerte ; son secret n’est montré qu’une fois.
PATCH/api/partner/webhooks/:webhookIdune clé d’éditeurModifie une alerte.
DELETE/api/partner/webhooks/:webhookIdune clé d’éditeurRetire une alerte, dans tous les établissements.
GET/api/partner/usageune clé d’éditeurCe que chaque établissement a consommé sur un mois (?month=AAAA-MM).
GET/api/institutions/:institutionId/room-kindsinstitution.viewLes types de salle et leurs règles, pour composer un formulaire.
GET/api/institutions/:institutionId/lessonsschedule.readL’emploi du temps sur une fenêtre (from, to), éventuellement pour une classe (groupId).
POST/api/institutions/:institutionId/lessonsschedule.writePose un cours dans une salle, pour une classe et son auditoire.
POST/api/institutions/:institutionId/lessons/seriesschedule.writePose un cours chaque semaine jusqu’à une date, avec sa classe et son enseignant.
PUT/api/institutions/:institutionId/lessonsschedule.writeDépose un emploi du temps, cours par cours, chacun sous sa référence : rejouable, il n’efface rien.
GET/api/institutions/:institutionId/lessons/conflictsschedule.readLes chevauchements : une salle réservée deux fois, une classe attendue à deux endroits.
DELETE/api/institutions/:institutionId/lessons/by-ref/:refschedule.writeAnnule un cours déposé, par la référence qu’il porte chez vous.
GET/api/institutions/:institutionId/lessons/:lessonIdschedule.readUn cours.
DELETE/api/institutions/:institutionId/lessons/:lessonIdschedule.writeAnnule un cours.
PUT/api/institutions/:institutionId/lessons/:lessonId/audiencesschedule.writeDiffuse un cours à des classes d’autres centres.
PUT/api/institutions/:institutionId/lessons/:lessonId/teacherschedule.writeDésigne l’enseignant du cours, ou son remplaçant pour ce cours ; nul le retire.
GET/api/institutions/:institutionId/lessons/:lessonId/attendanceattendance.readLa feuille de présence d’un cours clos, ligne par ligne.
GET/api/institutions/:institutionId/lessons/:lessonId/attendance.csvattendance.readLa feuille en CSV, sous le nom de fichier que l’établissement archivera.
GET/api/institutions/:institutionId/lessons/:lessonId/attendance.htmlattendance.readLa feuille à imprimer.
POST/api/institutions/:institutionId/lessons/:lessonId/attendance/closeschedule.writeArrête la feuille sans attendre le balayage ; déjà close, elle est rendue telle quelle.
GET/api/institutions/:institutionId/centresinstitution.viewLes centres — pour un directeur de centre, les siens.
POST/api/institutions/:institutionId/centresinstitution.manage ou partner.manageDéclare un centre.
PATCH/api/institutions/:institutionId/centres/:centreIdinstitution.manageRenomme un centre, ou change sa référence et sa ville.
DELETE/api/institutions/:institutionId/centres/:centreIdinstitution.manageRetire un centre.
GET/api/institutions/:institutionId/centres/:centreId/directorsinstitution.manageLes directeurs d’un centre.
POST/api/institutions/:institutionId/centres/:centreId/directorsinstitution.manageNomme directeur de ce centre un membre, par son adresse.
PUT/api/institutions/:institutionId/centres/:centreId/directors/:accountIdinstitution.manageNomme directeur de ce centre un membre, par son identifiant.
DELETE/api/institutions/:institutionId/centres/:centreId/directors/:accountIdinstitution.manageRetire sa direction à un directeur de centre.
GET/api/institutions/:institutionId/keysinstitution.manage ou partner.manageLes accès logiciels de l’établissement, et les portées qu’on peut leur donner.
POST/api/institutions/:institutionId/keysinstitution.manage ou partner.manageCrée un accès ; la clé n’est montrée qu’une fois.
DELETE/api/institutions/:institutionId/keys/:keyIdinstitution.manage ou partner.manageRévoque un accès : il cesse aussitôt de fonctionner.
GET/api/institutions/:institutionId/keys/:keyId/activityinstitution.manageCe qu’un accès a fait : le journal, interrogé par acteur.
GET/api/institutions/:institutionId/overviewinstitution.manageSes personnes, ses salles, et celles qui sont ouvertes en ce moment.
GET/api/institutions/:institutionId/capacityinstitution.manageLes places réservées par les cours d’une période, au regard des quotas (from, to).
GET/api/institutions/:institutionId/room-policiesinstitution.manageLes quotas par type de salle : ce que l’accord a fixé, et ce qui vient du catalogue.
PUT/api/institutions/:institutionId/room-policies/:kindl’exploitantRègle le quota d’un type de salle — l’exploitant seul, selon l’accord.
DELETE/api/institutions/:institutionId/room-policies/:kindl’exploitantRend un type de salle au catalogue : retire l’écart, sans poser de plafond « illimité ».
GET/api/institutions/:institutionId/journalinstitution.manageLe journal de l’établissement : qui a fait quoi, passages de l’assistance compris.
GET/api/institutions/:institutionId/roomsinstitution.manage ou studies.manage ou studies.centresLes salles de l’établissement, par page, avec leur titulaire — pour un directeur de centre, celles de ses centres.
PATCH/api/institutions/:institutionId/rooms/:codeinstitution.manageVerrouille ou déverrouille une salle (locked).
DELETE/api/institutions/:institutionId/rooms/:codeinstitution.manageSupprime une salle.
GET/api/institutions/:institutionId/retentioninstitution.manageCombien de jours garder les présences et les feuilles ; nul : tout garder.
PUT/api/institutions/:institutionId/retentioninstitution.manageFixe ces durées.
GET/api/institutions/:institutionId/classesstudies.manage ou studies.centresLes classes, par page (search, archived).
POST/api/institutions/:institutionId/classesstudies.manage ou studies.centresCrée une classe — un directeur de centre, dans l’un de ses centres.
GET/api/institutions/:institutionId/classes/:classIdstudies.manage ou studies.centresUne classe, et sa salle attitrée.
PUT/api/institutions/:institutionId/classes/:classId/roomstudies.manage ou studies.centresLa salle attitrée de la classe : ses cours la prennent par défaut, ses apprenants y entrent sans invitation. room: null la retire.
PATCH/api/institutions/:institutionId/classes/:classIdstudies.manage ou studies.centresRenomme une classe, change son centre, l’archive.
DELETE/api/institutions/:institutionId/classes/:classIdstudies.manage ou studies.centresSupprime une classe.
GET/api/institutions/:institutionId/classes/:classId/membersstudies.manage ou studies.centresLes inscrits d’une classe, par page.
POST/api/institutions/:institutionId/classes/:classId/membersstudies.manage ou studies.centresInscrit des personnes de l’établissement, par leur courriel ; les inconnues sont rendues.
DELETE/api/institutions/:institutionId/classes/:classId/members/:accountIdstudies.manage ou studies.centresRetire une personne d’une classe.
POST/api/institutions/:institutionId/classes/:classId/importstudies.manage ou studies.centresImporte une liste (CSV : courriel ou téléphone, nom). À blanc par défaut ; dryRun=0 applique.
GET/api/institutions/:institutionId/dashboardstudies.manage ou studies.centresLe tableau de bord : assiduité, heures, décrochage, confort et données, par centre et par classe (from, to).
GET/api/institutions/:institutionId/webhooksinstitution.manageLes alertes de l’établissement, et les événements qu’on peut suivre.
POST/api/institutions/:institutionId/webhooksinstitution.managePose une alerte ; son secret de signature n’est montré qu’une fois.
PATCH/api/institutions/:institutionId/webhooks/:webhookIdinstitution.manageModifie une alerte : adresse, événements, nom, ou la suspend (enabled).
DELETE/api/institutions/:institutionId/webhooks/:webhookIdinstitution.manageRetire une alerte.
GET/api/institutions/:institutionId/webhooks/:webhookId/deliveriesinstitution.manageCe qui est parti, et son sort (limit, 50 par défaut, 200 au plus).
POST/api/institutions/:institutionId/entriespartner.manageUn lien d’entrée dans une salle, à ouvrir dans une iframe sur une origine enregistrée.
PUT/api/institutions/:institutionId/classes/by-ref/:ref/rosterroster.writeDépose la liste des inscrits d’une classe. À blanc par défaut : écrire ?dryRun=false.
GET/api/institutions/:institutionId/membersinstitution.manageLes membres, par page, avec leur rôle.
GET/api/institutions/:institutionId/teachersinstitution.manage ou studies.manage ou studies.centresLes enseignants de l’établissement : ceux qu’on désigne pour un cours.
POST/api/institutions/:institutionId/membersinstitution.manage ou studies.manage ou studies.centresInvite une personne par son courriel ou son téléphone ; rend son lien d’activation s’il faut en créer le compte.
PATCH/api/institutions/:institutionId/members/:accountIdinstitution.manageChange le rôle d’un membre. Le Promoteur, lui, transmet son titre.
DELETE/api/institutions/:institutionId/members/:accountIdinstitution.manageRetire une personne de l’établissement ; son compte demeure.
POST/api/institutions/:institutionId/members/:accountId/activation-linkinstitution.manageUn nouveau lien d’activation, à partager : il ne vaut qu’une fois.
POST/api/institutions/:institutionId/members/:accountId/promoterinstitution.transferLe Promoteur transmet son titre ; il devient Administrateur.
PATCH/api/meun appelant identifiéSon nom, et l’accord de son rôle (masculine, feminine).
GET/api/me/ticketsun appelant identifiéMes demandes d’assistance, avec le lien de suivi de chacune.
POST/api/me/ticketsun appelant identifiéOuvre une demande d’assistance sous son compte. share=true la partage avec l’établissement actif.
GET/api/me/classesun appelant identifiéMes classes, dans tous mes établissements, et la salle attitrée de chacune.
GET/api/me/lessonsun appelant identifiéMes prochains cours : ceux que j’enseigne, dans tous mes établissements (from, to).
PUT/api/me/passwordun appelant identifiéChange son mot de passe ; l’actuel est demandé.
PUT/api/me/identifiersun appelant identifiéChange son courriel ou son téléphone ; le mot de passe est demandé.
POST/api/me/email/proofun appelant identifiéRenvoie le lien qui confirme son courriel. Il ne part qu’à l’adresse, et n’est jamais rendu ici.
POST/api/email/confirmaucuneConsomme le lien reçu par courriel : l’adresse est désormais prouvée. 410 si le lien ne vaut plus.
GET/api/me/invitationsun appelant identifiéLes établissements qui m’invitent, et que je n’ai pas encore rejoints.
POST/api/me/invitations/:orgIdun appelant identifiéAccepte l’invitation de cet établissement : j’y entre, avec le rôle et les classes prévus.
DELETE/api/me/invitations/:orgIdun appelant identifiéDécline l’invitation de cet établissement.
GET/api/institutions/:institutionId/onboardinginstitution.manageOù en est l’accueil guidé : centres, enseignants, salles, cours planifiés.
GET/api/institutions/:institutionId/export/attendance.csvinstitution.exportToutes les feuilles de présence en un fichier — possible même en pause.
POST/api/institutions/:institutionId/closureinstitution.closeDemande la fermeture : l’accès passe en pause, les données sont effacées dans trente jours.
DELETE/api/institutions/:institutionId/closureinstitution.closeAnnule une fermeture demandée ; l’accès reste en pause jusqu’à sa réouverture.
GET/api/institutions/:institutionId/support-ticketsinstitution.manageLes demandes d’assistance partagées avec l’établissement (search, limit, offset).
GET/api/institutions/:institutionId/support-tickets/:ticketIdinstitution.manageUne demande partagée et son fil, en lecture.
GET/api/rooms/:code/teamun appelant identifiéLe titulaire de la salle et ses co-animateurs.
PUT/api/rooms/:code/team/:accountIdun appelant identifiéFait d’une personne de l’établissement un co-animateur de la salle.
POST/api/rooms/:code/teamun appelant identifiéFait d’une personne de l’établissement un co-animateur, par son courriel ou son téléphone.
DELETE/api/rooms/:code/team/:accountIdun appelant identifiéRetire un co-animateur ; le titulaire, lui, transmet d’abord la salle.
POST/api/rooms/:code/ownerun appelant identifiéTransmet la salle à une personne de l’établissement (identifiant, courriel ou téléphone) ; l’ancien titulaire reste co-animateur.

Les anciennes adresses /api/integration/… et /api/partner/… répondent encore, comme alias dépréciés de ces routes : chaque réponse porte l'en-tête Deprecation: true et un en-tête Link vers la route qui la remplace, par exemple Link: </api/institutions/…/lessons>; rel="successor-version". Elles n'acceptent que leur propre sorte de clé — mhk_… pour la première, mhp_… pour la seconde — et disparaîtront à la prochaine version.

Adresse de base

Toutes les routes sont relatives au domaine de votre instance, par exemple https://reunion.votre-etablissement.fr. En production, l'API n'est servie qu'en HTTPS.

Version

La version de l'API se dit dans un en-tête, pas dans l'adresse : une ressource garde la même adresse d'une version à l'autre, et c'est votre programme qui dit quel contrat il attend.

Api-Version: 1
CodeCorpscode
400version d’API inconnue : « 2 » — versions servies : 1api.version

Le corps du refus porte aussi supported, la liste des versions servies. Chaque réponse de l'API porte l'en-tête Api-Version, la version qui l'a servie. La version est un entier : on fige un contrat, pas un correctif.

Authentification

Une seule porte, et un seul justificatif par requête : la session d'une personne, la clé du logiciel d'un établissement (mhk_…) ou celle d'un éditeur partenaire (mhp_…). Une requête qui porte à la fois le cookie de session et un en-tête Authorization est refusée (400, code auth.ambiguous) : elle n'est pas départagée.

AppelantJustificatifAtteint
Une personneCookie de session meetinghub.sidLes établissements dont elle est membre, selon son rôle
Le logiciel d'un établissementAuthorization: Bearer mhk_…Son établissement, selon les portées de la clé
Un éditeur partenaireAuthorization: Bearer mhp_…Les établissements qu'il a ouverts. Voir Éditeurs partenaires

L'établissement d'un appel se lit dans l'adresse : /api/institutions/:institutionId/…. Un établissement que l'appelant n'atteint pas répond 404, code not-found, comme s'il n'existait pas. Une route qui demande une capacité que l'appelant n'a pas dans cet établissement répond 403, code forbidden, et le message nomme ce qu'il faudrait : cet accès ne permet pas cela — il faut : schedule.read.

Une écriture faite avec le cookie de session doit venir des pages de MeetingHub : une écriture qui porte l'en-tête Origin d'un autre site est refusée (403, code origin.refused). Un client sans en-tête Origin, comme curl, n'est pas concerné.

La clé d'intégration

Authorization: Bearer mhk_Abdvt1rV_47R9xK2pQ…
ÉlémentForme
Préfixe fixemhk_ ; mhp_ pour une clé d'éditeur partenaire
Préfixe de la clé8 caractères, lisible en clair : il identifie la clé dans un journal
Séparateur_
Secret43 caractères
Alphabetlettres A-Z et a-z, chiffres, - et _

La clé est vérifiée à chaque requête : une révocation prend effet à la requête suivante. Les réponses d'échec sont décrites sur la page Clés d'intégration.

GET /api/me

Rend l'appelant et ce qu'il peut faire. Aucune capacité n'est demandée ; sans justificatif, la réponse est { "actor": { "kind": "anonymous" } }.

Réponse 200, pour une clé d'établissement :

{
  "actor": { "kind": "institution-key", "id": "…", "name": "ENT — émargement" },
  "institutions": [{ "id": "6c1d3a52-…", "name": "Lycée bilingue", "status": "active" }],
  "capabilities": ["institution.view", "attendance.read"]

}
ChampTypeDescription
actor.kindstringperson, institution-key, partner-key ou anonymous
actor.iduuidL'identifiant de la clé, de l'éditeur partenaire ou du compte
actor.namestringLe nom de la clé, celui de l'éditeur partenaire, ou le courriel de la personne — son téléphone à défaut
institutionsobject[]Les établissements que l'appelant atteint, avec leur id, leur name et leur status : trial, active ou paused. Pour une personne, role remplace status
capabilitiesstring[]Pour une clé : ce qu'elle ouvre, ses portées dites en capacités (attendance:read → attendance.read). Pour un éditeur partenaire : institution.view et partner.manage
userobjectPour une personne seulement : son compte, tel que le rend la connexion ci-dessous

Ouvrir une session d'administrateur

POST /api/auth/signin — sans authentification. C'est ainsi qu'un administrateur appelle l'API avec sa session, par exemple pour poser une clé.

Champ du corpsTypeObligatoireDescription
identifierstringouiLe courriel du compte, ou son téléphone. email est encore lu à sa place
passwordstringouiLe mot de passe du compte

Réponse 200, avec l'en-tête Set-Cookie: meetinghub.sid=… :

{
  "user": {
    "id": "5a74f72e-81af-402c-a2af-a5ebd35b7bba",
    "email": "direction@mon-lycee.fr",
    "phone": null,
    "displayName": "Direction",
    "platformAdmin": false,
    "orgId": "6c1d3a52-7a0e-4f0b-9c55-0a54c3e1f2b8",
    "orgRole": "admin",
    "capabilities": ["institution.view", "institution.manage", "…"],
    "institution": { "id": "6c1d3a52-…", "name": "Lycée bilingue", "status": "active", "…": "…" }
  }

}
ChampTypeDescription
user.iduuidIdentifiant du compte
user.emailstring ou nullCourriel du compte, en minuscules
user.phonestring ou nullTéléphone du compte, au format international
user.displayNamestringNom affiché
user.platformAdminbooleantrue pour l'exploitant du service ; false pour un compte d'établissement
user.orgIduuidL'établissement actif de la session : celui qu'ouvrent les écrans
user.orgRolestring ou nullLe rôle dans cet établissement : promoter, admin, studies, teacher ou learner
user.capabilitiesstring[]Ce que le compte peut faire dans cet établissement
user.institutionobject ou nullCet établissement, son nom et son statut

Le cookie est à renvoyer avec chaque requête. Sur /api, l'établissement actif ne décide de rien : c'est l'adresse qui désigne l'établissement, et le rôle qu'on y tient qui ouvre les routes.

CodeCorpsCause
401identifiants invalidesIdentifiant ou mot de passe faux
429trop de tentatives, patientez un instantPlus de 20 tentatives en 15 minutes depuis la même adresse IP

Types de données

Tous les corps sont du JSON encodé en UTF-8, sauf l'export CSV et la page imprimable d'une feuille de présence. Une requête avec un corps doit porter Content-Type: application/json.

TypeFormeExemple
stringChaîne de caractères"Salle 204"
integerNombre entier120
numberNombre, entier ou décimal90
booleantrue ou falsetrue
uuidChaîne au format UUID, en minuscules"5a74f72e-81af-402c-a2af-a5ebd35b7bba"
datetimeChaîne au format ISO 8601"2026-10-14T08:00:00.000Z"
objectObjet JSON, décrit champ par champ{ "ref": "salle-204" }
T[]Tableau d'éléments de type T["attendance:read"]

Un champ qui peut valoir null est noté « string ou null » dans la colonne Type.

Dates. En réponse, toutes les dates sont en UTC, avec les millisecondes et le suffixe Z. En requête, écrivez-les au même format : une date sans fuseau serait lue dans le fuseau du serveur.

Identifiants. Les objets de MeetingHub sont désignés par un uuid. Un uuid mal formé dans un chemin rend 404, comme un uuid inconnu. Vos propres objets — cours, salles, classes — sont désignés par votre identifiant, appelé ref : une string de 1 à 200 caractères, espaces de bord retirés. Au-delà de 200 caractères, elle est tronquée.

Champs inconnus. Un champ que la route n'attend pas est ignoré, sans erreur. Un champ attendu mais d'un autre type que celui documenté est traité comme absent.

Pagination

Les listes longues — le journal d'une clé et la liste des membres — se lisent par tranches, avec trois paramètres de requête :

ParamètreTypeDéfautBornesDescription
limitinteger201 à 100Nombre d'éléments rendus. Une valeur hors bornes est ramenée à la borne
offsetinteger00 ou plusNombre d'éléments à sauter
searchstringvide120 caractèresFiltre textuel, insensible à la casse

La réponse porte les éléments et le total :

ChampTypeDescription
rowsT[]Les éléments de la tranche
totalintegerLe nombre total d'éléments qui répondent au filtre

Taille des corps

PorteTaille maximale d'un corps JSON
/api, et ses anciens alias4 Mo
/api/auth4 Ko

Un corps plus gros rend 413, un JSON illisible 400 : voir Corps illisible ou trop gros.

Limites de débit

PorteLimiteComptée par
/api, et ses anciens alias300 requêtes par minuteappelant : la clé, l'éditeur partenaire ou le compte ; l'adresse IP sans justificatif
POST /api/auth/signin20 tentatives par 15 minutesadresse IP

Au-delà, la réponse est 429, avec un en-tête Retry-After qui donne, en secondes, le temps à attendre avant la prochaine tentative. L'exploitant d'une instance peut relever ces limites ; il ne peut pas les baisser sous ces valeurs.