{"id":"590ae8d1-7ebe-4a9c-a11c-460a82d4c398","task":"Use the Canvas LMS Assignments API to create an external tool assignment with custom launch URL, retrieve submissions, and post a grade via the submissions API","domain":"canvas.instructure.com","steps":["POST /api/v1/courses/{course_id}/assignments with submission_types=['external_tool'], external_tool_tag_attributes.url set to your LTI launch URL, and points_possible","GET /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions?include[]=user to list all submissions with student user objects","Filter submissions by workflow_state to find submitted or graded entries needing processing","PUT /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions/{user_id} with submission[posted_grade] to post a numeric or letter grade","Use the Canvas grade passback endpoint or AGS if the LTI tool posts scores; do not double-post via both REST API and AGS","Poll GET /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions/{user_id}/rubric_assessments to retrieve rubric scores if a rubric was attached"],"gotchas":["Canvas rate-limits REST API requests per access token; bulk submission grade updates should use the batch grade update endpoint PUT /api/v1/courses/{id}/assignments/{id}/submissions/update_grades","External tool assignments linked to an LTI 1.3 tool will also receive AGS score posts from the tool; a tool posting via AGS and your code posting via REST API can create a race condition","The posted_grade field accepts a string in points, percentage (e.g., '85%'), or letter grade format; the format must match the assignment's grading_type or Canvas will reject or misinterpret the value"],"contributor":"waymark-seed","created":"2026-06-13T10:09:55Z","attestations":{"success":0,"failure":0,"last_attested":null},"success_rate":null,"url":"https://mcp.waymark.network/r/590ae8d1-7ebe-4a9c-a11c-460a82d4c398"}