For Developers

Canvas API Scopes

It is acceptable to enable scopes on the Canvas developer key used with an Edlink integration. Some institutions may even require this as a matter of security policy. However, Canvas' current behavior imposes trade-offs that limit recommending scoped keys broadly.

There are two primary reasons, one technical and one operational:

Enabling scopes disables the Canvas GraphQL API

When scopes are enabled on a Canvas developer key, the GraphQL API is effectively unavailable for that key. The underlying reason is not publicly documented. Edlink relies on GraphQL for most rostering operations because it reduces API traffic and allows retrieval of compound objects in a single request (e.g., course + sections + enrollments) instead of multiple requests.

Scope management is error-prone and hard to maintain at scale

Canvas exposes a large number of highly granular scopes tied to specific REST API endpoints. This makes configuration easy to misapply and complicates future changes (e.g., switching to improved endpoints) because each institution must update its scopes. Edlink supports approximately a thousand Canvas instances; coordinating per-instance scope adjustments is not feasible at this scale.

Fallback behavior

Edlink provides REST API fallbacks for all GraphQL queries it uses. While REST API requests are slower and generate more API traffic, they ultimately produce the same results.

If you have decided to go with an explicit list of scopes, you must:

  1. Enable the "Enforce Scopes" toggle in the Canvas "Key Settings" page.
  2. Check the "Allow Include Parameters" box.

Then, we recommend checking the "Read only (get)" checkbox. However if you cannot do so, the list of GET urls we ask that you allow is:

SectionURL
Assignmentsurl:GET|/api/v1/courses/:course_id/assignments/:assignment_id/overrides
Assignmentsurl:GET|/api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Assignmentsurl:GET|/api/v1/sections/:course_section_id/assignments/:assignment_id/override
Assignmentsurl:GET|/api/v1/groups/:group_id/assignments/:assignment_id/override
Assignmentsurl:GET|/api/v1/courses/:course_id/assignments/overrides
Assignmentsurl:GET|/api/v1/courses/:course_id/assignments
Assignmentsurl:GET|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id/assignments
Assignmentsurl:GET|/api/v1/users/:user_id/courses/:course_id/assignments
Assignmentsurl:GET|/api/v1/courses/:course_id/assignments/:id
Assignment Groupsurl:GET|/api/v1/courses/:course_id/assignment_groups
Assignment Groupsurl:GET|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Grading Periodsurl:GET|/api/v1/courses/:course_id/grading_periods
Grading Periodsurl:GET|/api/v1/courses/:course_id/grading_periods/:id
Modulesurl:GET|/api/v1/courses/:course_id/modules
Modulesurl:GET|/api/v1/courses/:course_id/modules/:id
Modulesurl:GET|/api/v1/courses/:course_id/modules/:module_id/items
Modulesurl:GET|/api/v1/courses/:course_id/modules/:module_id/items/:id
Modulesurl:GET|/api/v1/courses/:course_id/module_item_sequence
Submissionsurl:GET|/api/v1/courses/:course_id/assignments/gradeable_students
Submissionsurl:GET|/api/v1/courses/:course_id/assignments/:assignment_id/submissions
Submissionsurl:GET|/api/v1/courses/:course_id/students/submissions
Submissionsurl:GET|/api/v1/courses/:course_id/assignments/:assignment_id/submissions/:user_id
Submissionsurl:GET|/api/v1/sections/:section_id/assignments/:assignment_id/submissions
Submissionsurl:GET|/api/v1/sections/:section_id/students/submissions
Submissionsurl:GET|/api/v1/sections/:section_id/assignments/:assignment_id/submissions/:user_id
Enrollmentsurl:GET|/api/v1/courses/:course_id/enrollments
Enrollmentsurl:GET|/api/v1/sections/:section_id/enrollments
Enrollmentsurl:GET|/api/v1/users/:user_id/enrollments
Enrollmentsurl:GET|/api/v1/accounts/:account_id/enrollments/:id
Sectionsurl:GET|/api/v1/courses/:course_id/sections
Sectionsurl:GET|/api/v1/courses/:course_id/sections/:id
Sectionsurl:GET|/api/v1/sections/:id
Coursesurl:GET|/api/v1/courses
Coursesurl:GET|/api/v1/courses/:id
Coursesurl:GET|/api/v1/courses/:course_id/students
Coursesurl:GET|/api/v1/courses/:course_id/users
Coursesurl:GET|/api/v1/courses/:course_id/users/:id
Coursesurl:GET|/api/v1/users/:user_id/courses
Coursesurl:GET|/api/v1/accounts/:account_id/courses/:id
Accountsurl:GET|/api/v1/accounts
Accountsurl:GET|/api/v1/accounts/:id
Accountsurl:GET|/api/v1/accounts/:account_id/courses
Accountsurl:GET|/api/v1/accounts/:account_id/sub_accounts
Usersurl:GET|/api/v1/accounts/:account_id/users
Usersurl:GET|/api/v1/users/:id
Usersurl:GET|/api/v1/users/:user_id/profile
Enrollment Termsurl:GET|/api/v1/accounts/:account_id/terms
Enrollment Termsurl:GET|/api/v1/accounts/:account_id/terms/:id

Additionally we ask for some Write URL permissions in order to enable full platform functionality:

SectionURL
Assignmentsurl:POST|/api/v1/courses/:course_id/assignments
Assignmentsurl:PUT|/api/v1/courses/:course_id/assignments/:id
Assignmentsurl:DELETE|/api/v1/courses/:course_id/assignments/:id
Assignment Extensionsurl:POST|/api/v1/courses/:course_id/assignments/:assignment_id/extensions
Submissionsurl:POST|/api/v1/courses/:course_id/assignments/:assignment_id/submissions
Submissionsurl:PUT|/api/v1/courses/:course_id/assignments/:assignment_id/submissions/:user_id
Modulesurl:PUT|/api/v1/courses/:course_id/modules/:id
Modulesurl:POST|/api/v1/courses/:course_id/modules
Modulesurl:DELETE|/api/v1/courses/:course_id/modules/:id
Assignment Groupsurl:POST|/api/v1/courses/:course_id/assignment_groups
Assignment Groupsurl:PUT|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Assignment Groupsurl:DELETE|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Sectionsurl:POST|/api/v1/courses/:course_id/sections
Sectionsurl:PUT|/api/v1/setions/:id
Sectionsurl:DELETE|/api/v1/setions/:id
Coursesurl:PUT|/api/v1/courses/:id
Coursesurl:POST|/api/v1/accounts/:account_id/courses
Enrollmentsurl:POST|/api/v1/sections/:section_id/enrollments
Enrollmentsurl:DELETE|/api/v1/courses/:course_id/enrollments/:id
Quiz Submission Filesurl:POST|/api/v1/courses/:course_id/quizzes/:quiz_id/submissions/self/files
Pagesurl:PUT|/api/v1/courses/:course_id/pages/:url_or_id
Pagesurl:POST|/api/v1/courses/:course_id/pages
Pagesurl:DELETE|/api/v1/courses/:course_id/pages/:url_or_id
Usersurl:POST|/api/v1/accounts/:account_id/users
Usersurl:PUT|/api/v1/users/:id
Rubricsurl:PUT|/api/v1/courses/:course_id/rubrics/:id
Enrollment Termsurl:POST|/api/v1/accounts/:account_id/terms
Enrollment Termsurl:PUT|/api/v1/accounts/:account_id/terms/:id
Enrollment Termsurl:DELETE|/api/v1/accounts/:account_id/terms/:id