finds.dev← search

// the find

ucfopen/canvasapi

★ 680 · Python · MIT · updated Apr 2026

Python API wrapper for Instructure's Canvas LMS. Easily manage courses, users, gradebooks, and more.

CanvasAPI is a Python wrapper for Instructure's Canvas LMS REST API, with one class per resource (courses, users, assignments, gradebook pieces) and methods that return those objects, so you can move from a course to its assignments to their submissions without building URLs by hand. It's aimed at people scripting against Canvas: sync jobs, roster tooling, course migration helpers, and the downstream tools listed in the README. UCF has maintained it since 2016, and the README counts over 100 dependent repositories.

The object model is the real value. Each Canvas resource has its own module (course.py, user.py, submission.py and so on), and the methods return typed objects, so chained calls read like the domain instead of raw endpoint paths. Keyword arguments are handled consistently, including nested ones like course={'name': ...}, which get flattened into the bracketed form Canvas expects, and keyword-args.rst documents the rules. PaginatedList loads pages lazily, so iterating a large roster doesn't pull every record into memory before you touch the first one. The testing setup is solid for a wrapper of this size: each module has a matching test file with JSON fixtures, CI runs on GitHub Actions, and codecov reports coverage on every push.

PaginatedList is the sharp edge. It doesn't know its length and doesn't support negative indexing, as the README warns, so code ported from plain lists will break on len() and [-1]. Endpoint coverage grows by request: the repo has an endpoint-coverage-request issue template, which suggests gaps get filled as people ask for them, so newer Canvas endpoints may be missing for a while. The tests run against recorded fixtures rather than a live Canvas instance, so a change in Canvas's response shape can pass CI until a user reports it. The README says nothing about rate limiting or retries, so if a large sync hits Canvas's throttle, handling that is on you.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →