Documentation

API publique Scolariis

Lecture et premières écritures des données scolaires d'un établissement, authentifiée par clé.

Authentification

Chaque appel est authentifié par une clé, jamais par un cookie de session. Une clé se crée depuis /parametres/api, par l'administrateur ou le directeur de l'établissement — c'est un geste de configuration, pas une consultation.

La clé complète n'est affichée qu'une seule fois, au moment de sa création. Elle n'est pas conservée en clair côté serveur et ne peut pas être redemandée : si elle est perdue, il faut la révoquer et en créer une nouvelle.

Une clé ne porte que les droits (« scopes ») qui lui ont été accordés à sa création, et jamais plus que les droits du rôle qui l'a créée.

Forme d'un appel

La clé se transmet dans l'en-tête Authorization, au format porteur (« Bearer »). Jamais dans l'URL : une clé passée en paramètre de requête finirait en clair dans des journaux qui ne lui sont pas destinés.

GET /api/v1/eleves?page=1&par_page=25 HTTP/1.1
Host: votre-domaine.tld
Authorization: Bearer sk_live_<prefixe>_<secret>

Enveloppe de réponse et pagination

Une liste répond avec ses données et un bloc de pagination ; un élément unique ne répond qu'avec ses données.

{
  "donnees": [ { "id": 1, "...": "..." } ],
  "pagination": { "page": 1, "par_page": 25, "total": 138 }
}

Deux paramètres de requête pilotent la pagination sur les listes :

  • page — le numéro de page, à partir de 1.
  • par_page — le nombre de résultats par page ; 25 par défaut, 100 au maximum.

Codes d'erreur

Une erreur répond avec ce corps :

{
  "erreur": { "code": "scope_absent", "message": "..." }
}
Code HTTP Situation
401 Clé absente de l'en-tête Authorization, ou invalide.
403 La clé est valide, mais ne porte pas le scope exigé par cette ressource.
404 Ressource inconnue, ou appartenant à un autre établissement.
429 Quota horaire dépassé — voir Quota et limitation de débit ci-dessous.

Quota et limitation de débit

Chaque clé est bornée à un nombre d'appels par heure — son quota, fixé à la création de la clé. Le compte se fait sur une fenêtre glissante de 3600 secondes : ce sont les appels des 1 dernière(s) heure(s) écoulée(s) qui comptent, pas ceux depuis le début de l'heure d'horloge.

Trois en-têtes accompagnent toute réponse dès qu'une clé a été authentifiée, qu'elle soit acceptée ou refusée pour dépassement :

En-tête Signification
X-RateLimit-Limit Le quota horaire de la clé qui a authentifié l'appel — un entier constant tant que la clé n'est pas reconfigurée.
X-RateLimit-Remaining Les appels encore permis dans la fenêtre courante, AVANT l'appel qui porte cet en-tête. Le journal ne s'écrit qu'à la fin du traitement de l'appel en cours : celui-ci ne se compte donc jamais lui-même, et le tout premier appel d'une clé neuve affiche Remaining égal à Limit, pas Limit moins un.
X-RateLimit-Reset L'horodatage Unix de réarmement. La fenêtre est GLISSANTE sur 3600 secondes, jamais calée sur l'heure ronde : cet instant est celui où le plus ancien appel encore compté dans la fenêtre en sort, pas le début de l'heure suivante.

X-RateLimit-Reset n'est pas une heure ronde. La fenêtre étant glissante, le réarmement tombe à l'instant précis où le plus ancien appel encore compté en sort — jamais au début de l'heure suivante. Un client qui suppose une fenêtre fixe (« ça repart à XX:00 ») retentera au mauvais moment ; c'est cet horodatage, et lui seul, qu'il faut respecter.

Le quota dépassé répond 429 avec le code d'erreur quota_depasse, et porte lui aussi les trois en-têtes ci-dessus — X-RateLimit-Remaining à zéro, X-RateLimit-Reset dans le futur.

Ressources disponibles

Chaque ressource expose deux points d'accès en GET : la collection et l'élément. Trois d'entre elles — absences, bulletins, paiements — exposent en plus des écritures ciblées, listées dans la section suivante.

Ressource Collection Élément Scope exigé Description
Élèves /api/v1/eleves /api/v1/eleves/{id} eleves.lire L'état civil des élèves inscrits. Les données de santé ne sont pas exposées.
Enseignants /api/v1/enseignants /api/v1/enseignants/{id} enseignants.lire Le corps enseignant : spécialité, diplôme, contrat.
Classes /api/v1/classes /api/v1/classes/{id} classes.lire Les classes de l'année scolaire, avec niveau, capacité et salle.
Matières /api/v1/matieres /api/v1/matieres/{id} matieres.lire Les matières enseignées et leur coefficient.
Inscriptions /api/v1/inscriptions /api/v1/inscriptions/{id} inscriptions.lire Le rattachement d'un élève à une classe pour une année, et le montant dû.
Évaluations /api/v1/evaluations /api/v1/evaluations/{id} evaluations.lire Les devoirs et compositions, avec barème et coefficient.
Notes /api/v1/notes /api/v1/notes/{id} notes.lire Les notes saisies, avec l'auteur de la saisie.
Absences /api/v1/absences /api/v1/absences/{id} absences.lire Les absences relevées et leur justification.
Bulletins /api/v1/bulletins /api/v1/bulletins/{id} bulletins.lire Les bulletins produits : moyenne, rang, mention, décision.
Emplois du temps /api/v1/emplois-du-temps /api/v1/emplois-du-temps/{id} emplois_du_temps.lire Les séances placées : classe, matière, enseignant, créneau.
Paiements /api/v1/paiements /api/v1/paiements/{id} paiements.lire Les encaissements de frais de scolarité.

Écritures disponibles

Chacune est un acte métier — « enregistrer un paiement », « publier un bulletin » — jamais un CRUD générique : ce dépôt n'expose ni PUT ni DELETE génériques sur une ligne. Une écriture peut exiger un scope distinct de celui de la lecture — parfois même distinct d'une autre écriture de la même ressource, pour qu'une clé qui corrige une appréciation ne puisse pas pour autant publier un bulletin.

Verbe Chemin Action Scope exigé Description
POST /api/v1/absences Saisir une absence absences.ecrire Enregistre une absence pour un élève d'une classe.
POST /api/v1/absences/{id}/justification Justifier une absence absences.ecrire Marque une absence comme justifiée.
POST /api/v1/bulletins Générer un bulletin bulletins.ecrire Calcule et enregistre le bulletin d'un élève pour une période, à partir des notes déjà saisies.
POST /api/v1/bulletins/{id}/publication Publier un bulletin bulletins.publier Rend un bulletin visible aux familles. Capacité distincte de l'écriture : corriger une appréciation n'autorise pas à publier.
PUT /api/v1/bulletins/{id}/appreciation Modifier l'appréciation bulletins.ecrire Met à jour l'appréciation générale d'un bulletin.
PUT /api/v1/bulletins/{id}/decision Modifier la décision du conseil bulletins.ecrire Met à jour la décision du conseil de classe d'un bulletin.
POST /api/v1/paiements Enregistrer un paiement paiements.ecrire Encaisse un paiement de scolarité et le ventile automatiquement sur les échéances dues.

Ce que l'API ne fait pas (encore)

  • Les écritures se limitent aux sept actes listés plus haut : aucun PUT ni DELETE génériques, et la plupart des ressources restent en lecture seule.
  • La pagination est par décalage (offset), pas par curseur. Une ligne insérée entre deux appels décale d'un rang tout ce qui suit : un client qui feuillette une collection peut donc recevoir la même donnée deux fois — la dernière de la page N, puis la première de la page N+1. C'est un compromis connu et assumé, pas un défaut caché ; il n'y a pas de tri ni de filtre pour l'atténuer dans cette version.

Spécification OpenAPI

Le même contenu, au format machine-lisible, pour générer un client ou l'importer dans un outil de test.

openapi.yaml