{"id":46840257,"url":"https://github.com/maelgangloff/scolengo-api","last_synced_at":"2026-03-10T12:40:01.014Z","repository":{"id":152786199,"uuid":"626654041","full_name":"maelgangloff/scolengo-api","owner":"maelgangloff","description":"Unofficial Node.js API client of Skolengo EMS v2","archived":false,"fork":false,"pushed_at":"2024-08-26T14:28:32.000Z","size":653,"stargazers_count":25,"open_issues_count":2,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-10-10T09:09:26.562Z","etag":null,"topics":["api","api-client","jsonapi","kdecole","kosmos","nodejs","skolengo"],"latest_commit_sha":null,"homepage":"https://npmjs.com/package/scolengo-api","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maelgangloff.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE-OF-CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"maelgangloff"}},"created_at":"2023-04-11T22:47:21.000Z","updated_at":"2025-09-05T22:07:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"c51c51d3-92d7-4418-b566-eeb3f84e14cf","html_url":"https://github.com/maelgangloff/scolengo-api","commit_stats":null,"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/maelgangloff/scolengo-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maelgangloff%2Fscolengo-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maelgangloff%2Fscolengo-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maelgangloff%2Fscolengo-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maelgangloff%2Fscolengo-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maelgangloff","download_url":"https://codeload.github.com/maelgangloff/scolengo-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maelgangloff%2Fscolengo-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30333818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-client","jsonapi","kdecole","kosmos","nodejs","skolengo"],"created_at":"2026-03-10T12:40:00.004Z","updated_at":"2026-03-10T12:40:00.996Z","avatar_url":"https://github.com/maelgangloff.png","language":"TypeScript","funding_links":["https://github.com/sponsors/maelgangloff"],"categories":[],"sub_categories":[],"readme":"# scolengo-api\n\n[![view on npm](http://img.shields.io/npm/v/scolengo-api.svg?style=flat-square)](https://www.npmjs.org/package/scolengo-api)\n![GitHub CI](https://github.com/maelgangloff/scolengo-api/actions/workflows/CI.yml/badge.svg)\n[![Discord](https://img.shields.io/discord/1095829734211977276?label=Discord\u0026style=flat-square)](https://discord.gg/9u69mxsFT6)\n[![npm](https://img.shields.io/npm/dm/scolengo-api?style=flat-square)](https://npm-stat.com/charts.html?package=scolengo-api)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/The-Rabbit-Team/.github/blob/master/banners/scolengo-api.png?raw=true\" /\u003e\n\u003c/p\u003e\n\nSupport non officiel de l'API Skolengo. Il s'agit de l'API utilisée par la nouvelle application mobile éponyme. Ce module permet de récupérer les données de l'ENT de manière automatique. De plus, certaines fonctions implémentées permettent de prétraiter les données (conversion de l'emploi du temps au format iCalendar par exemple).\n\nCe module est destiné à devenir le successeur de [kdecole-api](https://github.com/maelgangloff/kdecole-api) dans l'éventualité où l'accès à l'ancienne API serait définitivement clos.\n\n\u003e [!TIP]\n\u003e Pour utiliser cette librairie, il est nécessaire de s'authentifier auprès des serveurs de Skolengo. Pour obtenir des jetons de connexion, vous pouvez utiliser [scolengo-token](https://github.com/maelgangloff/scolengo-token).\n\nPour participer et se tenir informé, **rejoins le serveur Discord: https://discord.gg/9u69mxsFT6**\n\n## Disclaimer\n\u003e [!WARNING]\n\u003e - Il est clairement mentionné que cette librairie n'est pas officiellement éditée par la société éditrice du logiciel *Skolengo*.\n\u003e - Ce module n'est pas une contrefaçon car il n'existe pas de module similaire édité officiellement.\n\u003e - Les utilisateurs ne peuvent accéder qu'à leurs propres données. Ils sont soumis au même processus d'authentification que celui implémenté dans l'application et imposé par le serveur API.\n\u003e - Les données des utilisateurs ne sont pas davantage exposées puisqu'un utilisateur ne peut accéder qu'à ses propres données. Personne n'a le contrôle sur cette limitation qui est inhérente au fonctionnement de l'API des serveurs de Skolengo.\n\u003e - Cette librairie ne se suffit pas à elle-même pour fonctionner. Il est nécessaire de l'importer dans un projet et l'utilisateur est le seul responsable de son code et des éventuelles conséquences.\n\u003e - Tout utilisateur de cette librairie a *a priori* lu et approuvé l'entièreté du fichier de licence GPLv3 disponible publiquement [LICENSE](https://github.com/maelgangloff/scolengo-api/blob/master/LICENSE) ainsi que de ce présent fichier de présentation.\n\u003e - Tout utilisateur de cette librairie a *a priori* lu et compris l'entièreté du code de ce projet avant toute utilisation.\n\u003e - L'auteur de ce projet n'agit pas en tant qu'intermédiaire de traitement des données au sens du RGPD. Les utilisateurs sont responsables de leur propre conformité au RGPD lors de l'utilisation de cette librairie. Ils doivent s'assurer que leur utilisation de cette librairie est conforme aux exigences du RGPD et de toute autre législation applicable en matière de protection des données.\n\u003e - Eu égard l'ensemble de ces remarques, les contributeurs et *a fortiori* l'auteur du projet ne peuvent être tenus responsables de tout dommage potentiel.\n\n## Liste des ENT utilisant Skolengo :\n| Nom usuel de l'ENT           | Code ENT | URL OpenID Connect Discovery                               |\n|------------------------------|----------|------------------------------------------------------------|\n| Mon Bureau Numérique         | gdest    | https://sso.monbureaunumerique.fr/oidc/.well-known         |\n| Mon ENT Occitanie            | entmip   | https://sso.mon-ent-occitanie.fr/oidc/.well-known          |\n| Arsène 76                    | cg76     | https://sso.arsene76.fr/oidc/.well-known                   |\n| ENT27                        | cg27     | https://sso.ent27.fr/oidc/.well-known                      |\n| ENT Creuse                   | cg23     | https://sso.entcreuse.fr/oidc/.well-known                  |\n| ENT Auvergne-Rhône-Alpes     | rra      | https://sso.ent.auvergnerhonealpes.fr/oidc/.well-known     |\n| Agora 06                     | cg06     | https://sso.agora06.fr/oidc/.well-known                    |\n| CyberCollèges 42             | cg42     | https://sso.cybercolleges42.fr/oidc/.well-known            |\n| eCollège 31 Haute-Garonne    | cg31     | https://sso.ecollege.haute-garonne.fr/oidc/.well-known     |\n| Mon collège en Val d'Oise    | cg95     | https://sso.moncollege.valdoise.fr/oidc/.well-known        |\n| Webcollège Seine-Saint-Denis | cg93     | https://sso.webcollege.seinesaintdenis.fr/oidc/.well-known |\n| Eclat-BFC                    | bfc      | https://sso.eclat-bfc.fr/oidc/.well-known                  |\n| @ucollège84                  | cg84     | https://sso.aucollege84.vaucluse.fr/oidc/.well-known       |\n| ENT Val de Marne             | cg94     | https://sso.moncollege.valdemarne.fr/oidc/.well-known      |\n| Skolengo-Écoles primaires    | metab1d  | https://sso.skolengo.com/oidc/.well-known                  |\n| Skolengo-Collèges et Lycées  | mpdl     | https://sso.pdl.kosmoseducation.com/oidc/.well-known       |\n| AEFE                         | metab    | https://sso1.skolengo.com/oidc/.well-known                 |\n| AEFE Amérique - Pacifique    | metabam  | https://sso2.skolengo.com/oidc/.well-known                 |\n| Schulportal Ostbelgien       | cgb      | https://sso.schulen.be/oidc/.well-known                    |\n\nUn wiki est disponible, celui-ci rassemble davantage d'informations sur le fonctionnement de l'API. **[Ce wiki est disponible ici](https://github.com/maelgangloff/scolengo-api/wiki).**\n\n\u003ca name=\"Skolengo\"\u003e\u003c/a\u003e\n\n## Skolengo\n**Kind**: global class  \n\n* [Skolengo](#Skolengo)\n    * [new Skolengo(oidClient, school, tokenSet, config)](#new_Skolengo_new)\n    * _instance_\n        * [.getUserInfo(userId, params, includes)](#Skolengo+getUserInfo)\n        * [.downloadAttachment(attachment)](#Skolengo+downloadAttachment)\n        * [.getSchoolInfos(params, includes)](#Skolengo+getSchoolInfos)\n        * [.getSchoolInfo(schoolInfoId, params, includes)](#Skolengo+getSchoolInfo)\n        * [.getEvaluationSettings(studentId, limit, offset, params, includes)](#Skolengo+getEvaluationSettings)\n        * [.getEvaluation(studentId, periodId, limit, offset, params, includes)](#Skolengo+getEvaluation)\n        * [.getEvaluationDetail(studentId, evaluationId, params, includes)](#Skolengo+getEvaluationDetail)\n        * [.getPeriodicReportsFiles(studentId, limit, offset, params, includes)](#Skolengo+getPeriodicReportsFiles)\n        * [.getAgenda(studentId, startDate, endDate, limit, offset, params, includes)](#Skolengo+getAgenda)\n        * [.getLesson(studentId, lessonId, params, includes)](#Skolengo+getLesson)\n        * [.getHomeworkAssignments(studentId, startDate, endDate, limit, offset, params, includes)](#Skolengo+getHomeworkAssignments)\n        * [.getHomeworkAssignment(studentId, homeworkId, params, includes)](#Skolengo+getHomeworkAssignment)\n        * [.patchHomeworkAssignment(studentId, homeworkId, attributes, params, includes)](#Skolengo+patchHomeworkAssignment)\n        * [.getUsersMailSettings(userId, params, includes)](#Skolengo+getUsersMailSettings)\n        * [.getCommunicationsFolder(folderId, limit, offset, params, includes)](#Skolengo+getCommunicationsFolder)\n        * [.getCommunication(communicationId, params)](#Skolengo+getCommunication)\n        * [.getCommunicationParticipations(communicationId, params, includes)](#Skolengo+getCommunicationParticipations)\n        * [.getCommunicationParticipants(communicationId, fromGroup, params, includes)](#Skolengo+getCommunicationParticipants)\n        * [.patchCommunicationFolders(communicationId, folders, userId, params)](#Skolengo+patchCommunicationFolders)\n        * [.postCommunication(newCommunication, params)](#Skolengo+postCommunication)\n        * [.postParticipation(participation, params)](#Skolengo+postParticipation)\n        * [.getAbsenceFiles(studentId, limit, offset, params, includes)](#Skolengo+getAbsenceFiles)\n        * [.getAbsenceFile(folderId, params, includes)](#Skolengo+getAbsenceFile)\n        * [.postAbsenceFileState(folderId, reasonId, comment, params)](#Skolengo+postAbsenceFileState)\n        * [.getAbsenceReasons(limit, offset, params)](#Skolengo+getAbsenceReasons)\n        * [.refreshToken(triggerListener)](#Skolengo+refreshToken)\n        * [.getTokenClaims()](#Skolengo+getTokenClaims)\n    * _static_\n        * [.revokeToken(oidClient, token)](#Skolengo.revokeToken)\n        * [.getAppCurrentConfig(httpConfig)](#Skolengo.getAppCurrentConfig)\n        * [.searchSchool(filter, limit, offset, httpConfig)](#Skolengo.searchSchool)\n        * [.getOIDClient(school, redirectUri)](#Skolengo.getOIDClient)\n        * [.fromConfigObject(config, skolengoConfig)](#Skolengo.fromConfigObject)\n\n\u003ca name=\"new_Skolengo_new\"\u003e\u003c/a\u003e\n\n### new Skolengo(oidClient, school, tokenSet, config)\nIl est possible de s'authentifier en possédant au prélable des jetons OAuth 2.0\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| oidClient | \u003ccode\u003eClient\u003c/code\u003e | Un client OpenID Connect |\n| school | \u003ccode\u003eSchool\u003c/code\u003e | Etablissement |\n| tokenSet | \u003ccode\u003eTokenSetParameters\u003c/code\u003e | Jetons d'authentification OpenID Connect |\n| config | \u003ccode\u003eSkolengoConfig\u003c/code\u003e | Configuration optionnelle (stockage du jeton renouvellé, client HTTP personnalisé, gestion des erreurs Pronote, ...) |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\n// 🚨 ATTENTION: Ne communiquez jamais vos jetons à un tiers. Ils vous sont strictement personnels. Si vous pensez que vos jetons ont été dérobés, révoquez-les immédiatement.\n// L'objet de configuration ci-dessous peut être généré à partir de l'utilitaire scolengo-token (https://github.com/maelgangloff/scolengo-token)\nconst config = {\n  \"tokenSet\": {\n    \"access_token\": \"\u003caccess_token_here\u003e\",\n    \"id_token\": \"\u003cid_token_here\u003e\",\n    \"refresh_token\": \"RT-\u003crefresh_token_here\u003e\",\n    \"token_type\": \"bearer\",\n    \"expires_at\": 1234567890,\n    \"scope\": \"openid\"\n  },\n  \"school\": {\n    \"id\": \"SKO-E-\u003cschool_id\u003e\",\n    \"name\": \"\u003cschool_name\u003e\",\n    \"addressLine1\": \"\u003cschool_address\u003e\",\n    \"addressLine2\": null,\n    \"addressLine3\": null,\n    \"zipCode\": \"\u003cschool_zip_code\u003e\",\n    \"city\": \"\u003cschool_city\u003e\",\n    \"country\": \"France\",\n    \"homePageUrl\": \"\u003ccas_login_url\u003e\",\n    \"emsCode\": \"\u003cschool_ems_code\u003e\",\n    \"emsOIDCWellKnownUrl\": \"\u003cschool_ems_oidc_well_known_url\u003e\"\n  }\n}\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const infoUser = await user.getUserInfo()\n  console.log(`Correctement authentifié sous l'identifiant ${infoUser.id}`)\n})\n```\n```js\nconst {Skolengo} = require('scolengo-api')\nconst {TokenSet} = require('openid-client')\n\nSkolengo.searchSchool({ text: 'Lycée Louise Weiss' }).then(async schools =\u003e {\n  if(!schools.length) throw new Error('Aucun établissement n\\'a été trouvé.')\n  const school = schools[0]\n  const oidClient = await Skolengo.getOIDClient(school)\n\n  // 🚨 ATTENTION: Ne communiquez jamais vos jetons à un tiers. Ils vous sont strictement personnels. Si vous pensez que vos jetons ont été dérobés, révoquez-les immédiatement.\n\n  const tokenSet = new TokenSet({\n    access_token: 'ACCESS_TOKEN',\n    id_token: 'ID_TOKEN',\n    refresh_token: 'REFRESH_TOKEN',\n    token_type: 'bearer',\n    expires_at: 1681486899,\n    scope: 'openid'\n  })\n\n  const user = new Skolengo(oidClient, school, tokenSet)\n  const infoUser = await user.getUserInfo()\n  console.log(`Correctement authentifié sous l'identifiant ${infoUser.id}`)\n})\n```\n\u003ca name=\"Skolengo+getUserInfo\"\u003e\u003c/a\u003e\n\n### skolengo.getUserInfo(userId, params, includes)\nInformations sur l'utilisateur actuellement authentifié (nom, prénom, date de naissance, adresse postale, courriel, téléphone, permissions, ...)\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| userId | \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e | Identifiant de l'utilisateur |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+downloadAttachment\"\u003e\u003c/a\u003e\n\n### skolengo.downloadAttachment(attachment)\nTélécharger une pièce jointe.\n\nUne pièce jointe peut être un fichier inclu dans un courriel, une actualité de l'établissement ou un bulletin périodique.\n\n\u003e [!CAUTION]\n\u003e 🚨 ATTENTION: Dans cette requête, votre jeton est envoyé à l'URL du fichier. Assurez-vous que celle-ci provient bien de votre établissement.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| attachment | \u003ccode\u003eAttachment\u003c/code\u003e | La pièce jointe |\n\n**Example**  \n```js\nconst {createWriteStream} = require('node:fs')\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const student = 'ESKO-P-b2c86113-1062-427e-bc7f-0618cbd5d5ec'\n  const bulletins = await user.getPeriodicReportsFiles(student)\n  for(const bulletin of bulletins) {\n    console.log(bulletin.name)\n    (await user.downloadAttachment(bulletin)).pipe(createWriteStream(bulletin.name));\n  }\n})\n```\n\u003ca name=\"Skolengo+getSchoolInfos\"\u003e\u003c/a\u003e\n\n### skolengo.getSchoolInfos(params, includes)\nRécupérer toutes les actualités de l'établissement\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getSchoolInfo\"\u003e\u003c/a\u003e\n\n### skolengo.getSchoolInfo(schoolInfoId, params, includes)\nRécupérer une actualité de l'établissement\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| schoolInfoId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'une actualité |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getEvaluationSettings\"\u003e\u003c/a\u003e\n\n### skolengo.getEvaluationSettings(studentId, limit, offset, params, includes)\nStatut des services d'évaluation (identifiant des périodes, ...)\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getEvaluation\"\u003e\u003c/a\u003e\n\n### skolengo.getEvaluation(studentId, periodId, limit, offset, params, includes)\nRécupérer les notes d'un étudiant sur une période\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| periodId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant de la période de notation |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getEvaluationDetail\"\u003e\u003c/a\u003e\n\n### skolengo.getEvaluationDetail(studentId, evaluationId, params, includes)\nRécupérer le détail d'une note d'un étudiant\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un étudiant |\n| evaluationId | \u003ccode\u003estring\u003c/code\u003e | Identifiant de la note |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getPeriodicReportsFiles\"\u003e\u003c/a\u003e\n\n### skolengo.getPeriodicReportsFiles(studentId, limit, offset, params, includes)\nRécupérer la liste des bilans périodiques disponibles pour un étudiant.\nPour chaque bulletin, une adresse est disponible pour le téléchargement.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const bulletins = await getPeriodicReportsFiles('ESKO-P-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx');\n  console.log(bulletins)\n})\n```\n\u003ca name=\"Skolengo+getAgenda\"\u003e\u003c/a\u003e\n\n### skolengo.getAgenda(studentId, startDate, endDate, limit, offset, params, includes)\nRécupérer l'agenda d'un étudiant.\nIl est possible de le convertir au format iCalendar.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| startDate | \u003ccode\u003estring\u003c/code\u003e |  | Date de début - Format : YYYY-MM-DD |\n| endDate | \u003ccode\u003estring\u003c/code\u003e |  | Date de fin - Format : YYYY-MM-DD |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst { writeFileSync } = require('node:fs')\nconst { Skolengo } = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const studentId = 'ESKO-P-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n  const agenda = await user.getAgenda(studentId, '2023-05-01', '2023-05-30')\n\n  writeFileSync('export.ics', agenda.toICalendar())\n})\n```\n\u003ca name=\"Skolengo+getLesson\"\u003e\u003c/a\u003e\n\n### skolengo.getLesson(studentId, lessonId, params, includes)\nRécupérer les données d'un cours/leçon\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un étudiant |\n| lessonId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un cours/leçon |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getHomeworkAssignments\"\u003e\u003c/a\u003e\n\n### skolengo.getHomeworkAssignments(studentId, startDate, endDate, limit, offset, params, includes)\nRécupérer les devoirs d'un étudiant\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| startDate | \u003ccode\u003estring\u003c/code\u003e |  | Date de début - Format : YYYY-MM-DD |\n| endDate | \u003ccode\u003estring\u003c/code\u003e |  | Date de fin - Format : YYYY-MM-DD |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const startDate = new Date().toISOString().split('T')[0] // Aujourd'hui\n  const endDate = new Date(Date.now() + 15 * 24 * 60 * 60 * 1e3).toISOString().split('T')[0] // Aujourd'hui + 15 jours\n  const homework = await user.getHomeworkAssignments(user.getTokenClaims().sub, startDate, endDate)\n\n  console.log(\"Voici les exercices à faire pour les 2 prochaines semaines :\", homework)\n})\n```\n\u003ca name=\"Skolengo+getHomeworkAssignment\"\u003e\u003c/a\u003e\n\n### skolengo.getHomeworkAssignment(studentId, homeworkId, params, includes)\nRécupérer les données d'un devoir\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un étudiant |\n| homeworkId | \u003ccode\u003estring\u003c/code\u003e | Identifiant du devoir |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nconst user = await Skolengo.fromConfigObject(config)\n\nuser.getHomeworkAssignment(user.getTokenClaims().sub, \"123456\").then(e =\u003e {\n    console.log(`Pour le ${new Date(e.dueDateTime).toLocaleString()} :`)\n    console.log(`\u003e ${e.title} (${e.subject.label})`)\n    console.log(e.html)\n})\n\n```\n\u003ca name=\"Skolengo+patchHomeworkAssignment\"\u003e\u003c/a\u003e\n\n### skolengo.patchHomeworkAssignment(studentId, homeworkId, attributes, params, includes)\nModifier le statut d'un travail à faire\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un étudiant |\n| homeworkId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un devoir à modifier |\n| attributes | \u003ccode\u003ePartial.\u0026lt;HomeworkAssignment\u0026gt;\u003c/code\u003e | Devoir modifié |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nconst user = await Skolengo.fromConfigObject(config)\nuser.patchHomeworkAssignment('ESKO-P-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', '123456', { done: true }).then(hmw =\u003e {\n  console.log(`Le travail \"${hmw.title}\" a été marqué ${hmw.done ? 'fait' : 'à faire'}.`)\n})\n```\n\u003ca name=\"Skolengo+getUsersMailSettings\"\u003e\u003c/a\u003e\n\n### skolengo.getUsersMailSettings(userId, params, includes)\nRécupérer les informations du service de communication (identifiants des dossiers, ...)\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| userId | \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e | Identifiant d'un utilisateur |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getCommunicationsFolder\"\u003e\u003c/a\u003e\n\n### skolengo.getCommunicationsFolder(folderId, limit, offset, params, includes)\nRécupérer les communication d'un dossier\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| folderId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un dossier |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e10\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getCommunication\"\u003e\u003c/a\u003e\n\n### skolengo.getCommunication(communicationId, params)\nRécupérer une communication à partir de son identifiant.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| communicationId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'une communication |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n\n\u003ca name=\"Skolengo+getCommunicationParticipations\"\u003e\u003c/a\u003e\n\n### skolengo.getCommunicationParticipations(communicationId, params, includes)\nRécupérer les participations d'un fil de discussion (communication)\nMarque la communication comme lue.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| communicationId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'une communication |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+getCommunicationParticipants\"\u003e\u003c/a\u003e\n\n### skolengo.getCommunicationParticipants(communicationId, fromGroup, params, includes)\nRécupérer tous les participants d'un fil de discussion (communication)\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| communicationId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'une communication |\n| fromGroup | \u003ccode\u003eboolean\u003c/code\u003e | \u003ccode\u003etrue\u003c/code\u003e | Afficher le détail des groupes |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+patchCommunicationFolders\"\u003e\u003c/a\u003e\n\n### skolengo.patchCommunicationFolders(communicationId, folders, userId, params)\nDéplacer une communication dans un dossier\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| communicationId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'une communication |\n| folders |  | Liste contenant l'identifiant du dossier |\n| userId | \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e | Identifiant de l'utilisateur |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n\n\u003ca name=\"Skolengo+postCommunication\"\u003e\u003c/a\u003e\n\n### skolengo.postCommunication(newCommunication, params)\nEnvoyer un message dans un nouveau fil de discussion\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| newCommunication | \u003ccode\u003ePartial.\u0026lt;Communication\u0026gt;\u003c/code\u003e | La nouvelle communication |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n\n\u003ca name=\"Skolengo+postParticipation\"\u003e\u003c/a\u003e\n\n### skolengo.postParticipation(participation, params)\nEnvoyer un message dans un fil de discussion existant\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| participation | \u003ccode\u003ePartial.\u0026lt;Participation\u0026gt;\u003c/code\u003e | La nouvelle participation |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n\n\u003ca name=\"Skolengo+getAbsenceFiles\"\u003e\u003c/a\u003e\n\n### skolengo.getAbsenceFiles(studentId, limit, offset, params, includes)\nRécupérer les absences et retards d'un étudiant.\nIl est possible d'exporter les absences au format CSV.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| studentId | \u003ccode\u003estring\u003c/code\u003e |  | Identifiant d'un étudiant |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003eoffset\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e |  | Ressources JSON:API à inclure |\n\n**Example**  \n```js\nconst { writeFileSync } = require('node:fs')\nconst { Skolengo } = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const studentId = 'ESKO-P-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'\n  const absenceFiles = await user.getAbsenceFiles(studentId)\n\n  writeFileSync('export.csv', agenda.toCSV())\n})\n```\n\u003ca name=\"Skolengo+getAbsenceFile\"\u003e\u003c/a\u003e\n\n### skolengo.getAbsenceFile(folderId, params, includes)\nRécupérer les détails d'une absence\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| folderId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un dossier |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n| includes | \u003ccode\u003eArray.\u0026lt;string\u0026gt;\u003c/code\u003e | Ressources JSON:API à inclure |\n\n\u003ca name=\"Skolengo+postAbsenceFileState\"\u003e\u003c/a\u003e\n\n### skolengo.postAbsenceFileState(folderId, reasonId, comment, params)\nJustifier une absence avec motif et commentaire.\n_PS: La requête n'a pas été testée._\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| folderId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un dossier |\n| reasonId | \u003ccode\u003estring\u003c/code\u003e | Identifiant d'un motif |\n| comment | \u003ccode\u003estring\u003c/code\u003e | Commentaire |\n| params | \u003ccode\u003eobject\u003c/code\u003e | Modifier les paramètres de la requête |\n\n\u003ca name=\"Skolengo+getAbsenceReasons\"\u003e\u003c/a\u003e\n\n### skolengo.getAbsenceReasons(limit, offset, params)\nRécupérer la liste des motifs possibles d'absence.\nCette liste peut être différente pour chaque établissement.\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| params | \u003ccode\u003eobject\u003c/code\u003e |  | Modifier les paramètres de la requête |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  user.getAbsenceReasons().then(response =\u003e {\n    console.log(`Liste des motifs: ${response.map(r =\u003e r.longLabel).join(';')}`)\n  })\n})\n```\n\u003ca name=\"Skolengo+refreshToken\"\u003e\u003c/a\u003e\n\n### skolengo.refreshToken(triggerListener)\nDemande un renouvellement du jeu de jeton (tokenSet)\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| triggerListener | \u003ccode\u003eboolean\u003c/code\u003e | \u003ccode\u003etrue\u003c/code\u003e | Si oui, appeler la fonction onTokenRefresh |\n\n\u003ca name=\"Skolengo+getTokenClaims\"\u003e\u003c/a\u003e\n\n### skolengo.getTokenClaims()\nRécupérer les données contenues dans le payload JWT du token ID\n\n**Kind**: instance method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\u003ca name=\"Skolengo.revokeToken\"\u003e\u003c/a\u003e\n\n### Skolengo.revokeToken(oidClient, token)\nRévoquer un jeton\n\n**Kind**: static method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| oidClient | \u003ccode\u003eClient\u003c/code\u003e | Un client OpenID Connect |\n| token | \u003ccode\u003estring\u003c/code\u003e | Un jeton |\n\n\u003ca name=\"Skolengo.getAppCurrentConfig\"\u003e\u003c/a\u003e\n\n### Skolengo.getAppCurrentConfig(httpConfig)\nConfiguration actuelle de l'application mobile (dernière version déployée, dernière version supportée, ...)\n\n**Kind**: static method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| httpConfig | \u003ccode\u003eAxiosRequestConfig\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e | Configuration facultative du client HTTP |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.getAppCurrentConfig().then(config =\u003e {\n  console.log(`Dernière version déployée: ${config.latestDeployedSkoAppVersion}`)\n  console.log(`Dernière version supportée: ${config.latestSupportedSkoAppVersion}`)\n})\n```\n\u003ca name=\"Skolengo.searchSchool\"\u003e\u003c/a\u003e\n\n### Skolengo.searchSchool(filter, limit, offset, httpConfig)\nRechercher un établissement scolaire\n\n**Kind**: static method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| filter | \u003ccode\u003eSchoolFilter\u003c/code\u003e |  | Le filtre de recherche |\n| limit | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e10\u003c/code\u003e | Limite |\n| offset | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Offset |\n| httpConfig | \u003ccode\u003eAxiosRequestConfig\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e |  | Configuration facultative du client HTTP |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.searchSchool({ text: 'Lycée Louise Weiss' }).then(schools =\u003e {\n  console.log(schools)\n})\n```\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.searchSchool({ lat: 48.0, lon: 7.0 }).then(schools =\u003e {\n  console.log(schools)\n})\n```\n\u003ca name=\"Skolengo.getOIDClient\"\u003e\u003c/a\u003e\n\n### Skolengo.getOIDClient(school, redirectUri)\nCréer un client OpenID Connect permettant l'obtention des jetons (refresh token et access token)\n\n**Kind**: static method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| school | \u003ccode\u003eSchool\u003c/code\u003e |  | L'établissement scolaire |\n| redirectUri | \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e | \u003ccode\u003e\u0026quot;skoapp-prod://sign-in-callback\u0026quot;\u003c/code\u003e | Callback |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.searchSchool({ text: 'Lycée Louise Weiss' }).then(async schools =\u003e {\n  if(!schools.length) throw new Error('Aucun établissement n\\'a été trouvé.')\n  const school = schools[0]\n  const oidClient = await Skolengo.getOIDClient(school, 'skoapp-prod://sign-in-callback')\n  console.log(oidClient.authorizationUrl())\n  // Lorsque l'authentification est effectuée, le CAS redirige vers le callback indiqué avec le code. Ce code permet d'obtenir les refresh token et access token (cf. mécanismes OAuth 2.0 et OID Connect)\n})\n```\n```js\nconst {Skolengo} = require('scolengo-api')\n\nSkolengo.searchSchool({ text: 'Lycée Louise Weiss' }).then(async schools =\u003e {\n  if(!schools.length) throw new Error('Aucun établissement n\\'a été trouvé.')\n  const school = schools[0]\n  const oidClient = await Skolengo.getOIDClient(school, 'skoapp-prod://sign-in-callback')\n\n  const params = oidClient.callbackParams('skoapp-prod://sign-in-callback?code=OC-9999-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-X')\n  const tokenSet = await oidClient.callback('skoapp-prod://sign-in-callback', params)\n  // 🚨 ATTENTION: Ne communiquez jamais vos jetons à un tiers. Ils vous sont strictement personnels. Si vous pensez que vos jetons ont été dérobés, révoquez-les immédiatement.\n\n  const user = new Skolengo(oidClient, school, tokenSet)\n  const infoUser = await user.getUserInfo()\n  console.log(`Correctement authentifié sous l'identifiant ${infoUser.id}`)\n})\n```\n\u003ca name=\"Skolengo.fromConfigObject\"\u003e\u003c/a\u003e\n\n### Skolengo.fromConfigObject(config, skolengoConfig)\nCréer un client Scolengo à partir d'un objet contenant les informations d'authentification.\nCet objet de configuration peut être généré à partir de l'utilitaire [scolengo-token](https://github.com/maelgangloff/scolengo-token).\nLe callback optionnel `onTokenRefresh` est appellé lors du rafraichissement du jeton (pour éventuellement stocker en mémoire le nouveau tokenSet).\nLa callback optionnel `tokenRefresh` permet d'outrepasser l'utilisation de la librairie `openid-client` pour le rafraîchissement des jetons. La délégation de cette tâche permet l'utilisation de cette librairie dans des environnements externes à Node.js.\n\n**Kind**: static method of [\u003ccode\u003eSkolengo\u003c/code\u003e](#Skolengo)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| config | \u003ccode\u003eAuthConfig\u003c/code\u003e | Informations d'authentification |\n| skolengoConfig | \u003ccode\u003eSkolengoConfig\u003c/code\u003e | Configuration optionnelle (stockage du jeton renouvellé, client HTTP personnalisé, gestion des erreurs Pronote, ...) |\n\n**Example**  \n```js\nconst {Skolengo} = require('scolengo-api')\nconst config = require('./config.json')\nconst user = await Skolengo.fromConfigObject(config)\n```\n```js\nconst {Skolengo} = require('scolengo-api')\n\n// 🚨 ATTENTION: Ne communiquez jamais vos jetons à un tiers. Ils vous sont strictement personnels. Si vous pensez que vos jetons ont été dérobés, révoquez-les immédiatement.\nconst config = {\n  \"tokenSet\": {\n    \"access_token\": \"\u003caccess_token_here\u003e\",\n    \"id_token\": \"\u003cid_token_here\u003e\",\n    \"refresh_token\": \"RT-\u003crefresh_token_here\u003e\",\n    \"token_type\": \"bearer\",\n    \"expires_at\": 1234567890,\n    \"scope\": \"openid\"\n  },\n  \"school\": {\n    \"id\": \"SKO-E-\u003cschool_id\u003e\",\n    \"name\": \"\u003cschool_name\u003e\",\n    \"addressLine1\": \"\u003cschool_address\u003e\",\n    \"addressLine2\": null,\n    \"addressLine3\": null,\n    \"zipCode\": \"\u003cschool_zip_code\u003e\",\n    \"city\": \"\u003cschool_city\u003e\",\n    \"country\": \"France\",\n    \"homePageUrl\": \"\u003ccas_login_url\u003e\",\n    \"emsCode\": \"\u003cschool_ems_code\u003e\",\n    \"emsOIDCWellKnownUrl\": \"\u003cschool_ems_oidc_well_known_url\u003e\"\n  }\n}\nSkolengo.fromConfigObject(config).then(async user =\u003e {\n  const infoUser = await user.getUserInfo()\n  console.log(`Correctement authentifié sous l'identifiant ${infoUser.id}`)\n})\n```\n\n\u003e [!NOTE]\n\u003e ## Liens utiles\n\u003e - [Wiki](https://github.com/maelgangloff/scolengo-api/wiki)\n\u003e - [Serveur Discord](https://discord.gg/9u69mxsFT6)\n\u003e - [JSON:API Specification](https://jsonapi.org/format)\n\u003e - [OpenID Connect Specification](https://openid.net/connect)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaelgangloff%2Fscolengo-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaelgangloff%2Fscolengo-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaelgangloff%2Fscolengo-api/lists"}