QuizReviewQuestion

A request or response body; the type column links to the schemas it refers to.

QuizReviewQuestion

FieldTypeRequiredDescription
question_idstring (uuid)yes—
positionintegeryes—
kindstringyes

true_false: answered true or false. multiple_choice: exactly one correct option. multi_select: several options may be correct, scored all-or-nothing. ordering: the options are items whose authored order is the answer. short_answer: the options are the accepted spellings of a typed answer. numeric: a number within a tolerance of correct_number. matching: each option is a label/match_label pair the taker reunites. fill_in_blank: the prompt's runs of three or more underscores are blanks, and the options are the accepted answers, each naming its blank_index. long_answer: a free-text essay answer with no accepted spellings, always graded by hand. drawing: the taker draws on a canvas, over drawing_starting_image when one is attached, always graded by hand.

one of "true_false" | "multiple_choice" | "multi_select" | "ordering" | "short_answer" | "numeric" | "matching" | "fill_in_blank" | "long_answer" | "drawing"

promptstringyes—
prompt_formatstringyes

plaintext: the prompt renders verbatim. markdown: the same prompt text renders as Markdown. pdf: an uploaded PDF carries the question; the prompt text is the instruction shown above it.

one of "plaintext" | "markdown" | "pdf"

prompt_pdf_file_namestring | nullyes—
prompt_pdf_prefer_inline_displaybooleanyes

Whether the attached PDF is drawn beside the question or offered as a download only (`00051`). A one-page scenario belongs on screen; a long reference the taker works from on paper only buries the answers beneath it. Ignored on prompts with no PDF.

explanationstring | nullyes—
correct_booleanboolean | nullyes—
correct_numbernumber | nullyes—
tolerancenumber | nullyes—
optionsarray of ReviewQuestionOptionyes

In presentation order for choice and matching questions; in *authored* (correct) order for ordering questions; the accepted answers for short_answer, and for fill_in_blank with each one's blank_index.

drawing_starting_imagestring | nullyes

drawing questions: the image the taker draws over, as a data URL; null for a blank canvas, and on every other kind.

at most 3000000 characters · matches ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/]+=*$

response_booleanboolean | nullyes—
selected_option_idsarray of string (uuid) | nullyes

Chosen options of a choice question, or every item of an ordering question in the taker's arrangement.

response_textstring | nullyes

A short_answer or long_answer response.

response_numbernumber | nullyes

A numeric response.

response_matchesarray of ResponseMatch | nullyes

The pairs made so far on a matching question.

response_blanksarray of string | nullyes

A fill_in_blank response: one string per blank in prompt order, empty where the taker left a blank unfilled.

response_drawingstring | nullyes

A drawing response: the taker's canvas as one image data URL, the starting image beneath their strokes.

at most 4000000 characters · matches ^data:image\/(png|webp|jpeg);base64,[A-Za-z0-9+/]+=*$

answered_atstring (date-time) | nullyes

When the taker last answered the question; null when they never did.

is_correctboolean | nullyes

As graded at submit time; unanswered questions were graded incorrect. On a manually graded question, null until marked, then whether full marks were awarded.

points_possibleintegeryes

What the question was worth when the paper was built.

points_awardedinteger | nullyes

Points earned — the machine's at submit, or the marker's; null while ungraded.

manually_gradedbooleanyes

Whether a marker awards this question's points, per the paper's snapshot.

auto_resultboolean | nullyes

Markers only: on a manually graded machine-checkable question, the machine's verdict as a suggestion. Null for long answers, on unflagged questions, and for takers.

rubric_markdownstring | nullyes

The marking scheme: always for markers and quizzes:read holders, and for the taker only when its author chose to show it.

at most 50000 characters

feedback_markdownstring | nullyes

The marker's note to the taker, as markdown; null when none was left.

graded_atstring (date-time) | nullyes

When a marker last recorded points for this question; null otherwise.

jsonExample
{
  "question_id": "1b671a64-40d5-491e-99b0-da01ff1f3341",
  "position": 0,
  "kind": "true_false",
  "prompt": "string",
  "prompt_format": "plaintext",
  "prompt_pdf_file_name": "string",
  "prompt_pdf_prefer_inline_display": true,
  "explanation": "string",
  "correct_boolean": true,
  "correct_number": 0,
  "tolerance": 0,
  "options": [
    {
      "id": "1b671a64-40d5-491e-99b0-da01ff1f3341",
      "label": "string",
      "is_correct": true,
      "match_label": "string",
      "blank_index": 0
    }
  ],
  "drawing_starting_image": "data:image/png;base64,iVBORw0KGgo…",
  "response_boolean": true,
  "selected_option_ids": [
    "1b671a64-40d5-491e-99b0-da01ff1f3341"
  ],
  "response_text": "string",
  "response_number": 0,
  "response_matches": [
    {
      "option_id": "1b671a64-40d5-491e-99b0-da01ff1f3341",
      "match_option_id": "1b671a64-40d5-491e-99b0-da01ff1f3341"
    }
  ],
  "response_blanks": [
    "string"
  ],
  "response_drawing": "string",
  "answered_at": "2026-01-01T00:00:00.000Z",
  "is_correct": true,
  "points_possible": 0,
  "points_awarded": 0,
  "manually_graded": true,
  "auto_result": true,
  "rubric_markdown": "- 2 points: names both hazards\n- 1 point: names one\n- 0: neither",
  "feedback_markdown": "string",
  "graded_at": "2026-01-01T00:00:00.000Z"
}