{"openapi":"3.1.0","info":{"title":"Storskarvia","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pricing":{"get":{"summary":"Pricing","operationId":"pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for-novelists":{"get":{"summary":"Route","operationId":"route_for_novelists_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for-screenwriters":{"get":{"summary":"Route","operationId":"route_for_screenwriters_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for-playwrights":{"get":{"summary":"Route","operationId":"route_for_playwrights_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for-podcasters":{"get":{"summary":"Route","operationId":"route_for_podcasters_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/for-video-creators":{"get":{"summary":"Route","operationId":"route_for_video_creators_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/fact-checking":{"get":{"summary":"Route","operationId":"route_fact_checking_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/about":{"get":{"summary":"Route","operationId":"route_about_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sudowrite-alternative":{"get":{"summary":"Route","operationId":"route_sudowrite_alternative_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/final-draft-alternative":{"get":{"summary":"Route","operationId":"route_final_draft_alternative_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/scrivener-alternative":{"get":{"summary":"Route","operationId":"route_scrivener_alternative_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/anachronism-checker":{"get":{"summary":"Anachronism Checker","operationId":"anachronism_checker_anachronism_checker_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Anachronism Checker Run","operationId":"anachronism_checker_run_anachronism_checker_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_anachronism_checker_run_anachronism_checker_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/anachronism-checker/example":{"get":{"summary":"Anachronism Checker Example","description":"A saved result for the sample passage, for when the checker is busy or\nat its cap. Static: the findings come from a fixture captured from one real\nrun (public_checker.example), so this page makes no model or search call\nand writes nothing. It is our own sample text, so it is indexable.","operationId":"anachronism_checker_example_anachronism_checker_example_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/anachronism-checker/r/{job_id}":{"get":{"summary":"Anachronism Checker Result","operationId":"anachronism_checker_result_anachronism_checker_r__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"src","in":"query","required":false,"schema":{"type":"string","default":"","title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/anachronism-checker/r/{job_id}/status":{"get":{"summary":"Anachronism Checker Status","operationId":"anachronism_checker_status_anachronism_checker_r__job_id__status_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/news/{slug}":{"get":{"summary":"News Moved","operationId":"news_moved_news__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/news.rss":{"get":{"summary":"News Moved","operationId":"news_moved_news_rss_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/news":{"get":{"summary":"News Moved","operationId":"news_moved_news_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/guides":{"get":{"summary":"Guides Index","operationId":"guides_index_guides_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/guides/{slug}":{"get":{"summary":"Guide Page","operationId":"guide_page_guides__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manual":{"get":{"summary":"Manual Index","operationId":"manual_index_manual_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/manual/search.json":{"get":{"summary":"Manual Search","operationId":"manual_search_manual_search_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/manual/{slug}":{"get":{"summary":"Manual Chapter","operationId":"manual_chapter_manual__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webmcp/data":{"get":{"summary":"Webmcp Data","description":"Single small JSON blob for the WebMCP tools in _webmcp.html. Guides are\nsourced live from the existing GUIDES list (main.py's single source of\ntruth for /guides/*), so this endpoint never drifts out of sync with the\nreal guides hub — only the static marketing copy above needs manual upkeep.","operationId":"webmcp_data_api_webmcp_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/evidence":{"get":{"summary":"Health Evidence","description":"Is the fact-checker's evidence retrieval actually working?\n\nSeparate from /health because it is slow (live HTTP to every lane) and\nbecause its failure mode is quiet: the web lane can return zero results for\nevery query while checks keep completing \"successfully\" against Wikipedia\nalone. 503 on \"down\" so a monitor notices without anyone reading the body.\n\n`?probe_escalation=1` additionally spends one paid search to prove that lane\nworks end to end. ADMIN ONLY, and off by default: the escalation provider\nbills per call, so an open query parameter would be a billing-amplification\nhole — anyone could loop it and run up the search bill. The free lanes stay\nunauthenticated so an ordinary uptime monitor can still watch them.","operationId":"health_evidence_health_evidence_get","parameters":[{"name":"probe_escalation","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Probe Escalation"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/csp-report":{"post":{"summary":"Csp Report","description":"Where the browser sends Content-Security-Policy violations.\n\nOne WARNING line per report, fields truncated, body capped: the payload is\nwritten by whatever page was open, so it is data. Always 204, even when a\nreport is dropped for volume; a reporter gets nothing back to learn from.","operationId":"csp_report_csp_report_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/security.txt":{"get":{"summary":"Security Txt","description":"RFC 9116: where a researcher reports a vulnerability.\n\nExpires is required by the RFC and must be under a year out; it is\ncomputed at request time so the file never goes stale on the shelf. nginx\ndenies every dotted path, so ops/nginx-storskarvia.com.conf carries an\nexplicit allowance for this one.","operationId":"security_txt_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/security.txt":{"get":{"summary":"Security Txt","description":"RFC 9116: where a researcher reports a vulnerability.\n\nExpires is required by the RFC and must be under a year out; it is\ncomputed at request time so the file never goes stale on the shelf. nginx\ndenies every dotted path, so ops/nginx-storskarvia.com.conf carries an\nexplicit allowance for this one.","operationId":"security_txt__well_known_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/help":{"get":{"summary":"Help Page","operationId":"help_page_help_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"summary":"Terms","operationId":"terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/support":{"get":{"summary":"Support","operationId":"support_support_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/waitlist":{"post":{"summary":"Waitlist","operationId":"waitlist_api_waitlist_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_waitlist_api_waitlist_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login Page","operationId":"login_page_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup":{"get":{"summary":"Signup Page","operationId":"signup_page_signup_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login/2fa":{"get":{"summary":"Twofa Page","operationId":"twofa_page_login_2fa_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/2fa":{"post":{"summary":"Twofa Verify","operationId":"twofa_verify_auth_2fa_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_twofa_verify_auth_2fa_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/signup":{"post":{"summary":"Signup","operationId":"signup_auth_signup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_auth_signup_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consent":{"get":{"summary":"Consent Page","description":"Cookie preferences: see the current answer and change it.\n\nConsent that can only be withdrawn by clearing the browser's cookies is\nnot withdrawable in the sense the GDPR means (Art. 7(3): as easy to\nwithdraw as to give). This page is linked from every footer and works\nwhether or not the banner was ever shown.","operationId":"consent_page_consent_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Consent","description":"Record the visitor's answer to the measurement banner.\n\nA redirect rather than a script, so the reloaded page is built with the\ndecision already made: the pixel loads on this navigation instead of the\none after it, and the Content-Security-Policy for that response agrees\nwith the HTML in it.\n\nAnything that is not an explicit \"yes\" is stored as \"no\". A malformed\nsubmission must not become permission. A \"no\" also drops the campaign\ncookie if one was set, so withdrawing consent stops the measurement it\ncovered rather than merely stopping more of it.","operationId":"consent_consent_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_consent_consent_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/verify":{"get":{"summary":"Verify Email","operationId":"verify_email_auth_verify_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/resend-verification":{"post":{"summary":"Resend Verification","operationId":"resend_verification_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/forgot":{"get":{"summary":"Forgot Page","operationId":"forgot_page_forgot_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Forgot","operationId":"forgot_forgot_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_forgot_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset":{"get":{"summary":"Reset Page","operationId":"reset_page_reset_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Reset","operationId":"reset_reset_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_reset_reset_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/founders/badge.png":{"get":{"summary":"Founder Badge","description":"The badge, fetchable from an email client with no session.\n\nThe welcome email puts this URL in front of somebody who is very likely\nreading on a phone they have never signed in on, so gating it on a session\nreturned 401 to exactly the person the email was written for. The link in\nthe email therefore carries a signed, purpose-salted token.\n\nThe token names a user and nothing else. The number and the name are read\nfrom the row at request time, so a founder who withdraws their name stops\nappearing on badges fetched afterwards, including through a link already\nsitting in an old email. Baking the name into the token would have made\nthat withdrawal unenforceable.\n\nA session beats a token. Anything else means a link pasted into a chat\nshows the reader somebody else's badge while they are signed in as\nthemselves, and it means a stale token in a URL can 404 a perfectly good\nsession.\n\nThe token is bound to session_epoch, so \"sign out everywhere\" revokes every\nbadge link ever mailed to that account. Without that binding the URL was a\nbearer credential with no off switch, which is a poor trade for a decorative\nPNG. The cost is that a password change invalidates the link in an old\nemail; the founder can still fetch the badge signed in, which is the path\nthey are on at that point anyway.\n\nThe badge shows the founder's own name even when founder_public is false.\nThat flag governs the public wall, not what somebody may do with their own\nbadge, and this is deliberate rather than an oversight.","operationId":"founder_badge_founders_badge_png_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/benchmark":{"get":{"summary":"Benchmark Page","operationId":"benchmark_page_benchmark_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/founders":{"get":{"summary":"Founders Wall","description":"Who is on the wall, in the order they arrived.\n\nOnly the ones who said yes. A founder who has not opted in is counted in\nthe total and named nowhere.","operationId":"founders_wall_founders_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/founder/note":{"post":{"summary":"Founder Note","description":"A founder writing to the person who made the thing.\n\nNot a support ticket and not a form: a hundred people were let in early on\nthe understanding that they would say what was wrong, and the whole value\nof that depends on it taking ten seconds. It goes straight to the maker\nwith who they are and where they were, so a reply can be a reply rather\nthan a request for more information.","operationId":"founder_note_api_founder_note_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/founder":{"post":{"summary":"Founder Settings","description":"Their name on the wall, and whether they are on it at all.","operationId":"founder_settings_api_founder_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/app":{"get":{"summary":"Dashboard","operationId":"dashboard_app_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/projects":{"post":{"summary":"Create Project","operationId":"create_project_api_projects_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_create_project_api_projects_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/documents":{"post":{"summary":"Create Document","operationId":"create_document_api_projects__project_id__documents_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_create_document_api_projects__project_id__documents_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/doc/{doc_id}":{"get":{"summary":"Editor","operationId":"editor_doc__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}":{"put":{"summary":"Save Document","operationId":"save_document_api_documents__doc_id__put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Document Route","operationId":"delete_document_route_api_documents__doc_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/storage":{"post":{"summary":"Set Storage","operationId":"set_storage_api_documents__doc_id__storage_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Storage","operationId":"get_storage_api_documents__doc_id__storage_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/storage/start-empty":{"post":{"summary":"Start Empty","description":"The way out when the cloud file a document's text lives in is gone for\ngood: deleted, or moved somewhere the writer no longer wants. Without it a\ndocument whose text cannot be loaded stays read-only for ever.\n\nForgets which file this document wrote, and where it was moved from, so\nthe page opens empty and editable. Same destination: the next save writes a\nnew file there, and the push still refuses if a file turns out to be there\nafter all, since the document no longer has a rev for it. Owner only, and\nthe editor asks first.","operationId":"start_empty_api_documents__doc_id__storage_start_empty_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/versions":{"get":{"summary":"List Versions","operationId":"list_versions_api_documents__doc_id__versions_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Version","operationId":"create_version_api_documents__doc_id__versions_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/versions/{version_id}/restore":{"post":{"summary":"Restore Version","operationId":"restore_version_api_versions__version_id__restore_post","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/outline":{"get":{"summary":"Outline Page","operationId":"outline_page_project__project_id__outline_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/treatment":{"post":{"summary":"Save Treatment","operationId":"save_treatment_api_projects__project_id__treatment_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Save Treatment","operationId":"save_treatment_api_projects__project_id__treatment_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/cards/merge":{"post":{"summary":"Merge Cards","description":"Merge treatment sections into the beat cards WITHOUT deleting anything\n(Tim: \"keep the new card and the old card, just in case\"). A section whose\ntitle matches an existing card updates that card's synopsis in place; a new\ntitle is appended as a fresh card. Cards not named in the treatment are left\nuntouched — so a renamed beat adds a card and the old one survives.","operationId":"merge_cards_api_projects__project_id__cards_merge_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/cards.json":{"get":{"summary":"List Cards Json","operationId":"list_cards_json_api_projects__project_id__cards_json_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/cards":{"post":{"summary":"Create Card","operationId":"create_card_api_projects__project_id__cards_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cards/{card_id}":{"put":{"summary":"Update Card","operationId":"update_card_api_cards__card_id__put","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"integer","title":"Card Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Card","operationId":"delete_card_api_cards__card_id__delete","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"integer","title":"Card Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/cards/reorder":{"post":{"summary":"Reorder Cards","operationId":"reorder_cards_api_projects__project_id__cards_reorder_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/reports/{kind}":{"get":{"summary":"Production Report","description":"Production reports for screenplays; cue, cast and runtime for audio drama.\n\nPages come from the SAME model the PDF prints, so a report naming page 12A\nand the distributed script naming page 12A cannot disagree. A report keyed\nto a different pagination is worse than none: the schedule built from it is\nsilently wrong.\n\nONE route, two report families, chosen by the document's format. A separate\nendpoint for audio drama would need its own copy of the save-flush guard,\nthe CSV escaping and the filename rule, and the three would drift.","operationId":"production_report_api_documents__doc_id__reports__kind__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"fmt","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/production/{action}":{"post":{"summary":"Production Action","description":"Lock pages, issue a revision, or omit a scene.\n\nOwner only and screenplay only. These change what a production reads as an\naddress, so they are not something a shared reviewer should be able to do.","operationId":"production_action_api_documents__doc_id__production__action__post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/compile":{"get":{"summary":"Compile Page","operationId":"compile_page_project__project_id__compile_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/compile.json":{"get":{"summary":"Compile Manifest","description":"What compiling right now would produce, without producing it.\n\nThe compile page is a set of rules whose effect is invisible until you open\nthe file. This is what makes it legible: every section, whether it is in,\nand the heading it will actually print.","operationId":"compile_manifest_api_projects__project_id__compile_json_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/compile":{"post":{"summary":"Compile Save","description":"Save the compile settings.\n\nStored NORMALISED rather than as sent: rules_for validates every field, so\nwhat lands in the column is a shape the renderer can always read, and an\nunknown title mode from a stale client cannot reach a download.","operationId":"compile_save_api_projects__project_id__compile_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/compile/{fmt}":{"get":{"summary":"Compile Download","description":"The compiled manuscript, in one of the formats a novel already exports.\n\nThe compiled document is an ordinary novel ProseMirror document, so this\nhands it to the SAME writers a single document uses. There is no compile\nrenderer to drift out of step with the document one.","operationId":"compile_download_api_projects__project_id__compile__fmt__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"fmt","in":"path","required":true,"schema":{"type":"string","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/export/epub":{"get":{"summary":"Export Epub","description":"EPUB is a novel deliverable, so it is offered only where it means\nsomething. Exporting a screenplay as an ebook would produce a valid file\nnobody wants.","operationId":"export_epub_api_documents__doc_id__export_epub_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/export/docx":{"get":{"summary":"Export Docx","operationId":"export_docx_api_documents__doc_id__export_docx_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"manuscript","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Manuscript"}},{"name":"title_page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Title Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/read":{"get":{"summary":"Read Document","description":"A document as a plain read-only page, for the split editor to frame.\n\nSeparate from /export/html, which is a DOWNLOAD and says so in its\nContent-Disposition — pointing an iframe at that saves a file instead of\nshowing one. Same renderer, so the pane beside the draft shows the document\nthe way every other output does.","operationId":"read_document_api_documents__doc_id__read_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/export/pdf":{"get":{"summary":"Export Pdf","operationId":"export_pdf_api_documents__doc_id__export_pdf_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"watermark","in":"query","required":false,"schema":{"type":"string","default":"","title":"Watermark"}},{"name":"rev_against","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Rev Against"}},{"name":"rev_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rev Name"}},{"name":"manuscript","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Manuscript"}},{"name":"title_page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Title Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/export/{fmt}":{"get":{"summary":"Export Document Text","operationId":"export_document_text_api_documents__doc_id__export__fmt__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"fmt","in":"path","required":true,"schema":{"type":"string","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/shares":{"post":{"summary":"Create Share","operationId":"create_share_api_documents__doc_id__shares_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Shares","operationId":"list_shares_api_documents__doc_id__shares_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shares/{share_id}":{"delete":{"summary":"Revoke Share","operationId":"revoke_share_api_shares__share_id__delete","parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/share/{token}":{"get":{"summary":"Claim Share","operationId":"claim_share_share__token__get","parameters":[{"name":"token","in":"path","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/documents/{doc_id}/comments":{"get":{"summary":"List Comments","operationId":"list_comments_api_documents__doc_id__comments_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Comment","operationId":"create_comment_api_documents__doc_id__comments_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/{cid}/update":{"post":{"summary":"Update Comment","operationId":"update_comment_api_comments__cid__update_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/comments/{cid}":{"delete":{"summary":"Delete Comment","operationId":"delete_comment_api_comments__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/collections":{"get":{"summary":"List Collections","operationId":"list_collections_api_projects__project_id__collections_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Collection","operationId":"create_collection_api_projects__project_id__collections_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collections/{coll_id}":{"post":{"summary":"Edit Collection","operationId":"edit_collection_api_collections__coll_id__post","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Collection","operationId":"delete_collection_api_collections__coll_id__delete","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collections/{coll_id}/documents":{"post":{"summary":"Add To Collection","operationId":"add_to_collection_api_collections__coll_id__documents_post","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collections/{coll_id}/documents/{doc_id}":{"delete":{"summary":"Remove From Collection","description":"Take a document OUT of a collection. The document itself is untouched —\na collection is a way of looking at the binder, not a place things live.","operationId":"remove_from_collection_api_collections__coll_id__documents__doc_id__delete","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/research/items":{"get":{"summary":"Research Items","operationId":"research_items_api_projects__project_id__research_items_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Research Item Add","description":"Upload a file, or save a link.\n\nA LINK is stored as a link: its address, a title and whatever the writer\nwants to say about it. The server does not go and fetch it. Archiving a\npage would mean this host making a request to an address a user chose,\nwhich is a way into anything else this network can reach, and that is a\ndecision about egress rather than a feature to slip into a research shelf.","operationId":"research_item_add_api_projects__project_id__research_items_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/files/{item_id}":{"get":{"summary":"Research File","description":"Serve an uploaded file, through the auth check.\n\nKept OUT of the public /media mount, like document images: a research\nshelf holds the unpublished deed and the photograph, and a guessable URL\nwould hand them to anyone who guessed.","operationId":"research_file_api_research_files__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/items/{item_id}":{"post":{"summary":"Research Item Edit","operationId":"research_item_edit_api_research_items__item_id__post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Research Item Delete","operationId":"research_item_delete_api_research_items__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/images":{"post":{"summary":"Upload Image","operationId":"upload_image_api_documents__doc_id__images_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/image/{name}":{"get":{"summary":"Serve Doc Image","operationId":"serve_doc_image_api_documents__doc_id__image__name__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/import":{"post":{"summary":"Import Document","operationId":"import_document_api_projects__project_id__import_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/research":{"get":{"summary":"Research Page","operationId":"research_page_project__project_id__research_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/research":{"get":{"summary":"List Research","operationId":"list_research_api_projects__project_id__research_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/research":{"post":{"summary":"Ask Research","operationId":"ask_research_api_documents__doc_id__research_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/{note_id}":{"delete":{"summary":"Delete Research","operationId":"delete_research_api_research__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/doc/{doc_id}/breakdown":{"get":{"summary":"Breakdown Page","operationId":"breakdown_page_doc__doc_id__breakdown_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/breakdown":{"get":{"summary":"Get Breakdown","operationId":"get_breakdown_api_documents__doc_id__breakdown_get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Save Breakdown","description":"Tags and shooting order. Normalised before storage, the same way the\ncompile rules are: what lands in the column is always a shape the PDF\nwriter can read.","operationId":"save_breakdown_api_documents__doc_id__breakdown_put","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/breakdown/{kind}":{"get":{"summary":"Breakdown Export","description":"The board, the sheets and Day Out of Days, as CSV or PDF.","operationId":"breakdown_export_api_documents__doc_id__breakdown__kind__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}},{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"fmt","in":"query","required":false,"schema":{"type":"string","default":"csv","title":"Fmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/timeline":{"get":{"summary":"Timeline Page","operationId":"timeline_page_project__project_id__timeline_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/timeline":{"get":{"summary":"Get Timeline","operationId":"get_timeline_api_projects__project_id__timeline_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Timeline","description":"Window and display settings. Changing them never touches an event: the\nevents are anchored to the epoch, and the epoch is set once.","operationId":"update_timeline_api_projects__project_id__timeline_put","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/timeline/events":{"post":{"summary":"Create Timeline Event","operationId":"create_timeline_event_api_projects__project_id__timeline_events_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/timeline-events/{event_id}":{"put":{"summary":"Update Timeline Event","operationId":"update_timeline_event_api_timeline_events__event_id__put","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Timeline Event","operationId":"delete_timeline_event_api_timeline_events__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/timeline.docx":{"get":{"summary":"Timeline Docx","description":"The timeline as a document, which is how it was asked for. Only the days\nthat hold something: a printed page of empty rows is scaffolding, useful on\nscreen while filling it in and noise on paper.","operationId":"timeline_docx_api_projects__project_id__timeline_docx_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}":{"get":{"summary":"Project Page","operationId":"project_page_project__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/target":{"post":{"summary":"Set Project Target","description":"A word target and, optionally, a date to hit it by. Blank clears.","operationId":"set_project_target_api_projects__project_id__target_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_set_project_target_api_projects__project_id__target_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/search":{"get":{"summary":"Search Project","description":"Find a phrase across every document in the project.\n\nMatches against the accepted plaintext the server already keeps for\nfact-checking and export, so nothing is re-derived per query. A\nzero-retention chapter keeps no server copy and is hydrated from the\nwriter's cloud first; if that fails it is reported as unsearched rather\nthan silently absent.","operationId":"search_project_api_projects__project_id__search_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/organize":{"post":{"summary":"Organize Document","operationId":"organize_document_api_documents__doc_id__organize_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/rename":{"post":{"summary":"Rename Project","operationId":"rename_project_api_projects__project_id__rename_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_rename_project_api_projects__project_id__rename_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/lookbook":{"get":{"summary":"Lookbook Page","operationId":"lookbook_page_project__project_id__lookbook_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/codex/{entry_id}/portrait.png":{"get":{"summary":"Codex Portrait File","operationId":"codex_portrait_file_api_codex__entry_id__portrait_png_get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/codex/{entry_id}/portrait":{"post":{"summary":"Codex Portrait","operationId":"codex_portrait_api_codex__entry_id__portrait_post","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/codex":{"get":{"summary":"Codex Page","operationId":"codex_page_project__project_id__codex_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/codex":{"get":{"summary":"List Codex","operationId":"list_codex_api_projects__project_id__codex_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Codex","operationId":"create_codex_api_projects__project_id__codex_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/codex/{entry_id}":{"put":{"summary":"Update Codex","operationId":"update_codex_api_codex__entry_id__put","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Codex","operationId":"delete_codex_api_codex__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/codex/sync-script":{"post":{"summary":"Sync Codex From Script","description":"Instant, zero-cost: pull characters (cues) + locations (sluglines) from a screenplay doc.","operationId":"sync_codex_from_script_api_projects__project_id__codex_sync_script_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/codex/detect":{"post":{"summary":"Detect Codex","description":"AI: extract named entities from a draft. Returns suggestions (does not auto-add).","operationId":"detect_codex_api_documents__doc_id__codex_detect_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/archive":{"get":{"summary":"Project Archive","operationId":"project_archive_api_projects__project_id__archive_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/export":{"get":{"summary":"Account Export","description":"Everything the account holds, in one download.\n\nThe privacy policy promises portability and the free plan promises the\nwriting is never hostage; this is the one-click form of both. Each project\nis its own archive inside, so a single project can be restored or handed on\nwithout unpacking the rest. Metered per account: building it hydrates every\nzero-retention chapter from the cloud.","operationId":"account_export_api_account_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/storage/dropbox/connect":{"get":{"summary":"Dropbox Connect","operationId":"dropbox_connect_storage_dropbox_connect_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/account","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storage/dropbox/callback":{"get":{"summary":"Dropbox Callback","operationId":"dropbox_callback_storage_dropbox_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storage/dropbox/disconnect":{"post":{"summary":"Dropbox Disconnect","operationId":"dropbox_disconnect_storage_dropbox_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/storage/gdrive/connect":{"get":{"summary":"Gdrive Connect","operationId":"gdrive_connect_storage_gdrive_connect_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/account","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storage/gdrive/callback":{"get":{"summary":"Gdrive Callback","operationId":"gdrive_callback_storage_gdrive_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storage/gdrive/disconnect":{"post":{"summary":"Gdrive Disconnect","operationId":"gdrive_disconnect_storage_gdrive_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/documents/{doc_id}/check":{"post":{"summary":"Start Check","operationId":"start_check_api_documents__doc_id__check_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{doc_id}/continuity":{"post":{"summary":"Start Continuity","operationId":"start_continuity_api_documents__doc_id__continuity_post","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/checks/{check_id}":{"get":{"summary":"Check Status","operationId":"check_status_api_checks__check_id__get","parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"integer","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/findings/{finding_id}/status":{"post":{"summary":"Finding Status","operationId":"finding_status_api_findings__finding_id__status_post","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account":{"get":{"summary":"Account Page","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/mcp-key":{"post":{"summary":"Account Mcp Key","operationId":"account_mcp_key_account_mcp_key_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_account_mcp_key_account_mcp_key_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/name":{"post":{"summary":"Change Name","description":"The writer's own name, as it should appear on a title page.\n\nBlank is a legitimate answer and clears it. An account without a name is\nwhat every account was before there was one to give, and it still falls\nback to the email's local part, so there is nothing here to protect by\nrefusing an empty field.","operationId":"change_name_account_name_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_change_name_account_name_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/password":{"post":{"summary":"Change Password","operationId":"change_password_account_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_change_password_account_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}":{"delete":{"summary":"Delete Project Route","operationId":"delete_project_route_api_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/2fa/nudge":{"post":{"summary":"Twofa Nudge Dismiss","operationId":"twofa_nudge_dismiss_account_2fa_nudge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/2fa/setup":{"post":{"summary":"Twofa Setup","operationId":"twofa_setup_account_2fa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/2fa/cancel":{"post":{"summary":"Twofa Cancel","operationId":"twofa_cancel_account_2fa_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/2fa/enable":{"post":{"summary":"Twofa Enable","operationId":"twofa_enable_account_2fa_enable_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_twofa_enable_account_2fa_enable_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/2fa/recovery":{"post":{"summary":"Twofa Recovery","operationId":"twofa_recovery_account_2fa_recovery_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_twofa_recovery_account_2fa_recovery_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/2fa/disable":{"post":{"summary":"Twofa Disable","operationId":"twofa_disable_account_2fa_disable_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_twofa_disable_account_2fa_disable_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/signout-all":{"post":{"summary":"Signout Everywhere","operationId":"signout_everywhere_account_signout_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/delete":{"post":{"summary":"Delete Account","operationId":"delete_account_account_delete_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_delete_account_account_delete_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"summary":"Admin Panel","operationId":"admin_panel_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/unflag":{"post":{"summary":"Admin Unflag","description":"Clear a flag after a human has looked. The EVENTS are never deleted:\nthe flag is a verdict and can be wrong, the events are what happened.","operationId":"admin_unflag_admin_unflag_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_unflag_admin_unflag_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/beta":{"post":{"summary":"Admin Beta","description":"Freeze or reopen the beta without a deploy.\n\nFreezing is not the same as running out of seats: this is the switch for\nstopping early, or for holding the door shut after the hundredth while the\ndecision about launching is made.","operationId":"admin_beta_admin_beta_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_beta_admin_beta_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/beta/grant":{"post":{"summary":"Admin Beta Grant","description":"Hand one of the held-back seats to somebody, by name.\n\nThe seat has to be one of the reserved ones and it has to still be free.\nGranting an arbitrary number would let a typo create seat 4 twice or seat\n0, and the whole value of the number is that it is exactly what it says.","operationId":"admin_beta_grant_admin_beta_grant_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_beta_grant_admin_beta_grant_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/waitlist.csv":{"get":{"summary":"Admin Waitlist Csv","operationId":"admin_waitlist_csv_admin_waitlist_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/feedback":{"post":{"summary":"Submit Feedback","operationId":"submit_feedback_api_feedback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/feedback/{fid}/seen":{"post":{"summary":"Admin Feedback Seen","operationId":"admin_feedback_seen_admin_feedback__fid__seen_post","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/plan":{"post":{"summary":"Admin Set Plan","operationId":"admin_set_plan_admin_users__user_id__plan_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_set_plan_admin_users__user_id__plan_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/reset-quota":{"post":{"summary":"Admin Reset Quota","operationId":"admin_reset_quota_admin_users__user_id__reset_quota_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/comp":{"post":{"summary":"Admin Toggle Comp","description":"Comp a user: grant them a plan free and shield them from all billing.\nToggling off returns them to a normal (billable) account at their plan.","operationId":"admin_toggle_comp_admin_users__user_id__comp_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_toggle_comp_admin_users__user_id__comp_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/checkout":{"post":{"summary":"Checkout","operationId":"checkout_billing_checkout_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_checkout_billing_checkout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/topup":{"post":{"summary":"Topup","operationId":"topup_billing_topup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_topup_billing_topup_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/portal":{"post":{"summary":"Billing Portal","operationId":"billing_portal_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/cancel":{"post":{"summary":"Billing Cancel","description":"In-app cancel with exit survey. Flags the subscription to lapse at\nperiod end; the Stripe webhook (subscription.deleted) remains the single\nsource of the `canceled` lifecycle event, now carrying the reason.","operationId":"billing_cancel_billing_cancel_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_billing_cancel_billing_cancel_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/webhook":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_account_mcp_key_account_mcp_key_post":{"properties":{"action":{"type":"string","title":"Action","default":"generate"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","default":[]},"label":{"type":"string","title":"Label","default":""},"key_id":{"type":"integer","title":"Key Id","default":0}},"type":"object","title":"Body_account_mcp_key_account_mcp_key_post"},"Body_admin_beta_admin_beta_post":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"Body_admin_beta_admin_beta_post"},"Body_admin_beta_grant_admin_beta_grant_post":{"properties":{"email":{"type":"string","title":"Email"},"seat":{"type":"integer","title":"Seat","default":0}},"type":"object","required":["email"],"title":"Body_admin_beta_grant_admin_beta_grant_post"},"Body_admin_set_plan_admin_users__user_id__plan_post":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"Body_admin_set_plan_admin_users__user_id__plan_post"},"Body_admin_toggle_comp_admin_users__user_id__comp_post":{"properties":{"plan":{"type":"string","title":"Plan","default":"studio"}},"type":"object","title":"Body_admin_toggle_comp_admin_users__user_id__comp_post"},"Body_admin_unflag_admin_unflag_post":{"properties":{"uid":{"type":"integer","title":"Uid"}},"type":"object","required":["uid"],"title":"Body_admin_unflag_admin_unflag_post"},"Body_anachronism_checker_run_anachronism_checker_post":{"properties":{"text":{"type":"string","title":"Text","default":""},"setting":{"type":"string","title":"Setting","default":""},"website":{"type":"string","title":"Website","default":""},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""},"utm_source":{"type":"string","title":"Utm Source","default":""},"utm_medium":{"type":"string","title":"Utm Medium","default":""},"utm_campaign":{"type":"string","title":"Utm Campaign","default":""},"ref_host":{"type":"string","title":"Ref Host","default":""}},"type":"object","title":"Body_anachronism_checker_run_anachronism_checker_post"},"Body_billing_cancel_billing_cancel_post":{"properties":{"reason":{"type":"string","title":"Reason"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["reason"],"title":"Body_billing_cancel_billing_cancel_post"},"Body_change_name_account_name_post":{"properties":{"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"Body_change_name_account_name_post"},"Body_change_password_account_password_post":{"properties":{"current":{"type":"string","title":"Current"},"new":{"type":"string","title":"New"}},"type":"object","required":["current","new"],"title":"Body_change_password_account_password_post"},"Body_checkout_billing_checkout_post":{"properties":{"tier":{"type":"string","title":"Tier"}},"type":"object","required":["tier"],"title":"Body_checkout_billing_checkout_post"},"Body_consent_consent_post":{"properties":{"choice":{"type":"string","title":"Choice","default":""},"next":{"type":"string","title":"Next","default":""}},"type":"object","title":"Body_consent_consent_post"},"Body_create_document_api_projects__project_id__documents_post":{"properties":{"folder":{"type":"string","title":"Folder","default":""},"template":{"type":"string","title":"Template","default":""}},"type":"object","title":"Body_create_document_api_projects__project_id__documents_post"},"Body_create_project_api_projects_post":{"properties":{"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind","default":"novel"}},"type":"object","required":["title"],"title":"Body_create_project_api_projects_post"},"Body_delete_account_account_delete_post":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"Body_delete_account_account_delete_post"},"Body_forgot_forgot_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_forgot_forgot_post"},"Body_login_auth_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email","password"],"title":"Body_login_auth_login_post"},"Body_rename_project_api_projects__project_id__rename_post":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"Body_rename_project_api_projects__project_id__rename_post"},"Body_reset_reset_post":{"properties":{"token":{"type":"string","title":"Token"},"new":{"type":"string","title":"New"}},"type":"object","required":["token","new"],"title":"Body_reset_reset_post"},"Body_set_project_target_api_projects__project_id__target_post":{"properties":{"target_words":{"type":"string","title":"Target Words","default":""},"target_date":{"type":"string","title":"Target Date","default":""}},"type":"object","title":"Body_set_project_target_api_projects__project_id__target_post"},"Body_signup_auth_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"marketing_ok":{"type":"string","title":"Marketing Ok","default":""},"name":{"type":"string","title":"Name","default":""},"next":{"type":"string","title":"Next","default":""},"via":{"type":"string","title":"Via","default":""},"via_src":{"type":"string","title":"Via Src","default":""}},"type":"object","required":["email","password"],"title":"Body_signup_auth_signup_post"},"Body_topup_billing_topup_post":{"properties":{"pack":{"type":"string","title":"Pack"}},"type":"object","required":["pack"],"title":"Body_topup_billing_topup_post"},"Body_twofa_disable_account_2fa_disable_post":{"properties":{"password":{"type":"string","title":"Password","default":""},"code":{"type":"string","title":"Code","default":""}},"type":"object","title":"Body_twofa_disable_account_2fa_disable_post"},"Body_twofa_enable_account_2fa_enable_post":{"properties":{"code":{"type":"string","title":"Code","default":""}},"type":"object","title":"Body_twofa_enable_account_2fa_enable_post"},"Body_twofa_recovery_account_2fa_recovery_post":{"properties":{"code":{"type":"string","title":"Code","default":""}},"type":"object","title":"Body_twofa_recovery_account_2fa_recovery_post"},"Body_twofa_verify_auth_2fa_post":{"properties":{"code":{"type":"string","title":"Code","default":""},"next":{"type":"string","title":"Next","default":""}},"type":"object","title":"Body_twofa_verify_auth_2fa_post"},"Body_waitlist_api_waitlist_post":{"properties":{"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier","default":"pro"},"source":{"type":"string","title":"Source","default":"pricing"},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["email"],"title":"Body_waitlist_api_waitlist_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}