- Updated
RateLimitExceededexception to trigger on HTTP 429 instead of old 403. - Add a default User-Agent header
3.4.0 - 2025-11-10
- LTI Resource Links (Thanks, @jsmnhou)
- Smart Search API [BETA] (Thanks, @alportoricensis)
- New Quizzes Accommodations
- Added support for Python 3.12 and 3.13
- Dropped support for Python 3.7 and 3.8
- Updated deploy Action to use more modern processes.
- Updated
PaginatedListto be type-aware, showing which class is included in the response. (Thanks @HandcartCactus) - Updated Sphinx
- Reworked how
Requesterhandles JSON-only POST requests (currently, only New Quizzes Accommodations and GraphQL)
3.3.0 - 2023-08-27
- Added documentation for PaginatedList
- Rework requester URLs to accommodate graphql and new quizzes endpoints (Thanks, @bennettscience)
- Fixed PaginatedList not respecting new quizzes endpoints (Thanks, @jonespm)
- Updated codecov action
3.2.0 - 2023-05-25
- New Quizzes
- Delete Page in Groups (Thanks, @Caitlin-Fabian)
- Added support for pagination with metadata when headers are missing (Thanks, @bennettscience)
- Added support for Python 3.11
- Fixed an issue where
Course.create_discussion_topicwouldn't accept attachment files.
3.1.0 - 2023-04-21
- Account Calendars (Thanks, @dmols)
- List available account calendars
- Get a single account calendar
- Update a calendar's visibility
- Update many calendars' visibility
- List all account calendars
- Enrollments (Thanks, @svanderwulp)
- Accept Course Invitation
- Reject Course Invitation
- File (Thanks, @bennettscience)
- Update File
- JWTs (Thanks @dmols)
- Create JWTs
- Refresh JWTs
- Moderation Grading (Moderation Set)
- List students selected for moderation
- Select students for moderation
- Query Course Events (Thanks, @dmols)
- Query by course
- Query by account
- Rubrics (Thanks, @bennettscience)
- Create, Update, and Delete Rubric Assessments
- Create a Rubric Association
- Users
- Terminate all user sessions (Thanks, @lucas-salas)
- Updated Codecov action to v3
- Fixed an issue where kwargs were not passed along to Canvas in
Course.get_module(). (Thanks, @bennettscience) - Fixed an issue where not all functions allowed arbitrary keyword arguments. Added a test to detect and prevent this for the future.
- Fixed an issue with
Course.get_enabled_features()where it would throw an error trying to paginate. It now returns a list of strings directly. (Thanks, @bennettscience) - Added missing docs for
AssignmentOverride. (Thanks, @lafent) - Fixed a typo in
Canvas.create_calendar_event()where an error message improperly listed the missing key as 'context_codes' instead of 'context_code'. (Thanks, @dmols and @mikesuhan)
3.0.0 - 2022-09-21
- Delete a Rubric (Thanks, @ggarfink)
- Grade Change Log for Assignments, Courses, and Users (Thanks, @matthewf-ucsd)
- Content Migrations: List items for selective import (Thanks, @matthewf-ucsd)
- List observers of a User (Thanks, @bennettscience)
- ePortfolio endpoints (Thanks, @Birdmaaan4 and @bennettscience)
- Delete an Admin from an Account (Thanks, @shaneros)
- Added support for Python 3.10
- Smart DateTimes now support any ISO 8601 format, including time offsets. (Thanks, @kailukaitisBrendan)
- Fixed an issue where kwargs were not passed along to Canvas in
User.get_profile(). (Thanks, @breed)
- Dropped support for Python 3.6
- Update
QuizSubmission.get_submission_eventsto return aPaginatedList. (Thanks, @stevenbell) - Update
Course.get_course_level_student_summary_datato return aPaginatedListofCourseStudentSummaryitems instead of a dictionary. (Thanks, @craigdsthompson) - Update
Course.get_outcome_resultsto return aPaginatedListofOutcomeResultitems instead of a dictionary. (Thanks, @bennettscience) - Remove unnecessary
idparameter fromdelete,reorder_question_group, andupdatemethods inQuizGroupclass. (Thanks, @kailukaitisBrendan) - Update
Submissionto return attachments asFileobjects instead of dictionaries. (Thanks, @laitingsheng)
2.2.0 - 2021-03-25
- Enroll a user in a section (Thanks, @damianfs)
- File quota for courses, groups, and users (Thanks, @deundrewilliams)
- Provisional Grades (Thanks, @zenith110)
- Added support for Python 3.9
- Added
RateLimitExceededexception to distinguish between being rate limited and being otherwise forbidden from accesing a resource. It is a subclass of theForbiddenexception. - File uploads now accept path-like objects (Thanks, @theunkn0wn1)
- Add list of CanvasAPI Projects to README (Thanks, @deundrewilliams)
- PyPI Package Description now uses README (Thanks, @bennettscience)
- Replaced Travis CI with GitHub Actions
- Fixed an issue where
Canvas.create_poll()did not work due to an incorrect parameter. - Canvas.get_todo_items() now correctly returns a
PaginatedListofTodoitems (Thanks, @bennettscience) - Fixed an issue where
Favorite.remove()did not handle parameters properly. (Thanks, @deundrewilliams)
2.1.0 - 2020-12-04
- Course TODO items (Thanks, @onomou)
- Create observer pairing code (Thanks, @bennettscience)
- Added missing documentation for the get_current_user method and clarifications to the
CurrentUserclass. (Thanks, @Xx-Ashutosh-xX) Canvas.get_announcementnow has a required parametercontext_codes, which accepts a list of course IDs orCourseobjects.- Updated contributing guide
- Added missing documentation for the "Smart DateTimes" feature
- Added basic troubleshooting guide to documentation
- Fixed an issue where an
Announcementobject sometimes didn't have an associated course ID. (Thanks, @bennettscience) - Fixed an issue where an encoding problem could lead to file downloads hanging indefinitely. (Thanks, @blepabyte)
- The
enrollment_typeargument onCourse.enroll_useris now deprecated. Pass this information toenrollment[type]as a keyword argument instead. e.g.enroll_user(enrollment={'type': 'StudentEnrollment'})
2.0.0 - 2020-08-14
- Added support for arbitrary keyword arguments across the entire library
- Custom Gradebook Columns (Thanks,@aileenpongnon)
- Files
- Resolve Path (Thanks,@dsavransky)
- Fixed an issue where
Quiz.get_quiz_groupincorrectly setcourse_idto the quiz ID. (Thanks,@hcolclou) - Fixed an issue where
Course.create_external_tooldidn't acceptclient_id(LTI 1.3 support). - Fixed an issue where
Module.create_module_itemdidn't (Thanks,@aileenpongnon and @onomou) - Fixed an issue where
Page.revert_to_revisionwould incorrectly always setgroup_idto the page ID. Now correctly setsgroup_idorcourse_idappropriately.
Course.create_external_toolno longer supports positional arguments for its required parameters. Use keyword arguments instead.
1.0.0 - 2020-07-09
- Added support for Python 3.8
- Dropped support for Python 3.4, 3.5, and 2.7
- Removed all previously deprecated methods and attributes.
- Upgraded Ubuntu version for Travis (Thanks,@jonespm)
- Set up automatic deployments to PyPI via Travis
- Set up nightly build
0.16.1 - 2020-07-06
- Fixed an issue where the user-provided API_URL/base_url wasn't run through cleanup.
- Using
/api/v1/in the API_URL has been deprecated since v0.8.0 and legacy support will be removed in the next release. Ensure your provided url doesn't containapi/v1/. See deprecation warning in changelog for v0.8.0. ⚠️ This is the final release with support for Python 3.5⚠️
0.16.0 - 2020-06-26
- Enrollment Terms
- Get a Single Enrollment Term (Thanks, @lcamacho)
- Files
- Resolve Path for Course (Thanks,@dsavransky)
- GraphQL (Thanks,@jonespm)
- Late Policy (Thanks, @kennygperez)
- Quiz Assignment Overrides (Thanks, @kennygperez)
- Quiz Statistics (Thanks, @andrew-gardener)
- Updated README to use updated parameters for getting a user's courses by enrollment state (Thanks,@Vishvak365)
⚠️ This is the final release with support for Python 2.7⚠️ - Python 2.7 is end-of-life as of January 2020
- Future releases of CanvasAPI will NOT support any version of Python 2
⚠️ This is the final release with support for Python 3.4⚠️ - Python 3.4 is end-of-life as of March 2019
- Future releases of CanvasAPI will NOT support Python 3.4 or below
- This is the final deprecation warning for all methods marked as deprecated in this changelog or in our documentation. They will be removed in the next release.
- Fixed an issue where
Quiz.get_submission()ignored data added from using theincludekwarg. (Thanks,@Mike-Nahmias) - Fixed the broken
__str__method on theChangeRecordclass (Thanks,@Mike-Nahmias) - Fixed an issue where printing an
AccountReportwould fail due to not having an ID (Thanks,@Mike-Nahmias) - Fixed an issue where
"report_type"was passed improperly (Thanks,@brucespang) - Fixed some new
flake8issues (Thanks,@dsavransky and @jonespm) - Fixed an incorrect docstring for
Course.create_page()(Thanks,@dsavransky) - Fixed an issue where extra whitespace in the user-supplied canvas URL would break
PaginatedList(Thanks,@amorqiu)
0.15.0 - 2019-11-19
- Assignment Extensions (Thanks, @ljoks)
- AssignmentGroup (Thanks, @ctcuff)
- List Assignments
- Authentications Log (Thanks, @weining-li)
- Brand Configs (Thanks, @bennettscience)
- Comm Messages (Thanks, @ljoks)
- File Usage Rights (Thanks, @atarisafari and @joonro)
- Gradebook History (Thanks, @gdijkhoffz)
- Quiz Reports (Thanks, @atarisafari
- Quiz Submission Events (Thanks, @Goff-Davis)
- Quiz Submission User List (Thanks, @gdijkhoffz)
- Rubric Associations (Thanks, @weining-li)
- Throw
IndexErrorwhen using negative indexes onPaginatedListobjects (Thanks, @UniversalSuperBox) Assignment.overridesnow returns a list ofAssignmentOverrideobjects.
CanvasObject.attributesis now deprecated and will be removed in a future version.CanvasObject.to_json()is now deprecated and will be removed in a future version. To view the original attributes sent by Canvas, enable logs from the requests library.
- Fixed an issue where
util.clean_headers()would throw aValueErrorif a user accidentally included a space in their API token. (Thanks, @keeeeeegan) - Fixed an issue where
QuizSubmissionobjects sometimes wouldn't have a course_id, making some methods unusable. (Thanks, @bennettscience) - Fixed an issue where
get_user()did not accept arbitrary keyword arguments (Thanks, @eriktews) - Fixed an issue where an import was triggering a
DeprecationWarning(Thanks, @Screeeech) - Fixed an issue where a GroupedSubmission wasn't saving the
submissionsattribute properly
0.14.0 - 2019-08-20
- API Token scopes (Thanks, @jrsilveti)
- List scopes
- Account Notifications (Thanks, @jrsilveti)
- Show a global notification
- Update a global notification
- Account Reports (Thanks, @jrsilveti)
- Start a report
- Status of a report
- Delete a report
- Collaborations (Thanks, @jrsilveti)
- List collaborations
- List members of a collaboration
- Feature Flags (Thanks, @cat0698)
- List features
- List enabled features
- Get feature flag
- Set feature flag
- Remove feature flag
- Rubric (Thanks, @cat0698)
- Create a single rubric
- Removed overzealous global enabling of
DeprecationWarning. (Thanks, @Screeeech)- Note:
DeprecationWarningsare disabled by default, so you may need to run your code withpython -Wdto see them.
- Note:
0.13.0 - 2019-07-08
- Content Exports (Thanks, @weining-li)
- ePub Exports (Thanks, @jrsilveti)
- Favorites (Thanks, @atarisafari)
- Grading Periods (Thanks, @jrsilveti)
- Outcome Import (Thanks, @jrsilveti)
- Peer Reviews (Thanks, @vutoan1245)
- Planner (Thanks, @weining-li)
- Planner
- Planner Notes
- Planner Overrides
- Polls (Thanks, @Goff-Davis)
- Poll
- PollChoice
- PollSession
- PollSubmission
- Quiz Submission Questions (Thanks, @bradfordlynch)
- Added documentation for Debugging
- Added request and response logging to
Requester.request - Added documentation for Exceptions
- Added generic error handling for unhandled 4XX+ HTTP errors
- Added Code of Conduct
- Added support for PATCH methods (Thanks, @us91)
- Added a warning when using a blank
CANVAS_URL(Thanks, @gdijkhoffz) - Added Issue and Pull Request Templates
- Added CODEOWNERS file
Quiz.get_all_quiz_submissionsis now deprecated. UseQuiz.get_submissionsinstead.
- Fixed an issue where creating an external tool did not properly send parameters to Canvas. (Thanks, @altgilbers)
- Fixed an issue where getting Quiz Submissions would only return up to the first 10 results (Thanks,@Mike-Nahmias)
- Fixed an issue where unhandled 4XX and 5XX HTTP errors would cause a JSONDecodeError
- Removed a limitation where the parameter
groupedbeing passed toget_multiple_submissionswould be ignored. These methods now return aGroupedSubmissionobject containing multipleSubmissionobjects, instead of ignoring. (Thanks, @bennettscience)
0.12.0 - 2019-04-03
- Assignment Overrides
- Quiz Submissions (Thanks, @wallacetyler)
- Blueprints (Thanks, @gdijkhoffz)
- Create an Admin (Thanks, @altgilbers)
- SIS Imports (Thanks, @nottheswimmer)
- Create and Delete Communication Channels (Thanks, @matthewf-ucsd)
- Added support for HTTP response 409 (Thanks, @wallacetyler)
- Fixed an issue where
Section.edit()didn't accept keyword arguments (Thanks, @wjw27)
0.11.0 - 2018-09-17
- Get all quiz submissions (Thanks, @petarGitNik)
- Upload a file to a submission (Thanks, @MarkLalor)
- Upload a file to a folder (Thanks, @elec3647)
- Get Admins in an account (Thanks, @kensler)
- Added support for Python 3.7
- Added a warning when using HTTP for the base url instead of HTTPS. This should help prevent some confusing behavior that Canvas exhibits when making HTTP requests to an HTTPS-enabled instance.
- Added more detailed documentation for passing complex parameters as keyword arguments.
- Fixed an issue where
Outcome.get_subgroups()didn't have sufficient context to call other methods. - Fixed improper passing of keyword arguments when editing a Module (Thanks, @phaustin)
0.10.0 - 2018-06-01
- Content Migrations (Thanks, @qwertynerd97)
- Copy a File (Thanks, @qwertynerd97)
- Course Quiz Extensions
- List Announcements (Thanks, @rmanbaird)
- Grade/Comment on Multiple Submissions (Thanks, @rmanbaird)
- Quiz Extensions
- Lots of docstring fixes. (Thanks, @rmanbaird)
- All methods starting with
list_have been deprecated. Each has been replaced with a corresponding method starting withget_. For example,Course.list_groups()is nowCourse.get_groups(). Thelist_methods will be removed in a future release. (Thanks @qwertynerd97 for doing the bulk of the grunt work.) Course.update_tab()is now deprecated. UseTab.update()instead.
- Fixed a bug where taking a slice of a
PaginatedListwhere thestartwas larger than the list caused an infinite loop. - Fixed a typo that prevented
Assignment.submit()from working properly. (Thanks, @Tobiaqs)
0.9.0 - 2018-03-01
- Quiz Questions
- Added example usage for several common endpoints to our documentation.
- Updated
PaginatedListto allow specification of the root element to build the list from when given an atypical JSON response (see #146). (thanks @dfwarden) - Improved keyword argument support for
course.get_section()(thanks @andrew-gardener) - When uploading a file to a submission with
Submission.upload_comment(), it will automatically attached to a new comment.
⚠️ Dropped support for Python 3.3⚠️ - Python 3.3 is end-of-life as of September 2017
- Should continue to function in 3.3, but compatibility cannot be guaranteed going forward.
- Several methods in the
CourseandSectionclasses relating to assignments and submissions have been deprecated.- Comparable methods have been implemented in the
AssignmentandSubmissionclasses, as appropriate. - The deprecated methods now include a warning in the documentation with reference to the replacement. Additionally, the deprecated methods will raise a
DeprecationWarning. - These methods will be removed in a future release.
- Comparable methods have been implemented in the
Course.list_sections()has been deprecated. UseCourse.get_sections()instead.
- Fixed an issue where booleans would be capitalized when sent to Canvas, causing Canvas to misinterpret them and set default values.
- Fixed an issue where unexpected JSON responses from Canvas would cause
PaginatedListobjects to fail.
0.8.2 - 2018-01-24
- Fixed an issue where editing and deleting user logins would use incorrect IDs.
0.8.1 - 2018-01-23
- Fixed several incorrect and missing docstrings
- Fixed an issue where Canvas returning
while(1);at the beginning of a response to uploading a file prevented uploads from completing. - Fixed an issue where a trailing slash in the provided BASE_URL would cause
PaginatedListobjects to fail. - Fixed an issue where combine_kwargs was transposing empty brackets and keys when a dictionary had a list as a value.
0.8.0 - 2018-01-04
- Account
- Delete a sub account
- Grading Standards (Thanks, @JonGuilbe)
- Notification Preferences (Thanks, @a-goetz)
- Update a preference
- Update preferences by category
- Update multiple preferences
- Outcomes (Thanks, @a-goetz)
- Quiz Question Groups (Thanks, @JonGuilbe)
- Rubric (Thanks, @sigurdurb)
- Added support for other iterables as parameter values. (Thanks, @liblit)
- For many endpoints that accept an "object id", either a CanvasAPI Object or integer ID can now be passed. (Thanks, @a-goetz)
- Added a requester cache that remembers the last 5 requests to Canvas. It can be accessed as the attribute
_cacheof therequester object. (e.g.course._requester._cache) - Files can now be downloaded directly from the
Fileobject in one of two ways: (Thanks, @DanBrink91)get_contentswill directly return the contents of the file. (e.g.file.get_contents())downloadwill download the file and save it to the provided path. (e.g.file.download('example.txt'))
- Moved several methods exclusive to the API Key owner's user from the
Userclass to a new class calledCurrentUser. There is a new method in theCanvasclass calledget_current_userto access this object. (e.g.canvas.get_current_user()) (Thanks, @DanBrink91)
- Fixed a bug where creating conversations wouldn't work until the user iterated over the response.
- Lots of formatting fixes and spelling corrections.
Including /api/v1/ at the end of the API URL passed to a new Canvas object is now deprecated. Users should now only pass the root URL into the Canvas object (e.g. "https://example.com/api/v1/" should now be "https://example.com").
For now, users including /api/v1/ will see a DeprecationWarning, but things will otherwise operate normally. The ability to continue using /api/v1/ will be removed in a future release.
0.7.0 - 2017-10-04
Thanks to all the contributors who helped with this release: @stephenwoosley, @jackrsteiner, and @allygator. You guys are awesome!
Huge thanks to @liblit for lots of issues, suggestions, and pull requests. Couldn't have done all this without you!
- Upload file to a Submission Comment (
Submission.upload_comment())
- Switched to
flake8instead of justpyflakesandpycodestyle. - Added markdown linter and fixed related issues.
DateTime"Smart Objects" are now timezone aware.- Keyword arguments now support lists and tuples. Can be nested in other lists and/or inside dictionaries. See issue #55 for details.
DateTimeobjects passed as params now auto-format to ISO 8601 strings.- Added table of contents to README.
- Updated "Getting Started" page in Documentation to match README.
- Fixed an issue where editing a page would report a missing ID.
- Fixed an issue where kwargs weren't passed along in
Course.get_pages(). - Fixed an issue where
Course.list_multiple_submissions()would always set grouped toTrue. It now correctly always sets grouped toFalseby removing the param. - Fixed several issues relating to
DiscussionTopicmethods returning incorrect types. - Fixed an issue where reordering pinned topics had no valid values for the order param.
0.6.0 - 2017-08-15
- Added support for SIS IDs to get accounts, courses, groups and sections. (Thanks for the suggestion, @sigurdurb!)
0.5.1 - 2017-08-02
- Moved documentation to Read the Docs.
- Fixed an issue where kwargs in Python 2.7 wouldn't be properly formatted when converted to get parameters.
0.5.0 - 2017-07-10
- Files (Get file from Canvas, Course, Group, or User)
- Added support for Python 3.3, 3.4, 3.5, and 3.6 while maintaining 2.7 compatibility.
- Fixed an issue where non-ASCII characters in CanvasObject data would throw UnicodeEncodeError exceptions.
0.4.0 - 2017-06-16
- Analytics
- Announcement External Feeds
- Authentication Providers
- Communications Channels
- Files
- Logins
- Notification Preferences
- Submissions
- Search
- Tabs
- User Observees
- Set up TravisCI and Coveralls.
- Added Badges to README.
- Updated CONTRIBUTING.md to more accurately reflect our dev process.
0.3.0 - 2017-03-30
- Appointment Groups
- Assignment Groups
- Bookmarks
- Calendar Events
- Discussions
- External Tools
- Updated CHANGELOG.md format
- Created AUTHORS.md
- Added LICENSE
- Added
pycodestyleandpyflakesrequirements - Added setup.cfg with
pycodestylemax-line-length definition - Moved .coveragerc settings to setup.cfg
- Changed
assertstatements to use the assertion methods built into unittest.
0.2.0 - 2017-01-04
- Groups
- Roles
- Page Revisions
- Sections
- Conversations
- Standardized
__str__methods. They now (generally) follow the convention of the value of the single most relevant field followed by an ID in parentheses. - Reworked how
requests_mockis used in test suite. - Nested dictionaries are now allowed as kwargs
- Split 401 into two exceptions:
InvalidAccessTokenif'WWW-Authenticate'header is present. Otherwise,Unauthorized.
- Moved some incorrectly placed enrollment methods to the Enrollment class.
- Corrected
Processclass toProgress - Minor text fixes.
0.1.2 - 2016-07-22
- Getting a Group
- Uploading a file to a Course or User
- Several Page related endpoints
- Added contribution guide
- Added Docker container for testing (e.g. with Jenkins)
- Split requirements files into three:
- dev_requirements.txt
- tests_requirements.txt
- requirements.txt
- Added some missing parameters
- Fixed some incorrectly defined parameters
- Fixed an issue where tests would fail due to an improperly configured requires block