{"id":40940808,"url":"https://github.com/codio/codio-api-js","last_synced_at":"2026-01-22T04:34:16.378Z","repository":{"id":37900761,"uuid":"364198703","full_name":"codio/codio-api-js","owner":"codio","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-16T10:06:37.000Z","size":244,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-12-18T19:16:18.215Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/codio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-05-04T09:05:31.000Z","updated_at":"2025-12-16T10:06:40.000Z","dependencies_parsed_at":"2024-12-11T10:29:22.324Z","dependency_job_id":"78272c49-a9a3-4391-b49b-983fed7f5923","html_url":"https://github.com/codio/codio-api-js","commit_stats":{"total_commits":41,"total_committers":6,"mean_commits":6.833333333333333,"dds":0.5609756097560976,"last_synced_commit":"297932d9687f777423f4e0956caedce223333344"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codio/codio-api-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codio%2Fcodio-api-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codio%2Fcodio-api-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codio%2Fcodio-api-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codio%2Fcodio-api-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codio","download_url":"https://codeload.github.com/codio/codio-api-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codio%2Fcodio-api-js/sbom","scorecard":{"id":298315,"data":{"date":"2025-08-11","repo":{"name":"github.com/codio/codio-api-js","commit":"70acb7ac083fd22422a238a4d3a20650f7d6fc2b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yaml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/codio/codio-api-js/lint.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lint.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/codio/codio-api-js/lint.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/codio/codio-api-js/publish.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/codio/codio-api-js/publish.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/codio/codio-api-js/publish.yaml/master?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/lint.yaml:1","Warn: no topLevel permission defined: .github/workflows/publish.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":6,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Warn: no status checks found to merge onto branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T20:05:36.299Z","repository_id":37900761,"created_at":"2025-08-17T20:05:36.299Z","updated_at":"2025-08-17T20:05:36.299Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28654734,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-01-22T04:34:15.758Z","updated_at":"2026-01-22T04:34:16.369Z","avatar_url":"https://github.com/codio.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# codio-api-js\n```\nimport codio from 'codio-api-js'\n\ncodio.v1.setDomain('codio.com') // codio.co.uk for UK domain, codio.com is default\n```\n\nFollow https://docs.codio.com/develop/develop/ide/tools/ghapi.html#api-integration-information to generate\nAPI keys.\n## Requirements\n- Nodejs\n- zstd\n\n## How to build\n- Run `yarn`\n- Run `yarn build`\n\n\n## Authentication\n```\nconst token = await codio.v1.auth(client_id, client_secret)\n```\n\nThe token is saved inside the library all consequence calls will be made using the token.\n\n## API rate limit\n\nBurst rate limit: 50 requests per 10 seconds per organization\n\nDaily limit: 10.000 requests per organization\n\nAPI specific HTTP headers:\n\n| Header | Description |\n|----------|----------|\n| X-RateLimit-Limit | Number of request for burst, Example 50 |\n| X-RateLimit-Remaining | Number of requests left for the time window, Example 34 |\n| X-RateLimit-Reset | The remaining window before the rate limit resets in UTC epoch seconds |\n| X-RateLimit-DailyLimit | Number of request per day, Example 10000 |\n| X-RateLimit-DailyLimit-Remaining | Number of request per day remaining, Example 3456 |\n\n## Publish Assignment\nThese methods allow to publish the assignment either as archive (zip and tar.gz is supported)\nyou need to specify `course Id : string`, `assignmentId: string`, `changelog: string` and path to either project folder or archive\n```\n  await codio.v1.assignment.publish(courseId, assignmentId, projectPath,\n   {changelog: string, stack: string, withStackUpdate: boolean} || changelog: string))\n\n  await codio.v1.assignment.publishArchive(courseId, assignmentId, projectArchivePath,\n   {changelog: string, stack: string, withStackUpdate: boolean} || changelog: string))\n   \n  stack - stackVersionId || stackVersionId:latest\n\n```\n\nGitHub Action: https://github.com/codio/codio-assignment-publish-action\nGitHub Action Usage Example: https://github.com/ksimuk/codio-test-publish/blob/master/.github/workflows/publish.yaml\n\n## Reduce (ex Books)\nTruncate pages from project. This method creates in the `dstDir` reduced version of the project, \nwhich contains only pages specified in `sections: string[]` and files specified in `paths: string[]`\n```\n  await codio.v1.tools.reduce(srcDir, dstDir, sections, paths, sectionsConfig)\n```\n\n## Reduce Publish\nSimilar to reduce but publishes generated projects as assignments.\n```\n  await codio.v1.assignment.reducePublish(courseId, srcDir, yamConfigsDir,\n   {changelog: string, stack: string, withStackUpdate: boolean} || changelog: string))\n```\n`yamlConfig` Directory should contain yaml files in the next format:\n`assignment` - id of the assignment to publish\n`assignmentName` - or name of the assignment to publish\n`section` - section name or array of paths to the section\n`paths` - an array of files that needs to be exported, `.guides` is exported fully to all assignments\n`withChildren` - boolean - preserve children structure, `true` by default\n\n```\n- assignment: \u003cassignment Id\u003e\n  section:  [\"Chapter 1\", \"Section 1.1\"]\n  paths: ['Section1.java'] \n  \n- assignment: \u003cassignment Id\u003e\n  section:  Section 3\n\n- assignmentName: \u003cassignment name\u003e\n  section: Section 1\n\n- assignmentName: \u003cassignment name\u003e\n  section: Section 2\n  withChildren: false\n\n```\n\nGitHub Action: https://github.com/codio/codio-assignment-publish-action\nGitHub Action Usage Example: https://github.com/ksimuk/codio-test-publish-book/tree/master/.github\n\n## Assessment Library\n\n### List Libraries\n\nReturns an array of `Library` items\n```\n  Library = {\n    name: string\n    id: string\n    createdBy: string\n  }\n\n  const libraries = await codio.v1.assessment.listLibraries()\n```\n\n### Find Assessments in a library\n\nReturns an array of `Assessment` items\n```\n  const assessments = await codio.v1.assessment.find('libraryId || name', searchTags: Map\u003cstring, string\u003e)\n```\n\n### Synchronize assessments from library\n\nPublishes all assessments from the project in `project_path` to the library\n```\n  await codio.v1.assessment.fromCodioProject('libraryId || name', '\u003cproject_path\u003e')\n```\n\nPlease be aware on that this action will update {assessment_id}.json files with new tags \nneeded to keep connection between project assessment and library item. You will \nneed to commit the changes to avoid duplication the assessment\n\nGitHub action: https://github.com/codio/codio-assessments-publish-action\n\n### Get Course Info\n\n#### Course assignments\n\nreturn \n\n```\n  await codio.v1.course.info(courseId)\n```\nreturn `Course` object\n```\nCourse = {\n  id: string,\n  name: string,\n  description?: string,\n  modules: Module[],\n  assignments: Assignment[],\n  creationDate: Date,\n  archivedDate: Date,\n  archived: boolean,\n  start?: Date,\n  end?: Date,\n  timezone?: string,\n  tags?: string[]\n}\nModule = {\n  id: string,\n  name: string,\n  assignments: Assignment[]\n}\nAssignment = {\n  id: string,\n  name: string\n}\n```\n\n### Course info by name\n\nreturn\n\n```\n  await codio.v1.course.findByName(courseName, withHiddenAssignments)\n```\nreturn `Course` object\n```\nCourse = {\n  id: string,\n  name: string,\n  description?: string,\n  modules: Module[],\n  assignments: Assignment[],\n  creationDate: Date,\n  archivedDate: Date,\n  archived: boolean,\n  start?: Date,\n  end?: Date,\n  timezone?: string,\n  tags?: string[]\n}\nModule = {\n  id: string,\n  name: string,\n  assignments: Assignment[]\n}\nAssignment = {\n  id: string,\n  name: string\n}\n```\n\n#### Course assignments student Progress\n\n```\n  await codio.v1.course.assignmentStudentsProgress(courseId, assignmentId)\n```\nreturns `StudentProgress[]` object \n```\nStudentProgress = {\n  student_id: string\n  student_email: string\n  seconds_spent: number\n  grade: number\n  extra_credit: number\n  status: string\n  completion_date: Date\n  extendedDeadline: number\n  extendedTimeLimit: number\n}\n```\n\n\n#### Course student Progress\n\n```\n  await codio.v1.course.studentCourseProgress(courseId, studentId|email|login)\n```\nreturns `AssignmentProgress[]` object\n```\nAssignmentProgress = {\n  assignment_name: string\n  assignment_id: string\n  module_name: string\n  module_id: string\n  started: boolean\n  progress: {\n    seconds_spent: number\n    grade: number\n    status: string\n    completion_date: Date\n    extended_deadline: number\n    extended_time_limit: number\n  }\n}\n```\n\n#### Course assignments students projects\n\nPrepare student's project \nyou need to specify `course Id : string`, `assignmentId: string`, `studentId: string`\n\n```\n  await codio.v1.course.exportStudentAssignment(courseId, assignmentId, studentId)\n```\nreturns `archive url` string\n\nOr download student's project\nyou need to specify `course Id : string`, `assignmentId: string`, `studentId: string`\n\n```\n  await codio.v1.course.downloadStudentAssignment(courseId, assignmentId, studentId, filePath)\n```\ndownloads file to filePath\n\n#### Course users\n\nFetch course students excepts test users\n\n```\n  await codio.v1.course.getStudents(courseId)\n```\nreturns user `User[]` object\n\n```\nUser = {\n  id: string\n  name: string\n  login: string\n  email: string\n}\n```\n\nFetch course teachers\n\n```\n  await codio.v1.course.getTeachers(courseId)\n```\nreturns user `User[]` object\n\nAdd teacher to course\n\n```\n  await codio.v1.course.addTeacher(courseId, userId, readOnly?)\n```\n- `readOnly` (optional, default `false`): when `true`, the user is added as a read‑only teacher.\n- returns `boolean` — true if the teacher was successfully added\n\nExample:\n```javascript\n// Add full teacher (default)\nawait codio.v1.course.addTeacher(courseId, userId)\n\n// Add read-only teacher\nawait codio.v1.course.addTeacher(courseId, userId, true)\n```\n\n#### Course management\n\nCreate course\n\n```\n  await codio.v1.course.createCourse(courseData)\n```\nParameters:\n```\nCreateCourseRequest = {\n  name: string,\n  description?: string,\n  start?: string,\n  end?: string,\n  timezone?: string,\n  tags?: string[]\n}\n```\nNotes:\n- `start` and `end` are ISO 8601 strings (e.g., `2025-09-01T13:00:00Z`).\n- `timezone` should be an IANA timezone name (e.g., `America/New_York`).\n- In responses, `Course.start` is a `Date` (or absent), while `CreateCourseRequest.start` is a string.\nreturns `string` — newly created courseId\n\nExample:\n```javascript\nconst courseId = await codio.v1.course.createCourse({\n  name: 'Intro to CS',\n  description: 'Fall 2025 section',\n  start: '2025-09-01T13:00:00Z', // ISO 8601 string\n  end: '2025-12-20T23:59:59Z',   // ISO 8601 string\n  timezone: 'America/New_York',\n  tags: ['CS101','Fall-2025']\n})\n```\n\nCreate module\n\n```\n  await codio.v1.course.createModule(courseId, moduleName)\n```\nreturns `string` — newly created moduleId\n\nExample:\n```javascript\nconst moduleId = await codio.v1.course.createModule(courseId, 'Module 1: Basics')\n```\n\n\n#### Export student CSV\n\nReturns url string:\n```\nawait codio.course.exportStudentCSV(courseId, studentId)\n```\n\nDownload exported student CSV data to filePath:\n```\nawait codio.course.downloadStudentCSV(courseId, studentId, filePath)\n```\n\n#### Export assignment CSV\n\nReturns url string:\n```\nawait codio.course.exportAssignmentCSV(courseId, assignmentId)\n```\n\nDownload exported assignment CSV data to filePath:\n```\nawait codio.course.downloadAssignmentCSV(courseId, assignmentId, filePath)\n```\n\n#### Export LLM Proxy data\n\nReturns url string:\n```\nawait codio.course.exportLLMProxyData(courseId)\n```\n\n#### Export Coach data\n\nReturns url string:\n```\nawait codio.course.exportCoachData(courseId)\n```\n\n\n#### Export Assessment Data\n\nExport all assessment results for selected assignments in the course.\n\nThe following data is exported to a .csv file for download\n(or into a .zip file containing individual csv files if multiple assignments selected).\n\nReturns archive url string:\n```\nawait codio.course.exportAssessmentData(courseId, assignmentIds)\n```\n\nTo download exported data you need to specify course Id : string, assignmentIds: string (comma-separated list of assignmentIds)\n```\nawait codio.course.downloadAssessmentData(courseId, assignmentIds, filePath)\n```\ndownloads file to filePath\n\n#### Export Course Sources\n\nExport all course sources.\n\n\nReturns `CourseExport` object\n\n```\nCourseExport = {\n  taskId: string\n  done: boolean\n  error?: string\n  url?: string\n}\n```\n\n```\nawait codio.course.createSourceExport(courseId)\n```\n\nTo download exported data you need to specify course Id\n```\nawait codio.course.downloadSourceExport(courseId, filePath)\n```\ndownloads file to filePath\n\nGet all available exports.\n\nReturns array `CourseExport[]` objects\n\n```\nawait codio.course.getSourceExports(courseId)\n```\n\nGet export progress by id.\n\nReturns `CourseExport` object\n\n```\nawait codio.course.getSourceExportProgress(courseId, taskId)\n```\n\n#### Export Course Work Data\n\nExport all course work data.\n\n\nReturns `CourseExport` object\n\n```\nCourseExport = {\n  taskId: string\n  done: boolean\n  error?: string\n  url?: string\n}\n```\n\n```\nawait codio.course.createWorkExport(courseId)\n```\n\nTo download exported data you need to specify course Id\n```\nawait codio.course.downloadWorkExport(courseId, filePath)\n```\ndownloads file to filePath\n\nGet all available exports.\n\nReturns array `CourseExport[]` objects\n\n```\nawait codio.course.getWorkExports(courseId)\n```\n\nGet export progress by id.\n\nReturns `CourseExport` object\n\n```\nawait codio.course.getWorkExportProgress(courseId, taskId)\n```\n\n#### List organization courses\n\nList organization courses\n\n\nReturns\n\n```\nListCoursesResponse = {\n  courses: Course[],\n  nextToken: string\n}\n```\n\nExample\n\n```\nawait codio.course.list(\u003cnext token\u003e, \u003carchived\u003e)\n```\n\n\n#### Archive course\n\nReturns `Date` of archivation\n\n```\nawait codio.course.archive(\u003ccourseId\u003e)\n```\n\n#### Filter Learners For Mentors\n\nSpecify mentors for LTI-base course\n\nReturns\n\n```\nFilterLeanersResponce = {\n  completed: boolean\n}\n```\n\nExample\n\n```\n\u003cleanersMapping\u003e = [{\n  mentorId: string,\n  learnerIds: string[]\n}]\n```\n\n```\nawait codio.course.filterLearnersForMentors(\u003ccourseId\u003e, \u003cleanersMapping\u003e)\n```\n\n\n\n## Publish Stack\nThis method allow to publish the stack \nyou need to specify \n`stackId : string` - stack to add new published version to,\n`id: string | null` - stack id or stack version id to use as base,\n`provisioner: string` - one of `ansible` or `bash` to detect which file to use `provision.sh` or `provision.yaml`,\n`content: string | null` - content of `provision.yaml` or `provision.sh` file which overrides stored in archive if set (tar.gz is supported),\n`archivePath: string | null` - path to archive with files to use during provision,\n`message: string` - published version changelog\n\n```javascript\n  await codio.v1.stack.publish(\n    stackId,\n    id,\n    provisioner,\n    content,\n    archivePath,\n    message\n  )\n\n```\n\n## Get Stack Info\n`stackId : string` - stack id\n\n```javascript\n  await codio.v1.stack.info(stackId)\n```\n\n## Get Assignment Settings\n`courseId : string` - course id,\n`assignmentId : string` - assignment id,\n\nNote: endTime field is Closing Date\n\nreturns `AssignmentSettings` - Settings, missed properties won't be updated\n```javascript\n  const settings = await codio.assignment.getSettings('\u003ccourse\u003e', '\u003cassignments\u003e')\n```\n\n```\n  enableResetAssignmentByStudent?: boolean\n  disableDownloadByStudent?: boolean\n  visibilityOnDisabled?: string, // \"READ_ONLY\", \"NO_ACCESS\",\n  visibilityOnCompleted?: string, // \"READ_ONLY_RESUBMIT\", \"READ_ONLY\", \"NO_ACCESS\",\n  startTime?: Date | null,\n  endTime?: Date | null,\n  action?: string // \"COMPLETE\", \"DISABLE\", \"DISABLE_AND_COMPLETE\",\n  dueTime?: Date | null\n  markAsCompleteOnDueDate?: boolean\n  penaltiesV2?: PenaltySettings\n  examMode?: {\n    timedExamMode: {\n      enabled: boolean\n      duration: number // minutes\n    }\n    shuffleQuestionsOrder: boolean\n    forwardOnlyNavigation: boolean\n    singleLogin: boolean\n    authentication: boolean\n  },\n  releaseGrades?: boolean\n  isDisabled?: boolean\n}\n\nexport type PenaltySettings = {\n  enable: boolean\n  deductionIntervalMinutes: number\n  deductionPercent: number\n  lowestGradePercent: number\n}\n```\n\n## Update Assignment Settings\nThis method allow updating assignment settings.\nYou need to specify\n`courseId : string` - course id,\n`assignmentId : string` - assignment id ,\n`settings: AssignmentSettings` - Settings, missed properties won't be updated\n\nNote: endTime field is Closing Date\n\nExample: \n```javascript\n  await codio.assignment.updateSettings('\u003ccourse\u003e', '\u003cassignments\u003e', {\n    enableResetAssignmentByStudent: false,\n    startTime: null,\n    endTime: new Date('2022-05-10T23:59:59+01:00'),\n    dueTime: new Date('2022-05-09T23:59:59+01:00'),\n    penaltiesV2: {\n      enable: true,\n      deductionIntervalMinutes: 60,\n      deductionPercent: 10,\n      lowestGradePercent: 90\n    }\n  })\n```\n\n#### Update student related time extensions\n\n\nSet time limits on a per-student basis\n\n\n```javascript\n await codio.assignment.updateStudentTimeExtension(courseId, assignmentId, studentId, {\n  extendedDeadline: minutes,\n  extendedTimeLimit: minutes\n})\n```\n\nreturns empty object\n\n\n## Get webhook events\n\n### Load resent events\n\nGet last events list with continuation token if more events are awailable\n\n```\n  await codio.v1.events.loadEvents('\u003cnextToken\u003e', \u003climit\u003e)\n```\n\nreturn `LoadEventResponse` object\n```\nLoadEventResponse = {\n  events: Event[],\n  nextToken: string\n}\nEvent = {\n  id: string,\n  event: any,\n  completed: boolean,\n  error?: string,\n  issuedAt: Date\n}\n```\n\n### Load all resent events\n\n```\n  await codio.v1.events.loadAllEvents()\n```\n\nreturn `Event` array\n\n### Timezones:\n\nWe recommend using [Luxon](https://moment.github.io/luxon/) to deal with time zones.\n```javascript\nconst { DateTime } = require('luxon')\n\nDateTime.fromISO('2022-05-09T23:59:59').toJSDate() // to use local timezone\nDateTime.fromISO('2022-05-09T23:59:59', { zone: 'EST' }).toJSDate() // to use other timezone\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodio%2Fcodio-api-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodio%2Fcodio-api-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodio%2Fcodio-api-js/lists"}