🚀 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.

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: url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id
Returns a submitted quiz attempt and its current grading result.

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>'
Returns a NewQuizSubmission object

List submission questions

GET /api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/questions

Scope: url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/questions
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.

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>'
Returns a list of NewQuizSubmissionQuestion objects

List submission item results

GET /api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/item_results

Scope: url:GET|/api/quiz/v1/courses/:course_id/quizzes/:assignment_id/submissions/:submission_id/item_results
Returns a paginated list of responses, scores, and feedback from the attempt's current grading result.

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>'
Returns a list of NewQuizSubmissionItemResult objects