🚀 Heads up: Our API Docs Have Moved!
We have relocated to Instructure Developer Documentation Portal. 🎉 Please update your bookmarks. This page will automatically redirect after July 1, 2026.
We have relocated to Instructure Developer Documentation Portal. 🎉 Please update your bookmarks. This page will automatically redirect after July 1, 2026.
New Quizzes Submissions API
Requires permission to grade the assignment. Quiz responses include answer keys and grading data regardless of student result-view settings. Survey item results omit correctness indicators and correct/incorrect feedback.
Follow the rel="next" URL in the Link header, including after an empty page.
A NewQuizSubmission object looks like:
// A submitted New Quizzes attempt and its current grading result.
{
// The New Quizzes session ID.
"id": "12",
// The attempt number.
"attempt": 1,
// The attempt's status.
"status": "graded",
// When the session was submitted.
"submitted_at": "2026-01-15T15:00:00Z",
// Time spent taking the quiz, in seconds.
"elapsed_time": 300,
// The total number of items in the attempt.
"session_items_count": 5,
// The UUID of the account associated with the session.
"account_uuid": "18d0ef47-8f42-4bc3-9961-498641a557a2",
// The session's due date, if set.
"due_at": "2026-01-16T23:59:00Z",
// The session's end time, if set.
"end_at": "2026-01-15T15:00:00Z",
// When the session started.
"start_at": "2026-01-15T14:55:00Z",
// Whether the student access code was accepted.
"accepted_student_access_code": false,
// Whether the session timer is disabled.
"disable_timer": false,
// Extra time allowed for the session, in seconds.
"extra_time_in_seconds": 0,
// The multiplier applied to the session timer.
"timer_multiplier": 1.0,
// Whether the session is excluded from statistics.
"exclude_from_stats": false,
// The UUID of the root account associated with the session.
"root_account_uuid": "6e43ecbd-68cf-4e8d-a48c-1ab229eb54db",
// Whether the session builds on the previous attempt.
"build_on_last_attempt": false,
// The number of items remaining for Build on Last Attempt, when applicable.
"bola_session_items_count": null,
// Whether reducing choices is enabled for the session.
"reduce_choices_enabled": false,
// Whether the student can clear a multiple-choice selection.
"allow_clear_mc_selection": true,
// Whether choice elimination is enabled, when applicable.
"choice_elimination": false,
// Whether the student can return to previous items.
"allow_backtracking": true,
// The session's one-question-at-a-time setting.
"one_at_a_time_type": "none",
// Whether results feedback is enabled for the session.
"results_feedback_enabled": true,
// Whether the IP address is allowed for the session.
"ip_is_allowed": true,
// Quiz details, including the New Quizzes quiz ID.
"quiz": {"id":"90","title":"Addition","context_id":"7"},
// The current grading result. Omitted unless status is needs_grading or graded.
"authoritative_result": {"id":"34","created_at":"2026-01-15T15:00:00Z","updated_at":"2026-01-15T15:01:00Z","quiz_session_id":"12","grading_method":"autograde","status":"graded","score":8.0,"points_possible":10.0,"percentage":0.8,"fudge_points":0.0,"scheduled_regraded_quiz_entry_ids":[],"bola_complete":false,"requires_additional_review":false}
}
A NewQuizSubmissionResult object looks like:
// A grading result for a New Quizzes session.
{
// The New Quizzes result ID.
"id": "34",
// When the grading result was created.
"created_at": "2026-01-15T15:00:00Z",
// When the grading result was last updated.
"updated_at": "2026-01-15T15:01:00Z",
// The method used to grade the session.
"grading_method": "autograde",
// Quiz entry IDs with a regrade in progress.
"scheduled_regraded_quiz_entry_ids": ["56"],
// Whether all item responses are correct. Always false for surveys.
"bola_complete": false,
// The New Quizzes session ID.
"quiz_session_id": "12",
// The grading status.
"status": "graded",
// The points awarded for the session.
"score": 8.0,
// The total possible points.
"points_possible": 10.0,
// The score as a ratio: 0.8 means 80%.
"percentage": 0.8,
// The manual score adjustment.
"fudge_points": 0.0,
// Whether any item result is waiting for additional review.
"requires_additional_review": false
}
A NewQuizSubmissionQuestion object looks like:
// A question or passage as presented to the student.
{
// The New Quizzes quiz entry ID. Several questions selected from one item bank
// can share this ID.
"quiz_entry_id": "56",
// The item's position in the session, starting at 1.
"position": 1,
// The displayed question number, or 0 for passage-only items.
"question_number": 1,
// The points available for the item.
"points_possible": 2.0,
// The calculator available for the item.
"calculator_type": "none",
// Question content. Passage-only items use no-interaction and omit id and
// item_body.
"item": {"id":"78","title":"Addition","label":null,"item_body":"\u003cp\u003eWhat is 3 + 6?\u003c\/p\u003e","user_response_type":"Uuid","outcome_alignment_set_guid":null,"properties":{"shuffle_rules":{"choices":{"shuffled":false}}},"interaction_type":{"id":"1","slug":"choice","name":"Multiple Choice"},"interaction_data":{"choices":[{"id":"5595b4c2-7dd6-447f-b8f1-9b6d0e0c287a","position":1,"item_body":"\u003cp\u003e9\u003c\/p\u003e"},{"id":"69f9c2b1-443b-4ee7-9173-55d819b18e18","position":2,"item_body":"\u003cp\u003e12\u003c\/p\u003e"}]}},
// Answer key, scoring rules, and grading notes. Format depends on question
// type.
"scoring_data": {"value":"5595b4c2-7dd6-447f-b8f1-9b6d0e0c287a"},
// The passage, image, or other stimulus associated with the question.
"stimulus": {"id":"91","stimulus_type":"text","title":"Adding integers","body":"\u003cp\u003eAdd the two numbers in each question.\u003c\/p\u003e","instructions":"Use the passage to answer the question.","source_url":null,"orientation":"left","passage":true},
// The question's stimulus association key, when applicable.
"stimulus_key": 1,
// The item's position among the remaining Build on Last Attempt items, or 0 if
// previously correct.
"bola_position": 1,
// Whether a response to the item is required.
"required": false
}
A NewQuizSubmissionItemResult object looks like:
// The student's response, score, and feedback for an item.
{
// The item's ID, matching item.id in the questions response.
"item_id": "78",
// The corresponding item's position in the session, starting at 1.
"position": 1,
// The item's attempt number.
"attempt": 1,
// The points awarded for the item.
"score": 2.0,
// The points available for the item.
"points_possible": 2.0,
// When the item was graded.
"graded_at": "2026-01-15T15:01:00Z",
// The method used to grade the item.
"grading_method": "autograde",
// Student response and scoring data. For multiple-choice questions, value maps
// choice IDs to scoring details; user_responded identifies selected choices.
"scored_data": {"correct":true,"value":{"5595b4c2-7dd6-447f-b8f1-9b6d0e0c287a":{"result_score":1,"user_responded":true}}},
// Feedback for the student's response.
"feedback": {"item_feedback":{"neutral":"\u003cp\u003eReview addition.\u003c\/p\u003e","correct":"\u003cp\u003eCorrect!\u003c\/p\u003e"},"grader_feedback":{"content":"\u003cp\u003eWell done.\u003c\/p\u003e"}},
// Regrading details.
"regrade_info": {"original_score":1.0,"original_points_possible":2.0,"new_points_possible":2.0,"new_score":2.0,"reconciliation_method":"new_score","regraded":true}
}
A NewQuizSubmissionError object looks like:
// An error returned by Canvas or New Quizzes.
{
// The error status, when supplied by Canvas.
"status": "bad_request",
// The error message.
"message": "attempt must be a positive integer",
// Error details returned by New Quizzes.
"error": "Invalid pagination cursor",
// Additional error details.
"errors": null
}
Get a quiz submission
GET /api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id
Scope:
Returns a submitted quiz attempt and its current grading result.
url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| course_id | Required | string | The ID of the Canvas course. |
| assignment_id | Required | integer | The ID of the Canvas assignment associated with the quiz. |
| submission_id | Required | integer | The Canvas submission ID. |
| attempt | integer | The submitted attempt number in submission order. If omitted, the quiz's score-to-keep setting selects the attempt. For average scoring, the latest attempt is returned. |
Example Request:
curl 'https://<canvas>/api/quiz/v1/courses/1/quizzes/2/submissions/3?attempt=1' \
-H 'Authorization: Bearer <token>'
List submission questions
GET /api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/questions
Scope:
Returns a paginated list of questions and passages in the order shown to the student.
Use `position` to match questions with item results from the same attempt.
Passage-only items have no corresponding item result.
When Build on Last Attempt is enabled, questions answered correctly in the
previous attempt are omitted, except for surveys. Position values may have gaps.
url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/questions
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| course_id | Required | string | The ID of the Canvas course. |
| assignment_id | Required | integer | The ID of the Canvas assignment associated with the quiz. |
| submission_id | Required | integer | The Canvas submission ID. |
| attempt | integer | The submitted attempt number in submission order. If omitted, the quiz's score-to-keep setting selects the attempt. For average scoring, the latest attempt is returned. | |
| per_page | integer | Number of items per page. | |
| page | string | Pagination token from the `rel="next"` URL in the `Link` response header. |
Example Request:
curl 'https://<canvas>/api/quiz/v1/courses/1/quizzes/2/submissions/3/questions?attempt=1&per_page=50' \
-H 'Authorization: Bearer <token>'
List submission item results
GET /api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/item_results
Scope:
Returns a paginated list of responses, scores, and feedback from the attempt's
current grading result.
url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/item_results
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| course_id | Required | string | The ID of the Canvas course. |
| assignment_id | Required | integer | The ID of the Canvas assignment associated with the quiz. |
| submission_id | Required | integer | The Canvas submission ID. |
| attempt | integer | The submitted attempt number in submission order. If omitted, the quiz's score-to-keep setting selects the attempt. For average scoring, the latest attempt is returned. | |
| per_page | integer | Number of results per page. | |
| page | string | Pagination token from the `rel="next"` URL in the `Link` response header. |
Example Request:
curl 'https://<canvas>/api/quiz/v1/courses/1/quizzes/2/submissions/3/item_results?attempt=1&per_page=50' \
-H 'Authorization: Bearer <token>'