Comment l'API signale une erreur, et ce que veut dire chaque code de retour. Les messages propres à chaque route sont listés sur la page de la route.
Le corps d'une erreur
{ "error": "cet accès ne permet pas cela — il faut : schedule.read", "code": "forbidden"
}
| Champ | Type | Description |
|---|---|---|
error | string | Un message en français, destiné à un humain |
code | string | Ce que le programme lit. Voir Les valeurs de code. Absent des refus qui précèdent l'API elle-même : corps illisible, limite de débit, route inconnue, et les routes /api/auth |
Décidez sur le code HTTP et sur code, jamais sur le texte : le texte des messages peut changer d'une version à l'autre, les codes non.
Deux cas n'ont pas ce corps : les réponses 204, qui n'ont pas de corps du tout — par exemple DELETE /api/partner/webhooks/:webhookId —, et les réponses CSV et HTML d'une feuille de présence, qui n'en ont un qu'en cas d'erreur.
Les codes de retour
| Code | Signification | Que faire |
|---|---|---|
200 | Réussite | — |
201 | Créé : une clé, un webhook, un établissement, un dépôt appliqué | — |
204 | Réussite, sans corps | — |
400 | La requête est invalide : un champ manque, a le mauvais type ou sort de ses bornes | Corriger la requête. Ne pas réessayer telle quelle |
401 | Pas d'authentification valide | Voir 401 |
403 | Authentifié, mais pas autorisé : capacité absente, établissement en pause, route réservée à une autre sorte d'appelant | Changer de clé ou de compte. Ne pas réessayer |
404 | La ressource n'existe pas dans l'établissement, son identifiant est mal formé, ou l'appelant n'atteint pas cet établissement | Vérifier l'identifiant et l'établissement de l'adresse |
409 | L'état de la ressource empêche l'opération : feuille pas encore arrêtée, cours déjà tenu, référence déjà prise | Attendre le changement d'état, ou renoncer |
413 | Le corps dépasse la taille maximale de la porte | Découper l'envoi. Voir Corps illisible ou trop gros |
415 | Le corps est compressé ou encodé d'une façon que le serveur ne lit pas | Envoyer du JSON en UTF-8, sans Content-Encoding |
429 | Limite de débit atteinte | Attendre le nombre de secondes donné par l'en-tête Retry-After |
500 | Erreur du serveur | Réessayer plus tard |
503 | Le service demandé n'est pas disponible sur cette instance, par exemple sans base de données | Contacter l'exploitant de l'instance |
Les valeurs de code
code | Code HTTP | Sens |
|---|---|---|
auth.required | 401 | Aucun justificatif, sur une route qui demande un appelant ; ou, sur un ancien alias, pas la clé qu'il attend |
auth.invalid-key | 401 | Clé présentée, mais illisible, inconnue, révoquée ou expirée |
api.version | 400 | L'en-tête Api-Version demande une version que l'instance ne sert pas. Voir Version |
auth.ambiguous | 400 | Cookie de session et en-tête Authorization dans la même requête |
origin.refused | 403 | Écriture par cookie venue d'un autre site |
institution.paused | 403 | L'établissement de la clé est en pause : rien n'est effacé, rien ne s'ouvre |
forbidden | 403 | Capacité absente, ou route réservée à une autre sorte d'appelant |
not-found | 404 | Ressource ou établissement introuvable pour l'appelant |
invalid | 400 | Un champ de la requête ne respecte pas ses règles |
conflict | 409 | L'état présent empêche l'opération |
sheet.not-closed | 409 | La feuille de présence n'est pas encore arrêtée |
sheet.empty | 409 | Un cours sans classe attendue ni présence n'a pas de feuille à arrêter |
unavailable | 503 | Service indisponible sur cette instance |
D'autres valeurs, plus précises, servent à l'application — par exemple series.until ou invite.already-member. Un programme qui ne les connaît pas s'en tient au code HTTP.
Corps illisible ou trop gros
Sur /api, le corps est lu avant que la clé soit vérifiée : une requête dont le corps est illisible est refusée, même sans clé.
| Cas | Code | Corps |
|---|---|---|
| Le corps n'est pas du JSON valide | 400 | corps JSON illisible |
Le corps dépasse la taille maximale — 4 Mo sur /api, 4 Ko sur /api/auth | 413 | corps trop volumineux — N octets au plus |
| Le corps est dans un jeu de caractères autre que l'UTF-8, ou compressé | 415 | jeu de caractères non pris en charge, ou encodage du corps non pris en charge |
Un 413 sur un dépôt d'emploi du temps ou de liste d'inscrits se règle en découpant l'envoi en plusieurs dépôts. Chaque cours est reconnu par sa référence, chaque inscrit par son courriel ou son téléphone : un dépôt découpé, ou rejoué, ne crée pas de doublon.
401 : non authentifié
| Situation | Corps | code | En-tête |
|---|---|---|---|
/api, sans justificatif, sur une route qui demande un appelant | identification requise | auth.required | — |
/api, en-tête Authorization qui n'est pas Bearer … | en-tête Authorization attendu : Bearer <clé> | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
/api, clé d'établissement mal formée | clé d’intégration illisible | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
/api, clé d'établissement inconnue ou révoquée | clé d’intégration inconnue ou révoquée | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
/api, clé d'établissement expirée | clé d’intégration expirée | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
/api, clé d'éditeur partenaire mal formée | clé d’éditeur partenaire illisible | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
/api, clé d'éditeur partenaire inconnue ou révoquée | clé d’éditeur partenaire inconnue ou révoquée | auth.invalid-key | WWW-Authenticate: Bearer error="invalid_token" |
Ancien alias /api/integration, sans clé d'établissement | clé d’intégration requise | auth.required | WWW-Authenticate: Bearer realm="MeetingHub" |
Ancien alias /api/partner, sans clé d'éditeur partenaire | clé d’éditeur partenaire requise | auth.required | WWW-Authenticate: Bearer realm="MeetingHub partner" |
POST /api/auth/signin | identifiants invalides | — | — |
Sous /api/institutions/:institutionId, une requête sans justificatif ne reçoit pas 401 mais 404 : pour qui n'est personne, l'établissement n'existe pas.
404 ou 409
Les deux codes ne disent pas la même chose, et la différence compte pour l'éditeur partenaire comme pour l'établissement :
404: l'objet désigné n'existe pas pour l'appelant — ou son identifiant n'a pas la forme d'unuuid. Unuuidmal formé ne dit rien de ce qui existe.409: la requête est comprise, mais l'état actuel l'empêche. Pour une feuille de présence demandée avec une clé,409veut dire qu'aucune feuille n'existe pour cet identifiant à cet instant : attendez le webhookattendance.closedplutôt que de réessayer en boucle.
Messages par route
| Page | Section |
|---|---|
| Conventions | Connexion, session d'administrateur |
| Clés d'intégration | Création, révocation, journal, échecs d'authentification |
| Emploi du temps | Lecture, dépôt, causes de refus d'une entrée, annulation |
| Listes d'inscrits | Dépôt et causes de refus d'une entrée |
| Feuilles de présence | Les trois formats, l'arrêt à la main |
| Webhooks | Création, modification, suppression, livraisons |
| Éditeurs partenaires | Établissements, centres, liens d'entrée, webhooks, mesure d'usage |