{"openapi":"3.1.0","info":{"title":"SambodhIAS v2","version":"2.0.0"},"paths":{"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google":{"post":{"tags":["auth"],"summary":"Google Login","operationId":"google_login_api_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/apple":{"post":{"tags":["auth"],"summary":"Apple Login","description":"Sign in with Apple — sibling of google_login (App Store guideline 4.8).\n\nThe mobile app sends the raw identityToken from AppleAuthentication; we\nverify it against Apple's JWKS (aud = our bundle id, iss = appleid.apple.com)\nand create/link the user exactly like the Google flow.","operationId":"apple_login_api_auth_apple_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppleLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Mark the user's open session as ended. Frontend fires this with\nsendBeacon on logout-button click so it never blocks sign-out.","operationId":"logout_api_auth_logout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/phone":{"post":{"tags":["auth"],"summary":"Set Phone","description":"Set / update the current user's phone. Used by the post-Google-signup\nprompt (the one-tap flow can't collect a phone inline) and profile edits.","operationId":"set_phone_api_auth_phone_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","operationId":"refresh_token_api_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","operationId":"get_me_api_auth_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me/preferences":{"patch":{"tags":["auth"],"summary":"Update My Preferences","description":"Persist the user's UI/content language. Validated against the supported set;\nthe client mirrors this into a cookie (web) / secure store (mobile) so the\nlocale survives logout and is available before /auth/me resolves.","operationId":"update_my_preferences_api_auth_me_preferences_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferencesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/delete-account":{"post":{"tags":["auth"],"summary":"Delete Account","description":"Permanently delete the authenticated user's account and all their data.\n\nPassword accounts must re-enter their password; Google-only accounts (no\npassword) confirm explicitly. The single DELETE cascades across every v2.*\ntable that references the user (migration 055) — assessments, attempts,\nmemory, coverage, payments, sessions, etc. — while staff/audit rows\n(email_campaigns.sent_by, prompt_versions.edited_by) are anonymised, not\nremoved. Deleting the row invalidates every token the user holds\n(get_current_user and /refresh both reload the user and 401 once it's gone)\nand cascade-closes their sessions, so no separate revocation is needed.","operationId":"delete_account_api_auth_delete_account_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","operationId":"forgot_password_api_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"reset_password_api_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email","operationId":"verify_email_api_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments":{"post":{"tags":["assessments"],"summary":"Create Assessment","description":"Create a new assessment — current_affairs, adaptive, or seed-based.\n\nSuccess is recorded by each path's ``assessment.created`` (with how long\nthe user waited); a request that ends without a set is recorded here as\n``assessment.create_failed``, so slow and failed starts are both in\nv2.product_events.","operationId":"create_assessment_api_assessments_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssessmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["assessments"],"summary":"List Assessments","description":"List assessments for the current user (P10 perf fix: one query instead of\none COUNT per assessment; paginated, newest first).","operationId":"list_assessments_api_assessments_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/ca_monthly_compilations":{"get":{"tags":["assessments"],"summary":"List Ca Monthly Compilations","description":"List published Current Affairs monthly compilations (no auth required —\nlisting only, ids needed to start a compilation assessment).\n\nReturns rows ordered newest first.","operationId":"list_ca_monthly_compilations_api_assessments_ca_monthly_compilations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/assessments/{assessment_id}/study-booklet":{"get":{"tags":["assessments"],"summary":"Get Study Booklet","description":"Generate (or fetch cached) per-candidate PDF study booklet.\n\nReturns the PDF inline with the right content-type so the browser can\nrender it or trigger a download via Content-Disposition.","operationId":"get_study_booklet_api_assessments__assessment_id__study_booklet_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/revision-pack":{"get":{"tags":["assessments"],"summary":"Get Revision Pack","description":"In-app revision deck — wrong questions + their concept cards, grouped\nby syllabus tag. Lightweight JSON for the feedback page.","operationId":"get_revision_pack_api_assessments__assessment_id__revision_pack_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}":{"get":{"tags":["assessments"],"summary":"Get Assessment","description":"Get assessment detail with questions, responses, and evaluation.","operationId":"get_assessment_api_assessments__assessment_id__get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/evaluation-progress":{"get":{"tags":["assessments"],"summary":"Get Evaluation Progress","description":"Live progress for the evaluation pipeline — polled by the feedback page\nwhile `status != 'evaluated'` to render a real progress bar.\n\nReturns `{step, total, label, updated_at}` or `{step: null}` if no in-flight\nevaluation (either already done, or hasn't started yet).","operationId":"get_evaluation_progress_api_assessments__assessment_id__evaluation_progress_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/extend":{"post":{"tags":["assessments"],"summary":"Extend Assessment","description":"Append 10 more questions to an in-progress assessment using the same generation config.","operationId":"extend_assessment_api_assessments__assessment_id__extend_post","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/coverage":{"get":{"tags":["assessments"],"summary":"Get Assessment Coverage","description":"Get page-level coverage data for a specific assessment.","operationId":"get_assessment_coverage_api_assessments__assessment_id__coverage_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/source-page-info":{"get":{"tags":["assessments"],"summary":"Get Source Page Info","description":"Metadata for the source-page viewer — document name, total pages,\nsection title, and the weak-chunk previews shown below the rendered image.","operationId":"get_source_page_info_api_assessments__assessment_id__source_page_info_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"document_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"page","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Page"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/source-page-image":{"get":{"tags":["assessments"],"summary":"Get Source Page Image","description":"Render a textbook page as PNG with any weak chunk(s) highlighted.\n\nOn-the-fly PyMuPDF rasterization — no pre-baked images. Browser caches via\nHTTP so repeat clicks on the same page are near-instant.","operationId":"get_source_page_image_api_assessments__assessment_id__source_page_image_get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"document_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"page","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"Page"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/cron-evaluate-stuck":{"post":{"tags":["assessments"],"summary":"Cron Evaluate Stuck","description":"Manual / external trigger for the stuck-eval sweep (CRON_SECRET-auth,\nmirrors the NewsPulse cron). The primary schedule is the in-process loop in\napp/main.py; this endpoint is for on-demand runs (e.g. draining a backlog\nright after deploy).","operationId":"cron_evaluate_stuck_api_assessments_cron_evaluate_stuck_post","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/submit":{"post":{"tags":["assessments"],"summary":"Submit Answers","description":"Submit answers for an assessment.","operationId":"submit_answers_api_assessments__assessment_id__submit_post","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAnswersRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/answer":{"post":{"tags":["assessments"],"summary":"Save Single Answer","description":"Persist a single answer immediately (auto-save).\n\nPrevents data loss when a user closes the tab before pressing Submit.\nIdempotent — (assessment_id, question_id) is unique; subsequent calls\nupsert the stored answer.","operationId":"save_single_answer_api_assessments__assessment_id__answer_post","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/evaluate":{"post":{"tags":["evaluations"],"summary":"Evaluate Assessment","description":"Thin HTTP wrapper around the evaluation pipeline.\n\nRuns the deterministic *core* evaluation (which commits and makes the result\nvisible to the polling feedback page in ~1-2s), then schedules the LLM\nrevision-content *enrichment* (concept cards + news card-revision explainers)\nOFF the critical path. Previously those serial, blocking LLM calls ran inside\nthe gating transaction, so the feedback page couldn't show a score until they\nall finished (~1 minute).","operationId":"evaluate_assessment_api_assessments__assessment_id__evaluate_post","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assessments/{assessment_id}/model-answer/{question_id}":{"get":{"tags":["evaluations"],"summary":"Get Model Answer","description":"On-demand model answer generation (cached). Gated by score or attempt count.","operationId":"get_model_answer_api_assessments__assessment_id__model_answer__question_id__get","parameters":[{"name":"assessment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Assessment Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/topics":{"get":{"tags":["documents"],"summary":"List Topics","description":"Auto-discover subjects and topics from indexed documents.\nReturns a tree structure for the assessment creation wizard.","operationId":"list_topics_api_documents_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/documents/books":{"get":{"tags":["documents"],"summary":"List Books","description":"Return indexed books (documents) for book-level filtering in assessment configure.","operationId":"list_books_api_documents_books_get","parameters":[{"name":"subject","in":"query","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/subtopics":{"get":{"tags":["documents"],"summary":"List Subtopics","description":"Return the browsable subtopic glossary for a subject/topic.\nAlways derives from chapter names in heading_hierarchy (level 1 then 0),\nwith a section_title fallback when hierarchy is sparse.\nThe Subtopic table is intentionally skipped — it often contains low-quality\ndata (sentence fragments from section_titles) rather than clean chapter names.","operationId":"list_subtopics_api_documents_subtopics_get","parameters":[{"name":"subject","in":"query","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"document_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/index":{"post":{"tags":["documents"],"summary":"Trigger Indexing","description":"Trigger indexing of all documents in the data/ folder.\nSkips already-indexed documents with unchanged file hash.","operationId":"trigger_indexing_api_documents_index_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/documents":{"get":{"tags":["documents"],"summary":"List Documents","description":"List all indexed documents, optionally filtered by subject/topic.","operationId":"list_documents_api_documents_get","parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{document_id}":{"get":{"tags":["documents"],"summary":"Get Document","description":"Get document detail with its chunks.","operationId":"get_document_api_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/coverage/{subject}":{"get":{"tags":["documents"],"summary":"Get Coverage","description":"Get the user's coverage data for a subject (and optionally topic).\nReturns per-document, per-page coverage with performance scores.","operationId":"get_coverage_api_documents_coverage__subject__get","parameters":[{"name":"subject","in":"path","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard":{"get":{"tags":["dashboard"],"summary":"Get Dashboard","description":"Dashboard data: totals, averages, streaks, recent assessments, mastery summary.","operationId":"get_dashboard_api_dashboard_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/progress":{"get":{"tags":["progress"],"summary":"Get Progress","description":"Progress data: per-subject assessments and concept mastery.","operationId":"get_progress_api_progress_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/progress/v2":{"get":{"tags":["progress"],"summary":"Get Progress V2","description":"Progress v2 — scannable snapshot + actionable next-steps.\n\nReplaces the raw per-subject accordion from /progress with canonicalised\nsubject rollups (so \"History\" and \"history\" don't show as two rows) plus\na prioritised `next_actions` list merging revisions-due, weak areas,\nuntested topics, PYQ gaps, and concept gaps.","operationId":"get_progress_v2_api_progress_v2_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/progress/profile":{"get":{"tags":["progress"],"summary":"Get Candidate Profile","description":"Get candidate's learning profile: coverage per subject, weak/strong areas,\nmistake patterns. Used for adaptive assessment composition and candidate matching.","operationId":"get_candidate_profile_api_progress_profile_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat":{"post":{"tags":["chat"],"summary":"Chat","description":"Chat with the AI tutor. Uses RAG context + memory for grounded responses.","operationId":"chat_api_chat_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/concepts":{"get":{"tags":["concepts"],"summary":"List Concepts","description":"List concept mastery for the current user.","operationId":"list_concepts_api_concepts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/concepts/{concept_id}/explain":{"get":{"tags":["concepts"],"summary":"Explain Concept","description":"Get a concept explanation card.\nWhen assessment_id is provided, generates a targeted explanation based on\nthe actual question the user got wrong — not a generic concept overview.\nWithout assessment_id, checks memory_semantic cache first; generates via LLM on cache miss.","operationId":"explain_concept_api_concepts__concept_id__explain_get","parameters":[{"name":"concept_id","in":"path","required":true,"schema":{"type":"string","title":"Concept Id"}},{"name":"assessment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assessment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revisions/count":{"get":{"tags":["revisions"],"summary":"Count Pending Reviews","description":"Count pending revision items, optionally filtered by review_type.","operationId":"count_pending_reviews_api_revisions_count_get","parameters":[{"name":"review_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revisions":{"get":{"tags":["revisions"],"summary":"List Pending Revisions","description":"List pending revision schedules, optionally filtered by review_type.","operationId":"list_pending_revisions_api_revisions_get","parameters":[{"name":"review_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revisions/spaced":{"get":{"tags":["revisions"],"summary":"List Spaced Revisions","description":"List concepts due for spaced repetition review (from concept_masteries.next_review_at).","operationId":"list_spaced_revisions_api_revisions_spaced_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revisions/spaced/{mastery_id}/complete":{"post":{"tags":["revisions"],"summary":"Complete Spaced Revision","description":"Complete a spaced revision by updating SM-2 fields on ConceptMastery.","operationId":"complete_spaced_revision_api_revisions_spaced__mastery_id__complete_post","parameters":[{"name":"mastery_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mastery Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revisions/{revision_id}/complete":{"post":{"tags":["revisions"],"summary":"Complete Revision","description":"Mark a revision as complete with a quality rating (0-5).","operationId":"complete_revision_api_revisions__revision_id__complete_post","parameters":[{"name":"revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Revision Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pyq/coverage":{"get":{"tags":["pyq"],"summary":"Get Pyq Coverage","description":"PYQ coverage: overall, by year, and by subject.","operationId":"get_pyq_coverage_api_pyq_coverage_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pyq/practice/{year}":{"post":{"tags":["pyq"],"summary":"Create Pyq Practice","description":"Create a practice assessment from PYQ questions for a specific year.","operationId":"create_pyq_practice_api_pyq_practice__year__post","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pyq/years":{"get":{"tags":["pyq"],"summary":"Get Available Years","description":"List years that have PYQ questions ready for practice, with how many.\n\nCounts exactly what create_pyq_practice serves (source 'pyq:<year>', valid\nrows only), so the number on each year tile matches the paper the student\ngets — retired questions are excluded.","operationId":"get_available_years_api_pyq_years_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/preparation/state":{"get":{"tags":["preparation"],"summary":"Get Preparation State","description":"Comprehensive preparation state: syllabus coverage, concept readiness, recommendations.","operationId":"get_preparation_state_api_preparation_state_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/generate":{"post":{"tags":["newspulse"],"summary":"Generate Cards","description":"Trigger the NewsPulse pipeline (admin only).","operationId":"generate_cards_api_newspulse_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cron-trigger":{"post":{"tags":["newspulse"],"summary":"Cron Trigger","description":"Trigger NewsPulse pipeline via CRON_SECRET header (for the Render cron job).\n\nKicks the pipeline off as a FastAPI BackgroundTask and returns 202\nAccepted immediately. Keeps the endpoint under 100ms regardless of\npipeline duration (which routinely exceeds 5 minutes after the\nclustering stage was added). The cron job only needs the 202 and\nverifies the outcome via /last-run; manual curl triggers no longer time out.","operationId":"cron_trigger_api_newspulse_cron_trigger_post","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/last-run":{"get":{"tags":["newspulse"],"summary":"Last Pipeline Run","description":"Return the most recent NewsPulse pipeline run for cron verification.\n\nCron-secret protected (same as /cron-trigger). The Render cron job\n(scripts/cron/run_pipeline.py) polls this after triggering — since the\npipeline runs async, a 202 alone can't confirm cards were produced. The job\nfails (and Render alerts) if the latest run is 'failed' or 'degraded', or\nif no run is recorded after the trigger.","operationId":"last_pipeline_run_api_newspulse_last_run_get","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/today":{"get":{"tags":["newspulse"],"summary":"Get Today Cards","description":"Get today's published concept cards (IST calendar day).","operationId":"get_today_cards_api_newspulse_today_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/{card_id}/view":{"post":{"tags":["newspulse"],"summary":"Mark Card Viewed","description":"Upsert a per-user 'viewed' record for a NewsPulse card.\n\nFrontend fires this on a 3-second debounced expand. P3 perf fix\n(docs/perf-audit-2026-09-26/perf_db.md D8): a single INSERT ... ON\nCONFLICT DO UPDATE replaces the old SELECT-then-UPDATE/INSERT pair, and\nthe update's WHERE clause makes a re-post of the same card within 10\nminutes with no bigger dwell_ms a true no-op — no row rewrite, no index\nchurn on a table that took 873k unconditional UPDATEs in a week. Returns\nthe card's fresh state so the caller can patch its cache in place instead\nof invalidating + refetching /cards/states.","operationId":"mark_card_viewed_api_newspulse_cards__card_id__view_post","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkViewedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/states":{"get":{"tags":["newspulse"],"summary":"Get Card States","description":"Per-card state map for the current user, plus optional window progress.\n\nReturns:\n    {\n      \"states\": { card_id: {read, tested, needs_revision, mastered} },\n      \"progress\": {window_label, total_cards, tested_cards, untouched_cards}\n                   (only if window_mode given)\n    }","operationId":"get_card_states_api_newspulse_cards_states_get","parameters":[{"name":"window_mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"rolling_30 | calendar_month","title":"Window Mode"},"description":"rolling_30 | calendar_month"},{"name":"window_value","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM if calendar_month","title":"Window Value"},"description":"YYYY-MM if calendar_month"},{"name":"card_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated card ids to restrict the state map to (P17 perf fix). Omitting it keeps the old behaviour — every view/coverage/reaction row the user has ever produced — for backward compatibility during rollout; clients should migrate to always passing the ids of the cards currently on screen.","title":"Card Ids"},"description":"Comma-separated card ids to restrict the state map to (P17 perf fix). Omitting it keeps the old behaviour — every view/coverage/reaction row the user has ever produced — for backward compatibility during rollout; clients should migrate to always passing the ids of the cards currently on screen."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/{card_id}/like":{"put":{"tags":["newspulse"],"summary":"Like Card","operationId":"like_card_api_newspulse_cards__card_id__like_put","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["newspulse"],"summary":"Unlike Card","operationId":"unlike_card_api_newspulse_cards__card_id__like_delete","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/{card_id}/bookmark":{"put":{"tags":["newspulse"],"summary":"Bookmark Card","operationId":"bookmark_card_api_newspulse_cards__card_id__bookmark_put","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["newspulse"],"summary":"Unbookmark Card","operationId":"unbookmark_card_api_newspulse_cards__card_id__bookmark_delete","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/{card_id}/share":{"post":{"tags":["newspulse"],"summary":"Share Card","description":"Log a share event (fire-and-forget from the client).\n\nClients build the URL themselves from the card's `share_path` (see\ncardShareUrl in packages/shared) so the native share sheet opens inside\nthe tap's user-gesture window — awaiting this call first would lose it on\nSafari. Only published cards have a public page, so anything else 404s.","operationId":"share_card_api_newspulse_cards__card_id__share_post","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/cards/bookmarks":{"get":{"tags":["newspulse"],"summary":"List Bookmarks","description":"The Saved tab: the user's bookmarked cards, most recently saved first.\n\nGoes through the same free-tier teaser as every other list, so bookmarking\na locked card never becomes a paywall bypass.","operationId":"list_bookmarks_api_newspulse_cards_bookmarks_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/months":{"get":{"tags":["newspulse"],"summary":"List Card Months","description":"Return calendar months with published-card counts (newest first), used\nby the assessment 'pick a month' dropdown.","operationId":"list_card_months_api_newspulse_months_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/stats/summary":{"get":{"tags":["newspulse"],"summary":"Get Stats","description":"Pipeline stats: cards/questions generated today (IST day), LLM costs.","operationId":"get_stats_api_newspulse_stats_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse":{"get":{"tags":["newspulse"],"summary":"List Cards","description":"List concept cards with optional filters.","operationId":"list_cards_api_newspulse_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Date"},"description":"YYYY-MM-DD"},{"name":"gs_paper","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gs Paper"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"news / editorial / all","title":"Category"},"description":"news / editorial / all"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"draft/published/archived","title":"Status"},"description":"draft/published/archived"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/{card_id}":{"get":{"tags":["newspulse"],"summary":"Get Card","description":"Get a single concept card with its linked questions.\n\nThis endpoint is the free-tier GATE: non-subscribers may open 30 distinct\ncards (counted from the launch epoch). Serving an unviewed card to an\nunder-limit user records the view server-side; over the limit → 402.","operationId":"get_card_api_newspulse__card_id__get","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["newspulse"],"summary":"Edit Card","description":"Edit a concept card (admin only).","operationId":"edit_card_api_newspulse__card_id__patch","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditCardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newspulse/{card_id}/publish":{"post":{"tags":["newspulse"],"summary":"Publish Card","description":"Promote draft → published (admin only).","operationId":"publish_card_api_newspulse__card_id__publish_post","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Card Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mains/upload-answer-images":{"post":{"tags":["mains"],"summary":"Upload Answer Images","description":"Upload 1-5 handwritten answer images. Returns image IDs for OCR.","operationId":"upload_answer_images_api_mains_upload_answer_images_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_answer_images_api_mains_upload_answer_images_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mains/ocr-answer":{"post":{"tags":["mains"],"summary":"Ocr Answer","description":"Run OCR on previously uploaded answer images. Returns extracted text + structural metadata.","operationId":"ocr_answer_api_mains_ocr_answer_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OcrRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mains2026/series":{"get":{"tags":["mains2026"],"summary":"Get Series","operationId":"get_series_api_mains2026_series_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mains2026/tests/{test_id}/start":{"post":{"tags":["mains2026"],"summary":"Start Test","operationId":"start_test_api_mains2026_tests__test_id__start_post","parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news":{"get":{"tags":["places-in-news"],"summary":"List Places","operationId":"list_places_api_places_in_news_get","parameters":[{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"place_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Type"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/stats":{"get":{"tags":["places-in-news"],"summary":"Stats","description":"Coverage strip for the Places-in-News landing page.","operationId":"stats_api_places_in_news_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/practice":{"post":{"tags":["places-in-news"],"summary":"Practice","description":"Returns up to `count` random valid questions matching the filters.\n\nNo Assessment row created; the frontend tracks correct/wrong locally.\nPaywall: free users get the first `PIN_FREE_QUESTION_LIMIT` questions in\ndeterministic order; once they've attempted that many, /practice returns\n402 and the frontend shows the unlock modal.","operationId":"practice_api_places_in_news_practice_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PracticeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/progress":{"get":{"tags":["places-in-news"],"summary":"Get Progress","operationId":"get_progress_api_places_in_news_progress_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["places-in-news"],"summary":"Update Progress","operationId":"update_progress_api_places_in_news_progress_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/missed":{"post":{"tags":["places-in-news"],"summary":"Record Missed Place","description":"Mark a place as 'needs revision' for the current user. Called by the\npractice page when a user submits a wrong answer.  Idempotent — if a\npending row already exists for the (user, place) pair, bumps miss_count\nand last_attempted_at instead of inserting a duplicate.","operationId":"record_missed_place_api_places_in_news_missed_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordMissedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["places-in-news"],"summary":"List Missed Places","description":"Return places this user got wrong and hasn't yet marked reviewed.\nThe revision row stores concept_id = str(place.id); we re-hydrate the\nplace rows in a second query so the UI can render the full concept card.","operationId":"list_missed_places_api_places_in_news_missed_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/missed/{revision_id}/done":{"post":{"tags":["places-in-news"],"summary":"Mark Missed Reviewed","description":"Flip a pending missed-place revision row to completed.","operationId":"mark_missed_reviewed_api_places_in_news_missed__revision_id__done_post","parameters":[{"name":"revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Revision Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/{place_id}":{"get":{"tags":["places-in-news"],"summary":"Get Place","operationId":"get_place_api_places_in_news__place_id__get","parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Place Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/places-in-news/regenerate/{place_id}":{"post":{"tags":["places-in-news"],"summary":"Regenerate","operationId":"regenerate_api_places_in_news_regenerate__place_id__post","parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Place Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environment-in-news/stats":{"get":{"tags":["environment-in-news"],"summary":"Stats","operationId":"stats_api_environment_in_news_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environment-in-news/practice":{"post":{"tags":["environment-in-news"],"summary":"Practice","description":"Returns valid Env questions in deterministic order.\n\nFree users get the first ENV_FREE_QUESTION_LIMIT; the 402 fires once\nthey've already attempted that many.","operationId":"practice_api_environment_in_news_practice_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environment-in-news/progress":{"get":{"tags":["environment-in-news"],"summary":"Get Progress","operationId":"get_progress_api_environment_in_news_progress_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["environment-in-news"],"summary":"Update Progress","operationId":"update_progress_api_environment_in_news_progress_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/today":{"get":{"tags":["crossword"],"summary":"Today","description":"Status view: today's puzzle meta + own attempt + entitlement. Never 402.","operationId":"today_api_crossword_today_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/puzzles/{puzzle_id}/start":{"post":{"tags":["crossword"],"summary":"Start","operationId":"start_api_crossword_puzzles__puzzle_id__start_post","parameters":[{"name":"puzzle_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Puzzle Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/attempts/{attempt_id}/state":{"put":{"tags":["crossword"],"summary":"Save State","description":"Debounced autosave of the letter grid. Display state only — never scored.","operationId":"save_state_api_crossword_attempts__attempt_id__state_put","parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/attempts/{attempt_id}/check":{"post":{"tags":["crossword"],"summary":"Check Word","operationId":"check_word_api_crossword_attempts__attempt_id__check_post","parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/attempts/{attempt_id}/hint":{"post":{"tags":["crossword"],"summary":"Get Hint","operationId":"get_hint_api_crossword_attempts__attempt_id__hint_post","parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/attempts/{attempt_id}/reveal":{"post":{"tags":["crossword"],"summary":"Reveal Letter","operationId":"reveal_letter_api_crossword_attempts__attempt_id__reveal_post","parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/puzzles/{puzzle_id}/leaderboard":{"get":{"tags":["crossword"],"summary":"Leaderboard","operationId":"leaderboard_api_crossword_puzzles__puzzle_id__leaderboard_get","parameters":[{"name":"puzzle_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Puzzle Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/archive":{"get":{"tags":["crossword"],"summary":"Archive","description":"Past puzzles, newest first. Listing is free; playing goes through\n/start, where the lifetime free-play gate applies.","operationId":"archive_api_crossword_archive_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/cron-trigger":{"post":{"tags":["crossword"],"summary":"Cron Trigger","operationId":"cron_trigger_api_crossword_cron_trigger_post","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/last-run":{"get":{"tags":["crossword"],"summary":"Last Pipeline Run","operationId":"last_pipeline_run_api_crossword_last_run_get","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crossword/admin/generate":{"post":{"tags":["crossword"],"summary":"Admin Generate","description":"Synchronous generation for launch seeding and repair.","operationId":"admin_generate_api_crossword_admin_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags":{"get":{"tags":["admin-question-flags"],"summary":"List Queue","operationId":"list_queue_api_admin_question_flags_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},{"name":"source_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Prefix"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"question_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Question Id"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"most_flagged","title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/summary":{"get":{"tags":["admin-question-flags"],"summary":"Summary","operationId":"summary_api_admin_question_flags_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/crowd-suspects":{"get":{"tags":["admin-question-flags"],"summary":"Crowd Suspects","description":"MCQs where the most-chosen option is NOT the key and holds ≥ min_share of answers.","operationId":"crowd_suspects_api_admin_question_flags_crowd_suspects_get","parameters":[{"name":"min_answers","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":3,"default":8,"title":"Min Answers"}},{"name":"min_share","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.3,"default":0.5,"title":"Min Share"}},{"name":"include_dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Dismissed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/questions/{question_id}":{"get":{"tags":["admin-question-flags"],"summary":"Get Group","operationId":"get_group_api_admin_question_flags_questions__question_id__get","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/questions/{question_id}/resolve":{"post":{"tags":["admin-question-flags"],"summary":"Resolve Question","operationId":"resolve_question_api_admin_question_flags_questions__question_id__resolve_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/questions/{question_id}/regrade":{"post":{"tags":["admin-question-flags"],"summary":"Regrade Question","operationId":"regrade_question_api_admin_question_flags_questions__question_id__regrade_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-flags/questions/{question_id}/recheck":{"post":{"tags":["admin-question-flags"],"summary":"Recheck Question","operationId":"recheck_question_api_admin_question_flags_questions__question_id__recheck_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/overview":{"get":{"tags":["admin-growth"],"summary":"Growth Overview","operationId":"growth_overview_api_admin_growth_overview_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/funnel":{"get":{"tags":["admin-growth"],"summary":"Growth Funnel","operationId":"growth_funnel_api_admin_growth_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/retention":{"get":{"tags":["admin-growth"],"summary":"Growth Retention","operationId":"growth_retention_api_admin_growth_retention_get","parameters":[{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":52,"minimum":4,"default":12,"title":"Weeks"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/features":{"get":{"tags":["admin-growth"],"summary":"Growth Features","operationId":"growth_features_api_admin_growth_features_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/dropoffs":{"get":{"tags":["admin-growth"],"summary":"Growth Dropoffs","operationId":"growth_dropoffs_api_admin_growth_dropoffs_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/latency":{"get":{"tags":["admin-growth"],"summary":"Growth Latency","operationId":"growth_latency_api_admin_growth_latency_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/segments":{"get":{"tags":["admin-growth"],"summary":"Growth Segments","operationId":"growth_segments_api_admin_growth_segments_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/segments/{name}":{"get":{"tags":["admin-growth"],"summary":"Growth Segment Users","operationId":"growth_segment_users_api_admin_growth_segments__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/watchlist":{"get":{"tags":["admin-growth"],"summary":"Growth Watchlist","operationId":"growth_watchlist_api_admin_growth_watchlist_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/users/{user_id}/timeline":{"get":{"tags":["admin-growth"],"summary":"Growth User Timeline","operationId":"growth_user_timeline_api_admin_growth_users__user_id__timeline_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/export":{"get":{"tags":["admin-growth"],"summary":"Growth Export","description":"The standalone dashboard's input: no emails, no user ids.","operationId":"growth_export_api_admin_growth_export_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"First IST date of a custom window (YYYY-MM-DD)","title":"Start"},"description":"First IST date of a custom window (YYYY-MM-DD)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today","title":"End"},"description":"Last IST date of a custom window (YYYY-MM-DD); defaults to today"},{"name":"x-cron-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/cron-trigger":{"post":{"tags":["admin-growth"],"summary":"Cron Trigger","operationId":"cron_trigger_api_admin_growth_cron_trigger_post","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/growth/last-run":{"get":{"tags":["admin-growth"],"summary":"Last Pipeline Run","operationId":"last_pipeline_run_api_admin_growth_last_run_get","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/llm-metrics":{"get":{"tags":["admin"],"summary":"Llm Metrics","operationId":"llm_metrics_api_admin_llm_metrics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/classify-pyq-chunks":{"post":{"tags":["admin"],"summary":"Trigger Pyq Classification","description":"Classify PYQ chunks into UPSC subjects/topics via LLM. Idempotent — skips already-tagged chunks.","operationId":"trigger_pyq_classification_api_admin_classify_pyq_chunks_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts":{"get":{"tags":["admin"],"summary":"List Prompts","description":"List all prompt templates.","operationId":"list_prompts_api_admin_prompts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{slug}":{"get":{"tags":["admin"],"summary":"Get Prompt Detail","description":"Get full prompt detail including version history.","operationId":"get_prompt_detail_api_admin_prompts__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Prompt","description":"Update a prompt by creating a new version.","operationId":"update_prompt_api_admin_prompts__slug__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePromptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{slug}/rollback":{"post":{"tags":["admin"],"summary":"Rollback Prompt","description":"Rollback to a previous prompt version.","operationId":"rollback_prompt_api_admin_prompts__slug__rollback_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{slug}/reset":{"post":{"tags":["admin"],"summary":"Reset Prompt","description":"Reset prompt to hardcoded default.","operationId":"reset_prompt_api_admin_prompts__slug__reset_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/question-pool/stats":{"get":{"tags":["admin"],"summary":"Question Pool Stats","description":"Question pool statistics: coverage per subject, total pool size.","operationId":"question_pool_stats_api_admin_question_pool_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pregen-question-pool":{"post":{"tags":["admin"],"summary":"Pregen Question Pool","description":"Pre-generate questions for all subtopics where the pool has fewer than\npool_target questions.  Returns immediately; processing runs in background.\nCheck /admin/question-pool/stats for progress.","operationId":"pregen_question_pool_api_admin_pregen_question_pool_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PregenPoolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/reindex-ocr":{"post":{"tags":["admin"],"summary":"Reindex With Ocr","description":"Re-index specific documents using Gemini OCR for better heading detection.\nUse for text-based PDFs with OCR encoding artifacts or split chapter titles.\nReturns immediately; processing runs in the background.","operationId":"reindex_with_ocr_api_admin_reindex_ocr_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReindexOcrRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"Admin List Users","description":"List every user with rolled-up activity over the last `days` days.\nOne round-trip — uses CTEs aggregating user_sessions + user_page_visits.","operationId":"admin_list_users_api_admin_users_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/test-flag":{"patch":{"tags":["admin"],"summary":"Admin Set User Test Flag","description":"Mark / unmark an account as a QA or store-review account. Test accounts\nare excluded from every growth metric (see growth_metrics_service).","operationId":"admin_set_user_test_flag_api_admin_users__user_id__test_flag_patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestFlagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/sessions":{"get":{"tags":["admin"],"summary":"Admin User Sessions","description":"Per-user session list with computed duration + sections touched.","operationId":"admin_user_sessions_api_admin_users__user_id__sessions_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/sections":{"get":{"tags":["admin"],"summary":"Admin User Sections","description":"Per-section dwell breakdown for a single user — bar chart data.","operationId":"admin_user_sections_api_admin_users__user_id__sections_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/newspulse/engagement":{"get":{"tags":["admin"],"summary":"Admin Newspulse Engagement","description":"Likes / saves / shares / views rolled up by card, subject and syllabus\ntag, plus share channels and signups attributed to shared links.","operationId":"admin_newspulse_engagement_api_admin_newspulse_engagement_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/newspulse-interests":{"get":{"tags":["admin"],"summary":"Admin User Newspulse Interests","description":"One user's NewsPulse interest mix + bookmarks they never opened.","operationId":"admin_user_newspulse_interests_api_admin_users__user_id__newspulse_interests_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/recipients":{"get":{"tags":["admin"],"summary":"Admin Email Recipients","description":"All users still opted in for email. Returned shape feeds the recipient\npicker on the Compose screen.\n\nOptional `segment` narrows the audience. 'play_test_optin' returns only users\nwho consented to closed testing (joined to v2.play_test_optins) — this is how\nthe admin targets Email 2 (testing links) at exactly the opt-in list.","operationId":"admin_email_recipients_api_admin_email_recipients_get","parameters":[{"name":"segment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/preview":{"post":{"tags":["admin"],"summary":"Admin Email Preview","description":"Render markdown → safe HTML so the Compose UI can show a faithful preview\n(server-side render keeps sanitize logic in one place).","operationId":"admin_email_preview_api_admin_email_preview_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/send":{"post":{"tags":["admin"],"summary":"Admin Email Send","description":"Create a campaign + recipient rows, schedule the background send loop,\nreturn 202 with the campaign id immediately.","operationId":"admin_email_send_api_admin_email_send_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSendRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/campaigns/{campaign_id}/coverage":{"get":{"tags":["admin"],"summary":"Admin Email Campaign Coverage","description":"Eligible users who have no recipient row on this campaign.\n\nThe gap a campaign's own counters cannot show. Computed live against current\neligibility, so it answers \"who is still missing this?\" rather than what was\ntrue at creation (that is the stored coverage_gap).\n\njoined_after_campaign separates the benign case — people who registered\nafter the campaign was built, who were never candidates — from users who\nexisted and were simply not selected.","operationId":"admin_email_campaign_coverage_api_admin_email_campaigns__campaign_id__coverage_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/campaigns/{campaign_id}/backfill":{"post":{"tags":["admin"],"summary":"Admin Email Campaign Backfill","description":"Add recipient rows for eligible users this campaign missed, and send.\n\nAdds rows as 'pending' and re-enters the normal send loop, so backfilled\nrecipients get the identical body, personalization and unsubscribe handling\nas the original run — and the loop's pending-only select means nobody who\nalready received it can be sent to twice.","operationId":"admin_email_campaign_backfill_api_admin_email_campaigns__campaign_id__backfill_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBackfillRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/cron-resume-stalled":{"post":{"tags":["admin"],"summary":"Cron Resume Stalled Campaigns","description":"Manual / external trigger for the stalled-campaign sweep (CRON_SECRET-auth,\nmirrors /api/assessments/cron-evaluate-stuck). The primary schedule is the\nin-process loop in app/main.py; this is for draining right after a deploy.","operationId":"cron_resume_stalled_campaigns_api_admin_email_cron_resume_stalled_post","parameters":[{"name":"x-cron-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/upload-file":{"post":{"tags":["admin"],"summary":"Admin Email Upload File","description":"Generic attachment upload — any non-executable MIME, ≤25 MB.\n\nReturns a permanent public URL the admin can link from the email body\n(auto-inserted as `[📎 filename (1.2 MB)](url)`).\n\nFor image-specific upload (used by paste/drag inline images, compresses\nJPG/PNG), use POST /email/upload-image instead.","operationId":"admin_email_upload_file_api_admin_email_upload_file_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_email_upload_file_api_admin_email_upload_file_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/upload-image":{"post":{"tags":["admin"],"summary":"Admin Email Upload Image","description":"Upload a single image into the public `email-assets` Supabase bucket.\nReturns a permanent public URL the admin can paste/embed in email body.\n\nEnforces ≤5 MB and image/* content type. Oversized images get compressed\nvia the existing storage_service.compress_image() helper (PIL-based).","operationId":"admin_email_upload_image_api_admin_email_upload_image_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_email_upload_image_api_admin_email_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/campaigns":{"get":{"tags":["admin"],"summary":"Admin Email Campaigns","operationId":"admin_email_campaigns_api_admin_email_campaigns_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/email/campaigns/{campaign_id}":{"get":{"tags":["admin"],"summary":"Admin Email Campaign Detail","operationId":"admin_email_campaign_detail_api_admin_email_campaigns__campaign_id__get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/play-test/opt-ins":{"get":{"tags":["admin"],"summary":"Admin Play Test Optins","description":"All closed-testing opt-ins for the admin console: the Play Store Gmails to\npaste into Play Console, plus per-tester reachability for Email 2.\n\n`reachable` = matched to an account that is still email-opted-in and active,\ni.e. the testing-links broadcast (segment=play_test_optin) will reach them.","operationId":"admin_play_test_optins_api_admin_play_test_opt_ins_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/specialists":{"get":{"tags":["mission-control"],"summary":"Mission Specialists","operationId":"mission_specialists_api_admin_mission_control_specialists_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/specialists/{slug}":{"get":{"tags":["mission-control"],"summary":"Mission Specialist Detail","operationId":"mission_specialist_detail_api_admin_mission_control_specialists__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mission-control"],"summary":"Update Mission Specialist","operationId":"update_mission_specialist_api_admin_mission_control_specialists__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSpecialistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/specialists/{slug}/run":{"post":{"tags":["mission-control"],"summary":"Run Mission Specialist","operationId":"run_mission_specialist_api_admin_mission_control_specialists__slug__run_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/overview":{"get":{"tags":["mission-control"],"summary":"Mission Overview","operationId":"mission_overview_api_admin_mission_control_overview_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/tasks":{"get":{"tags":["mission-control"],"summary":"Mission Tasks","operationId":"mission_tasks_api_admin_mission_control_tasks_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"specialist_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Specialist Slug"}},{"name":"workflow","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mission-control"],"summary":"Create Mission Task","operationId":"create_mission_task_api_admin_mission_control_tasks_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMissionTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/tasks/{task_id}":{"get":{"tags":["mission-control"],"summary":"Mission Task Detail","operationId":"mission_task_detail_api_admin_mission_control_tasks__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/tasks/{task_id}/run":{"post":{"tags":["mission-control"],"summary":"Run Mission Task","operationId":"run_mission_task_api_admin_mission_control_tasks__task_id__run_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/scan":{"post":{"tags":["mission-control"],"summary":"Run All Specialists","description":"Run every active specialist. Kept at /scan so the existing client route\nstays valid; it now runs the agents rather than only queueing tasks.","operationId":"run_all_specialists_api_admin_mission_control_scan_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/approvals/{approval_id}/approve":{"post":{"tags":["mission-control"],"summary":"Approve Mission Action","operationId":"approve_mission_action_api_admin_mission_control_approvals__approval_id__approve_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DecideApprovalRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/approvals/{approval_id}/reject":{"post":{"tags":["mission-control"],"summary":"Reject Mission Action","operationId":"reject_mission_action_api_admin_mission_control_approvals__approval_id__reject_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DecideApprovalRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/approvals/{approval_id}/execute":{"post":{"tags":["mission-control"],"summary":"Execute Mission Action","description":"Execute the fix behind an approval (real side effects, audit-logged).","operationId":"execute_mission_action_api_admin_mission_control_approvals__approval_id__execute_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DecideApprovalRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/policies":{"get":{"tags":["mission-control"],"summary":"Mission Policies","operationId":"mission_policies_api_admin_mission_control_policies_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mission-control/policies/{key}":{"patch":{"tags":["mission-control"],"summary":"Update Mission Policy","operationId":"update_mission_policy_api_admin_mission_control_policies__key__patch","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePolicyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","operationId":"submit_feedback_api_feedback_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_feedback_api_feedback_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/mine":{"get":{"tags":["feedback"],"summary":"List My Feedback","operationId":"list_my_feedback_api_feedback_mine_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/question-flags":{"post":{"tags":["question-flags"],"summary":"Create Flag","operationId":"create_flag_api_question_flags_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/question-flags/mine":{"get":{"tags":["question-flags"],"summary":"List My Flags","operationId":"list_my_flags_api_question_flags_mine_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback":{"get":{"tags":["admin-feedback"],"summary":"List Feedback","operationId":"list_feedback_api_admin_feedback_get","parameters":[{"name":"area","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"classification_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification Status"}},{"name":"has_ticket","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Ticket"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/{feedback_id}":{"get":{"tags":["admin-feedback"],"summary":"Get Feedback","operationId":"get_feedback_api_admin_feedback__feedback_id__get","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feedback Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin-feedback"],"summary":"Patch Feedback","operationId":"patch_feedback_api_admin_feedback__feedback_id__patch","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feedback Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchFeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/{feedback_id}/reclassify":{"post":{"tags":["admin-feedback"],"summary":"Reclassify Feedback","operationId":"reclassify_feedback_api_admin_feedback__feedback_id__reclassify_post","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feedback Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/tickets":{"post":{"tags":["admin-feedback"],"summary":"Create Ticket","operationId":"create_ticket_api_admin_feedback_tickets_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin-feedback"],"summary":"List Tickets","operationId":"list_tickets_api_admin_feedback_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"}},{"name":"assignee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assignee Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/tickets/{ticket_id}":{"get":{"tags":["admin-feedback"],"summary":"Get Ticket","operationId":"get_ticket_api_admin_feedback_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin-feedback"],"summary":"Patch Ticket","operationId":"patch_ticket_api_admin_feedback_tickets__ticket_id__patch","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchTicketRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/tickets/{ticket_id}/attach":{"post":{"tags":["admin-feedback"],"summary":"Attach Feedback","operationId":"attach_feedback_api_admin_feedback_tickets__ticket_id__attach_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/feedback/tickets/{ticket_id}/detach":{"post":{"tags":["admin-feedback"],"summary":"Detach Feedback","operationId":"detach_feedback_api_admin_feedback_tickets__ticket_id__detach_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/themes":{"get":{"tags":["admin-mains2026"],"summary":"List Themes","operationId":"list_themes_api_admin_mains2026_themes_get","parameters":[{"name":"gs_paper","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gs Paper"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/candidates":{"get":{"tags":["admin-mains2026"],"summary":"List Candidates","operationId":"list_candidates_api_admin_mains2026_candidates_get","parameters":[{"name":"gs_paper","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gs Paper"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"candidate","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/questions/{question_id}":{"patch":{"tags":["admin-mains2026"],"summary":"Update Question","operationId":"update_question_api_admin_mains2026_questions__question_id__patch","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__admin_mains2026__UpdateQuestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/series":{"get":{"tags":["admin-mains2026"],"summary":"List Series","operationId":"list_series_api_admin_mains2026_series_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/tests":{"post":{"tags":["admin-mains2026"],"summary":"Build Test","operationId":"build_test_api_admin_mains2026_tests_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildTestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/mains2026/series/{series_id}/publish":{"post":{"tags":["admin-mains2026"],"summary":"Publish Series","operationId":"publish_series_api_admin_mains2026_series__series_id__publish_post","parameters":[{"name":"series_id","in":"path","required":true,"schema":{"type":"string","title":"Series Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/questions":{"get":{"tags":["admin-questions"],"summary":"Search Questions","description":"Search the question bank. `q` matches question text or explanation; `id` is exact.","operationId":"search_questions_api_admin_questions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"question_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type"}},{"name":"is_valid","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/questions/{question_id}":{"patch":{"tags":["admin-questions"],"summary":"Update Question","description":"Edit a question and/or flip its validity. Only provided fields change.","operationId":"update_question_api_admin_questions__question_id__patch","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Question Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__admin_questions__UpdateQuestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telemetry/visits":{"post":{"tags":["telemetry"],"summary":"Post Visits","operationId":"post_visits_api_telemetry_visits_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitsBatch"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telemetry/events":{"post":{"tags":["telemetry"],"summary":"Post Events","description":"Buffer a batch of CLIENT product events. Server-only names (e.g.\n``payment.paid``) and malformed event ids are counted as ``rejected``.","operationId":"post_events_api_telemetry_events_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductEventsBatch"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pin/status":{"get":{"tags":["payments"],"summary":"Pin Status","operationId":"pin_status_api_payments_pin_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pin/order":{"post":{"tags":["payments"],"summary":"Create Pin Order","operationId":"create_pin_order_api_payments_pin_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pin/verify":{"post":{"tags":["payments"],"summary":"Verify Pin Payment","operationId":"verify_pin_payment_api_payments_pin_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pyq/status":{"get":{"tags":["payments"],"summary":"Pyq Status","operationId":"pyq_status_api_payments_pyq_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pyq/order":{"post":{"tags":["payments"],"summary":"Create Pyq Order","operationId":"create_pyq_order_api_payments_pyq_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/pyq/verify":{"post":{"tags":["payments"],"summary":"Verify Pyq Payment","operationId":"verify_pyq_payment_api_payments_pyq_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/env/status":{"get":{"tags":["payments"],"summary":"Env Status","operationId":"env_status_api_payments_env_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/env/order":{"post":{"tags":["payments"],"summary":"Create Env Order","operationId":"create_env_order_api_payments_env_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/env/verify":{"post":{"tags":["payments"],"summary":"Verify Env Payment","operationId":"verify_env_payment_api_payments_env_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/crossword/status":{"get":{"tags":["payments"],"summary":"Crossword Status","operationId":"crossword_status_api_payments_crossword_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/crossword/order":{"post":{"tags":["payments"],"summary":"Create Crossword Order","operationId":"create_crossword_order_api_payments_crossword_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/crossword/verify":{"post":{"tags":["payments"],"summary":"Verify Crossword Payment","operationId":"verify_crossword_payment_api_payments_crossword_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/mains2026/status":{"get":{"tags":["payments"],"summary":"Mains2026 Status","operationId":"mains2026_status_api_payments_mains2026_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/mains2026/order":{"post":{"tags":["payments"],"summary":"Create Mains2026 Order","operationId":"create_mains2026_order_api_payments_mains2026_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/mains2026/verify":{"post":{"tags":["payments"],"summary":"Verify Mains2026 Payment","operationId":"verify_mains2026_payment_api_payments_mains2026_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/ca_monthly/status":{"get":{"tags":["payments"],"summary":"Ca Monthly Status","operationId":"ca_monthly_status_api_payments_ca_monthly_status_get","parameters":[{"name":"compilation_id","in":"query","required":true,"schema":{"type":"string","title":"Compilation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/ca_monthly/order":{"post":{"tags":["payments"],"summary":"Create Ca Monthly Order","operationId":"create_ca_monthly_order_api_payments_ca_monthly_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaMonthlyOrderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/ca_monthly/verify":{"post":{"tags":["payments"],"summary":"Verify Ca Monthly Payment","operationId":"verify_ca_monthly_payment_api_payments_ca_monthly_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaMonthlyVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/newspulse/status":{"get":{"tags":["payments"],"summary":"Newspulse Status","operationId":"newspulse_status_api_payments_newspulse_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/newspulse/order":{"post":{"tags":["payments"],"summary":"Create Newspulse Order","operationId":"create_newspulse_order_api_payments_newspulse_order_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/newspulse/verify":{"post":{"tags":["payments"],"summary":"Verify Newspulse Payment","operationId":"verify_newspulse_payment_api_payments_newspulse_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/razorpay/webhook":{"post":{"tags":["payments"],"summary":"Razorpay Webhook","operationId":"razorpay_webhook_api_payments_razorpay_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payments/google/verify":{"post":{"tags":["payments"],"summary":"Verify Google Purchase","operationId":"verify_google_purchase_api_payments_google_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/apple/verify":{"post":{"tags":["payments"],"summary":"Verify Apple Purchase","operationId":"verify_apple_purchase_api_payments_apple_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppleVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unsubscribe":{"get":{"tags":["unsubscribe"],"summary":"Unsubscribe","operationId":"unsubscribe_api_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/pyq/years":{"get":{"tags":["public"],"summary":"Public Pyq Years","description":"All UPSC PYQ years available with question counts. Cached aggressively.","operationId":"public_pyq_years_api_public_pyq_years_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Public Pyq Years Api Public Pyq Years Get"}}}}}}},"/api/public/pyq/years/{year}":{"get":{"tags":["public"],"summary":"Public Pyq Year Detail","description":"Sample of public-safe PYQ questions for a year. Up to 3 questions.","operationId":"public_pyq_year_detail_api_public_pyq_years__year__get","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Pyq Year Detail Api Public Pyq Years  Year  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/newspulse/recent":{"get":{"tags":["public"],"summary":"Public Newspulse Recent","description":"Recent published NewsPulse cards. Capped at last 60 days.","operationId":"public_newspulse_recent_api_public_newspulse_recent_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":30,"title":"Days"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Public Newspulse Recent Api Public Newspulse Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/newspulse/by-slug/{slug}":{"get":{"tags":["public"],"summary":"Public Newspulse By Slug","description":"Resolve slug back to its card via the embedded short id suffix.","operationId":"public_newspulse_by_slug_api_public_newspulse_by_slug__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Newspulse By Slug Api Public Newspulse By Slug  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/mains2026/preview":{"get":{"tags":["public"],"summary":"Public Mains2026 Preview","description":"Indexable teaser for the Mains 2026 series: published tests + ONE sample\nquestion. Price/limits come from settings (single source of truth). Never\nleaks paid content — no question_ids, rubric, or key_points; one sample stem\nwith a truncated model-answer excerpt only.","operationId":"public_mains2026_preview_api_public_mains2026_preview_get","parameters":[{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Mains2026 Preview Api Public Mains2026 Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ca-monthly/months":{"get":{"tags":["public"],"summary":"Public Ca Monthly Months","description":"Published monthly compilations, newest first. Catalog for the hub page.","operationId":"public_ca_monthly_months_api_public_ca_monthly_months_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Public Ca Monthly Months Api Public Ca Monthly Months Get"}}}}}}},"/api/public/ca-monthly/by-month/{month}":{"get":{"tags":["public"],"summary":"Public Ca Monthly By Month","description":"A published month's teaser: the first CA_MONTHLY_FREE_QUESTION_LIMIT MCQs\n(the already-free slice — no paid content leaks) with options/answer/\nexplanation. `month` is the URL slug (e.g. 'may-2026').","operationId":"public_ca_monthly_by_month_api_public_ca_monthly_by_month__month__get","parameters":[{"name":"month","in":"path","required":true,"schema":{"type":"string","title":"Month"}},{"name":"X-Lang","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lang"}},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Ca Monthly By Month Api Public Ca Monthly By Month  Month  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/play-test/opt-in":{"post":{"tags":["public"],"summary":"Public Play Test Opt In","description":"Capture a closed-testing opt-in from the public /play-testing form.\n\nIdempotent per account email — a re-submit updates the same row (e.g. a\ncorrected Play Store Gmail). No auth required; the form prefills from the\nsession when signed in, but anyone with the email link can consent. The\nadmin never reads a reply: consenting submissions land directly in\nv2.play_test_optins and surface on the admin console.","operationId":"public_play_test_opt_in_api_public_play_test_opt_in_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayTestOptInRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public Play Test Opt In Api Public Play Test Opt In Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AdminGenerateRequest":{"properties":{"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"source":{"type":"string","title":"Source","default":"auto"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"AdminGenerateRequest"},"AnswerItem":{"properties":{"question_id":{"type":"string","title":"Question Id"},"answer":{"type":"string","title":"Answer"},"image_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Ids"},"time_taken_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Taken Ms"}},"type":"object","required":["question_id","answer"],"title":"AnswerItem"},"AppleLoginRequest":{"properties":{"identity_token":{"type":"string","title":"Identity Token"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"first_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]}},"type":"object","required":["identity_token"],"title":"AppleLoginRequest"},"AppleVerifyRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"signed_transaction":{"type":"string","maxLength":16384,"minLength":32,"title":"Signed Transaction"},"compilation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Id"}},"type":"object","required":["product_id","signed_transaction"],"title":"AppleVerifyRequest"},"AttachRequest":{"properties":{"feedback_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Feedback Ids"}},"type":"object","required":["feedback_ids"],"title":"AttachRequest"},"Body_admin_email_upload_file_api_admin_email_upload_file_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_email_upload_file_api_admin_email_upload_file_post"},"Body_admin_email_upload_image_api_admin_email_upload_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_email_upload_image_api_admin_email_upload_image_post"},"Body_submit_feedback_api_feedback_post":{"properties":{"message":{"type":"string","title":"Message"},"page_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Url"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"screenshot":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Screenshot"}},"type":"object","required":["message"],"title":"Body_submit_feedback_api_feedback_post"},"Body_upload_answer_images_api_mains_upload_answer_images_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"assessment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assessment Id"},"question_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Id"}},"type":"object","required":["files"],"title":"Body_upload_answer_images_api_mains_upload_answer_images_post"},"BuildTestRequest":{"properties":{"series_id":{"type":"string","title":"Series Id"},"gs_paper":{"type":"string","title":"Gs Paper"},"title":{"type":"string","title":"Title"},"order_index":{"type":"integer","title":"Order Index"},"question_ids":{"items":{"type":"string"},"type":"array","title":"Question Ids"},"is_free_preview":{"type":"boolean","title":"Is Free Preview","default":false}},"type":"object","required":["series_id","gs_paper","title","order_index","question_ids"],"title":"BuildTestRequest"},"CaMonthlyOrderRequest":{"properties":{"compilation_id":{"type":"string","title":"Compilation Id"}},"type":"object","required":["compilation_id"],"title":"CaMonthlyOrderRequest"},"CaMonthlyVerifyRequest":{"properties":{"compilation_id":{"type":"string","title":"Compilation Id"},"razorpay_order_id":{"type":"string","title":"Razorpay Order Id"},"razorpay_payment_id":{"type":"string","title":"Razorpay Payment Id"},"razorpay_signature":{"type":"string","title":"Razorpay Signature"}},"type":"object","required":["compilation_id","razorpay_order_id","razorpay_payment_id","razorpay_signature"],"title":"CaMonthlyVerifyRequest"},"CampaignBackfillRequest":{"properties":{"include_joined_after":{"type":"boolean","title":"Include Joined After","default":false}},"type":"object","title":"CampaignBackfillRequest"},"ChatMessage":{"properties":{"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"history":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["message"],"title":"ChatRequest"},"CheckRequest":{"properties":{"word_index":{"type":"integer","title":"Word Index"},"guess":{"type":"string","title":"Guess"}},"type":"object","required":["word_index","guess"],"title":"CheckRequest"},"CompleteRevisionRequest":{"properties":{"quality":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Quality"}},"type":"object","required":["quality"],"title":"CompleteRevisionRequest"},"CreateAssessmentRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"num_questions":{"type":"integer","title":"Num Questions","default":10},"difficulty":{"type":"string","title":"Difficulty","default":"medium"},"assessment_type":{"type":"string","title":"Assessment Type","default":"mcq"},"is_adaptive":{"type":"boolean","title":"Is Adaptive","default":false},"subtopic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtopic"},"include_pyq":{"type":"boolean","title":"Include Pyq","default":false},"window_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window Mode"},"window_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window Value"},"gs_paper":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gs Paper"},"compilation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Id"},"word_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Word Limit"},"include_news_enrichment":{"type":"boolean","title":"Include News Enrichment","default":true},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["subject"],"title":"CreateAssessmentRequest"},"CreateFlagRequest":{"properties":{"question_id":{"type":"string","format":"uuid","title":"Question Id"},"reason":{"type":"string","title":"Reason"},"suggested_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Answer"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"user_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Answer"},"assessment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assessment Id"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"}},"type":"object","required":["question_id","reason"],"title":"CreateFlagRequest"},"CreateMissionTaskRequest":{"properties":{"title":{"type":"string","maxLength":300,"minLength":3,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"workflow":{"type":"string","title":"Workflow","default":"ops"},"specialist_slug":{"type":"string","title":"Specialist Slug","default":"ops_sentinel"},"priority":{"type":"string","title":"Priority","default":"p2"},"severity":{"type":"string","title":"Severity","default":"medium"}},"type":"object","required":["title"],"title":"CreateMissionTaskRequest"},"CreateTicketRequest":{"properties":{"feedback_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Feedback Ids"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"priority":{"type":"string","title":"Priority","default":"p2"},"assignee_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assignee Id"}},"type":"object","required":["feedback_ids","title"],"title":"CreateTicketRequest"},"DecideApprovalRequest":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"DecideApprovalRequest"},"DeleteAccountRequest":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"confirm":{"type":"boolean","title":"Confirm","default":false}},"type":"object","title":"DeleteAccountRequest"},"EditCardRequest":{"properties":{"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"bullets":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bullets"},"relevance_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relevance Note"},"syllabus_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Syllabus Tags"},"gs_paper":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gs Paper"},"full_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Summary"}},"type":"object","title":"EditCardRequest"},"EmailPreviewRequest":{"properties":{"body_markdown":{"type":"string","title":"Body Markdown"},"cta_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Url"},"cta_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Position","default":"below"},"body_font":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Font","default":"inter"}},"type":"object","required":["body_markdown"],"title":"EmailPreviewRequest"},"EmailSendRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"body_markdown":{"type":"string","title":"Body Markdown"},"user_ids":{"items":{"type":"string"},"type":"array","title":"User Ids"},"extra_emails":{"items":{"type":"string"},"type":"array","title":"Extra Emails","default":[]},"cta_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Url"},"cta_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Position","default":"below"},"body_font":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Font","default":"inter"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"}},"type":"object","required":["subject","body_markdown","user_ids"],"title":"EmailSendRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GenerateRequest":{"properties":{"max_articles":{"type":"integer","title":"Max Articles","default":15},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources"},"target_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Date"}},"type":"object","title":"GenerateRequest"},"GoogleLoginRequest":{"properties":{"id_token":{"type":"string","title":"Id Token"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"first_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]}},"type":"object","required":["id_token"],"title":"GoogleLoginRequest"},"GoogleVerifyRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"purchase_token":{"type":"string","maxLength":4096,"minLength":8,"title":"Purchase Token"},"compilation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Id"}},"type":"object","required":["product_id","purchase_token"],"title":"GoogleVerifyRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HintRequest":{"properties":{"word_index":{"type":"integer","title":"Word Index"}},"type":"object","required":["word_index"],"title":"HintRequest"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LogoutRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"LogoutRequest"},"MarkViewedRequest":{"properties":{"dwell_ms":{"type":"integer","title":"Dwell Ms","default":0}},"type":"object","title":"MarkViewedRequest"},"OcrRequest":{"properties":{"image_ids":{"items":{"type":"string"},"type":"array","title":"Image Ids"}},"type":"object","required":["image_ids"],"title":"OcrRequest"},"PatchFeedbackRequest":{"properties":{"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"suggested_fix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Fix"}},"type":"object","title":"PatchFeedbackRequest"},"PatchTicketRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"assignee_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assignee Id"},"resolution_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Notes"}},"type":"object","title":"PatchTicketRequest"},"PhoneRequest":{"properties":{"phone":{"type":"string","title":"Phone"}},"type":"object","required":["phone"],"title":"PhoneRequest"},"PlayTestOptInRequest":{"properties":{"contact_email":{"type":"string","title":"Contact Email"},"play_gmail":{"type":"string","title":"Play Gmail"},"consent":{"type":"boolean","title":"Consent"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}},"type":"object","required":["contact_email","play_gmail","consent"],"title":"PlayTestOptInRequest"},"PracticeRequest":{"properties":{"place_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Place Ids"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"place_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Type"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","title":"PracticeRequest"},"PreferencesRequest":{"properties":{"preferred_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Language"}},"type":"object","title":"PreferencesRequest"},"PregenPoolRequest":{"properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"pool_target":{"type":"integer","title":"Pool Target","default":20},"min_chunks":{"type":"integer","title":"Min Chunks","default":3},"report_tiny":{"type":"boolean","title":"Report Tiny","default":false},"uncapped":{"type":"boolean","title":"Uncapped","default":false}},"type":"object","title":"PregenPoolRequest"},"ProductEventIn":{"properties":{"event_id":{"type":"string","title":"Event Id"},"name":{"type":"string","title":"Name"},"props":{"additionalProperties":true,"type":"object","title":"Props"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"client_ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ts"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["event_id","name"],"title":"ProductEventIn"},"ProductEventsBatch":{"properties":{"events":{"items":{"$ref":"#/components/schemas/ProductEventIn"},"type":"array","title":"Events"}},"type":"object","required":["events"],"title":"ProductEventsBatch"},"ProgressUpdate":{"properties":{"last_question_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Question Id"},"answered_count":{"type":"integer","title":"Answered Count","default":0},"score":{"type":"integer","title":"Score","default":0},"answers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Answers"},"completed":{"type":"boolean","title":"Completed","default":false}},"type":"object","title":"ProgressUpdate"},"QuestionPatch":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"correct_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Answer"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"model_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Answer"},"key_points":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Key Points"}},"type":"object","title":"QuestionPatch"},"RecordMissedRequest":{"properties":{"place_id":{"type":"string","title":"Place Id"},"question_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Id"},"user_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Answer"}},"type":"object","required":["place_id"],"title":"RecordMissedRequest"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"},"phone":{"type":"string","title":"Phone"},"first_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]},"last_touch":{"anyOf":[{"$ref":"#/components/schemas/Touch"},{"type":"null"}]}},"type":"object","required":["email","password","full_name","phone"],"title":"RegisterRequest"},"ReindexOcrRequest":{"properties":{"document_ids":{"items":{"type":"string"},"type":"array","title":"Document Ids"}},"type":"object","required":["document_ids"],"title":"ReindexOcrRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"ResolveRequest":{"properties":{"resolution":{"type":"string","enum":["fixed","retired","no_issue"],"title":"Resolution"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"patch":{"anyOf":[{"$ref":"#/components/schemas/QuestionPatch"},{"type":"null"}]},"regrade":{"type":"boolean","title":"Regrade","default":false}},"type":"object","required":["resolution"],"title":"ResolveRequest"},"RevealRequest":{"properties":{"word_index":{"type":"integer","title":"Word Index"},"cell_index":{"type":"integer","title":"Cell Index"}},"type":"object","required":["word_index","cell_index"],"title":"RevealRequest"},"RollbackRequest":{"properties":{"version_id":{"type":"string","title":"Version Id"}},"type":"object","required":["version_id"],"title":"RollbackRequest"},"SaveAnswerRequest":{"properties":{"question_id":{"type":"string","title":"Question Id"},"answer":{"type":"string","title":"Answer"},"image_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Ids"},"time_taken_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Taken Ms"}},"type":"object","required":["question_id","answer"],"title":"SaveAnswerRequest"},"ShareRequest":{"properties":{"channel":{"type":"string","enum":["native","whatsapp","x","telegram","copy_link"],"title":"Channel","default":"native"}},"type":"object","title":"ShareRequest"},"StateUpdate":{"properties":{"entries":{"additionalProperties":{"type":"string"},"type":"object","title":"Entries"}},"type":"object","required":["entries"],"title":"StateUpdate"},"SubmitAnswersRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerItem"},"type":"array","title":"Answers"}},"type":"object","required":["answers"],"title":"SubmitAnswersRequest"},"TestFlagRequest":{"properties":{"is_test":{"type":"boolean","title":"Is Test"}},"type":"object","required":["is_test"],"title":"TestFlagRequest"},"Touch":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"landing_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Path"}},"type":"object","title":"Touch","description":"Per-touch acquisition attribution from the frontend. All fields\noptional — a direct-typed URL produces None for everything."},"UpdatePolicyRequest":{"properties":{"value":{"additionalProperties":true,"type":"object","title":"Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["value"],"title":"UpdatePolicyRequest"},"UpdatePromptRequest":{"properties":{"content":{"type":"string","title":"Content"},"change_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Note"}},"type":"object","required":["content"],"title":"UpdatePromptRequest"},"UpdateSpecialistRequest":{"properties":{"avatar":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Avatar"},"role_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Role Title"},"mission":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Mission"},"display_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateSpecialistRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyRequest":{"properties":{"razorpay_order_id":{"type":"string","title":"Razorpay Order Id"},"razorpay_payment_id":{"type":"string","title":"Razorpay Payment Id"},"razorpay_signature":{"type":"string","title":"Razorpay Signature"}},"type":"object","required":["razorpay_order_id","razorpay_payment_id","razorpay_signature"],"title":"VerifyRequest"},"VisitEvent":{"properties":{"event_id":{"type":"string","title":"Event Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"path":{"type":"string","title":"Path"},"entered_at":{"type":"string","title":"Entered At"},"duration_ms":{"type":"integer","title":"Duration Ms","default":0}},"type":"object","required":["event_id","path","entered_at"],"title":"VisitEvent"},"VisitsBatch":{"properties":{"events":{"items":{"$ref":"#/components/schemas/VisitEvent"},"type":"array","title":"Events"}},"type":"object","required":["events"],"title":"VisitsBatch"},"app__api__admin_mains2026__UpdateQuestionRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"model_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Answer"},"rubric":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rubric"},"key_points":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Key Points"},"keywords_expected":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Keywords Expected"},"curation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curation Status"}},"type":"object","title":"UpdateQuestionRequest"},"app__api__admin_questions__UpdateQuestionRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"correct_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Answer"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"model_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Answer"},"key_points":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Key Points"}},"type":"object","title":"UpdateQuestionRequest"}}}}