Build an LMS Connect Gradebook Sync
Extend Secure Sync with LMS Connect grade passback and LTI 1.3 launch support.
Extend a Secure Sync integration with LMS Connect to create assignments, update submissions, and optionally support LTI 1.3 course launches.
Prerequisites
- Configure a working Secure Sync integration.
- Enable LMS Connect for your application.
- Use API v3.1 and the district-app token for LMS Connect API requests.
1. Confirm LMS readiness
Call GET /districts/{id} and check lms_state before grade passback. Proceed only when matching is complete.
When enabled for your application, use lms_status.synced_in_lms, last_lms_sync, and lms_matched_percentage to troubleshoot match status.
2. Design grade-passback behavior
Decide when your app creates assignments and sends grades. Decide whether your app only pushes data to the LMS or also imports LMS-side changes.
Use the district-app token for assignment and submission requests.
3. Create assignments and update submissions
Use the API v3.1 assignment and submission endpoints. Store each assignment ID when you create it so you can retrieve, update, or delete that assignment later.
Use 15–60 second timeouts for assignment and submission writes. The grade passback API has the same 1,800-request-per-minute limit as the Data API.
4. Account for provider differences
- Canvas: Set
submission_typesandmax_attemptsexplicitly. Canvas derives assignment state from its publishing and date behavior. - Google Classroom: The district requires GCRI. Several assignment fields, including
term_idandmax_attempts, are unsupported. - Schoology: Include
term_idfor assignments. Students must complete an LTI launch before their submissions can be written. Teachers must set an assignment grading category in Schoology for submissions to appear.
5. Support LTI 1.3 when needed
LTI 1.3 is supported for Canvas and Schoology. Validate the signed launch JWT and use its course or section context to route the user to the matching experience in your app.
6. Follow pagination links promptly
Grade-passback responses provide a next link when more results exist. That relative link is valid for two hours after the original request.
Related documentation
Updated about 2 hours ago

