Quiz Question Edit
PUT /courses//quiz// (GAP3)
Human edit of one quiz question. Flips its review status to pending (re-review required). No regeneration, no metering — this is a direct write, not an AI call.
module_index/position are int-typed on the route so FastAPI’s routing never confuses this path with a sibling string-keyed quiz route.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Request body for PUT /api/v1/courses/{id}/quiz/{module_index}/{position} (GAP3).
A human edit of one quiz question. Every field is optional: an omitted field keeps its current value (the route merges over the existing row -- a partial payload must never blank out the rest of the question).
New question text; omit to keep the current prompt
New option labels (MCQ only); omit to keep current options. Sending options REQUIRES restating correct
New correct answer (str, or list for multi-select); omit to keep current. Must match the effective option set
New answer explanation; omit to keep current
New question type (e.g. mcq_single); omit to keep current
Response
Successful Response
Response for PUT /api/v1/courses/{id}/quiz/{module_index}/{position}: the edited question re-read through the same reader as GET /quiz/review (contract parity). Deliberately NOT named QuizReviewQuestion: the review- read models land in a parallel branch and a same-name model here would merge-collide.
Question identity: m{module_index}_p{position}, matching the review-queue's quiz_question artifact identity
Module the question belongs to (0 = final exam)
Tier-offset position within the module (associate 0+, professional 1000+, expert 2000+)
Quiz tier: associate | professional | expert
Question type (e.g. mcq_single, mcq_multi, true_false)
Question text after the edit
Option set after the edit (empty for non-MCQ types)
Correct answer after the edit (str, or list for multi-select)
Answer explanation after the edit