{"id":19348817,"url":"https://github.com/carelessinternet/node-schoolsoft","last_synced_at":"2026-01-25T02:01:35.551Z","repository":{"id":36987670,"uuid":"435215912","full_name":"CarelessInternet/node-schoolsoft","owner":"CarelessInternet","description":"Reverse engineered SchoolSoft API used by the SchoolSoft mobile app.","archived":false,"fork":false,"pushed_at":"2024-06-17T17:42:09.000Z","size":624,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-08T22:02:47.292Z","etag":null,"topics":["api","javascript","reverse-engineering","schoolsoft","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CarelessInternet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-05T16:13:22.000Z","updated_at":"2024-12-14T13:25:12.000Z","dependencies_parsed_at":"2023-01-17T12:30:32.883Z","dependency_job_id":null,"html_url":"https://github.com/CarelessInternet/node-schoolsoft","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarelessInternet%2Fnode-schoolsoft","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarelessInternet%2Fnode-schoolsoft/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarelessInternet%2Fnode-schoolsoft/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarelessInternet%2Fnode-schoolsoft/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CarelessInternet","download_url":"https://codeload.github.com/CarelessInternet/node-schoolsoft/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246828500,"owners_count":20840474,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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","javascript","reverse-engineering","schoolsoft","typescript"],"created_at":"2024-11-10T04:23:12.804Z","updated_at":"2026-01-25T02:01:35.460Z","avatar_url":"https://github.com/CarelessInternet.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/schoolsoft\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/schoolsoft\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/npm/l/schoolsoft\" /\u003e\n  \u003cimg src=\"https://img.shields.io/node/v/schoolsoft?color=orange\" /\u003e\n  \u003cimg src=\"https://img.shields.io/npm/dw/schoolsoft\" /\u003e\n  \u003cimg src=\"https://img.shields.io/npm/types/schoolsoft\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/commit-activity/m/CarelessInternet/node-schoolsoft?color=red\" /\u003e\n\u003c/div\u003e\n\n# node-schoolsoft\n\nA SchoolSoft API wrapper for both the browser and Node.js!\n\n## Features\n\n* Zero dependencies!\n* Built with TypeScript and comes with types!\n* Utilises the native `fetch` API!\n  * Works with the browser, Node.js v18+, and frameworks that implement the `fetch` API like Next.js!\n* Uses ESM instead of CommonJS!\n\n## Disclaimer\n\nThis library has not been tested with guardian nor staff accounts, so please be aware that it's highly unlikely they will work with this API wrapper.\n\n## Installation\n\n```bash\nnpm i schoolsoft\n```\n\n## Documentation\n\n\u003cdetails\u003e\n  \u003csummary\u003eLogging In\u003c/summary\u003e\n\n  ### Using Functions\n\n  #### `connect()`\n  \n  The recommended way of logging in is by using the `connect()` function:\n\n  ```ts\n    import { connect } from 'schoolsoft';\n\n    const user = await connect('username', 'password', 'school');\n  ```\n\n  #### `connectWithAppKeyAndSchool()`\n\n  If you have the user's app key and school, you can log in using only those two credentials:\n\n  ```ts\n    import { connectWithAppKeyAndSchool } from 'schoolsoft';\n\n    const user = await connectWithAppKeyAndSchool('app key', 'school');\n  ```\n\n  ### Using the SchoolSoft Class\n\n  You can also log in using the `SchoolSoft` class, which is what the `connect()` function uses internally:\n\n  ```ts\n    import { SchoolSoft } from 'schoolsoft';\n\n    const school = new SchoolSoft('username', 'password', 'school');\n    const user = await school.login();\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eSchoolSoft Methods\u003c/summary\u003e\n\n  ### Get Functions\n\n  All methods that start with `get` are known API routes that retrieve information. Here are some examples:\n\n  ```ts\n    import { connect, SchoolSoft } from 'schoolsoft';\n\n    const schools = await SchoolSoft.getSchoolList();\n\n    const user = await connect('username', 'password', 'school');\n\n    // Examples of methods that retrieve information:\n\n    const lunch = await user.getLunchMenu();\n    const schedule = await user.getSchedule();\n\n    const assignments = await user.getAssignments();\n    const assignmentResult = await user.getAssignmentResult(assignments[0].id);\n\n    const calendar = await user.getCalendar();\n\n    // Retrieves notices (news) that are read-only, i.e. cannot be interacted with:\n    const notices = await user.getNoticesLimit();\n    // Retrieves notices (news) that can be interacted with:\n    const actionableNotices = await user.getNoticesActionable();\n    // Retrieves notices (news) that are archived:\n    const archivedNotices = await user.getNoticesArchived();\n  ```\n\n  All of these methods and more can be found in the [`source code`](src/index.ts).\n\n  ### Set Functions\n\n  All methods that start with `set` (apart from `setAppKey()`) are known API routes that set something, such as archiving or confirming a notice. Examples:\n\n  ```ts\n    import { connect } from 'schoolsoft';\n\n    const user = await connect('username', 'password', 'school');\n    \n    const { notices } = await user.getNoticesLimit();\n    const actionableNotices = await user.getNoticesActionable();\n\n    // Examples of methods that set something:\n\n    await user.setNoticeAsArchived(notices[0].id);\n    await user.setNoticeAsUnarchived(notices[0].id);\n    await user.setNoticeAsRead(notices[0].id);\n    await user.setNoticeAsUnread(notices[0].id);\n\n    await user.setNoticeActionableAsConfirmed(actionableNotices[0].id);\n    await user.setNoticeActionableAsConfirmed(actionableNotices[1].id, 'thanks for the information bro');\n  ```\n\n  All of these methods and more can be found in the [`source code`](src/index.ts).\n\u003c/details\u003e\n\n## Testing\n\nTesting is implemented with `jest`. Here's how to run the test cases:\n\n1. Create a `.env` file in the root directory with the environment variables found in [`__tests__/environment.d.ts`](__tests__/environment.d.ts).\n\n2. Run the test cases with `npm test`.\n\n## Credits\n\nThank you to [this repository](https://github.com/Blatzar/schoolsoft-api-app) for giving me a head start.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarelessinternet%2Fnode-schoolsoft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarelessinternet%2Fnode-schoolsoft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarelessinternet%2Fnode-schoolsoft/lists"}