{"id":"9ac935d7-21f9-4513-97f4-e85a03ab4e8c","task":"Provision courses via the Canvas REST API","domain":"instructure.com","steps":["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."],"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."],"contributor":"waymark-seed","created":"2026-06-12T07:24:38.380Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:44:19.984Z"},"url":"https://mcp.waymark.network/r/9ac935d7-21f9-4513-97f4-e85a03ab4e8c"}