# Boti Education app API : protocole (variante Green Wood School) Rétro-ingénierie statique à partir de com.botieducation.greenwood 2.4.14 (bundle Capacitor/Ionic/Angular), vérifiée avec un seul appel de connexion réel le 2026-09-01. ## URL de base https://boti.education/p/greenwood/botiapi/ Motif par école : https://boti.education/p//botiapi/ Tous les établissements Boti Education partagent un même backend. Hôte média : media.boti.education (URLs signées à durée limitée, token dans le chemin). ## Authentification ### Connexion POST {base}/login Content-Type: multipart/form-data Champs : - login numéro de téléphone, ex. 06xxxxxxxx - password en clair - privacy booléen ("true"/"false") - remembreMe bool Réponse (HTTP 200, application/json) : { "status": 200, "msg": "Bienvenue !", "error": false, "keyToken": "<40 caractères hex>", // clé de session "userId": "20887", "parentId": "1376", // quand role=parent "eleveId": "1739", "_acces": "parent", "role": "parent", "eleves": [ { id, nomcomplet, prenom, nom, datenaissance, sexe, niveau, img, parent_nom, parent_image } ], "parent": { id, nomcomplet, tel, email, sexe, image }, "accessToken": "", // présent sur certains comptes, peut être vide "refreshToken": "" } Erreurs : {"error": true, "msg": "..."} avec HTTP 200. ### Utilisation de la session sur chaque appel suivant - GET : paramètres d'URL, plus key= et user_id= - POST : champs multipart/form-data, plus key= - Voie moderne optionnelle (prise en charge par l'ApiService, souvent vide pour les comptes parents) : en-têtes Authorization: Bearer et X-refresh-token: Bearer ### Contrôle de session côté serveur - Toute réponse contenant "disconnect": true signifie que la session a été tuée (l'app navigue vers la page de connexion). - "redirect": "" fait naviguer l'app vers ce chemin. - "showSLides": "" ouvre une modale de diapositives (écrans d'accueil ou d'actualités). ## Enveloppe des requêtes Paramètres GET observés dans le bundle (par fonctionnalité, sous-ensemble) : user_id, key, acces, versionCode, versionNumber, paltform (sic, la faute de frappe est dans l'app), eleveId, lang, date, startDate, endDate, classe, id, search, page Conventions POST (FormData) : - champs plats ajoutés comme clé=valeur - objet imbriqué -> clé[sous-clé]=valeur - tableau -> clé[0]=..., clé[1]=... - File/Blob -> ajouté brut sous le nom du champ - key= ajouté automatiquement par l'ApiService ## Notifications push POST {base}/device_token champs : token=, user_id, key, uid= ## Inventaire des points d'accès Voir endpoints.md (100 points d'accès de l'app, méthodes get/post et chunk source par point d'accès). Les noms sont stables et ajoutés tels quels à l'URL de base. ## Médias / fichiers - Fichiers et images servis par media.boti.education avec un chemin signé à durée limitée (token base64url + horodatage ajoutés). - Les PDF sont ouverts en interne via pdf.js (chunk 7482.js). - getBlob(path, params, absolute) télécharge les blobs bruts pour les pièces jointes. ## Particularités - L'ApiService ajoute le nom du point d'accès comme chaîne brute : les noms du tableau sont la route serveur complète (pas de préfixe /api, pas de .php). - La coquille de paramètre « paltform » est envoyée par l'app ; le serveur l'accepte, ne pas la « corriger » aveuglément. - Des console.log détaillés (paramètres, en-têtes) subsistent dans la version de production.