We have relocated to Instructure Developer Documentation Portal. 🎉 Please update your bookmarks. This page will automatically redirect after July 1, 2026.
Quiz Submission Questions API
API for answering and flagging questions in a quiz-taking session.
A QuizSubmissionQuestion object looks like:
{
  // The ID of the QuizQuestion this answer is for.
  "id": 1,
  // Whether this question is flagged.
  "flagged": true,
  // The provided answer (if any) for this question. The format of this parameter
  // depends on the type of the question, see the Appendix for more information.
  "answer": null,
  // The possible answers for this question when those possible answers are
  // necessary.  The presence of this parameter is dependent on permissions.
  "answers": null
}Get all quiz submission questions. Quizzes::QuizSubmissionQuestionsController#index
GET /api/v1/quiz_submissions/:quiz_submission_id/questions
url:GET|/api/v1/quiz_submissions/:quiz_submission_id/questions
  Get a list of all the question records for this quiz submission.
200 OK response code is returned if the request was successful.
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| include[] | string | Associations to include with the quiz submission question. 
          Allowed values:  | 
Example Response:
{
  "quiz_submission_questions": [QuizSubmissionQuestion]
}Answering questions Quizzes::QuizSubmissionQuestionsController#answer
POST /api/v1/quiz_submissions/:quiz_submission_id/questions
url:POST|/api/v1/quiz_submissions/:quiz_submission_id/questions
  Provide or update an answer to one or more QuizQuestions.
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| attempt | Required | integer | The attempt number of the quiz submission being taken. Note that this must be the latest attempt index, as questions for earlier attempts can not be modified. | 
| validation_token | Required | string | The unique validation token you received when the Quiz Submission was created. | 
| access_code | string | Access code for the Quiz, if any. | |
| quiz_questions[] | QuizSubmissionQuestion | Set of question IDs and the answer value. See Appendix: Question Answer Formats for the accepted answer formats for each question type. | 
Example Request:
{
  "attempt": 1,
  "validation_token": "YOUR_VALIDATION_TOKEN",
  "access_code": null,
  "quiz_questions": [{
    "id": "1",
    "answer": "Hello World!"
  }, {
    "id": "2",
    "answer": 42.0
  }]
}Get a formatted student numerical answer. Quizzes::QuizSubmissionQuestionsController#formatted_answer
GET /api/v1/quiz_submissions/:quiz_submission_id/questions/:id/formatted_answer
url:GET|/api/v1/quiz_submissions/:quiz_submission_id/questions/:id/formatted_answer
  Matches the intended behavior of the UI when a numerical answer is entered and returns the resulting formatted number
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| answer | Required | Numeric | no description | 
Example Response:
{
  "formatted_answer": 12.1234
}Flagging a question. Quizzes::QuizSubmissionQuestionsController#flag
PUT /api/v1/quiz_submissions/:quiz_submission_id/questions/:id/flag
url:PUT|/api/v1/quiz_submissions/:quiz_submission_id/questions/:id/flag
  Set a flag on a quiz question to indicate that you want to return to it later.
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| attempt | Required | integer | The attempt number of the quiz submission being taken. Note that this must be the latest attempt index, as questions for earlier attempts can not be modified. | 
| validation_token | Required | string | The unique validation token you received when the Quiz Submission was created. | 
| access_code | string | Access code for the Quiz, if any. | 
Example Request:
{
  "attempt": 1,
  "validation_token": "YOUR_VALIDATION_TOKEN",
  "access_code": null
}Unflagging a question. Quizzes::QuizSubmissionQuestionsController#unflag
PUT /api/v1/quiz_submissions/:quiz_submission_id/questions/:id/unflag
url:PUT|/api/v1/quiz_submissions/:quiz_submission_id/questions/:id/unflag
  Remove the flag that you previously set on a quiz question after you’ve returned to it.
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| attempt | Required | integer | The attempt number of the quiz submission being taken. Note that this must be the latest attempt index, as questions for earlier attempts can not be modified. | 
| validation_token | Required | string | The unique validation token you received when the Quiz Submission was created. | 
| access_code | string | Access code for the Quiz, if any. | 
Example Request:
{
  "attempt": 1,
  "validation_token": "YOUR_VALIDATION_TOKEN",
  "access_code": null
}Appendixes
Appendix: Question Answer Formats
Essay Questions
- Question parametric type: essay_question
- Parameter type: Text
- Parameter synopsis: { "answer": "Answer text." }
Example request
{
  "answer": "<h2>My essay</h2>\n\n<p>This is a long article.</p>"
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Text is too long. | The answer text is larger than the allowed limit of 16 kilobytes. | 
Fill In Multiple Blanks Questions
- Question parametric type: fill_in_multiple_blanks_question
- Parameter type: Hash{String => String}
- Parameter synopsis: { "answer": { "variable": "Answer string." } }
Example request
Given that the question accepts answers to two variables, color1 and color2:
{
  "answer": {
    "color1": "red",
    "color2": "green"
  }
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Unknown variable 'var'. | The answer map contains a variable that is not accepted by the question. | 
| 400 Bad Request | Text is too long. | The answer text is larger than the allowed limit of 16 kilobytes. | 
Fill In The Blank Questions
- Question parametric type: short_answer_question
- Parameter type: String
- Parameter synopsis: { "answer": "Some sentence." }
Example request
{
  "answer": "Hello World!"
}
Possible errors
Similar to the errors produced by Essay Questions.
Formula Questions
- Question parametric type: calculated_question
- Parameter type: Decimal
- Parameter synopsis: { "answer": decimal }wheredecimalis either a rational number, or a literal version of it (String)
Example request
With an exponent:
{
  "answer": 2.3e-6
}
With a string for a number:
{
  "answer": "13.4"
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Parameter must be a valid decimal. | The specified value could not be processed as a decimal. | 
Matching Questions
- Question parametric type: matching_question
- Parameter type: Array<Hash>
- Parameter synopsis: { "answer": [{ "answer_id": id, "match_id": id }] }where the IDs must identify answers and matches accepted by the question.
Example request
Given that the question accepts 3 answers with IDs [ 3, 6, 9 ] and 6 matches
with IDs: [ 10, 11, 12, 13, 14, 15 ]:
{
  "answer": [{
    "answer_id": 6,
    "match_id": 10
  }, {
    "answer_id": 3,
    "match_id": 14
  }]
}
The above request:
- pairs answer#6withmatch#10
- pairs answer#3withmatch#14
- leaves answer#9un-matched
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Answer must be of type Array. | The match-pairings set you supplied is not an array. | 
| 400 Bad Request | Answer entry must be of type Hash, got '...'. | One of the entries of the match-pairings set is not a valid hash. | 
| 400 Bad Request | Missing parameter 'answer_id'. | One of the entries of the match-pairings does not specify an answer_id. | 
| 400 Bad Request | Missing parameter 'match_id'. | One of the entries of the match-pairings does not specify an match_id. | 
| 400 Bad Request | Parameter must be of type Integer. | One of the specified answer_idormatch_idis not an integer. | 
| 400 Bad Request | Unknown answer '123'. | An answer_idyou supplied does not identify a valid answer
      for that question. | 
| 400 Bad Request | Unknown match '123'. | A match_idyou supplied does not identify a valid match
      for that question. | 
Multiple Choice Questions
- Question parametric type: multiple_choice_question
- Parameter type: Integer
- Parameter synopsis: { "answer": answer_id }whereanswer_idis an ID of one of the question's answers.
Example request
Given an answer with an ID of 5:
{
  "answer": 5
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Parameter must be of type Integer. | The specified `answer_id` is not an integer. | 
| 400 Bad Request | Unknown answer '123' | The specified `answer_id` is not a valid answer. | 
Multiple Dropdowns Questions
- Question parametric type: multiple_dropdowns_question
- Parameter type: Hash{String => Integer}
- Parameter synopsis: { "answer": { "variable": answer_id } }where the keys are variables accepted by the question, and their values are IDs of answers provided by the question.
Example request
Given that the question accepts 3 answers to a variable named color with the
ids [ 3, 6, 9 ]:
{
  "answer": {
    "color": 6
  }
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Unknown variable 'var'. | The answer map you supplied contains a variable that is not accepted by the question. | 
| 400 Bad Request | Unknown answer '123'. | An answer_idyou supplied does not identify a valid answer
      for that question. | 
Multiple Answers Questions
- Question parametric type: multiple_answers_question
- Parameter type: Array<Integer>
- Parameter synopsis: { "answer": [ answer_id ] }where the array items are IDs of answers accepted by the question.
Example request
Given that the question accepts 3 answers with the ids [ 3, 6, 9 ] and we
want to select the answers 3 and 6:
{
  "answer": [ 3, 6 ]
}
Possible errors
| HTTP RC | Error Message | Cause | 
|---|---|---|
| 400 Bad Request | Selection must be of type Array. | The selection set you supplied is not an array. | 
| 400 Bad Request | Parameter must be of type Integer. | One of the answer IDs you supplied is not a valid ID. | 
| 400 Bad Request | Unknown answer '123'. | An answer ID you supplied in the selection set does not identify a valid answer for that question. | 
Numerical Questions
- Question parametric type: numerical_question
This is similar to Formula Questions.
True/False Questions
- Question parametric type: true_false_question
The rest is similar to Multiple Choice questions.