Canvas Courses API

The Courses resource of the Canvas LMS REST API — 31 operations covering course creation, settings, users and enrollment counts, course copy, blueprint associations, effective due dates, bulk course updates, conclude/delete and course reset. Split from the first-party contract Instructure publishes at https://canvas.instructure.com/doc/api/courses.json.

Operations 31

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

POST /v1/accounts/{account_id}/courses Create a new course in an account · Create a new course #
Ask an LLM
“How do I create a new course in a Canvas sub-account?”
“Can I set a course code, start date and end date when I first create a course?”
Tell an agent
Create a course named {name} with code {course_code} in account {account_id}.
Set up a new course {name} in account {account_id} running from {start_at} to {end_at}.
PUT /v1/accounts/{account_id}/courses Bulk offer, conclude or delete courses · Update courses #
Ask an LLM
“Can I conclude a whole batch of courses in an account at once?”
“What's the maximum number of courses I can publish in one bulk call?”
Tell an agent destructive · confirm first
Apply the {event} action to courses {course_ids} in account {account_id}.
Bulk offer courses {course_ids} to students in account {account_id} with event {event}.
GET /v1/courses List my active courses · List your courses #
Ask an LLM
“Which courses am I currently enrolled in?”
“Can I see only the courses where I'm the teacher?”
Tell an agent
List all my active courses.
Show my courses where my enrollment type is {enrollment_type}.
GET /v1/users/{user_id}/courses List courses for a specific user · List courses for a user #
Ask an LLM
“What courses is a particular student taking?”
“Can an observer see the course list of the student they observe?”
Tell an agent
List the active courses for user {user_id}.
Show user {user_id}'s courses in account {account_id}.
GET /v1/courses/{course_id}/users/{user_id}/progress Get one user's progress in a course · Get user progress #
Ask an LLM
“How far along is a single student in completing a course's requirements?”
“Can I check my own module completion progress in a course?”
Tell an agent
Get the course progress of user {user_id} in course {course_id}.
Show my own progress in course {course_id} using user {user_id} set to self.
POST /v1/courses/{course_id}/files Start a file upload to a course · Upload a file #
Ask an LLM
“How do I upload a file into a course's files area?”
“What's the first step of the file upload workflow for course files?”
Tell an agent
Start uploading a file to course {course_id}.
Request an upload slot for a new file in course {course_id}'s files.
GET /v1/courses/{course_id}/students List students via the deprecated endpoint · List students #
Ask an LLM
“Is there an older endpoint that just returns the students of a course?”
“What does the deprecated list students call return for a course?”
Tell an agent
List students in course {course_id} using the deprecated students endpoint.
Pull the legacy student roster for course {course_id}.
GET /v1/courses/{course_id}/users List users in a course · List users in course #
Ask an LLM
“Who is enrolled in a course, including teachers and TAs?”
“Can I filter a course's people list to just students in certain sections?”
Tell an agent
List all users in course {course_id}.
List users in course {course_id} with enrollment type {enrollment_type}.
GET /v1/courses/{course_id}/search_users Search users in a course by name · List users in course #
Ask an LLM
“Can I search a course roster by a partial name or login?”
“What's the search_users route for finding a person inside a course?”
Tell an agent
Search course {course_id} for users matching {search_term} via the search_users route.
Use search_users to find {enrollment_type} users in course {course_id}.
GET /v1/courses/{course_id}/recent_students List students by most recent login · List recently logged in students #
Ask an LLM
“Which students in my course logged in most recently?”
“Can I see each student's last login time for a course?”
Tell an agent
List students in course {course_id} ordered by last login.
Show who logged into course {course_id} most recently.
GET /v1/courses/{course_id}/users/{id} Get one user within a course · Get single user #
Ask an LLM
“Can I fetch a single person's details as they appear in a specific course?”
“What information do I get for one user in a course's context?”
Tell an agent
Get user {id} in course {course_id}.
Show the course-level profile of user {id} in course {course_id}.
GET /v1/courses/{course_id}/content_share_users Find users to share course content with · Search for content share users #
Ask an LLM
“Who can I share course content with in Canvas?”
“Which colleagues show up when I search to send a content share?”
Tell an agent
Search for content share recipients matching {search_term} in course {course_id}.
Find people named {search_term} I can share content with from course {course_id}.
POST /v1/courses/{course_id}/preview_html Preview processed HTML for a course · Preview processed html #
Ask an LLM
“Can I see how a chunk of HTML will render after a course processes it?”
“How will course link processing change my HTML before I save it?”
Tell an agent
Preview how {html} renders in course {course_id}.
Process this HTML through course {course_id} and show the result: {html}
GET /v1/courses/{course_id}/activity_stream Show my activity stream for a course · Course activity stream #
Ask an LLM
“What's new for me in a specific course's activity stream?”
“Can I see recent announcements and discussions for just one course?”
Tell an agent
Show my activity stream for course {course_id}.
List my recent course activity in {course_id}.
GET /v1/courses/{course_id}/activity_stream/summary Summarize my course activity stream · Course activity stream summary #
Ask an LLM
“How many unread activity items do I have in one course, by type?”
“Is there a summary count of my course stream instead of the full feed?”
Tell an agent
Summarize my activity stream counts for course {course_id}.
Give me unread activity totals for course {course_id}.
GET /v1/courses/{course_id}/todo List my to-do items for a course · Course TODO items #
Ask an LLM
“What do I still need to grade or submit in a particular course?”
“Which to-do items are waiting for me in one course?”
Tell an agent
List my to-do items for course {course_id}.
Show what's pending on my course {course_id} to-do list.
DELETE /v1/courses/{id} Delete or conclude a course · Delete/Conclude a course #
Ask an LLM
“How do I permanently delete a single course?”
“Can I conclude one course instead of deleting it?”
Tell an agent destructive · confirm first
Delete course {id} with event {event}.
Conclude course {id} by sending event {event}.
GET /v1/courses/{id} Get a single course · Get a single course #
Ask an LLM
“How do I look up a course's details by its ID?”
“Can I include the syllabus and term when fetching one course?”
Tell an agent
Get course {id}.
Show course {id} including {include}.
PUT /v1/courses/{id} Update a course's details · Update a course #
Ask an LLM
“Can I rename a course or change its course code after it's created?”
“How do I change a course's end date or time zone?”
Tell an agent
Rename course {id} to {name}.
Change course {id} to end on {end_at}.
GET /v1/courses/{course_id}/settings Get a course's settings · Get course settings #
Ask an LLM
“What settings does a course have, like whether students can create discussions?”
“Are final grades hidden from students in this course's settings?”
Tell an agent
Get the settings for course {course_id}.
Show whether course {course_id} lets students organize their own groups.
PUT /v1/courses/{course_id}/settings Change a course's settings · Update course settings #
Ask an LLM
“Can I stop students from attaching files to discussion posts?”
“How do I lock all announcements in a course?”
Tell an agent
Set allow student discussion topics to {allow_student_discussion_topics} in course {course_id}.
Set the default due time in course {course_id} to {default_due_time}.
GET /v1/courses/{course_id}/student_view_student Get or create a course's test student · Return test student for course #
Ask an LLM
“Is there a test student I can use to preview a course as a student?”
“Where do I get the student view test account for a course?”
Tell an agent
Get the test student for course {course_id}.
Fetch the student view test user in course {course_id}, creating it if needed.
GET /v1/accounts/{account_id}/courses/{id} Get a course within a specific account · Get a single course #
Ask an LLM
“Can I fetch a course by ID scoped to the account that owns it?”
“What does the account-scoped lookup return for one course?”
Tell an agent
Get course {id} in account {account_id}.
Look up course {id} through account {account_id} including {include}.
POST /v1/courses/{course_id}/reset_content Reset a course to empty content · Reset a course #
Ask an LLM
“Can I wipe all content from a course but keep its sections and enrolled users?”
“What happens when I reset course content?”
Tell an agent destructive · confirm first
Reset course {course_id} so it has no content.
Wipe the content of course {course_id} and keep its users and sections.
GET /v1/courses/{course_id}/effective_due_dates Get each student's effective due dates · Get effective due dates #
Ask an LLM
“What due date does each student actually have for assignments, after overrides?”
“Can I check effective due dates for only a few assignments?”
Tell an agent
Get effective due dates for all assignments in course {course_id}.
Show per-student due dates for assignments {assignment_ids} in course {course_id}.
GET /v1/courses/{course_id}/permissions Check my permissions in a course · Permissions #
Ask an LLM
“Do I have permission to manage grades in this course?”
“Which course-level rights does my account hold?”
Tell an agent
Check my permissions in course {course_id}.
Tell me whether I have {permissions} in course {course_id}.
GET /v1/courses/{course_id}/bulk_user_progress Get progress for every user in a course · Get bulk user progress #
Ask an LLM
“Can I see module completion progress for all students in a course at once?”
“As a teacher, how do I pull everyone's course progress in a single call?”
Tell an agent
Get progress for all users in course {course_id}.
Show the bulk completion progress of everyone enrolled in course {course_id}.
POST /v1/courses/{id}/dismiss_migration_limitation_message Dismiss the quiz migration alert · Remove quiz migration alert #
Ask an LLM
“How do I hide the quiz migration limitations banner in a course?”
“Can I dismiss the warning about quiz migration limits?”
Tell an agent
Dismiss the quiz migration alert in course {id}.
Remove the quiz migration limitation message from course {id}.
POST /v1/courses/{course_id}/restore/{version_id} Restore a previous syllabus version · Restore course syllabus version #
Ask an LLM
“Can I roll the syllabus back to an earlier saved version?”
“Does restoring an old syllabus affect any other course content?”
Tell an agent
Restore the syllabus of course {course_id} to version {version_id}.
Roll back course {course_id}'s syllabus to saved version {version_id}.
GET /v1/courses/{course_id}/course_copy/{id} Check a legacy course copy's status · Get course copy status #
Ask an LLM
“How do I see whether a course copy started with the old copy API has finished?”
“What's the status of a deprecated course copy job?”
Tell an agent
Check the status of course copy {id} into course {course_id}.
Show progress of legacy course copy {id} for course {course_id}.
POST /v1/courses/{course_id}/course_copy Copy content between courses (legacy) · Copy course content #
Ask an LLM
“Can I copy all the content of one course into another?”
“Is there a way to copy only some content types from a source course?”
Tell an agent
Copy all content from course {source_course} into course {course_id}.
Copy only {only} from course {source_course} into course {course_id}.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/canvas:canvas-courses-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

canvas-courses-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Canvas LMS REST Courses API
  version: v1
  summary: The complete Canvas LMS REST API, converted from the Swagger 1.2 documents Instructure publishes under https://canvas.instructure.com/doc/api/.
  description: The Canvas LMS REST API covers courses, assignments, quizzes, grades, users, enrollments, accounts, files, modules, rubrics, submissions, SIS imports, LTI, analytics and account administration.
  contact:
    name: Instructure Canvas
    url: https://canvas.instructure.com/doc/api/
  license:
    name: AGPL-3.0
    url: https://github.com/instructure/canvas-lms/blob/master/LICENSE
servers:
- url: https://canvas.instructure.com/api
  description: Instructure-hosted Canvas (canvas.instructure.com)
- url: https://{canvas_host}/api
  description: Any Canvas instance; Canvas is multi-tenant and self-hostable, so the host is the institution's Canvas domain.
  variables:
    canvas_host:
      default: canvas.instructure.com
      description: Your institution's Canvas hostname, e.g. school.instructure.com
security:
- bearerAuth: []
- oauth2: []
tags:


# --- truncated at 32 KB (125 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/canvas/refs/heads/main/openapi/canvas-courses-api-openapi.yml