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
PUTniDELETEgé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.