Semestra

LMS (Canvas)

File Content

GET
/courses/{course_id}/lms/files/{file_id}/content

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id
file_id*File Id

Query Parameters

download?Download

Send as an attachment

Defaultfalse
check?Check

Only check that the file opens (204, or the same errors)

Defaultfalse

Response Body

Successful Response

Example Request
curl -X GET 'https://example.com/courses/string/lms/files/string/content'
Example Response
Empty
GET
/courses/{course_id}/lms/announcements

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse
since?|

Only posted after this time

fields?array<>|

Agent/MCP only: return just these fields of each item (and its external_id); default title, author, posted_at, unread. markdown (or html) is the body, as Markdown

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/announcements'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "external_course_id": "",      "title": "string",      "html": "string",      "author": "string",      "posted_at": "2019-08-24T14:15:22Z",      "updated_at": "2019-08-24T14:15:22Z",      "unread": false    }  ],  "truncated": true}
POST
/courses/{course_id}/lms/announcements/{announcement_id}:read

Only when the user allows Semestra to change things on the platform (account setting lms.allow_writes), otherwise lms.writes_disabled. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

announcement_id*Announcement Id

External announcement id

Response Body

Successful Response

application/json
  1. response
announcement_id*Announcement Id
unread*Unread
Example Request
curl -X POST 'https://example.com/courses/string/lms/announcements/string:read'
Example Response
{  "announcement_id": "string",  "unread": true}
POST
/courses/{course_id}/lms/imports:gradebook

For assignments whose imported_as.kind is task in lms.assignment.list: each becomes an assessment and keeps its to-do. Saved at once when nothing needs a decision (committed); otherwise commit it after the review (imports.session.commit).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Request Body

application/json
  1. body
external_ids*array<>

Assignments (external_id of lms.assignment.list)

Items1 <= items <= 200

Response Body

Successful Response

application/json
  1. response
session_id*Session Id
program_id*Program Id
count*Count

Items in the import

committed?Committed

Saved at once (nothing needed a decision); otherwise it waits for review

Defaultfalse
failed?Failed

Items that could not be saved, when committed (see the import)

Default0
Example Request
curl -X POST 'https://example.com/courses/string/lms/imports:gradebook' \  -H 'Content-Type: application/json' \  -d '{  "external_ids": [    "string"  ]}'
Example Response
{  "session_id": "string",  "program_id": "string",  "count": 0,  "committed": false,  "failed": 0}
POST
/courses/{course_id}/lms/imports:assignments

Assignments worth points become assessments (each gets its task), the others tasks; ones imported before are left out. Saved at once when nothing needs a decision (committed); otherwise the user reviews it, then commit it like any import (imports.session.commit).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Request Body

application/json
  1. body
external_ids*array<>

Assignments (external_id of lms.assignment.list)

Items1 <= items <= 200

Response Body

Successful Response

application/json
  1. response
session_id*Session Id
program_id*Program Id
count*Count

Items in the import

committed?Committed

Saved at once (nothing needed a decision); otherwise it waits for review

Defaultfalse
failed?Failed

Items that could not be saved, when committed (see the import)

Default0
Example Request
curl -X POST 'https://example.com/courses/string/lms/imports:assignments' \  -H 'Content-Type: application/json' \  -d '{  "external_ids": [    "string"  ]}'
Example Response
{  "session_id": "string",  "program_id": "string",  "count": 0,  "committed": false,  "failed": 0}
GET
/courses/{course_id}/lms/assignments

To add them to the gradebook or tasks use lms.assignment.import (and lms.assignment.add_to_gradebook for ones imported as tasks), never the gradebook or task capabilities directly.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse
fields?array<>|

Agent/MCP only: return just these fields of each item (and its external_id); default name, due_at, points, group_name, submission, imported_as. markdown (or html) is the body, as Markdown

Response Body

Successful Response

application/json
  1. response
items*array<>
new_ids*array<string>

external_id of the new assignments: not imported and due later

truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/assignments'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "html": "string",      "due_at": "2019-08-24T14:15:22Z",      "unlock_at": "2019-08-24T14:15:22Z",      "lock_at": "2019-08-24T14:15:22Z",      "points": 0,      "group_id": "string",      "group_name": "string",      "group_weight": 0,      "submission_types": [        "string"      ],      "submission": {        "state": "string",        "submitted_at": "2019-08-24T14:15:22Z",        "graded_at": "2019-08-24T14:15:22Z",        "score": 0,        "grade": "string",        "late": false,        "missing": false,        "attempt": 0      },      "published": true,      "updated_at": "2019-08-24T14:15:22Z",      "locked": false,      "lock_explanation": "string",      "allowed_attempts": 0,      "rubric": [        {          "id": "string",          "description": "",          "long_description": "string",          "points": 0,          "ratings": [            {              "id": "string",              "description": "",              "points": 0            }          ]        }      ],      "imported_as": {        "kind": "assessment",        "id": "string"      }    }  ],  "new_ids": [    "string"  ],  "truncated": true}
GET
/lms/connections

Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Response Body

Successful Response

application/json
  1. response
items*array<>
Example Request
curl -X GET 'https://example.com/lms/connections'
Example Response
{  "items": [    {      "id": "string",      "provider": "string",      "display_name": "string",      "config": {},      "credentials_hint": {        "property1": "string",        "property2": "string"      },      "has_credentials": true,      "account_name": "string",      "status": "connected",      "last_checked_at": "2019-08-24T14:15:22Z",      "last_error_code": "string",      "program_ids": [        "string"      ],      "link_count": 0,      "created_at": "2019-08-24T14:15:22Z",      "updated_at": "2019-08-24T14:15:22Z"    }  ]}
POST
/lms/connections

Credentials are stored encrypted and only ever shown masked. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Request Body

application/json
  1. body
provider*Provider

Provider kind: canvas

Lengthlength <= 32
display_name?|

Name shown in the app; defaults to the instance name

config*

Provider settings, e.g. {base_url}

credentials?

Provider credentials, e.g. {access_token}; stored encrypted

sign_in?|

Instead of credentials: the address the platform's sign-in page ended on (lms.connection.sign_in.start)

Response Body

Successful Response

application/json
  1. response
id*Id
provider*Provider
display_name*Display Name
config*

Non-secret settings, e.g. {base_url}

credentials_hint*

Masked credentials, never the values

has_credentials*Has Credentials

False after a data import: enter them again

account_name*string|null
status*Status
Value in"connected""error"
last_checked_at*|null
last_error_code*string|null
program_ids*array<string>

Programs bound to this connection

link_count*Link Count

Courses linked through this connection

created_at*Created At
Formatdate-time
updated_at*Updated At
Formatdate-time
Example Request
curl -X POST 'https://example.com/lms/connections' \  -H 'Content-Type: application/json' \  -d '{  "provider": "string",  "config": {}}'
Example Response
{  "id": "string",  "provider": "string",  "display_name": "string",  "config": {},  "credentials_hint": {    "property1": "string",    "property2": "string"  },  "has_credentials": true,  "account_name": "string",  "status": "connected",  "last_checked_at": "2019-08-24T14:15:22Z",  "last_error_code": "string",  "program_ids": [    "string"  ],  "link_count": 0,  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
PATCH
/lms/connections/{id}

New settings or credentials are checked before saving. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

id*Id

Connection id

Request Body

application/json
  1. body
display_name?|

New display name

config?|

New provider settings

credentials?|

New credentials (checked before saving)

sign_in?|

Instead of credentials: a new sign-in on the platform's page

Response Body

Successful Response

application/json
  1. response
id*Id
provider*Provider
display_name*Display Name
config*

Non-secret settings, e.g. {base_url}

credentials_hint*

Masked credentials, never the values

has_credentials*Has Credentials

False after a data import: enter them again

account_name*string|null
status*Status
Value in"connected""error"
last_checked_at*|null
last_error_code*string|null
program_ids*array<string>

Programs bound to this connection

link_count*Link Count

Courses linked through this connection

created_at*Created At
Formatdate-time
updated_at*Updated At
Formatdate-time
Example Request
curl -X PATCH 'https://example.com/lms/connections/string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "string",  "provider": "string",  "display_name": "string",  "config": {},  "credentials_hint": {    "property1": "string",    "property2": "string"  },  "has_credentials": true,  "account_name": "string",  "status": "connected",  "last_checked_at": "2019-08-24T14:15:22Z",  "last_error_code": "string",  "program_ids": [    "string"  ],  "link_count": 0,  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
DELETE
/lms/connections/{id}

Refused while Programs are bound to it (lms.connection_in_use) unless detach_all, which also unbinds them and unlinks their courses; imported assessments, tasks and files stay. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

id*Id

Connection id

Query Parameters

detach_all?Detach All

Also unbind its Programs and unlink their courses (imports are kept)

Defaultfalse

Response Body

Successful Response

application/json
  1. response
id*Id
unbound_programs*Unbound Programs
unlinked_courses*Unlinked Courses
Example Request
curl -X DELETE 'https://example.com/lms/connections/string'
Example Response
{  "id": "string",  "unbound_programs": 0,  "unlinked_courses": 0}
POST
/lms/connections:sign-in

Returns the address to open in the user's browser; the address that page ends on goes to lms.connection.create (or update) as sign_in. Only where the server allows it (providers with sign_in). Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Request Body

application/json
  1. body
provider*Provider

Provider kind: canvas

Lengthlength <= 32
config*

Provider settings, e.g. {base_url}

Response Body

Successful Response

application/json
  1. response
authorize_url*Authorize Url

Open in the user's browser to sign in

Example Request
curl -X POST 'https://example.com/lms/connections:sign-in' \  -H 'Content-Type: application/json' \  -d '{  "provider": "string",  "config": {}}'
Example Response
{  "authorize_url": "string"}
POST
/lms/connections:validate

A re-check records the connection's status. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Request Body

application/json
  1. body
connection_id?|

Check a saved connection; omitted fields use its stored values

provider?|

Provider kind (new connection)

config?|

Provider settings

credentials?|

Credentials

Response Body

Successful Response

application/json
  1. response
ok*Ok
error_code*string|null
error_params?
summary*|null
connection*|

The saved connection, when one was checked

Example Request
curl -X POST 'https://example.com/lms/connections:validate' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "ok": true,  "error_code": "string",  "error_params": {},  "summary": {    "account_name": "string",    "avatar_url": "string",    "instance_name": "string"  },  "connection": {    "id": "string",    "provider": "string",    "display_name": "string",    "config": {},    "credentials_hint": {      "property1": "string",      "property2": "string"    },    "has_credentials": true,    "account_name": "string",    "status": "connected",    "last_checked_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "program_ids": [      "string"    ],    "link_count": 0,    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  }}
GET
/courses/{course_id}/lms/updates

A score change is a grade the gradebook does not have yet. Put them up for the user's review with lms.course.queue_updates.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
count*Count
items*array<>
Example Request
curl -X GET 'https://example.com/courses/string/lms/updates'
Example Response
{  "course_id": "string",  "count": 0,  "items": [    {      "external_id": "string",      "name": "string",      "target": {        "kind": "assessment",        "id": "string"      },      "changes": {        "property1": {          "old": null,          "new": null        },        "property2": {          "old": null,          "new": null        }      }    }  ]}
POST
/programs/{program_id}/lms/imports:courses

Creates an import the user reviews (imports.session.get); committing it creates the courses and links them to the LMS in one go.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

program_id*Program Id

Program id (must have a bound connection)

Request Body

application/json
  1. body
external_course_ids*array<>

External courses to import (external_id of lms.course.list)

Items1 <= items <= 50
term_id?|

Term the courses go into; agents create the term first

term_wizard?Term Wizard

Only for the app's new-term wizard (the term is created afterwards); agents cannot use it

Defaultfalse
start_date?|

App wizard only: first day of the term

end_date?|

App wizard only: last day of the term

Response Body

Successful Response

application/json
  1. response
session_id*Session Id
program_id*Program Id
count*Count

Items in the import

committed?Committed

Saved at once (nothing needed a decision); otherwise it waits for review

Defaultfalse
failed?Failed

Items that could not be saved, when committed (see the import)

Default0
Example Request
curl -X POST 'https://example.com/programs/string/lms/imports:courses' \  -H 'Content-Type: application/json' \  -d '{  "external_course_ids": [    "string"  ]}'
Example Response
{  "session_id": "string",  "program_id": "string",  "count": 0,  "committed": false,  "failed": 0}
GET
/courses/{course_id}/lms-link

Also says which connection the course's Program is bound to. Check it before the lms.* read tools: they need a linked course (lms.course_not_linked otherwise). Link a course with lms.course.link.set.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X GET 'https://example.com/courses/string/lms-link'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
PATCH
/courses/{course_id}/lms-link

Off: no calendar overlay and no update checks; reading still works. To remove the link altogether use lms.course.link.delete.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Request Body

application/json
  1. body
sync_enabled*Sync Enabled

Show in the calendar, check updates

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X PATCH 'https://example.com/courses/string/lms-link' \  -H 'Content-Type: application/json' \  -d '{  "sync_enabled": true}'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
DELETE
/courses/{course_id}/lms-link

Imported assessments, tasks and files stay; LMS reads, calendar overlay and update checks stop for this course. Link it again with lms.course.link.set. To pause syncing but keep reading, use lms.course.link.update instead.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X DELETE 'https://example.com/courses/string/lms-link'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
PUT
/courses/{course_id}/lms-link

Uses the Program's bound connection (lms.program_not_configured without one). An external course can be linked to only one course of the Program (lms.course_already_linked). If the course is already linked to another external course this fails with lms.course_link_exists (naming that course) unless replace is true; replacing stops tracking what was imported through the old link.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Request Body

application/json
  1. body
external_course_id*External Course Id

External course id (lms.course.list)

Length1 <= length <= 200
sync_enabled?Sync Enabled

Show in the calendar, check updates

Defaulttrue
replace?Replace

Replace the course's link to another external course; only when the user asked to change it

Defaultfalse

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X PUT 'https://example.com/courses/string/lms-link' \  -H 'Content-Type: application/json' \  -d '{  "external_course_id": "string"}'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
POST
/courses/{course_id}/lms-link:sync

Changes only the link, never the course itself. Use when the course was renamed or moved on the LMS and the link still shows the old code, name or term.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X POST 'https://example.com/courses/string/lms-link:sync'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
GET
/programs/{program_id}/lms/courses

Current-term courses by default; include_past for all of them.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

program_id*Program Id

Program id

Query Parameters

include_past?Include Past

Also courses of past terms

Defaultfalse
refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
connection_id*Connection Id
provider*Provider
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/programs/string/lms/courses'
Example Response
{  "connection_id": "string",  "provider": "string",  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "code": "string",      "name": "string",      "term": "string",      "start_at": "2019-08-24T14:15:22Z",      "end_at": "2019-08-24T14:15:22Z",      "default_view": "string",      "is_current": true,      "linked_course_id": "string",      "linked_course_name": "string"    }  ],  "truncated": true}
GET
/courses/{course_id}/lms

A read the platform does not support fails with lms.feature_unsupported.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
link*
provider*Provider
provider_name*Provider Name
features*array<>
course*
navigation*array<>
default_view*string|null
fetched_at?|

When the course was last read from the platform (cached)

truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms'
Example Response
{  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "provider": "string",  "provider_name": "string",  "features": [    "courses"  ],  "course": {    "external_id": "string",    "web_url": "string",    "raw_kind": "string",    "code": "string",    "name": "string",    "term": "string",    "start_at": "2019-08-24T14:15:22Z",    "end_at": "2019-08-24T14:15:22Z",    "default_view": "string",    "is_current": true  },  "navigation": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "kind": "home",      "label": "string",      "position": 0,      "hidden": false    }  ],  "default_view": "string",  "fetched_at": "2019-08-24T14:15:22Z",  "truncated": true}
POST
/courses/{course_id}/lms/updates:review

Creates an import of the changes and changes nothing itself: they are written when the import is committed (imports.session.commit) after the user reviewed it.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
session_id*Session Id
program_id*Program Id
count*Count

Items in the import

committed?Committed

Saved at once (nothing needed a decision); otherwise it waits for review

Defaultfalse
failed?Failed

Items that could not be saved, when committed (see the import)

Default0
Example Request
curl -X POST 'https://example.com/courses/string/lms/updates:review'
Example Response
{  "session_id": "string",  "program_id": "string",  "count": 0,  "committed": false,  "failed": 0}
POST
/courses/{course_id}/lms:refresh

The Canvas tab's "Refresh". Reads with refresh do the same for one read. Not for agents.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
course_id*Course Id
link*|null
program_connection_id*|

Connection bound to the course's Program; null = bind one first

Example Request
curl -X POST 'https://example.com/courses/string/lms:refresh'
Example Response
{  "course_id": "string",  "link": {    "id": "string",    "course_id": "string",    "program_id": "string",    "connection_id": "string",    "provider": "string",    "external_course_id": "string",    "external_code": "string",    "external_name": "string",    "external_term": "string",    "web_url": "string",    "sync_enabled": true,    "last_synced_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "created_at": "2019-08-24T14:15:22Z"  },  "program_connection_id": "string"}
GET
/courses/{course_id}/lms/files/{file_id}

Read its text with lms.file.preview; to search or cite it, save it with lms.file.save_to_course.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

file_id*File Id

External file id: target.ref of a file in lms.module_item.list, or external_id of a file from lms.folder.get / lms.file.search

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
external_id*External Id
web_url?|

Opens the item on the platform

raw_kind?|

The platform's own type (debugging)

name*Name
mime_type?string|null
size_bytes?integer|null
updated_at?|null
locked?Locked
Defaultfalse
Example Request
curl -X GET 'https://example.com/courses/string/lms/files/string'
Example Response
{  "external_id": "string",  "web_url": "string",  "raw_kind": "string",  "name": "string",  "mime_type": "string",  "size_bytes": 0,  "updated_at": "2019-08-24T14:15:22Z",  "locked": false}
GET
/courses/{course_id}/lms/files/{file_id}/preview

Reads it without saving it. To search it or cite it, save it with lms.file.save_to_course instead.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

file_id*File Id

External file id: target.ref of a file in lms.module_item.list, or external_id of a file from lms.folder.get / lms.file.search

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
name*Name
mime_type*Mime Type
kind*Kind

pdf, docx, pptx, xlsx, csv, html, text or markdown

pages*array<string>

Markdown per page (slide, sheet, logical page)

truncated*Truncated

Only the first pages are included

Example Request
curl -X GET 'https://example.com/courses/string/lms/files/string/preview'
Example Response
{  "name": "string",  "mime_type": "string",  "kind": "string",  "pages": [    "string"  ],  "truncated": true}
POST
/courses/{course_id}/lms/files/{file_id}:save

It is then processed like an upload and can be searched and extracted.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

file_id*File Id

External file id: target.ref of a file in lms.module_item.list, or external_id of a file from lms.folder.get / lms.file.search

Request Body

application/json
  1. body
folder_id?|

Course folder, default root

Response Body

Successful Response

application/json
  1. response
file_item_id*File Item Id
name*Name
Example Request
curl -X POST 'https://example.com/courses/string/lms/files/string:save' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "file_item_id": "string",  "name": "string"}
GET
/courses/{course_id}/lms/files

Matches part of the file name, not its contents. Each result says its type, size, last change and whether it is locked. Browse by folder with lms.folder.get, open one with lms.file.preview, or copy it into the course's files with lms.file.save_to_course.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse
term*Term

Part of the file name

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/files?term=string'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "mime_type": "string",      "size_bytes": 0,      "updated_at": "2019-08-24T14:15:22Z",      "locked": false    }  ],  "truncated": true}
GET
/courses/{course_id}/lms/folders

Leave out folder_id for the root folder. Courses that hide their files from students fail with lms.forbidden; their files are still reachable through modules.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse
folder_id?|

External folder id; the course's root folder when left out

Response Body

Successful Response

application/json
  1. response
folder*
trail*array<>

From the root folder down to folder

folders*array<>
files*array<>
truncated?Truncated
Defaultfalse
Example Request
curl -X GET 'https://example.com/courses/string/lms/folders'
Example Response
{  "folder": {    "external_id": "string",    "web_url": "string",    "raw_kind": "string",    "name": "string",    "path": "string",    "parent_id": "string",    "files_count": 0,    "folders_count": 0,    "locked": false  },  "trail": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "path": "string",      "parent_id": "string",      "files_count": 0,      "folders_count": 0,      "locked": false    }  ],  "folders": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "path": "string",      "parent_id": "string",      "files_count": 0,      "folders_count": 0,      "locked": false    }  ],  "files": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "mime_type": "string",      "size_bytes": 0,      "updated_at": "2019-08-24T14:15:22Z",      "locked": false    }  ],  "truncated": false}
GET
/courses/{course_id}/lms/grades

The course total first, then one row per assignment, with score, points possible and grade as the LMS shows them. The gradebook in this app is grading.gradebook.get; to add LMS assignments to it use lms.assignment.import.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/grades'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "score": 0,      "points_possible": 0,      "grade": "string",      "group_name": "string",      "graded_at": "2019-08-24T14:15:22Z",      "kind": "total"    }  ],  "truncated": true}
GET
/courses/{course_id}/lms/modules

Modules are the instructor's outline of the course (weeks or units), in order, with their state, unlock date and item count. Items of a module: lms.module_item.list.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/modules'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "name": "string",      "position": 0,      "state": "string",      "unlock_at": "2019-08-24T14:15:22Z",      "item_count": 0,      "completed_at": "2019-08-24T14:15:22Z",      "prerequisite_module_ids": [        "string"      ],      "require_sequential_progress": false,      "items": [        {          "external_id": "string",          "web_url": "string",          "raw_kind": "string",          "title": "string",          "kind": "page",          "position": 0,          "indent": 0,          "target": {            "kind": "page",            "ref": "string"          },          "external_url": "string",          "completion": {            "type": "string",            "min_score": 0,            "completed": false          },          "locked": false,          "lock_explanation": "string",          "due_at": "2019-08-24T14:15:22Z",          "points": 0        }      ]    }  ],  "truncated": true}
GET
/courses/{course_id}/lms/modules/{module_id}/items

Get module_id from lms.module.list. Each item has a kind (page, assignment, file, quiz, link...) and an indent level. target says where an item opens in the app (page, assignment, file...).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

module_id*Module Id

External module id, from lms.module.list

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/modules/string/items'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "title": "string",      "kind": "page",      "position": 0,      "indent": 0,      "target": {        "kind": "page",        "ref": "string"      },      "external_url": "string",      "completion": {        "type": "string",        "min_score": 0,        "completed": false      },      "locked": false,      "lock_explanation": "string",      "due_at": "2019-08-24T14:15:22Z",      "points": 0    }  ],  "truncated": true}
GET
/courses/{course_id}/lms/pages/{ref}

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

ref*Ref

Page ref from lms.page.list, or @front for the course's front page

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
external_id*External Id
web_url?|

Opens the item on the platform

raw_kind?|

The platform's own type (debugging)

ref*Ref

What page takes (Canvas: the page url slug)

title*Title
updated_at?|null
front_page?Front Page
Defaultfalse
html?string|null
locked?Locked
Defaultfalse
lock_explanation?|

Why it is locked, as the platform says

Example Request
curl -X GET 'https://example.com/courses/string/lms/pages/string'
Example Response
{  "external_id": "string",  "web_url": "string",  "raw_kind": "string",  "ref": "string",  "title": "string",  "updated_at": "2019-08-24T14:15:22Z",  "front_page": false,  "html": "string",  "locked": false,  "lock_explanation": "string"}
GET
/courses/{course_id}/lms/pages

Titles and last change only; the course's front page is marked. Read one with lms.page.get. The syllabus has its own tool, lms.syllabus.get.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/pages'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "ref": "string",      "title": "string",      "updated_at": "2019-08-24T14:15:22Z",      "front_page": false    }  ],  "truncated": true}
GET
/programs/{program_id}/lms-binding

Courses of the Program can only be linked through this connection. The user manages connections in settings.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

program_id*Program Id

Program id

Response Body

Successful Response

application/json
  1. response
program_id*Program Id
connection_id*string|null
connection*|null
link_count*Link Count

Courses of the Program linked through it

Example Request
curl -X GET 'https://example.com/programs/string/lms-binding'
Example Response
{  "program_id": "string",  "connection_id": "string",  "connection": {    "id": "string",    "provider": "string",    "display_name": "string",    "config": {},    "credentials_hint": {      "property1": "string",      "property2": "string"    },    "has_credentials": true,    "account_name": "string",    "status": "connected",    "last_checked_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "program_ids": [      "string"    ],    "link_count": 0,    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  },  "link_count": 0}
DELETE
/programs/{program_id}/lms-binding

Refused while courses of the Program are linked (lms.program_has_links): unlink them with lms.course.link.delete first. The connection itself stays.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

program_id*Program Id

Program id

Response Body

Successful Response

application/json
  1. response
program_id*Program Id
connection_id*string|null
connection*|null
link_count*Link Count

Courses of the Program linked through it

Example Request
curl -X DELETE 'https://example.com/programs/string/lms-binding'
Example Response
{  "program_id": "string",  "connection_id": "string",  "connection": {    "id": "string",    "provider": "string",    "display_name": "string",    "config": {},    "credentials_hint": {      "property1": "string",      "property2": "string"    },    "has_credentials": true,    "account_name": "string",    "status": "connected",    "last_checked_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "program_ids": [      "string"    ],    "link_count": 0,    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  },  "link_count": 0}
PUT
/programs/{program_id}/lms-binding

Refused while courses of the Program are linked (lms.program_has_links). Afterwards link courses with lms.course.link.set.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

program_id*Program Id

Program id

Request Body

application/json
  1. body
connection_id*Connection Id

Connection to bind (connection.id of lms.program.binding.get); the user adds connections in the settings

Length1 <= length <= 64

Response Body

Successful Response

application/json
  1. response
program_id*Program Id
connection_id*string|null
connection*|null
link_count*Link Count

Courses of the Program linked through it

Example Request
curl -X PUT 'https://example.com/programs/string/lms-binding' \  -H 'Content-Type: application/json' \  -d '{  "connection_id": "string"}'
Example Response
{  "program_id": "string",  "connection_id": "string",  "connection": {    "id": "string",    "provider": "string",    "display_name": "string",    "config": {},    "credentials_hint": {      "property1": "string",      "property2": "string"    },    "has_credentials": true,    "account_name": "string",    "status": "connected",    "last_checked_at": "2019-08-24T14:15:22Z",    "last_error_code": "string",    "program_ids": [      "string"    ],    "link_count": 0,    "created_at": "2019-08-24T14:15:22Z",    "updated_at": "2019-08-24T14:15:22Z"  },  "link_count": 0}
GET
/lms/providers

Features the provider lacks are not offered for its connections.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Response Body

Successful Response

application/json
  1. response
items*array<>
Example Request
curl -X GET 'https://example.com/lms/providers'
Example Response
{  "items": [    {      "kind": "string",      "display_name": "string",      "features": [        "courses"      ],      "config_schema": {},      "credentials_schema": {},      "sign_in": false    }  ]}
GET
/courses/{course_id}/lms/quizzes

Due, unlock and lock dates, points and question count by default; ask for more with fields. A quiz's score and attempts come with lms.assignment.list (its assignment_id); questions are not available.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse
fields?array<>|

Agent/MCP only: return just these fields of each item (and its external_id); default all but web_url and html. markdown (or html) is the body, as Markdown

Response Body

Successful Response

application/json
  1. response
items*array<>
truncated*Truncated
Example Request
curl -X GET 'https://example.com/courses/string/lms/quizzes'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "title": "string",      "html": "string",      "due_at": "2019-08-24T14:15:22Z",      "unlock_at": "2019-08-24T14:15:22Z",      "lock_at": "2019-08-24T14:15:22Z",      "points": 0,      "question_count": 0,      "time_limit": 0,      "allowed_attempts": 0,      "locked": false,      "lock_explanation": "string",      "assignment_id": "string"    }  ],  "truncated": true}
GET
/courses/{course_id}/lms/assignments/{assignment_id}/submission

Score, attempts, the teacher's comments and the rubric scores (match rubric_scores.criterion_id with the assignment's rubric from lms.assignment.list).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

assignment_id*Assignment Id

External assignment id (external_id of lms.assignment.list)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response

The user's own submission of one assignment, with the teacher's feedback.

external_id*External Id
web_url?|

Opens the item on the platform

raw_kind?|

The platform's own type (debugging)

assignment_id*Assignment Id
state?string|null
submitted_at?|null
graded_at?|null
score?number|null
grade?string|null
attempt?integer|null
late?Late
Defaultfalse
missing?Missing
Defaultfalse
comments?array<>
rubric_scores?array<>
Example Request
curl -X GET 'https://example.com/courses/string/lms/assignments/string/submission'
Example Response
{  "external_id": "string",  "web_url": "string",  "raw_kind": "string",  "assignment_id": "string",  "state": "string",  "submitted_at": "2019-08-24T14:15:22Z",  "graded_at": "2019-08-24T14:15:22Z",  "score": 0,  "grade": "string",  "attempt": 0,  "late": false,  "missing": false,  "comments": [    {      "author": "string",      "comment": "",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "rubric_scores": [    {      "criterion_id": "string",      "points": 0,      "rating_id": "string",      "comments": "string"    }  ]}
GET
/courses/{course_id}/lms/syllabus

To extract its grading scheme use lms.syllabus.import.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id (must be linked)

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
html?string|null
web_url?string|null
Example Request
curl -X GET 'https://example.com/courses/string/lms/syllabus'
Example Response
{  "html": "string",  "web_url": "string"}
POST
/courses/{course_id}/lms/imports:syllabus

Starts an AI extraction the user reviews; needs an AI model. Then wait for it and commit it like any import (imports.session.get, imports.session.commit).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

course_id*Course Id

Course id

Response Body

Successful Response

application/json
  1. response
session_id*Session Id
program_id*Program Id
count*Count

Items in the import

committed?Committed

Saved at once (nothing needed a decision); otherwise it waits for review

Defaultfalse
failed?Failed

Items that could not be saved, when committed (see the import)

Default0
Example Request
curl -X POST 'https://example.com/courses/string/lms/imports:syllabus'
Example Response
{  "session_id": "string",  "program_id": "string",  "count": 0,  "committed": false,  "failed": 0}
GET
/terms/{term_id}/lms/announcements

One request per connection (the term board's card); each item names its course_id. Not for agents: they read one course with lms.announcement.list.

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

term_id*Term Id

Term id

Query Parameters

refresh?Refresh

Skip the 5-minute cache and ask again

Defaultfalse

Response Body

Successful Response

application/json
  1. response
items*array<>

Newest first

linked_course_ids*array<string>

The term's courses linked to an LMS

truncated*Truncated
Example Request
curl -X GET 'https://example.com/terms/string/lms/announcements'
Example Response
{  "items": [    {      "external_id": "string",      "web_url": "string",      "raw_kind": "string",      "external_course_id": "",      "title": "string",      "html": "string",      "author": "string",      "posted_at": "2019-08-24T14:15:22Z",      "updated_at": "2019-08-24T14:15:22Z",      "unread": false,      "course_id": "string"    }  ],  "linked_course_ids": [    "string"  ],  "truncated": true}
GET
/terms/{term_id}/lms/new-assignments

From the cached lists, per course (the "today" page's prompt). Not for agents: they read one course with lms.assignment.list (new_ids).

Authorization

cookiesemestra_session<token>

Set by the sign-in endpoints for the web app. Requests other than GET, HEAD and OPTIONS also need the X-Semestra-CSRF header set to the semestra_csrf cookie.

Path Parameters

term_id*Term Id

Term id

Response Body

Successful Response

application/json
  1. response
items*array<>

Per linked course with new assignments

total*Total
unread?array<string>

Synced linked courses whose assignments are not cached: read them with lms.assignment.list (its new_ids)

Example Request
curl -X GET 'https://example.com/terms/string/lms/new-assignments'
Example Response
{  "items": [    {      "course_id": "string",      "external_ids": [        "string"      ],      "names": [        "string"      ]    }  ],  "total": 0,  "unread": [    "string"  ]}