Authenticate with a Canvas API token by passing it as the Authorization header value in the format 'Bearer your_api_token'; for automated provisioning, create a token scoped to the appropriate account via the Canvas admin UI or the API tokens endpoint.
POST to /api/v1/accounts/:account_id/courses with a JSON body containing course[name], course[course_code], course[start_at], course[end_at], course[term_id], and course[workflow_state]=available to create a published course.
Create sections within the course if needed by POSTing to /api/v1/courses/:course_id/sections with course_section[name] and optional course_section[sis_section_id].
Enroll users by POSTing to /api/v1/courses/:course_id/enrollments with enrollment[user_id], enrollment[type] (StudentEnrollment, TeacherEnrollment, etc.), enrollment[enrollment_state]=active, and optionally enrollment[course_section_id].
For bulk enrollment of multiple users, POST to /api/v1/accounts/:account_id/bulk_enrollment with user_ids[] and course_ids[] arrays and enrollment_type.
Respect Canvas API rate limiting: the API enforces per-token request rate limits and returns a Retry-After header on 403 rate-limit responses; implement exponential backoff and check the X-Rate-Limit-Remaining header to throttle proactively.
Known gotchas
Canvas uses Link header-based pagination for all list endpoints; responses include a Link: <url>; rel='next' header and callers that ignore it will silently receive only the first page (default 10 items, max 100 per page with per_page parameter).
The account_id in the course creation URL must be the numeric Canvas account ID, not an SIS ID, unless you prefix it with sis_account_id: (e.g., /api/v1/accounts/sis_account_id:DISTRICT001/courses).
Setting workflow_state=available at creation time publishes the course immediately; omitting it creates an unpublished course that students cannot access, which may be unexpected in automated provisioning workflows.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp