Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.1.0
info:
title: Canvas LMS Courses API
version: v1
summary: The Courses resource of the Canvas LMS REST API, converted from the first-party Swagger 1.2 document Instructure publishes at https://canvas.instructure.com/doc/api/courses.json.
description: |-
Courses, course settings, course users, enrollment counts, course copy, blueprint associations, effective due dates, bulk course updates and course deletion.
PROVENANCE: mechanically converted from https://canvas.instructure.com/doc/api/courses.json (Swagger 1.2, first-party, fetched 2026-09-05, HTTP 200). The verbatim harvest is at openapi/_original/swagger-1.2/courses.json. Supersedes a hand-authored 25-operation subset now quarantined at openapi/_scaffold/canvas-openapi-scaffold.yml.
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
externalDocs:
description: Canvas LMS REST API Documentation
url: https://canvas.instructure.com/doc/api/
x-generated-from: https://canvas.instructure.com/doc/api/courses.json
x-provenance:
method: derived
derived_by: API Evangelist enrichment pipeline (Swagger 1.2 -> OpenAPI 3.1 conversion)
source: openapi/_original/swagger-1.2/courses.json
source_url: https://canvas.instructure.com/doc/api/courses.json
fetched: '2026-09-05'
http_status: 200
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:
- name: Courses
x-resource: courses
externalDocs:
url: https://canvas.instructure.com/doc/api/courses.html
paths:
/v1/accounts/{account_id}/courses:
post:
tags:
- Courses
operationId: create_new_course
summary: Create a new course
description: Create a new course
parameters:
- name: account_id
in: path
schema:
type: string
required: true
description: ID
requestBody:
required: false
content:
application/json:
schema: &id001
type: object
properties:
course[name]:
type: string
description: |-
The name of the course. If omitted, the course will be named "Unnamed
Course."
course[course_code]:
type: string
description: The course code for the course.
course[start_at]:
type: string
format: date-time
description: |-
Course start date in ISO8601 format, e.g. 2011-01-01T01:00Z
This value is ignored unless 'restrict_enrollments_to_course_dates' is set to true.
course[end_at]:
type: string
format: date-time
description: |-
Course end date in ISO8601 format. e.g. 2011-01-01T01:00Z
This value is ignored unless 'restrict_enrollments_to_course_dates' is set to true.
course[license]:
type: string
description: |-
The name of the licensing. Should be one of the following abbreviations
(a descriptive name is included in parenthesis for reference):
- 'private' (Private Copyrighted)
- 'cc_by_nc_nd' (CC Attribution Non-Commercial No Derivatives)
- 'cc_by_nc_sa' (CC Attribution Non-Commercial Share Alike)
- 'cc_by_nc' (CC Attribution Non-Commercial)
- 'cc_by_nd' (CC Attribution No Derivatives)
- 'cc_by_sa' (CC Attribution Share Alike)
- 'cc_by' (CC Attribution)
- 'public_domain' (Public Domain).
course[is_public]:
type: boolean
description: Set to true if course is public to both authenticated and unauthenticated users.
course[is_public_to_auth_users]:
type: boolean
description: Set to true if course is public only to authenticated users.
course[public_syllabus]:
type: boolean
description: Set to true to make the course syllabus public.
course[public_syllabus_to_auth]:
type: boolean
description: Set to true to make the course syllabus public for authenticated users.
course[public_description]:
type: string
description: A publicly visible description of the course.
course[allow_student_wiki_edits]:
type: boolean
description: If true, students will be able to modify the course wiki.
course[allow_wiki_comments]:
type: boolean
description: If true, course members will be able to comment on wiki pages.
course[allow_student_forum_attachments]:
type: boolean
description: If true, students can attach files to forum posts.
course[open_enrollment]:
type: boolean
description: Set to true if the course is open enrollment.
course[self_enrollment]:
type: boolean
description: Set to true if the course is self enrollment.
course[restrict_enrollments_to_course_dates]:
type: boolean
description: |-
Set to true to restrict user enrollments to the start and end dates of the
course. This value must be set to true
in order to specify a course start date and/or end date.
course[term_id]:
type: string
description: The unique ID of the term to create to course in.
course[sis_course_id]:
type: string
description: The unique SIS identifier.
course[integration_id]:
type: string
description: The unique Integration identifier.
course[hide_final_grades]:
type: boolean
description: |-
If this option is set to true, the totals in student grades summary will
be hidden.
course[apply_assignment_group_weights]:
type: boolean
description: Set to true to weight final grade based on assignment groups percentages.
course[time_zone]:
type: string
description: |-
The time zone for the course. Allowed time zones are
{http://www.iana.org/time-zones IANA time zones} or friendlier
{http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html Ruby on Rails time zones}.
offer:
type: boolean
description: |-
If this option is set to true, the course will be available to students
immediately.
enroll_me:
type: boolean
description: Set to true to enroll the current user as the teacher.
skip_course_template:
type: boolean
description: |-
If this option is set to true, the template of the account will not be applied to this course
It means copy_from_course_template will not be executed. This option is thought for a course copy.
course[default_view]:
type: string
enum:
- feed
- wiki
- modules
- syllabus
- assignments
description: |-
The type of page that users will see when they first visit the course
* 'feed' Recent Activity Dashboard
* 'modules' Course Modules/Sections Page
* 'assignments' Course Assignments List
* 'syllabus' Course Syllabus Page
other types may be added in the future
course[syllabus_body]:
type: string
description: The syllabus body for the course
course[grading_standard_id]:
type: integer
format: int64
description: The grading standard id to set for the course. If no value is provided for this argument the current grading_standard will be un-set from this course.
course[grade_passback_setting]:
type: string
description: Optional. The grade_passback_setting for the course. Only 'nightly_sync', 'disabled', and '' are allowed
course[course_format]:
type: string
description: Optional. Specifies the format of the course. (Should be 'on_campus', 'online', or 'blended')
course[post_manually]:
type: boolean
description: |-
Default is false.
When true, all grades in the course must be posted manually, and will not be automatically posted.
When false, all grades in the course will be automatically posted.
enable_sis_reactivation:
type: boolean
description: When true, will first try to re-activate a deleted course with matching sis_course_id if possible.
application/x-www-form-urlencoded:
schema: *id001
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Course'
externalDocs:
url: https://canvas.instructure.com/doc/api/courses.html
put:
tags:
- Courses
operationId: update_courses
summary: Update courses
description: |-
Update multiple courses in an account. Operates asynchronously; use the {api:ProgressController#show progress endpoint}
to query the status of an operation.
parameters:
- name: account_id
in: path
schema:
type: string
required: true
description: ID
requestBody:
required: false
content:
application/json:
schema: &id002
type: object
properties:
course_ids:
type: array
items:
type: string
description: List of ids of courses to update. At most 500 courses may be updated in one call.
event:
type: string
enum:
- offer
- conclude
- delete
- undelete
description: |-
The action to take on each course. Must be one of 'offer', 'conclude', 'delete', or 'undelete'.
* 'offer' makes a course visible to students. This action is also called "publish" on the web site.
* 'conclude' prevents future enrollments and makes a course read-only for all participants. The course still appears
in prior-enrollment lists.
* 'delete' completely removes the course from the web site (including course menus and prior-enrollment lists).
All enrollments are deleted. Course content may be physically deleted at a future date.
* 'undelete' attempts to recover a course that has been deleted. (Recovery is not guaranteed; please conclude
rather than delete a course if there is any possibility the course will be used again.) The recovered course
will be unpublished. Deleted enrollments will not be recovered.
required:
- course_ids
- event
application/x-www-form-urlencoded:
schema: *id002
responses:
'200':
description: Success
content:
application/json:
schema:
type: string
x-canvas-declared-type: Progress
externalDocs:
url: https://canvas.instructure.com/doc/api/courses.html
/v1/courses:
get:
tags:
- Courses
operationId: list_your_courses
summary: List your courses
description: Returns the paginated list of active courses for the current user.
parameters:
- name: enrollment_type
in: query
schema:
type: string
enum:
- teacher
- student
- ta
- observer
- designer
required: false
description: |-
When set, only return courses where the user is enrolled as this type. For
example, set to "teacher" to return only courses where the user is
enrolled as a Teacher. This argument is ignored if enrollment_role is given.
- name: enrollment_role
in: query
schema:
type: string
required: false
description: |-
Deprecated
When set, only return courses where the user is enrolled with the specified
course-level role. This can be a role created with the
{api:RoleOverridesController#add_role Add Role API} or a base role type of
'StudentEnrollment', 'TeacherEnrollment', 'TaEnrollment', 'ObserverEnrollment',
or 'DesignerEnrollment'.
- name: enrollment_role_id
in: query
schema:
type: integer
format: int64
required: false
description: |-
When set, only return courses where the user is enrolled with the specified
course-level role. This can be a role created with the
{api:RoleOverridesController#add_role Add Role API} or a built_in role type of
'StudentEnrollment', 'TeacherEnrollment', 'TaEnrollment', 'ObserverEnrollment',
or 'DesignerEnrollment'.
- name: enrollment_state
in: query
schema:
type: string
enum:
- active
- invited_or_pending
- completed
required: false
description: |-
When set, only return courses where the user has an enrollment with the given state.
This will respect section/course/term date overrides.
- name: exclude_blueprint_courses
in: query
schema:
type: boolean
required: false
description: When set, only return courses that are not configured as blueprint courses.
- name: include
in: query
schema:
type: array
items:
type: string
enum:
- needs_grading_count
- syllabus_body
- syllabus_versions
- public_description
- total_scores
- current_grading_period_scores
- grading_periods
- term
- account
- course_progress
- sections
- storage_quota_used_mb
- total_students
- passback_status
- favorites
- teachers
- observed_users
- course_image
- banner_image
- concluded
- post_manually
required: false
description: |-
- "needs_grading_count": Optional information to include with each Course.
When needs_grading_count is given, and the current user has grading
rights, the total number of submissions needing grading for all
assignments is returned.
- "syllabus_body": Optional information to include with each Course.
When syllabus_body is given the user-generated html for the course
syllabus is returned.
- "public_description": Optional information to include with each Course.
When public_description is given the user-generated text for the course
public description is returned.
- "total_scores": Optional information to include with each Course.
When total_scores is given, any student enrollments will also
include the fields 'computed_current_score', 'computed_final_score',
'computed_current_grade', and 'computed_final_grade', as well as (if
the user has permission) 'unposted_current_score',
'unposted_final_score', 'unposted_current_grade', and
'unposted_final_grade' (see Enrollment documentation for more
information on these fields). This argument is ignored if the course is
configured to hide final grades.
- "current_grading_period_scores": Optional information to include with
each Course. When current_grading_period_scores is given and total_scores
is given, any student enrollments will also include the fields
'has_grading_periods',
'totals_for_all_grading_periods_option', 'current_grading_period_title',
'current_grading_period_id', current_period_computed_current_score',
'current_period_computed_final_score',
'current_period_computed_current_grade', and
'current_period_computed_final_grade', as well as (if the user has permission)
'current_period_unposted_current_score',
'current_period_unposted_final_score',
'current_period_unposted_current_grade', and
'current_period_unposted_final_grade' (see Enrollment documentation for
more information on these fields). In addition, when this argument is
passed, the course will have a 'has_grading_periods' attribute
on it. This argument is ignored if the total_scores argument is not
included. If the course is configured to hide final grades, the
following fields are not returned:
'totals_for_all_grading_periods_option',
'current_period_computed_current_score',
'current_period_computed_final_score',
'current_period_computed_current_grade',
'current_period_computed_final_grade',
'current_period_unposted_current_score',
'current_period_unposted_final_score',
'current_period_unposted_current_grade', and
'current_period_unposted_final_grade'
- "grading_periods": Optional information to include with each Course. When
grading_periods is given, a list of the grading periods associated with
each course is returned.
- "term": Optional information to include with each Course. When
term is given, the information for the enrollment term for each course
is returned.
- "account": Optional information to include with each Course. When
account is given, the account json for each course is returned.
- "course_progress": Optional information to include with each Course.
When course_progress is given, each course will include a
'course_progress' object with the fields: 'requirement_count', an integer
specifying the total number of requirements in the course,
'requirement_completed_count', an integer specifying the total number of
requirements in this course that have been completed, and
'next_requirement_url', a string url to the next requirement item, and
'completed_at', the date the course was completed (null if incomplete).
'next_requirement_url' will be null if all requirements have been
completed or the current module does not require sequential progress.
"course_progress" will return an error message if the course is not
module based or the user is not enrolled as a student in the course.
- "sections": Section enrollment information to include with each Course.
Returns an array of hashes containing the section ID (id), section name
(name), start and end dates (start_at, end_at), as well as the enrollment
type (enrollment_role, e.g. 'StudentEnrollment').
- "storage_quota_used_mb": The amount of storage space used by the files in this course
- "total_students": Optional information to include with each Course.
Returns an integer for the total amount of active and invited students.
- "passback_status": Include the grade passback_status
- "favorites": Optional information to include with each Course.
Indicates if the user has marked the course as a favorite course.
- "teachers": Teacher information to include with each Course.
Returns an array of hashes containing the {api:Users:UserDisplay UserDisplay} information
for each teacher in the course.
- "observed_users": Optional information to include with each Course.
Will include data for observed users if the current user has an
observer enrollment.
- "tabs": Optional information to include with each Course.
Will include the list of tabs configured for each course. See the
{api:TabsController#index List available tabs API} for more information.
- "course_image": Optional information to include with each Course. Returns course
image url if a course image has been set.
- "banner_image": Optional information to include with each Course. Returns course
banner image url if the course is a Canvas for Elementary subject and a banner
image has been set.
- "concluded": Optional information to include with each Course. Indicates whether
the course has been concluded, taking course and term dates into account.
- "post_manually": Optional information to include with each Course. Returns true if
the course post policy is set to Manually post grades. Returns false if the the course
post policy is set to Automatically post grades.
- "syllabus_versions": Optional information to include with each Course.
Returns recent saved versions of the syllabus body. Requires the
syllabus_versioning feature flag and permission to manage course
content. Version numbers can be passed to the Restore course
syllabus version API.
- name: state
in: query
schema:
type: array
items:
type: string
enum:
- unpublished
- available
- completed
- deleted
required: false
description: |-
If set, only return courses that are in the given state(s).
By default, "available" is returned for students and observers, and
anything except "deleted", for all other enrollment types
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Course'
externalDocs:
url: https://canvas.instructure.com/doc/api/courses.html
/v1/users/{user_id}/courses:
get:
tags:
- Courses
operationId: list_courses_for_user
summary: List courses for a user
description: Returns a paginated list of active courses for this user. To view the course list for a user other than yourself, you must be either an observer of that user or an administrator.
parameters:
- name: user_id
in: path
schema:
type: string
required: true
description: ID
- name: include
in: query
schema:
type: array
items:
type: string
enum:
- needs_grading_count
- syllabus_body
- syllabus_versions
- public_description
- total_scores
- current_grading_period_scores
- grading_periods
- term
- account
- course_progress
- sections
- storage_quota_used_mb
- total_students
- passback_status
- favorites
- teachers
- observed_users
- course_image
- banner_image
- concluded
- post_manually
required: false
description: |-
- "needs_grading_count": Optional information to include with each Course.
When needs_grading_count is given, and the current user has grading
rights, the total number of submissions needing grading for all
assignments is returned.
- "syllabus_body": Optional information to include with each Course.
When syllabus_body is given the user-generated html for the course
syllabus is returned.
- "public_description": Optional information to include with each Course.
When public_description is given the user-generated text for the course
public description is returned.
- "total_scores": Optional information to include with each Course.
When total_scores is given, any student enrollments will also
include the fields 'computed_current_score', 'computed_final_score',
'computed_current_grade', and 'computed_final_grade' (see Enrollment
documentation for more information on these fields). This argument
is ignored if the course is configured to hide final grades.
- "current_grading_period_scores": Optional information to include with
each Course. When current_grading_period_scores is given and total_scores
is given, any student enrollments will also include the fields
'has_grading_periods',
'totals_for_all_grading_periods_option', 'current_grading_period_title',
'current_grading_period_id', current_period_computed_current_score',
'current_period_computed_final_score',
'current_period_computed_current_grade', and
'current_period_computed_final_grade', as well as (if the user has permission)
'current_period_unposted_current_score',
'current_period_unposted_final_score',
'current_period_unposted_current_grade', and
'current_period_unposted_final_grade' (see Enrollment documentation for
more information on these fields). In addition, when this argument is
passed, the course will have a 'has_grading_periods' attribute
on it. This argument is ignored if the course is configured to hide final
grades or if the total_scores argument is not included.
- "grading_periods": Optional information to include with each Course. When
grading_periods is given, a list of the grading periods associated with
each course is returned.
- "term": Optional information to include with each Course. When
term is given, the information for the enrollment term for each course
is returned.
- "account": Optional information to include with each Course. When
account is given, the account json for each course is returned.
- "course_progress": Optional information to include with each Course.
When course_progress is given, each course will include a
'course_progress' object with the fields: 'requirement_count', an integer
specifying the total number of requirements in the course,
'requirement_completed_count', an integer specifying the total number of
requirements in this course that have been completed, and
'next_requirement_url', a string url to the next requirement item, and
'completed_at', the date the course was completed (null if incomplete).
'next_requirement_url' will be null if all requirements have been
completed or the current module does not require sequential progress.
"course_progress" will return an error message if the course is not
module based or the user is not enrolled as a student in the course.
- "sections": Section enrollment information to include with each Course.
Returns an array of hashes containing the section ID (id), section name
(name), start and end dates (start_at, end_at), as well as the enrollment
type (enrollment_role, e.g. 'StudentEnrollment').
- "storage_quota_used_mb": The amount of storage space used by the files in this course
- "total_students": Optional information to include with each Course.
Returns an integer for the total amount of active and invited students.
- "passback_status": Include the grade passback_status
- "favorites": Optional information to include with each Course.
Indicates if the user has marked the course as a favorite course.
- "teachers": Teacher information to include with each Course.
Returns an array of hashes containing the {api:Users:UserDisplay UserDisplay} information
for each teacher in the course.
- "observed_users": Optional information to include with each Course.
Will include data for observed users if the current user has an
observer enrollment.
- "tabs": Optional information to include with each Course.
Will include the list of tabs configured for each course. See the
{api:TabsController#index List available tabs API} for more information.
- "course_image": Optional information to include with each Course. Returns course
image url if a course image has been set.
- "banner_image": Optional information to include with each Course. Returns course
banner image url if the course is a Canvas for Elementary subject and a banner
image has been set.
- "concluded": Optional information to include with each Course. Indicates whether
the course has been concluded, taking course and term dates into account.
- "post_manually": Optional information to include with each Course. Returns true if
the course post policy is set to "Manually". Returns false if the the course post
policy is set to "Automatically".
- "syllabus_versions": Optional information to include with each Course.
Returns recent saved versions of the syllabus body. Requires the
syllabus_versioning feature flag and permission to manage course
content. Version numbers can be passed to the Restore course
syllabus version API.
- name: state
in: query
schema:
type: array
items:
type: string
enum:
- unpublished
- available
- completed
- deleted
required: false
description: |-
If set, only return courses that are in the given state(s).
By default, "available" is returned for students and observers, and
anything except "deleted", for all other enrollment types
- name: enrollment_state
in: query
schema:
type: string
enum:
- active
- invited_or_pending
- completed
required: false
description: |-
When set, only return courses where the user has an enrollment with the given state.
This will respect section/course/term date overrides.
- name: homeroom
# --- truncated at 32 KB (100 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/canvas/refs/heads/main/openapi/canvas-courses-api-openapi.yml