Send GET /api/v1/courses/<course_id>/assignments/<assignment_id>/submissions?per_page=100 to list all submissions for an assignment
Follow the Link header to paginate through all pages of submissions
Inspect each submission object for fields such as user_id, submitted_at, workflow_state, and attachments
To post a grade, send PUT /api/v1/courses/<course_id>/assignments/<assignment_id>/submissions/<user_id> with a JSON body including submission[posted_grade]
To post grades in bulk, use POST /api/v1/courses/<course_id>/assignments/<assignment_id>/submissions/update_grades with a grade_data hash keyed by user_id
Known gotchas
Submissions are not created until a student actually submits; a 'missing' state submission object is generated automatically after the due date but may not appear for all students immediately
The posted_grade value can be a percentage string ('85%'), a points number, or a letter grade depending on the assignment's grading_type; mismatching the format silently stores 0 or errors
SpeedGrader and the API share the same grade store; a grade written via API will immediately appear in SpeedGrader and vice versa, which can cause conflicts if both are in use simultaneously
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp