{"openapi":"3.1.0","info":{"title":"RLB Whisk API","description":"**Zero-LLM utilities. Deterministic + small-model. Multi-language day one. Same input, same output, every time.**\n\nFree API. Optional API keys unlock higher rate limits — grab one at [/whisk/keys/](https://reglegbrief.com/whisk/keys/) (no signup, no email).\n\nEvery response carries an `X-Request-ID` header — quote it if you need support.\n\nAirplane mode (in-browser Pyodide) is available at [/whisk/](https://reglegbrief.com/whisk/) for truly-local execution — bytes never leave your device.","contact":{"name":"RLB Whisk","url":"https://reglegbrief.com/whisk/"},"license":{"name":"Proprietary API (free-to-use) + open MIT SDKs","url":"https://reglegbrief.com/whisk/terms"},"version":"0.22.6.0.5.19.42-alpha"},"paths":{"/api/v1/spellcheck":{"post":{"tags":["Spellcheck"],"summary":"Spellcheck","operationId":"spellcheck_api_v1_spellcheck_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpellcheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpellcheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/spellcheck/apply":{"post":{"tags":["Spellcheck"],"summary":"Spellcheck Apply","description":"Auto-mode: run the check and apply the top suggestion for every finding.\n\nReturns the corrected text + a diff of what changed. Findings with no\nsuggestion are returned in `unresolved` so callers can surface them\nfor human review.","operationId":"spellcheck_apply_api_v1_spellcheck_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpellcheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/spellcheck/domain-packs":{"get":{"tags":["Spellcheck"],"summary":"List available vocab packs","description":"Enumerate every domain vocab pack shipping with this server.\n\nEach pack is a curated word list that gets appended to the ``ignore``\nset at check time when the client passes its id in ``domain_packs``.","operationId":"list_domain_packs_api_v1_spellcheck_domain_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Domain Packs Api V1 Spellcheck Domain Packs Get"}}}}}}},"/api/v1/spellcheck/domain-packs/{pack_id}":{"get":{"tags":["Spellcheck"],"summary":"Fetch a single pack's word list","description":"Return the full lowercased word set for one pack.\n\nUsed by Airplane (in-browser) mode so pack-aware acceptance works\noffline. Server-mode requests attach ``domain_packs`` in the check\nbody and the server does the filtering; browser-mode has no such\nserver call, so it fetches the words once and does the same filter\nclient-side against the misspellings Pyodide returns.","operationId":"get_domain_pack_api_v1_spellcheck_domain_packs__pack_id__get","parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Domain Pack Api V1 Spellcheck Domain Packs  Pack Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/spellcheck/languages":{"get":{"tags":["Spellcheck"],"summary":"Supported Languages","operationId":"supported_languages_api_v1_spellcheck_languages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Supported Languages Api V1 Spellcheck Languages Get"}}}}}}},"/api/v1/keys":{"post":{"tags":["API Keys"],"summary":"Generate a new API key","description":"Self-serve API key issuance. No signup, no email, no tracking. **Save the key somewhere safe** — we don't email it or store any way to recover a lost key. That's part of the 'we never see it' contract. Rate limits with a key are far more generous than the anonymous (no-key) tier.","operationId":"create_key_api_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys/me":{"get":{"tags":["API Keys"],"summary":"Look up metadata for your API key","description":"Send X-Api-Key header. Returns metadata but not the key itself.","operationId":"key_info_api_v1_keys_me_get","parameters":[{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Revoke your API key","description":"Send X-Api-Key. The key is marked revoked and can no longer be used.","operationId":"revoke_key_api_v1_keys_me_delete","parameters":[{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"tags":["Health"],"summary":"Overall service health","description":"Reports uptime, loaded dictionaries, and background-data status. Suitable for uptime monitors (UptimeRobot, BetterUptime, etc.) — returns 200 with a JSON body while everything is green.","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Health Get"}}}}}}},"/api/v1/health/ready":{"get":{"tags":["Health"],"summary":"Readiness probe (k8s-style)","description":"True once the service can serve real requests.","operationId":"ready_api_v1_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ready Api V1 Health Ready Get"}}}}}}},"/api/v1/health/live":{"get":{"tags":["Health"],"summary":"Liveness probe (k8s-style)","description":"True while the process is up. Never fails until the process dies.","operationId":"live_api_v1_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Live Api V1 Health Live Get"}}}}}}},"/api/v1/writing-report":{"post":{"tags":["Writing Report"],"summary":"Statistical writing report","description":"Deterministic (non-AI) writing analytics for English text. Same input, same output, every time. Runs in linear time and handles up to 500,000 characters (~100 pages).","operationId":"writing_report_api_v1_writing_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WritingReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Writing Report Api V1 Writing Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/summarise":{"post":{"tags":["Extract"],"summary":"Extractive TextRank summariser","description":"Non-AI, deterministic TextRank (Mihalcea & Tarau 2004). ~80% of LLM summary quality at 0% cost. Linear time.","operationId":"api_summarise_api_v1_extract_summarise_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummariseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Summarise Api V1 Extract Summarise Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/shorthand":{"post":{"tags":["Extract"],"summary":"Domain-flavoured shorthand notes generator","description":"TextRank sentence extraction + domain abbreviation dictionary (medical SOAP, legal brief, meeting action items, student outline, generic bullet). Deterministic, non-AI.","operationId":"api_shorthand_api_v1_extract_shorthand_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShorthandRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Shorthand Api V1 Extract Shorthand Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/citation":{"post":{"tags":["Extract"],"summary":"Citation format generator","description":"Pure template-based citation formatter. Supports APA, MLA, Chicago, Harvard, IEEE, BibTeX. Non-AI, deterministic.","operationId":"api_citation_api_v1_extract_citation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CitationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Citation Api V1 Extract Citation Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/keywords":{"post":{"tags":["Extract"],"summary":"TF-IDF + bigram keyword extraction","description":"Deterministic keyword extractor using term frequency, inverse sentence frequency, and adjacent-word bigram promotion. Zero-LLM, linear time.","operationId":"api_keywords_api_v1_extract_keywords_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeywordsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Keywords Api V1 Extract Keywords Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/cloze":{"post":{"tags":["Extract"],"summary":"Fill-in-the-blank study card generator","description":"Uses TextRank to pick salient sentences then blanks the highest-content word (capitalised nouns preferred). Student segment moat, non-AI.","operationId":"api_cloze_api_v1_extract_cloze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClozeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Cloze Api V1 Extract Cloze Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/extract/reading-time":{"post":{"tags":["Extract"],"summary":"Reading + speaking time estimator","description":"Word count + WPM defaults from research: 238 silent reading, 130 spoken.","operationId":"api_reading_time_api_v1_extract_reading_time_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadingTimeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Reading Time Api V1 Extract Reading Time Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/semantic/senses":{"get":{"tags":["Semantic"],"summary":"Enumerate WordNet senses of a word","operationId":"api_senses_api_v1_semantic_senses_get","parameters":[{"name":"word","in":"query","required":true,"schema":{"type":"string","title":"Word"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Senses Api V1 Semantic Senses Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/semantic/synonyms":{"get":{"tags":["Semantic"],"summary":"Synonym list for a word (union across senses)","operationId":"api_synonyms_api_v1_semantic_synonyms_get","parameters":[{"name":"word","in":"query","required":true,"schema":{"type":"string","title":"Word"}},{"name":"sense","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sense"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Synonyms Api V1 Semantic Synonyms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/semantic/disambiguate":{"post":{"tags":["Semantic"],"summary":"Word Sense Disambiguation via Lesk algorithm","description":"Given a word and its surrounding context, pick the most appropriate WordNet sense. Answers 'Mercury planet' vs 'Mercury element' vs 'mercurial personality'.","operationId":"api_disambiguate_api_v1_semantic_disambiguate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Disambiguate Api V1 Semantic Disambiguate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/semantic/context-synonyms":{"post":{"tags":["Semantic"],"summary":"Synonyms restricted to the chosen sense","operationId":"api_context_synonyms_api_v1_semantic_context_synonyms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Context Synonyms Api V1 Semantic Context Synonyms Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/semantic/analyse":{"post":{"tags":["Semantic"],"summary":"Full semantic analysis","description":"All senses + chosen sense + context synonyms + all synonyms.","operationId":"api_analyse_api_v1_semantic_analyse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Analyse Api V1 Semantic Analyse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/grammar/check":{"post":{"tags":["Grammar"],"summary":"Grammar rule check","description":"Runs the deterministic English grammar rule set against the text. Non-AI, LanguageTool-style pattern matching.","operationId":"api_grammar_check_api_v1_grammar_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrammarRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Grammar Check Api V1 Grammar Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/grammar/rules":{"get":{"tags":["Grammar"],"summary":"List available grammar rules","operationId":"api_grammar_rules_api_v1_grammar_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Grammar Rules Api V1 Grammar Rules Get"}}}}}}},"/api/v1/nlp/pos":{"get":{"tags":["NLP"],"summary":"POS tags for arbitrary English text","operationId":"get_pos_api_v1_nlp_pos_get","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Pos Api V1 Nlp Pos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nlp/entities":{"get":{"tags":["NLP"],"summary":"Named entities in arbitrary English text","operationId":"get_entities_api_v1_nlp_entities_get","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Entities Api V1 Nlp Entities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nlp/analyse":{"post":{"tags":["NLP"],"summary":"Full POS + NER + noun-chunks + sentences","operationId":"post_analyse_api_v1_nlp_analyse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__nlp_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Post Analyse Api V1 Nlp Analyse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nlp/health":{"get":{"tags":["NLP"],"summary":"Is spaCy loaded and responsive","operationId":"nlp_health_api_v1_nlp_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nlp Health Api V1 Nlp Health Get"}}}}}}},"/api/v1/nlp/dates":{"post":{"tags":["NLP"],"summary":"Extract DATE + TIME entities with ISO normalisation","operationId":"api_dates_api_v1_nlp_dates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Dates Api V1 Nlp Dates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nlp/schedule":{"post":{"tags":["NLP"],"summary":"Meeting-slot extraction — dates, times, events, people, orgs, locations","operationId":"api_schedule_api_v1_nlp_schedule_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Schedule Api V1 Nlp Schedule Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ask":{"post":{"tags":["Ask"],"summary":"Ask a natural-language question against the Whisk Encyclopedia","operationId":"ask_api_v1_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ask Api V1 Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ask/stream":{"get":{"tags":["Ask"],"summary":"SSE variant of /ask — sections stream progressively as the composer builds them","operationId":"ask_stream_api_v1_ask_stream_get","parameters":[{"name":"question","in":"query","required":false,"schema":{"type":"string","default":"","title":"Question"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}},{"name":"concept_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"}},{"name":"sense","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense"}},{"name":"tier_filter","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Tier Filter"}},{"name":"confidence_filter","in":"query","required":false,"schema":{"type":"string","default":"asserted","title":"Confidence Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ask/gaps/stats":{"get":{"tags":["Ask"],"summary":"How many no-answer questions have been logged","operationId":"gap_stats_api_v1_ask_gaps_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gap Stats Api V1 Ask Gaps Stats Get"}}}}}}},"/api/v1/ask/batch":{"post":{"tags":["Ask"],"summary":"Batch ask — up to 20 questions per call (slice 29a)","description":"Slice 29a Item 4 — process up to 20 questions in one call.\n\nPer-question error isolation: if question 5 fails to compose (e.g.\ninternal exception in an obscure code path), that slot returns\n`{\"error\": \"...\", \"confidence\": \"error\"}` and the batch keeps going.\nResponse order matches request order.\n\nRate limiting: each batch counts as N calls against the caller's\nper-IP limit — the existing middleware sees ONE HTTP request but\nthe internal loop bumps its accounting.","operationId":"ask_batch_api_v1_ask_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchAskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ask Batch Api V1 Ask Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ask/flag":{"post":{"tags":["Ask"],"summary":"Flag an /ask answer as incorrect","description":"User-driven quality signal. Writes an anonymous flag row to\n``data/vault_flags.db`` — no IP, no session ID, no API key. Operator\nreviews via ``GET /api/v1/ask/flags/stats``.\n\nStorage module is named vault_flags.py for historical reasons (it\npredates the vault retirement and has zero dependency on tools/vault.py\n— it's a generic SQLite flag logger). Not renamed in slice 26.5 to keep\nthe diff focused.","operationId":"flag_answer_api_v1_ask_flag_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Flag Answer Api V1 Ask Flag Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ask/flags/stats":{"get":{"tags":["Ask"],"summary":"How many /ask flags have been logged","operationId":"flag_stats_api_v1_ask_flags_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Flag Stats Api V1 Ask Flags Stats Get"}}}}}}},"/api/v1/geo/typeahead/{country}/{cls}/{prefix2}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Typeahead Chunk","operationId":"typeahead_chunk_api_v1_geo_typeahead__country___cls___prefix2__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"cls","in":"path","required":true,"schema":{"type":"string","title":"Cls"}},{"name":"prefix2","in":"path","required":true,"schema":{"type":"string","title":"Prefix2"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/grid/{lat}/{lon}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Grid Summary","description":"1-sq-km grid summary at (lat, lon).\n\nResponse shape (JSON):\n{\n  \"grid_id\": \"19.0700_73.0000\",\n  \"center\": {\"lat\": ..., \"lon\": ...},\n  \"radius_km\": 1.0,\n  \"bbox\": {\"min_lat\": ..., \"max_lat\": ..., \"min_lon\": ..., \"max_lon\": ...},\n  \"elevation\": {\"min_m\": ..., \"max_m\": ..., \"mean_m\": ..., \"std_m\": ...,\n                 \"relief_m\": ..., \"sample_count\": ...},\n  \"admin_chain\": [{\"level\": \"ADM4\", \"name\": \"Vashi\", \"entity_id\": ...}, ...],\n  \"population_estimate\": 15234,\n  \"entities_by_code\": [{\"feature_class\": \"P\", \"feature_code\": \"PPLX\",\n                          \"count\": 3, \"top_names\": [...]}, ...],\n  \"entities\": [<full list>]\n}","operationId":"grid_summary_api_v1_geo_grid__lat___lon__get","parameters":[{"name":"lat","in":"path","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"path","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Radius Km"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/viewshed/{lat}/{lon}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Viewshed","description":"Compute the visible horizon at (lat, lon).\n\nArgs:\n  lat, lon: observer position\n  radius_km: how far to cast each ray (default 50 km — realistic\n    eye-level horizon on a mountain)\n  observer_height_m: height of observer's eye above ground\n    (default 2 m for adult standing; use 100 m for a rooftop, etc.)\n  bearings: number of bearings to sample around 360° (default 72\n    = every 5°). Higher = more resolution, more compute.","operationId":"viewshed_api_v1_geo_viewshed__lat___lon__get","parameters":[{"name":"lat","in":"path","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"path","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","default":50.0,"title":"Radius Km"}},{"name":"observer_height_m","in":"query","required":false,"schema":{"type":"number","default":2.0,"title":"Observer Height M"}},{"name":"bearings","in":"query","required":false,"schema":{"type":"integer","default":72,"title":"Bearings"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/land-report/intents":{"get":{"tags":["Geo (Layer-2)"],"summary":"Land Report Intents","description":"List available intent rulebooks for the Land Report engine.","operationId":"land_report_intents_api_v1_geo_land_report_intents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/land-report/{lat}/{lon}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Land Report","operationId":"land_report_api_v1_geo_land_report__lat___lon__get","parameters":[{"name":"lat","in":"path","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"path","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Radius Km"}},{"name":"intent","in":"query","required":false,"schema":{"type":"string","title":"Intent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/chat/turn":{"post":{"tags":["Geo (Layer-2)"],"summary":"Chat Turn","description":"Retrieval-only endpoint. Returns structured facts + suggested\nLLM prompt; browser runs the LLM.","operationId":"chat_turn_api_v1_geo_chat_turn_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurnRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/entities/nearby":{"get":{"tags":["Geo (Layer-2)"],"summary":"Nearby","description":"Return `limit` closest entities within `radius_km`.\n\nfc: string of allowed feature_class letters (e.g. 'PSL' = populated+spot+area).\nexclude_populated: when true, skip class 'P' rows (useful for peer-POI in a city).","operationId":"nearby_api_v1_geo_entities_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":50.0,"exclusiveMinimum":0,"default":5.0,"title":"Radius Km"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":1,"default":8,"title":"Limit"}},{"name":"fc","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":8,"default":"PSL","title":"Fc"}},{"name":"exclude_populated","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Populated"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/entities/{entity_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Get Entity","operationId":"get_entity_api_v1_geo_entities__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"include","in":"query","required":false,"schema":{"type":"string","default":"","title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/subscribe":{"post":{"tags":["Geo (Layer-2)"],"summary":"Subscribe","operationId":"subscribe_api_v1_geo_talk_subscribe_post","parameters":[{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/subscriptions":{"get":{"tags":["Geo (Layer-2)"],"summary":"List Subscriptions","operationId":"list_subscriptions_api_v1_geo_talk_subscriptions_get","parameters":[{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/subscriptions/{sub_id}":{"delete":{"tags":["Geo (Layer-2)"],"summary":"Cancel Subscription","operationId":"cancel_subscription_api_v1_geo_talk_subscriptions__sub_id__delete","parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}},{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/feed":{"get":{"tags":["Geo (Layer-2)"],"summary":"Feed","operationId":"feed_api_v1_geo_talk_feed_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/feed/{alert_id}/read":{"post":{"tags":["Geo (Layer-2)"],"summary":"Mark Read","operationId":"mark_read_api_v1_geo_talk_feed__alert_id__read_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}},{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/discoverability":{"post":{"tags":["Geo (Layer-2)"],"summary":"Set Discoverability","operationId":"set_discoverability_api_v1_geo_talk_discoverability_post","parameters":[{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverabilityIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/discoverability/nearby":{"get":{"tags":["Geo (Layer-2)"],"summary":"Discoverable Nearby","description":"Return users who are (a) discoverable AND (b) subscribed to the same\nintent AND (c) their subscription coord within radius_km of (lat,lon).\nExcludes the caller's own row (auth-free, so no user_id filter — this is\nthe public \"who's watching this area for this intent\" board).","operationId":"discoverable_nearby_api_v1_geo_talk_discoverability_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},{"name":"intent","in":"query","required":true,"schema":{"type":"string","title":"Intent"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":200,"exclusiveMinimum":0,"default":20.0,"title":"Radius Km"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/livekit_token":{"get":{"tags":["Geo (Layer-2)"],"summary":"Livekit Token","operationId":"livekit_token_api_v1_geo_talk_livekit_token_get","parameters":[{"name":"room","in":"query","required":true,"schema":{"type":"string","minLength":4,"maxLength":12,"title":"Room"}},{"name":"name","in":"query","required":false,"schema":{"type":"string","maxLength":60,"default":"Guest","title":"Name"}},{"name":"identity","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Identity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/turn":{"get":{"tags":["Geo (Layer-2)"],"summary":"Turn Credentials","operationId":"turn_credentials_api_v1_geo_talk_turn_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/talk/rooms/count":{"get":{"tags":["Geo (Layer-2)"],"summary":"Active Room Count","operationId":"active_room_count_api_v1_geo_talk_rooms_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/talk/register":{"post":{"tags":["Geo (Layer-2)"],"summary":"Register","operationId":"register_api_v1_geo_talk_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__chat_auth__RegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/confirm":{"get":{"tags":["Geo (Layer-2)"],"summary":"Confirm","description":"Magic-link confirmation. Single connection scope to avoid the\ntwo-connection-lock hazard on WAL DBs with concurrent writers.\nReturns HTML for browser clicks, JSON for API callers (Accept: json).","operationId":"confirm_api_v1_geo_talk_confirm_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/schedule":{"post":{"tags":["Geo (Layer-2)"],"summary":"Schedule","operationId":"schedule_api_v1_geo_talk_schedule_post","parameters":[{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/join":{"get":{"tags":["Geo (Layer-2)"],"summary":"Join","description":"Meeting participant clicks link. If email not yet a registered user,\nauto-register (single-field, email-only). Then redirect to room.","operationId":"join_api_v1_geo_talk_join_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/minutes":{"post":{"tags":["Geo (Layer-2)"],"summary":"Submit Minutes","operationId":"submit_minutes_api_v1_geo_talk_minutes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinutesIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/me":{"get":{"tags":["Geo (Layer-2)"],"summary":"Me","description":"Frontend uses this to check auth state + get current user's email.","operationId":"me_api_v1_geo_talk_me_get","parameters":[{"name":"whisk_talk_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Talk Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/register":{"post":{"tags":["Geo (Layer-2)"],"summary":"Register","operationId":"register_api_v1_geo_messages_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__chat_auth__RegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/confirm":{"get":{"tags":["Geo (Layer-2)"],"summary":"Confirm","operationId":"confirm_api_v1_geo_messages_confirm_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/session/pending":{"get":{"tags":["Geo (Layer-2)"],"summary":"Session Pending","operationId":"session_pending_api_v1_geo_messages_session_pending_get","parameters":[{"name":"pt","in":"query","required":true,"schema":{"type":"string","title":"Pt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/session/trust":{"post":{"tags":["Geo (Layer-2)"],"summary":"Session Trust","operationId":"session_trust_api_v1_geo_messages_session_trust_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/auth/google":{"post":{"tags":["Geo (Layer-2)"],"summary":"Auth Google","operationId":"auth_google_api_v1_geo_messages_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleSignInIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/me":{"get":{"tags":["Geo (Layer-2)"],"summary":"Me","operationId":"me_api_v1_geo_messages_me_get","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/logout":{"post":{"tags":["Geo (Layer-2)"],"summary":"Logout","operationId":"logout_api_v1_geo_messages_logout_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/settings/privacy":{"get":{"tags":["Geo (Layer-2)"],"summary":"Get My Privacy","operationId":"get_my_privacy_api_v1_geo_messages_settings_privacy_get","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Geo (Layer-2)"],"summary":"Set My Privacy","operationId":"set_my_privacy_api_v1_geo_messages_settings_privacy_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacySettingsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/profile":{"post":{"tags":["Geo (Layer-2)"],"summary":"Profile","operationId":"profile_api_v1_geo_messages_profile_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/account/delete":{"post":{"tags":["Geo (Layer-2)"],"summary":"Account Delete","description":"Self-service account deletion (GDPR / PDPA right to erasure).\nDeletes user row + all associated data across every table. Irrevocable.\nRequires the user to type their own email as confirmation.","operationId":"account_delete_api_v1_geo_messages_account_delete_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDeleteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/lastseen/{peer_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Peer Lastseen","description":"Get a peer's presence state + last_active timestamp. Used by clients\nto render \"Last seen at ...\" / \"Offline since ...\" labels for offline\npeers. Respects the peer's show_online privacy setting.","operationId":"peer_lastseen_api_v1_geo_messages_lastseen__peer_id__get","parameters":[{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/presence":{"get":{"tags":["Geo (Layer-2)"],"summary":"Presence Snapshot","description":"Public snapshot of online user_id count (no identifiers leak).","operationId":"presence_snapshot_api_v1_geo_messages_presence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/messages/contacts":{"get":{"tags":["Geo (Layer-2)"],"summary":"List Contacts","operationId":"list_contacts_api_v1_geo_messages_contacts_get","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/add":{"post":{"tags":["Geo (Layer-2)"],"summary":"Add Contact","description":"Send a contact request. Does NOT create the reciprocal contact rows\ndirectly — those only appear after the recipient accepts.\n\nAuto-mutual: if the recipient previously sent us a pending request,\nthis call accepts BOTH sides.","operationId":"add_contact_api_v1_geo_messages_contacts_add_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/requests":{"get":{"tags":["Geo (Layer-2)"],"summary":"List Requests","description":"Return the user's pending incoming and outgoing contact requests.","operationId":"list_requests_api_v1_geo_messages_contacts_requests_get","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/requests/accept":{"post":{"tags":["Geo (Layer-2)"],"summary":"Accept Request","operationId":"accept_request_api_v1_geo_messages_contacts_requests_accept_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReqActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/requests/decline":{"post":{"tags":["Geo (Layer-2)"],"summary":"Decline Request","description":"Silent decline — sender is never told.","operationId":"decline_request_api_v1_geo_messages_contacts_requests_decline_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReqActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/requests/withdraw":{"post":{"tags":["Geo (Layer-2)"],"summary":"Withdraw Request","description":"Sender withdraws their own pending request.","operationId":"withdraw_request_api_v1_geo_messages_contacts_requests_withdraw_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReqActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/discover":{"get":{"tags":["Geo (Layer-2)"],"summary":"Discover","operationId":"discover_api_v1_geo_messages_discover_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/mute":{"post":{"tags":["Geo (Layer-2)"],"summary":"Mute Contact","operationId":"mute_contact_api_v1_geo_messages_contacts_mute_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/contacts/remove":{"post":{"tags":["Geo (Layer-2)"],"summary":"Remove Contact","description":"Remove a contact from the authenticated user's contact list. Unilateral —\nthe removed peer still sees this user in their own list until they also\nremove. Frontend maintains flag-based removed/blocked lists locally.","operationId":"remove_contact_api_v1_geo_messages_contacts_remove_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/user/{peer_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Peer Lookup","description":"Return a peer's public profile by user_id. Used by the chat client\nwhen a message arrives from someone not in the caller's contact list.","operationId":"peer_lookup_api_v1_geo_messages_user__peer_id__get","parameters":[{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/discover_bulk":{"post":{"tags":["Geo (Layer-2)"],"summary":"Discover Bulk","description":"Bulk-check a list of emails against the users table. Returns only the\nsubset that are registered Whisk users — non-matches are silently dropped\nfor privacy (server never confirms/denies non-membership of an arbitrary\naddress to non-users of the system).\n\nClient sends this after importing Google Contacts (or later, phone\ncontacts) to figure out which of the user's existing contacts are on\nWhisk and can be auto-added, vs which need an email invite.\n\nRate-limited to 10 calls per user per hour to prevent enumeration\nscraping. Cap of 500 emails per call.","operationId":"discover_bulk_api_v1_geo_messages_discover_bulk_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/whisk_ask":{"post":{"tags":["Geo (Layer-2)"],"summary":"Whisk Ask","operationId":"whisk_ask_api_v1_geo_messages_whisk_ask_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/whisk_menu":{"get":{"tags":["Geo (Layer-2)"],"summary":"Whisk Menu","description":"Categorized menu of curated intents that actually return useful data.\n\nDropped from chip list (still available as intents but not promoted):\n- national_symbols (mostly Wikipedia search links — no real data)\n- rule_farming / rule_commercial / rule_industrial / rule_housebuy /\n  rule_trekking / rule_travel / rule_astronomy / rule_horoscope\n  (backend engine reshapes site signals through an intent lens rather than\n   producing a purpose-built report. Belongs to a separate purpose-built\n   engine per intent, not shown here as a chip.)","operationId":"whisk_menu_api_v1_geo_messages_whisk_menu_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/country/{cc}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Get Country","description":"Public country-facts endpoint. Returns None-fields-collapsed JSON.","operationId":"get_country_api_v1_geo_country__cc__get","parameters":[{"name":"cc","in":"path","required":true,"schema":{"type":"string","title":"Cc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/country":{"get":{"tags":["Geo (Layer-2)"],"summary":"List Countries","description":"List all countries in the local table (code + name only).","operationId":"list_countries_api_v1_geo_country_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/geo/messages/devices":{"post":{"tags":["Geo (Layer-2)"],"summary":"Device Register","operationId":"device_register_api_v1_geo_messages_devices_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegisterIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Geo (Layer-2)"],"summary":"Device List","operationId":"device_list_api_v1_geo_messages_devices_get","parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Active Only"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/devices/{peer_user_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Peer Devices","operationId":"peer_devices_api_v1_geo_messages_devices__peer_user_id__get","parameters":[{"name":"peer_user_id","in":"path","required":true,"schema":{"type":"string","title":"Peer User Id"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Active Only"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/devices/{device_id}":{"delete":{"tags":["Geo (Layer-2)"],"summary":"Device Remove","operationId":"device_remove_api_v1_geo_messages_devices__device_id__delete","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/devices/fcm-token":{"post":{"tags":["Geo (Layer-2)"],"summary":"Device Fcm Token","description":"Register / update the FCM push token for a device this user owns.\nCalled by the native app on first sign-in and whenever the token rotates\n(Android may re-issue tokens periodically or on app data clear).","operationId":"device_fcm_token_api_v1_geo_messages_devices_fcm_token_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FcmTokenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/outbox":{"post":{"tags":["Geo (Layer-2)"],"summary":"Outbox Post","operationId":"outbox_post_api_v1_geo_messages_outbox_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboxPostIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Geo (Layer-2)"],"summary":"Outbox Get","operationId":"outbox_get_api_v1_geo_messages_outbox_get","parameters":[{"name":"device_id","in":"query","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/outbox/ack":{"post":{"tags":["Geo (Layer-2)"],"summary":"Outbox Ack","operationId":"outbox_ack_api_v1_geo_messages_outbox_ack_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboxAckIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/diag":{"post":{"tags":["Geo (Layer-2)"],"summary":"Diag Upload","description":"Diagnostic snapshot upload. Auth-required. Stores plain-text snapshot\nunder /opt/rlb/whisk/backend/data/diag/ with timestamp + device_id for support\ndebugging. Auto-purged after 7 days.","operationId":"diag_upload_api_v1_geo_messages_diag_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/files/upload":{"post":{"tags":["Geo (Layer-2)"],"summary":"Upload File","operationId":"upload_file_api_v1_geo_messages_files_upload_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/files/{file_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Download File","operationId":"download_file_api_v1_geo_messages_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Geo (Layer-2)"],"summary":"Delete File","description":"Uploader can delete their own file early (e.g. after all recipients acked\nreceipt). Otherwise 30-day TTL takes care of cleanup.","operationId":"delete_file_api_v1_geo_messages_files__file_id__delete","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/messages/report":{"post":{"tags":["Geo (Layer-2)"],"summary":"Submit Report","operationId":"submit_report_api_v1_geo_messages_report_post","parameters":[{"name":"whisk_messages_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whisk Messages Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/invite_whisk":{"post":{"tags":["Geo (Layer-2)"],"summary":"Invite Whisk","operationId":"invite_whisk_api_v1_geo_talk_invite_whisk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_InviteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Invite Whisk Api V1 Geo Talk Invite Whisk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/talk/whisk_peers":{"get":{"tags":["Geo (Layer-2)"],"summary":"List Whisk Peers","operationId":"list_whisk_peers_api_v1_geo_talk_whisk_peers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Whisk Peers Api V1 Geo Talk Whisk Peers Get"}}}}}}},"/api/v1/geo/ask":{"get":{"tags":["Geo (Layer-2)"],"summary":"Layer-2 Geo endpoint (GET for browser eyeball)","operationId":"geo_ask_get_api_v1_geo_ask_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}},{"name":"concept_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"}},{"name":"sense","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense"}},{"name":"tier_filter","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Tier Filter"}},{"name":"confidence_filter","in":"query","required":false,"schema":{"type":"string","default":"asserted","title":"Confidence Filter"}},{"name":"phase","in":"query","required":false,"schema":{"type":"string","default":"full","title":"Phase"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Ask Get Api V1 Geo Ask Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Geo (Layer-2)"],"summary":"Layer-2 Geo endpoint — GeoNames + SRTM package","description":"v0.22.6.0.2-alpha — Layer-2 Geo endpoint.\n\nReads Geo package DB only (whisk_geo.db via geo_pedia). Explicitly\nrejects the 8 Astro hot-tier entities — if a query resolves to Astro,\nreturns a no-data response with a hint to use /astro/ask. This\nenforces strict Layer-2 package scoping: no cross-package bleed.","operationId":"geo_ask_api_v1_geo_ask_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Ask Api V1 Geo Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/ask/fast":{"get":{"tags":["Geo (Layer-2)"],"summary":"v0.22.6.0.5.16 — fast-phase render (skip topical)","operationId":"geo_ask_fast_api_v1_geo_ask_fast_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}},{"name":"concept_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"}},{"name":"sense","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Ask Fast Api V1 Geo Ask Fast Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/ask/topics":{"get":{"tags":["Geo (Layer-2)"],"summary":"v0.22.6.0.5.16 — topics-only render (paired with fast)","operationId":"geo_ask_topics_api_v1_geo_ask_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}},{"name":"concept_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"}},{"name":"sense","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Ask Topics Api V1 Geo Ask Topics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/earth/elevation_scatter":{"get":{"tags":["Geo (Layer-2)"],"summary":"Earth entity — downsampled global elevation scatter (Item 4c)","description":"Returns a compact payload for the Earth-page 3D scatter globe:\n\n    {\n        \"count\":  int,\n        \"lat\":    [float, ...],   # decimal degrees, 4dp\n        \"lon\":    [float, ...],   # decimal degrees, 4dp\n        \"dem\":    [int, ...],     # metres above sea level (SRTM)\n        \"eids\":   [str, ...],     # entity_ids for click-to-nav\n    }\n\n~20K points chosen via rowid modulo (divisor 670 → ~20K / 13.4M).\nPayload ~1 MB gzipped. Cached in-process for the whisk service\nlifetime; no expiry / cache-bust needed since GN data is static\nbetween deploys.","operationId":"geo_earth_elevation_scatter_api_v1_geo_earth_elevation_scatter_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Geo Earth Elevation Scatter Api V1 Geo Earth Elevation Scatter Get"}}}}}}},"/api/v1/geo/scatter/{entity_id}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Per-entity scatter data (elevation / climate / terrain / population)","description":"Returns compact scatter payload scoped to the given entity's\ndescendants:\n\n    {\"count\":  int,\n     \"entity_id\": str,\n     \"bbox\":   {\"min_lat\":..,\"max_lat\":..,\"min_lon\":..,\"max_lon\":..} | null,\n     \"lat\":    [float,...],   # 4dp\n     \"lon\":    [float,...],   # 4dp\n     \"dem\":    [int,...],     # metres above sea level (SRTM)\n     \"koppen\": [str,...],     # Köppen climate code, \"\" if unknown\n     \"tri\":    [float,...],   # terrain ruggedness index (0 fallback)\n     \"pop\":    [int,...]}     # population per entity (0 fallback)\n\nSampling uses rowid modulo — deterministic, geographically broad,\nO(sampled) rather than O(all). `points` accepts 8000/12000/15000\n(client bandwidth-adaptive); other values snap to 12000.\n\nScope rules:\n  * gn.earth_6295630  → whole planet, no filter\n  * feature_code CONT → continent_code = entity's continent\n  * feature_code PCLI/PCLD/PCLIX → country_code = entity's country\n  * feature_code ADM1..ADM4     → country + successive admin codes\n  * anything else               → empty (individual entities don't scatter)\n\nCached in-process by (entity_id, points_target). No expiry —\npayload is deterministic across a deploy.","operationId":"geo_scatter_api_v1_geo_scatter__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"points","in":"query","required":false,"schema":{"type":"integer","default":12000,"title":"Points"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Scatter Api V1 Geo Scatter  Entity Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/geo/hub/{name}":{"get":{"tags":["Geo (Layer-2)"],"summary":"Layer-2 Geo hub — hierarchical disambiguation view (GET)","description":"GN-native hierarchical hub for a place-name query. Returns the\nsame v2 payload shape (`groups[*].place_groups`) that the existing\n_renderPlacesBucketV2 frontend renders — three sections:\n\n  1. same_real_place  — anchor entity + inside_home_country tree\n  2. other_places_by_name  — exact canonical matches grouped by country + admin1\n  3. places_containing_name — substring matches grouped by country + admin1\n\nPCLI alt-name lookup ensures 'India' / 'Bharat' surface Republic\nof India as anchor.","operationId":"geo_hub_get_api_v1_geo_hub__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geo Hub Get Api V1 Geo Hub  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lex/ask":{"get":{"tags":["Lex (Layer-2, dormant)"],"summary":"Layer-2 Lex endpoint (GET for browser eyeball) — dormant","operationId":"lex_ask_get_api_v1_lex_ask_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lex Ask Get Api V1 Lex Ask Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Lex (Layer-2, dormant)"],"summary":"Layer-2 Lex endpoint — dormant until Lex track resumes","description":"v0.22.6.0.2-alpha — Lex package endpoint stub.\n\nThe Lex package (WordNet + CMU + Hunspell + name-etymology + domain\npacks) exists as a physical DB (whisk_lex.db) but has no Layer-2\ncomposer yet. Returns a dormant-package stub explaining the state.\nWill be reactivated when the Lex track resumes.","operationId":"lex_ask_api_v1_lex_ask_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lex Ask Api V1 Lex Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/astro/ask":{"get":{"tags":["Astro (Layer-2)"],"summary":"Layer-2 Astro endpoint (GET for browser eyeball)","operationId":"astro_ask_get_api_v1_astro_ask_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Astro Ask Get Api V1 Astro Ask Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Astro (Layer-2)"],"summary":"Layer-2 Astro endpoint — 8 hot-tier celestials","description":"v0.22.6.0.2-alpha — Layer-2 Astro endpoint.\n\nReads only the 8 hot-tier hand-authored flat-file JSONs (Saturn /\nJupiter / Mars / Titan / Kraken Mare / Newton / Newton SI Unit /\nSaturn's Rings). If a query resolves to anything else, returns a\nno-data response with a hint to use /geo/ask.","operationId":"astro_ask_api_v1_astro_ask_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Astro Ask Api V1 Astro Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pii/detect":{"post":{"tags":["PII"],"summary":"Detect PII candidates in text (regex + Luhn)","operationId":"detect_pii_api_v1_pii_detect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PIIRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Detect Pii Api V1 Pii Detect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pii/detectors":{"get":{"tags":["PII"],"summary":"Enumerate available PII detectors","operationId":"list_detectors_api_v1_pii_detectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Detectors Api V1 Pii Detectors Get"}}}}}}},"/api/v1/encyclopedia/entities":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"List all entities in the encyclopedia (summary)","operationId":"list_entities_api_v1_encyclopedia_entities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Entities Api V1 Encyclopedia Entities Get"}}}}}}},"/api/v1/encyclopedia/entities/{entity_id}":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Full entity payload","operationId":"get_entity_api_v1_encyclopedia_entities__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Entity Api V1 Encyclopedia Entities  Entity Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/entities/{entity_id}/graph":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Adjacency graph centered on an entity, for mind-map rendering (slice 26.5)","description":"Returns {nodes, edges} for the standalone Ask UI's mind map.\n\n``hops``:\n  - \"1\" (default) — direct relations only.\n  - \"2\" — direct relations + one more hop out from each newly-seen node.\n  - \"ancestor\" — walk the ``instance_of`` chain upward only, ignoring\n    every other predicate.\n\nSlice 26.5 shipped this against hand-authored relations.jsonl only.\nSlice 28 folds in ConceptNet cold-tier edges (capped: 20 for hops=1, 60\nfor hops=2) so hot entities pick up their cold structural context AND\ncold-tier entities (Delhi, bicycle) get a mind map at all. Existing\nhand-authored edges take precedence and are never dropped.","operationId":"entity_graph_api_v1_encyclopedia_entities__entity_id__graph_get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"hops","in":"query","required":false,"schema":{"type":"string","default":"1","title":"Hops"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Entity Graph Api V1 Encyclopedia Entities  Entity Id  Graph Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/concepts":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"List all concepts in the encyclopedia (summary)","operationId":"list_concepts_api_v1_encyclopedia_concepts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Concepts Api V1 Encyclopedia Concepts Get"}}}}}}},"/api/v1/encyclopedia/concepts/{concept_id}":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Full concept payload","operationId":"get_concept_api_v1_encyclopedia_concepts__concept_id__get","parameters":[{"name":"concept_id","in":"path","required":true,"schema":{"type":"string","title":"Concept Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Concept Api V1 Encyclopedia Concepts  Concept Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/concepts/{concept_id}/graph":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Synthesized adjacency graph centered on a concept (slice 26.6)","description":"Concepts aren't in relations.jsonl (that file is entity-to-entity),\nso we synthesize a small mind-map on the fly from the concept's own\n``applies_to_entities`` / ``non_applies_to_entities`` /\n``applies_to_concepts`` fields. Sibling to /entities/{id}/graph so the\nfrontend can render a mind map regardless of node type.","operationId":"concept_graph_api_v1_encyclopedia_concepts__concept_id__graph_get","parameters":[{"name":"concept_id","in":"path","required":true,"schema":{"type":"string","title":"Concept Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Concept Graph Api V1 Encyclopedia Concepts  Concept Id  Graph Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/relations":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"All canonical relation edges","operationId":"list_relations_api_v1_encyclopedia_relations_get","parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"predicate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Relations Api V1 Encyclopedia Relations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/words/{word_lower}/hub":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Word-hub structured payload for the disambiguation card list (UX-2)","operationId":"word_hub_api_v1_encyclopedia_words__word_lower__hub_get","parameters":[{"name":"word_lower","in":"path","required":true,"schema":{"type":"string","title":"Word Lower"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Word Hub Api V1 Encyclopedia Words  Word Lower  Hub Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/words/{word_lower}/graph":{"get":{"tags":["Encyclopedia (alpha)"],"summary":"Word-hub cytoscape graph (word center + buckets + optional senses) (UX-3)","operationId":"word_hub_graph_api_v1_encyclopedia_words__word_lower__graph_get","parameters":[{"name":"word_lower","in":"path","required":true,"schema":{"type":"string","title":"Word Lower"}},{"name":"depth","in":"query","required":false,"schema":{"type":"string","default":"extended","title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Word Hub Graph Api V1 Encyclopedia Words  Word Lower  Graph Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/internetpedia/posts":{"get":{"tags":["InternetPedia (alpha)"],"summary":"List all Posts in InternetPedia (summary)","operationId":"list_posts_api_v1_internetpedia_posts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Posts Api V1 Internetpedia Posts Get"}}}}}}},"/api/v1/internetpedia/posts/{post_id}":{"get":{"tags":["InternetPedia (alpha)"],"summary":"Full Post payload","operationId":"get_post_api_v1_internetpedia_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Post Api V1 Internetpedia Posts  Post Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/internetpedia/voices":{"get":{"tags":["InternetPedia (alpha)"],"summary":"List all Voices (channels / publications)","operationId":"list_voices_api_v1_internetpedia_voices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Voices Api V1 Internetpedia Voices Get"}}}}}}},"/api/v1/internetpedia/voices/{voice_id}":{"get":{"tags":["InternetPedia (alpha)"],"summary":"Full Voice payload","operationId":"get_voice_api_v1_internetpedia_voices__voice_id__get","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Voice Api V1 Internetpedia Voices  Voice Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/dry-run":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Compute an IngestionDecision without mutating entity JSON","operationId":"dry_run_api_v1_encyclopedia_ingestion_dry_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimCandidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dry Run Api V1 Encyclopedia Ingestion Dry Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/queue":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"List pending curator-review items","operationId":"review_queue_api_v1_encyclopedia_ingestion_queue_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Review Queue Api V1 Encyclopedia Ingestion Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/transcript":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"Recent ingestion decisions (audit tail)","operationId":"transcript_api_v1_encyclopedia_ingestion_transcript_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Api V1 Encyclopedia Ingestion Transcript Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/apply":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Apply a ClaimCandidate (mutates entity JSON)","operationId":"apply_api_v1_encyclopedia_ingestion_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimCandidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Apply Api V1 Encyclopedia Ingestion Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/queue/{candidate_id}/approve":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Curator approves a queued item — runs apply on the stored candidate","operationId":"approve_queue_api_v1_encyclopedia_ingestion_queue__candidate_id__approve_post","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueDispositionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Queue Api V1 Encyclopedia Ingestion Queue  Candidate Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/queue/{candidate_id}/reject":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Curator rejects a queued item — no mutation, queue entry closes","operationId":"reject_queue_api_v1_encyclopedia_ingestion_queue__candidate_id__reject_post","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueDispositionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Queue Api V1 Encyclopedia Ingestion Queue  Candidate Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/promote-from-post":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Promote an InternetPedia post to an Encyclopedia claim (curated)","operationId":"promote_from_post_api_v1_encyclopedia_ingestion_promote_from_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteFromPostRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Promote From Post Api V1 Encyclopedia Ingestion Promote From Post Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/promotion-candidates":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"Detect InternetPedia entities with enough corroboration for review","operationId":"promotion_candidates_api_v1_encyclopedia_ingestion_promotion_candidates_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Window Days"}},{"name":"min_voices","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Min Voices"}},{"name":"reference_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promotion Candidates Api V1 Encyclopedia Ingestion Promotion Candidates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/bulk-wikidata-dry-run":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"Run the ingestion pipeline over a vendored Wikidata sample (dry-run)","description":"Load the vendored Wikidata sample for ``qid`` (e.g. Q193 = Saturn) and\nrun each structural claim through decide() in dry-run. Returns a per-\ncandidate decision report + summary counts. Never mutates entity JSON.\n\nReal Wikidata bulk ingestion would fetch from SPARQL / dumps and call\nthe same decide() path; this endpoint proves the decision engine\nhandles bulk input at scale on a curated sample.","operationId":"bulk_wikidata_dry_run_api_v1_encyclopedia_ingestion_bulk_wikidata_dry_run_get","parameters":[{"name":"qid","in":"query","required":false,"schema":{"type":"string","default":"Q193","title":"Qid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Wikidata Dry Run Api V1 Encyclopedia Ingestion Bulk Wikidata Dry Run Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/reliability-decay-audit":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"Audit every source's effective reliability given its publication age","description":"Walk every entity + concept, collect all source references, compute\nan effective reliability per source using the piecewise-linear decay\ncurve (fresh <20y / aging 20-100y / historical >=100y). Reports the\ncounts per bucket + full per-source detail.\n\nNever mutates. Curator tool for spotting pre-1929 sources that need\nmodern backfill.","operationId":"reliability_decay_audit_api_v1_encyclopedia_ingestion_reliability_decay_audit_get","parameters":[{"name":"reference_year","in":"query","required":false,"schema":{"type":"integer","default":2026,"title":"Reference Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reliability Decay Audit Api V1 Encyclopedia Ingestion Reliability Decay Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/reindex-sources":{"get":{"tags":["Ingestion pipeline (alpha)"],"summary":"Curator worklist: sources missing published_year (slice 15)","description":"Non-mutating audit that walks every entity + concept, collects each\nsource dict, and reports which are missing ``published_year``. Returns\na curator worklist with a per-source suggested_year (heuristic from\ncitation / date / portal). Turns the reliability-decay audit's dominant\n\"unknown\" bucket into a specific backfill worklist.\n\nAnonymous read — no auth required (mirrors reliability-decay-audit).","operationId":"reindex_sources_api_v1_encyclopedia_ingestion_reindex_sources_get","parameters":[{"name":"reference_year","in":"query","required":false,"schema":{"type":"integer","default":2026,"title":"Reference Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reindex Sources Api V1 Encyclopedia Ingestion Reindex Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/reindex-relations":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Regenerate relations.jsonl from every entity's relations[] (slice 14)","description":"Curator-triggered regeneration of the derived top-level relations\nindex. Ingestion apply-mode (corroborate_relation) writes to\nentity.relations[]; this endpoint rewrites the aggregate atomically.\n\nIdempotent — same input → same file bytes. Small utility; ships as\nan explicit endpoint per the slice-14 alignment (no auto-run on\nevery apply → keeps the hot path fast).","operationId":"reindex_relations_api_v1_encyclopedia_ingestion_reindex_relations_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reindex Relations Api V1 Encyclopedia Ingestion Reindex Relations Post"}}}}}}},"/api/v1/encyclopedia/ingestion/drop-stub":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Drop the ``stub: true`` marker from an entity that has grown (slice 14)","description":"Transition a stub entity to first-class once its inherited_attributes\nhave grown past the threshold (5 leaves as of slice 14). Snapshots + atomic\nwrite + cache reload. No-op on entities without the marker.","operationId":"drop_stub_api_v1_encyclopedia_ingestion_drop_stub_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DropStubRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Drop Stub Api V1 Encyclopedia Ingestion Drop Stub Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/encyclopedia/ingestion/reevaluate-derived-claims":{"post":{"tags":["Ingestion pipeline (alpha)"],"summary":"Audit derived claims: what tier the B.6 formula would compute today","description":"Walk every derived claim; compute what its tier SHOULD be given\nthe concept tier + current attribute-slot tiers; report staleness.\nDoes NOT mutate — surfaces work for curator's manual disposition\nuntil a schema shift links derived-claim inputs to claim IDs.","operationId":"reevaluate_derived_claims_api_v1_encyclopedia_ingestion_reevaluate_derived_claims_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reevaluate Derived Claims Api V1 Encyclopedia Ingestion Reevaluate Derived Claims Post"}}}}}}},"/api/v1/ingest/dry-run":{"post":{"tags":["Whisk Ingest (alpha)"],"summary":"Ingest dry-run: per-token resolution + suggested triples (slice 17)","description":"Slice 17 entry — runs the deterministic Ingest pipeline over the\ninput text and returns a review JSON. Never mutates any graph state.\n\nResponse shape (see tools.ingest.IngestDryRun):\n    input_text        — the raw input\n    tokens            — per-token resolution (kind, entity_id or shell,\n                        confidence, match_type, ...)\n    spans             — Whisk Pedia hits on multi-word NER spans\n    triples           — extracted (subject, predicate, object) triples\n                        with resolved entity ids where possible\n    nodes_to_create   — deduped shell candidates that ingest WOULD\n                        create if apply were invoked\n    stats             — count of each resolution kind\n    audit             — raw spaCy NER + noun chunks + sentence spans\n\nCurator uses this to spot-check that lookup + triple extraction fire\ncorrectly on a document before turning on apply-mode in slice 18+.","operationId":"dry_run_api_v1_ingest_dry_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDryRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dry Run Api V1 Ingest Dry Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/cold-pedia/status":{"get":{"tags":["Whisk Ingest (alpha)"],"summary":"Cold Pedia size + origin breakdown (slice 26)","description":"Return total count + per-origin counts for the cold-tier Pedia.\nAnonymous read. Used to verify materialization ran successfully.","operationId":"cold_pedia_status_api_v1_ingest_cold_pedia_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cold Pedia Status Api V1 Ingest Cold Pedia Status Get"}}}}}}},"/api/v1/ingest/cold-pedia/lookup":{"get":{"tags":["Whisk Ingest (alpha)"],"summary":"Cold Pedia alias lookup (slice 26)","description":"Direct alias lookup against the cold tier. Anonymous read.","operationId":"cold_pedia_lookup_api_v1_ingest_cold_pedia_lookup_get","parameters":[{"name":"alias","in":"query","required":true,"schema":{"type":"string","title":"Alias"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cold Pedia Lookup Api V1 Ingest Cold Pedia Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/transcript":{"get":{"tags":["Whisk Ingest (alpha)"],"summary":"Recent Ingest dry-run audit trail (slice 18)","description":"Return the last N entries from the Ingest transcript. Each entry\nrecords timestamp + input preview + resolution kind counts + shell +\ntriple counts (not the full per-token detail — that's on the response\nof the original /dry-run call). Anonymous read.","operationId":"transcript_api_v1_ingest_transcript_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Api V1 Ingest Transcript Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/apply":{"post":{"tags":["Whisk Ingest (alpha)"],"summary":"Ingest apply-mode — mutates encyclopedia state (slice 22)","description":"Slice 22 — run the deterministic Ingest pipeline AND commit its\noutput to the encyclopedia graph.\n\nSequence:\n  1. Dry-run the input text (per-token resolution + triples + shells)\n  2. For each shell candidate → create a stub entity JSON on disk\n     (stub: true, canonical_name from source mention, source\n     attribution to `source_id`/`source_portal`)\n  3. Re-run dry-run so triples can link to the freshly-created shells\n  4. For each triple → generate a ClaimCandidate + route through the\n     existing decide() + apply_decision() pipeline (slices 6-14)\n  5. Return the aggregate report — created shells + applied triples +\n     concept applicability suggestions\n\nMutates encyclopedia state — requires an API key (same auth as the\n/ingestion mutation endpoints).","operationId":"apply_api_v1_ingest_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestApplyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Apply Api V1 Ingest Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/apply-cold":{"post":{"tags":["Whisk Ingest (alpha)"],"summary":"Ingest apply-mode — cold-tier only (slice 28.5, no API key)","description":"Slice 28.5 — cold-tier-only ingest apply. Open (no ``WHISK_ADMIN_KEY``)\nso bulk loaders (slice-29 Wikidata / DBpedia) can enrich cold-tier\nentities without a curator key.\n\nGuardrails vs the gated ``/apply`` endpoint:\n\n  1. **No shell creation** — ``create_shells`` is forced to False. A\n     mention that doesn't already exist in either hot JSON or the\n     cold-pedia gazetteer is silently skipped rather than minting a\n     hot-tier shell.\n  2. **Hot-tier writes rejected** — any triple whose subject resolves\n     to a hot-tier JSON file is skipped with reason\n     ``hot_tier_requires_admin_key`` in the response. Callers wanting\n     to write to a hand-authored hot entity must use ``/apply`` with\n     a valid X-Api-Key.\n  3. **Kill-switch** — set env ``WHISK_INGEST_COLD_OPEN=false`` to\n     require an admin key on this route too (returns 503). Default is\n     open.\n  4. **Rate-limited** by the existing middleware\n     (500/hr anonymous per client_id), same envelope as /ask.\n\nCold-tier mutations themselves are fully-automatic — see\n``tools.cold_pedia.write_claim_cold`` / ``apply_new_slot_cold`` etc.\nfor the write layer.","operationId":"apply_cold_api_v1_ingest_apply_cold_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestApplyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Apply Cold Api V1 Ingest Apply Cold Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/on-demand":{"post":{"tags":["Whisk Ingest (alpha)"],"summary":"On-demand Wikipedia article ingest (slice 29b-1 v6, no API key)","description":"Slice 29b-1 v6 Item 4 — encounter-driven Wikipedia ingest.\n\nFlow:\n  1. Resolve query → Wikipedia article title (redirects + disambig)\n  2. If disambiguation → return candidates for user to pick\n  3. If not_found → return no_match_in_wikipedia\n  4. Else → fetch wikitext, parse, feed to Whisk Ingest text pipeline,\n     extract infobox facts, collect wikilinks as dangling refs, extract\n     wikidata_qid via {{wikidata}} template, write entity JSON,\n     cold-tier canonical_id link, fire inverse-relation engine.\n\nResponse `outcome` values:\n  - \"ingested\"                 — new entity created; page URL returned\n  - \"disambiguation_required\"  — user must pick from candidates\n  - \"no_match_in_wikipedia\"    — query didn't resolve to any article\n  - \"skipped_exists\"           — entity already exists (if_exists=skip)\n  - \"error\"                    — internal error; check `error` field\n\nNO auth (same as /apply-cold). Kill switch env\nWHISK_INGEST_ON_DEMAND_OPEN=false disables the route entirely.","operationId":"ingest_on_demand_api_v1_ingest_on_demand_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnDemandRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ingest On Demand Api V1 Ingest On Demand Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/terminology/check":{"post":{"tags":["Cross-doc Terminology"],"summary":"Flag inconsistent variant spellings across a document","description":"Scan the input text and return every variant family where ≥2 distinct\nspellings appear. Deterministic — same input → same output. Non-LLM. ~60\nEnglish families curated (email/e-mail, U.S./US, JavaScript/Javascript,\nUK/US spellings, etc.). Add more via ``data/terminology/en_variants.json``.","operationId":"check_api_v1_terminology_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__cross_doc_terminology_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Api V1 Terminology Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/terminology/families":{"get":{"tags":["Cross-doc Terminology"],"summary":"List every variant family in the catalog","description":"Introspection — the checker's dataset. Feed this to a settings screen\nor ignore-list UI.","operationId":"families_api_v1_terminology_families_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Families Api V1 Terminology Families Get"}}}}}}},"/api/v1/terminology/stats":{"get":{"tags":["Cross-doc Terminology"],"summary":"Catalog stats","operationId":"stats_api_v1_terminology_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api V1 Terminology Stats Get"}}}}}}},"/api/v1/homograph/analyse":{"post":{"tags":["Homograph"],"summary":"Scan text and disambiguate every homograph occurrence","description":"Non-LLM homograph disambiguation combining spaCy POS + WordNet Lesk WSD.\nDeterministic — same input → same output. Zero external dependency.","operationId":"analyse_api_v1_homograph_analyse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Analyse Api V1 Homograph Analyse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/homograph/detect":{"get":{"tags":["Homograph"],"summary":"Enumerate senses of a single word","description":"Get every WordNet sense of the word. Provide `context` to also get the\nLesk-disambiguated winner. Useful for wordchoice UIs surfacing sense picker.","operationId":"detect_api_v1_homograph_detect_get","parameters":[{"name":"word","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Word to enumerate all WordNet senses of.","title":"Word"},"description":"Word to enumerate all WordNet senses of."},{"name":"context","in":"query","required":false,"schema":{"type":"string","description":"Optional sentence context for Lesk WSD.","default":"","title":"Context"},"description":"Optional sentence context for Lesk WSD."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Detect Api V1 Homograph Detect Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/homograph/words":{"get":{"tags":["Homograph"],"summary":"List every homograph in the curated shortlist","operationId":"words_api_v1_homograph_words_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Words Api V1 Homograph Words Get"}}}}}}},"/api/v1/langdetect/detect":{"post":{"tags":["Language Detect"],"summary":"Detect the language of a text (176-lang, non-LLM)","description":"Deterministic language detection via fastText lid.176 (bundled — no\nexternal API). Falls back to a Unicode-script heuristic if the model\nisn't loaded. Zero external dependency at runtime.","operationId":"detect_api_v1_langdetect_detect_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__langdetect_api__DetectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Detect Api V1 Langdetect Detect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Language Detect"],"summary":"Detect the language of a query-string text (GET)","description":"Convenience GET variant for browser use.","operationId":"detect_get_api_v1_langdetect_detect_get","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":2000,"title":"Text"}},{"name":"k","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":3,"title":"K"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Detect Get Api V1 Langdetect Detect Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/langdetect/health":{"get":{"tags":["Language Detect"],"summary":"Language-detect subsystem status","operationId":"health_api_v1_langdetect_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Langdetect Health Get"}}}}}}},"/api/v1/cliche/check":{"post":{"tags":["Cliché"],"summary":"Detect cliché phrases in text","description":"Non-LLM cliché detector. 300-entry curated seed across 10 categories,\ngrows toward 5,000+ across future sessions. Deterministic — same input\nalways yields same hits. Zero external dependency.","operationId":"check_api_v1_cliche_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__cliche_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Api V1 Cliche Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cliche/categories":{"get":{"tags":["Cliché"],"summary":"Category distribution in the catalog","operationId":"categories_api_v1_cliche_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Categories Api V1 Cliche Categories Get"}}}}}}},"/api/v1/cliche/stats":{"get":{"tags":["Cliché"],"summary":"Catalog stats","operationId":"stats_api_v1_cliche_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api V1 Cliche Stats Get"}}}}}}},"/api/v1/confusion/check":{"post":{"tags":["Confusion pairs (malapropism)","confusion pairs"],"summary":"Flag words commonly confused with a look-alike or near-homophone","description":"Return a list of malapropism flags for the given text.\n\nEvery flag is a REAL English word (Hunspell won't catch it) that is\ncommonly used in place of a similar-looking or similar-sounding word\nwith a different meaning. The frontend shows these with a yellow\nunderline distinct from red spellcheck flags.","operationId":"check_confusion_pairs_api_v1_confusion_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__confusion_pairs_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Confusion Pairs Api V1 Confusion Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/confusion/catalog":{"get":{"tags":["Confusion pairs (malapropism)","confusion pairs"],"summary":"Confusion-pair catalog stats","description":"Introspection: how many pairs the check has, by category.","operationId":"catalog_stats_api_v1_confusion_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Catalog Stats Api V1 Confusion Catalog Get"}}}}}}},"/api/v1/silent-errors/check":{"post":{"tags":["Silent errors (17-check batch)","Silent errors"],"summary":"Run all 17 silent-error checks over the text","description":"Return every hit from every check, offset-sorted, with a common shape.\n\nThe frontend renders these with underline styles that vary by category\n(grammar = red; style = yellow; informational = grey).","operationId":"check_silent_errors_api_v1_silent_errors_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__silent_errors_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Silent Errors Api V1 Silent Errors Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/silent-errors/catalog":{"get":{"tags":["Silent errors (17-check batch)","Silent errors"],"summary":"Introspection: which checks + how many entries","operationId":"catalog_api_v1_silent_errors_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Catalog Api V1 Silent Errors Catalog Get"}}}}}}},"/api/v1/translate/":{"post":{"tags":["Translation"],"summary":"Translate text between two languages (non-LLM)","description":"Deterministic translation via bundled Marian OPUS-MT. Zero external\nMT API. Supported pairs: en↔hi, es, fr, de, zh, ja, ar, pt, it, ru.\nNon-en↔non-en pairs pivot through English in two hops.","operationId":"translate_api_v1_translate__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Translate Api V1 Translate  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/translate/pairs":{"get":{"tags":["Translation"],"summary":"List every language pair whose model is present on the server","operationId":"pairs_api_v1_translate_pairs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Pairs Api V1 Translate Pairs Get"}}}}}}},"/api/v1/translate/health":{"get":{"tags":["Translation"],"summary":"Translation subsystem status","operationId":"health_api_v1_translate_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Translate Health Get"}}}}}}},"/api/v1/paraphrase/":{"post":{"tags":["Paraphrase"],"summary":"Paraphrase text (non-LLM, non-hallucinating)","description":"Deterministic paraphrasing via WordNet + Lesk WSD + Plain-English +\nShorten dictionaries. Zero external API. Preserves facts (proper nouns,\nnumbers, named entities untouched). Same input → same output, always.","operationId":"paraphrase_api_v1_paraphrase__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParaphraseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Paraphrase Api V1 Paraphrase  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paraphrase/modes":{"get":{"tags":["Paraphrase"],"summary":"List available paraphrase modes","operationId":"modes_api_v1_paraphrase_modes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Modes Api V1 Paraphrase Modes Get"}}}}}}},"/api/v1/collocation/check":{"post":{"tags":["Collocations"],"summary":"Find collocations in text","operationId":"check_api_v1_collocation_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__collocation_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Api V1 Collocation Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collocation/head/{word}":{"get":{"tags":["Collocations"],"summary":"Collocations sharing a head word","operationId":"by_head_api_v1_collocation_head__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}},{"name":"min_strength","in":"query","required":false,"schema":{"type":"string","description":"'weak' | 'medium' | 'strong'","default":"medium","title":"Min Strength"},"description":"'weak' | 'medium' | 'strong'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response By Head Api V1 Collocation Head  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collocation/contains/{word}":{"get":{"tags":["Collocations"],"summary":"Collocations containing a given word (as head or modifier)","operationId":"contains_word_api_v1_collocation_contains__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Contains Word Api V1 Collocation Contains  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collocation/stats":{"get":{"tags":["Collocations"],"summary":"Catalog stats","operationId":"stats_api_v1_collocation_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api V1 Collocation Stats Get"}}}}}}},"/api/v1/embeddings/similarity":{"post":{"tags":["Embeddings"],"summary":"Cosine similarity between two words","operationId":"similarity_api_v1_embeddings_similarity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__embeddings_api__SimilarityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Similarity Api V1 Embeddings Similarity Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/nearest":{"post":{"tags":["Embeddings"],"summary":"Top-N nearest neighbours by cosine similarity","operationId":"nearest_api_v1_embeddings_nearest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nearest Api V1 Embeddings Nearest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/analogy":{"post":{"tags":["Embeddings"],"summary":"A is to B as C is to what? (e.g. man:king :: woman:?)","description":"Vector arithmetic — computes ``vec(b) - vec(a) + vec(c)`` and returns\nthe nearest words, excluding a/b/c themselves.","operationId":"analogy_api_v1_embeddings_analogy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalogyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Analogy Api V1 Embeddings Analogy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/rank_by_context":{"post":{"tags":["Embeddings"],"summary":"Rank candidate words by contextual similarity","description":"Used by the paraphrase engine (and any downstream tool) to pick the\nsynonym that best fits the surrounding sentence.","operationId":"rank_by_context_api_v1_embeddings_rank_by_context_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextRankRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rank By Context Api V1 Embeddings Rank By Context Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/vector/{word}":{"get":{"tags":["Embeddings"],"summary":"Raw 300-d vector for a word (truncated preview)","operationId":"vector_api_v1_embeddings_vector__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}},{"name":"full","in":"query","required":false,"schema":{"type":"boolean","description":"Return all 300 dims (default: first 20 for preview)","default":false,"title":"Full"},"description":"Return all 300 dims (default: first 20 for preview)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Vector Api V1 Embeddings Vector  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/health":{"get":{"tags":["Embeddings"],"summary":"Embeddings subsystem status","operationId":"health_api_v1_embeddings_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Embeddings Health Get"}}}}}}},"/api/v1/lm/score":{"post":{"tags":["Language Model"],"summary":"Log-probability + perplexity of a sentence","description":"Bigram+trigram scoring over NLTK Brown+Reuters. Higher log_prob = more\nlikely under the LM; lower perplexity = more predictable.","operationId":"score_api_v1_lm_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Score Api V1 Lm Score Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lm/rank_candidates":{"post":{"tags":["Language Model"],"summary":"Rank candidate words by contextual fit","operationId":"rank_candidates_api_v1_lm_rank_candidates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__language_model_api__RankRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rank Candidates Api V1 Lm Rank Candidates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lm/check_homophones":{"post":{"tags":["Language Model"],"summary":"Find likely homophone / word-confusion swaps","description":"Scans text for common homophone shortlist words (there/their/affect/effect/etc.).\nFor each occurrence, compares its LM score against its peers; if a peer scores\nsubstantially higher, flags it as a likely swap.","operationId":"check_homophones_api_v1_lm_check_homophones_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomophoneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Homophones Api V1 Lm Check Homophones Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lm/health":{"get":{"tags":["Language Model"],"summary":"Language-model subsystem status","operationId":"health_api_v1_lm_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Lm Health Get"}}}}}}},"/api/v1/tone/":{"post":{"tags":["Tone Rewrite"],"summary":"Rewrite text on one tone axis (whole-document scope)","description":"Non-LLM deterministic tone rewrite. Applies a curated regex catalog\n(Grammarly-parity pre-LLM methodology). Same input → same output.\nWhole-document scope; no sentence limit.","operationId":"rewrite_api_v1_tone__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewriteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rewrite Api V1 Tone  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tone/multi":{"post":{"tags":["Tone Rewrite"],"summary":"Apply multiple tone-axis rewrites in sequence","operationId":"rewrite_multi_api_v1_tone_multi_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRewriteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rewrite Multi Api V1 Tone Multi Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tone/axes":{"get":{"tags":["Tone Rewrite"],"summary":"List available axes + rule counts","operationId":"axes_api_v1_tone_axes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Axes Api V1 Tone Axes Get"}}}}}}},"/api/v1/restructure/":{"post":{"tags":["Sentence Restructure"],"summary":"Apply structural sentence transformations (whole-doc)","operationId":"restructure_api_v1_restructure__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestructureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Restructure Api V1 Restructure  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/restructure/transformations":{"get":{"tags":["Sentence Restructure"],"summary":"List available transformation sets","operationId":"transformations_api_v1_restructure_transformations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Transformations Api V1 Restructure Transformations Get"}}}}}}},"/api/v1/sbert/similarity":{"post":{"tags":["Sentence-BERT"],"summary":"Semantic similarity of two sentences","operationId":"similarity_api_v1_sbert_similarity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__sentence_bert_api__SimilarityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Similarity Api V1 Sbert Similarity Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sbert/embed":{"post":{"tags":["Sentence-BERT"],"summary":"Get 384-d sentence embeddings","operationId":"embed_api_v1_sbert_embed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Embed Api V1 Sbert Embed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sbert/rank_candidates":{"post":{"tags":["Sentence-BERT"],"summary":"Rank candidate rewrites by semantic similarity to reference","operationId":"rank_candidates_api_v1_sbert_rank_candidates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__sentence_bert_api__RankRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rank Candidates Api V1 Sbert Rank Candidates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sbert/health":{"get":{"tags":["Sentence-BERT"],"summary":"Sentence-BERT subsystem status","operationId":"health_api_v1_sbert_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Sbert Health Get"}}}}}}},"/api/v1/classify/sentiment":{"post":{"tags":["Text Classifier"],"summary":"Positive / negative sentiment classifier","description":"Naive-Bayes trained on NLTK movie_reviews (2000 labeled reviews).","operationId":"sentiment_api_v1_classify_sentiment_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sentiment Api V1 Classify Sentiment Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classify/register":{"post":{"tags":["Text Classifier"],"summary":"Formal / informal register classifier","description":"Naive-Bayes trained on Brown editorial+government (formal) vs webtext (informal).","operationId":"register_api_v1_classify_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register Api V1 Classify Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classify/health":{"get":{"tags":["Text Classifier"],"summary":"Classifiers subsystem status","operationId":"health_api_v1_classify_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Classify Health Get"}}}}}}},"/api/v1/coherence/check":{"post":{"tags":["Coherence"],"summary":"Whole-document coherence: register + voice + tense drift","operationId":"check_api_v1_coherence_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__coherence_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Api V1 Coherence Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/rhymes/{word}":{"get":{"tags":["Utilities"],"summary":"Words that rhyme with the given word (CMU)","operationId":"rhymes_api_v1_utils_rhymes__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rhymes Api V1 Utils Rhymes  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/phonetic/{word}":{"get":{"tags":["Utilities"],"summary":"CMU phonetic transcription","operationId":"phonetic_api_v1_utils_phonetic__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Phonetic Api V1 Utils Phonetic  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/reading_time":{"post":{"tags":["Utilities"],"summary":"Estimate reading time","operationId":"reading_time_api_v1_utils_reading_time_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__utilities_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reading Time Api V1 Utils Reading Time Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/speaking_time":{"post":{"tags":["Utilities"],"summary":"Estimate speaking time","operationId":"speaking_time_api_v1_utils_speaking_time_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__utilities_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Speaking Time Api V1 Utils Speaking Time Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/word_frequency":{"post":{"tags":["Utilities"],"summary":"Word frequency + Zipf ranking","operationId":"word_frequency_api_v1_utils_word_frequency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreqRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Word Frequency Api V1 Utils Word Frequency Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/base64_encode":{"post":{"tags":["Utilities"],"summary":"Base64-encode text","operationId":"base64_encode_api_v1_utils_base64_encode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__utilities_api__EncodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Base64 Encode Api V1 Utils Base64 Encode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/base64_decode":{"post":{"tags":["Utilities"],"summary":"Base64-decode text","operationId":"base64_decode_api_v1_utils_base64_decode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__utilities_api__EncodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Base64 Decode Api V1 Utils Base64 Decode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/url_encode":{"post":{"tags":["Utilities"],"summary":"URL percent-encode","operationId":"url_encode_api_v1_utils_url_encode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Url Encode Api V1 Utils Url Encode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/url_decode":{"post":{"tags":["Utilities"],"summary":"URL percent-decode","operationId":"url_decode_api_v1_utils_url_decode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Url Decode Api V1 Utils Url Decode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/hash":{"post":{"tags":["Utilities"],"summary":"Hash text (md5/sha1/sha256/sha512)","operationId":"hash_hex_api_v1_utils_hash_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HashRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Hash Hex Api V1 Utils Hash Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/json/pretty":{"post":{"tags":["Utilities"],"summary":"Pretty-print JSON","operationId":"json_pretty_api_v1_utils_json_pretty_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Json Pretty Api V1 Utils Json Pretty Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/json/minify":{"post":{"tags":["Utilities"],"summary":"Minify JSON","operationId":"json_minify_api_v1_utils_json_minify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Json Minify Api V1 Utils Json Minify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/regex_test":{"post":{"tags":["Utilities"],"summary":"Test a regex pattern against text","operationId":"regex_test_api_v1_utils_regex_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegexRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Regex Test Api V1 Utils Regex Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/list_to_table":{"post":{"tags":["Utilities"],"summary":"Parse a bulleted/numbered list into a table","operationId":"list_to_table_api_v1_utils_list_to_table_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List To Table Api V1 Utils List To Table Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stat_grammar/check":{"post":{"tags":["Statistical Grammar"],"summary":"Statistical grammar error detection via LM scoring","description":"Flags trigrams whose LM probability is unusually low. For flagged\ntokens with common homophone peers, suggests replacements when a peer\nscores substantially higher. Non-LLM, deterministic. This is our\nnon-LLM Grammarly-parity contextual error moat.","operationId":"check_api_v1_stat_grammar_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__statistical_grammar_api__CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Api V1 Stat Grammar Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compose/polish":{"post":{"tags":["Whisk Compose"],"summary":"Run the full Whisk pipeline end-to-end","description":"Pipe text through the complete Whisk toolchain and return the polished\noutput plus a per-step change ledger. Preset personalities available;\ncustom pipelines supported. This is the single endpoint that ties every\nprior tool into one call — compliance-grade traceability included.","operationId":"polish_api_v1_compose_polish_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolishRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Polish Api V1 Compose Polish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compose/presets":{"get":{"tags":["Whisk Compose"],"summary":"List preset personality templates","operationId":"presets_api_v1_compose_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Presets Api V1 Compose Presets Get"}}}}}}},"/api/v1/sentinel/detect_ai":{"post":{"tags":["Whisk Sentinel"],"summary":"Statistical AI-vs-human text detector (non-LLM)","description":"Detects LLM-generated text via perplexity variance, hapax ratio,\nZipf frequency skew, and safety-phrase tells. Our zero-LLM stack\ndetecting LLM output — the ironic capstone.","operationId":"detect_ai_api_v1_sentinel_detect_ai_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__sentinel_api__DetectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Detect Ai Api V1 Sentinel Detect Ai Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sentinel/explain/{rule_id}":{"get":{"tags":["Whisk Sentinel"],"summary":"Natural-language explanation of any rule","description":"Every rule in every Whisk catalog can be explained: why it exists,\nwhen it fires, when to override, references. Explainable AI without AI.","operationId":"explain_api_v1_sentinel_explain__rule_id__get","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Explain Api V1 Sentinel Explain  Rule Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sentinel/explained_rules":{"get":{"tags":["Whisk Sentinel"],"summary":"List every rule with a hand-authored explanation","operationId":"explained_rules_api_v1_sentinel_explained_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Explained Rules Api V1 Sentinel Explained Rules Get"}}}}}}},"/api/v1/sentinel/verify_hash":{"post":{"tags":["Whisk Sentinel"],"summary":"Deterministic SHA-256 of a canonical-JSON payload","description":"Court-grade audit trail: hash any Whisk API response and store it.\nSame payload → same hash across any machine, always.","operationId":"verify_hash_api_v1_sentinel_verify_hash_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Hash Api V1 Sentinel Verify Hash Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sentinel/replay":{"post":{"tags":["Whisk Sentinel"],"summary":"Verify a previous Whisk output is reproducible","description":"Given input + Compose config + expected hash, verify Whisk produces\nthe same output. Deterministic replay for regression testing + tamper\ndetection.","operationId":"replay_api_v1_sentinel_replay_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplayRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Replay Api V1 Sentinel Replay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/sentiment/vader":{"post":{"tags":["Advanced"],"summary":"VADER rule-based sentiment (compound + pos/neg/neu)","operationId":"vader_api_v1_advanced_sentiment_vader_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vader Api V1 Advanced Sentiment Vader Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/sentiment/afinn":{"post":{"tags":["Advanced"],"summary":"AFINN lexicon sentiment (integer valence)","operationId":"afinn_api_v1_advanced_sentiment_afinn_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Afinn Api V1 Advanced Sentiment Afinn Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/sentiment/nrc_emotions":{"post":{"tags":["Advanced"],"summary":"NRC 8-emotion lexicon (joy/sadness/anger/fear/trust/disgust/surprise/anticipation)","operationId":"nrc_api_v1_advanced_sentiment_nrc_emotions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nrc Api V1 Advanced Sentiment Nrc Emotions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/sentiment/emotional_arc":{"post":{"tags":["Advanced"],"summary":"Sentiment trajectory across sentences (Vonnegut's shape-of-stories)","operationId":"emotional_arc_api_v1_advanced_sentiment_emotional_arc_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Emotional Arc Api V1 Advanced Sentiment Emotional Arc Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/coreference":{"post":{"tags":["Advanced"],"summary":"Pronoun-to-antecedent linking (rule-based Hobbs-style)","operationId":"coref_api_v1_advanced_linguistic_coreference_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Coref Api V1 Advanced Linguistic Coreference Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/discourse_markers":{"post":{"tags":["Advanced"],"summary":"Find contrast/cause/effect/addition/sequence/etc markers","operationId":"disc_api_v1_advanced_linguistic_discourse_markers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Disc Api V1 Advanced Linguistic Discourse Markers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/speech_acts":{"post":{"tags":["Advanced"],"summary":"Classify sentences: declarative/interrogative/imperative/expressive/commissive","operationId":"speech_api_v1_advanced_linguistic_speech_acts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Speech Api V1 Advanced Linguistic Speech Acts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/rhetorical_structure":{"post":{"tags":["Advanced"],"summary":"Identify claims/evidence/warrants/concessions (RST sketch)","operationId":"rst_api_v1_advanced_linguistic_rhetorical_structure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rst Api V1 Advanced Linguistic Rhetorical Structure Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/stylometry":{"post":{"tags":["Advanced"],"summary":"Author fingerprint (function words + sentence stats + POS)","operationId":"sty_api_v1_advanced_linguistic_stylometry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sty Api V1 Advanced Linguistic Stylometry Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/linguistic/demographics":{"post":{"tags":["Advanced"],"summary":"Rough age/gender/education style hints from stylometric markers","operationId":"demo_api_v1_advanced_linguistic_demographics_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Demo Api V1 Advanced Linguistic Demographics Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/games/anagrams/{word}":{"get":{"tags":["Advanced"],"summary":"Find English anagrams of the given word","operationId":"anagrams_api_v1_advanced_games_anagrams__word__get","parameters":[{"name":"word","in":"path","required":true,"schema":{"type":"string","title":"Word"}},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Max Results"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Anagrams Api V1 Advanced Games Anagrams  Word  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/games/palindrome":{"post":{"tags":["Advanced"],"summary":"Check if input is a palindrome","operationId":"palindrome_api_v1_advanced_games_palindrome_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PalindromeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Palindrome Api V1 Advanced Games Palindrome Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/games/word_ladder":{"post":{"tags":["Advanced"],"summary":"Solve word-ladder puzzle (Lewis Carroll's Doublets)","operationId":"ladder_api_v1_advanced_games_word_ladder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LadderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ladder Api V1 Advanced Games Word Ladder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/poetry/rhyme_scheme":{"post":{"tags":["Advanced"],"summary":"Analyze rhyme scheme of a poem (e.g. ABAB, AABBA)","operationId":"rhyme_api_v1_advanced_poetry_rhyme_scheme_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rhyme Api V1 Advanced Poetry Rhyme Scheme Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/poetry/scansion":{"post":{"tags":["Advanced"],"summary":"Meter analysis of a line (iambic pentameter, etc.) via CMU stress marks","operationId":"scan_api_v1_advanced_poetry_scansion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scan Api V1 Advanced Poetry Scansion Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/poetry/form":{"post":{"tags":["Advanced"],"summary":"Identify poem form (haiku/sonnet/limerick/free verse)","operationId":"form_api_v1_advanced_poetry_form_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__TextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Form Api V1 Advanced Poetry Form Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/similarity/jaccard":{"post":{"tags":["Advanced"],"summary":"Jaccard similarity between two documents","operationId":"jac_api_v1_advanced_similarity_jaccard_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JaccardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Jac Api V1 Advanced Similarity Jaccard Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/similarity/find_similar":{"post":{"tags":["Advanced"],"summary":"Find similar docs in a corpus via MinHash","operationId":"find_sim_api_v1_advanced_similarity_find_similar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindSimilarRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Find Sim Api V1 Advanced Similarity Find Similar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/similarity/near_duplicates":{"post":{"tags":["Advanced"],"summary":"Find near-duplicate pairs in a corpus","operationId":"near_dup_api_v1_advanced_similarity_near_duplicates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearDupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Near Dup Api V1 Advanced Similarity Near Duplicates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/autocomplete":{"post":{"tags":["Advanced"],"summary":"Next-word suggestions from bigram+trigram LM","operationId":"autocomp_api_v1_advanced_autocomplete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Autocomp Api V1 Advanced Autocomplete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/password_strength":{"post":{"tags":["Advanced"],"summary":"Password strength via LM entropy (weak if it looks like English)","operationId":"pwstr_api_v1_advanced_password_strength_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Pwstr Api V1 Advanced Password Strength Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/encode/morse":{"post":{"tags":["Advanced"],"summary":"Convert text to Morse code","operationId":"morse_enc_api_v1_advanced_encode_morse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__EncodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Morse Enc Api V1 Advanced Encode Morse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/encode/from_morse":{"post":{"tags":["Advanced"],"summary":"Decode Morse code to text","operationId":"morse_dec_api_v1_advanced_encode_from_morse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__EncodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Morse Dec Api V1 Advanced Encode From Morse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/advanced/encode/braille":{"post":{"tags":["Advanced"],"summary":"Convert text to Unified English Braille (Grade 1)","operationId":"braille_enc_api_v1_advanced_encode_braille_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools__advanced_api__EncodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Braille Enc Api V1 Advanced Encode Braille Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/regression/record":{"post":{"tags":["Regression Harness"],"summary":"Record a golden test case","operationId":"record_api_v1_regression_record_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Record Api V1 Regression Record Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/regression/replay":{"post":{"tags":["Regression Harness"],"summary":"Replay all golden test cases; verify hash match","operationId":"replay_api_v1_regression_replay_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Replay Api V1 Regression Replay Post"}}}}}}},"/api/v1/regression/list":{"get":{"tags":["Regression Harness"],"summary":"List every golden test case","operationId":"list_cases_api_v1_regression_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Cases Api V1 Regression List Get"}}}}}}},"/api/v1/regression/case/{case_id}":{"get":{"tags":["Regression Harness"],"summary":"Get full detail of a specific golden case","operationId":"get_case_api_v1_regression_case__case_id__get","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Case Api V1 Regression Case  Case Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/regression/seed_defaults":{"post":{"tags":["Regression Harness"],"summary":"Seed a batch of canonical golden test cases (only if empty)","operationId":"seed_defaults_api_v1_regression_seed_defaults_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Defaults Api V1 Regression Seed Defaults Post"}}}}}}},"/api/v1/regression/health":{"get":{"tags":["Regression Harness"],"summary":"Regression harness status","operationId":"health_api_v1_regression_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api V1 Regression Health Get"}}}}}}},"/api/v1/rules/check":{"post":{"tags":["Rules Check (v0.12.0)"],"summary":"Run rule engine + spellcheck over prose","description":"Run every applicable rule over `req.text`, plus a general Hunspell\nspellcheck pass, return merged findings.\n\nApplicability filter: rule's `presets_active_in` must include\n`req.preset` and `dialects_active_in` must include `req.dialect`.\nDomain filtering happens per-rule at dispatch time via\n`enabled_domains`.\n\nFindings are sorted by (offset, length, rule_id).","operationId":"rules_check_api_v1_rules_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulesCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rules Check Api V1 Rules Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rules/presets":{"get":{"tags":["Rules Check (v0.12.0)"],"summary":"List valid preset ids","description":"Return the enum of valid presets the rules-check accepts.","operationId":"list_presets_api_v1_rules_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Presets Api V1 Rules Presets Get"}}}}}}},"/api/v1/rules/dialects":{"get":{"tags":["Rules Check (v0.12.0)"],"summary":"List valid dialect ids","description":"Return the enum of valid dialects the rules-check accepts.","operationId":"list_dialects_api_v1_rules_dialects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Dialects Api V1 Rules Dialects Get"}}}}}}},"/api/v1/rules/audit":{"get":{"tags":["Rules Check (v0.12.0)"],"summary":"Rule catalog + engine stats","description":"Snapshot: rule catalog counts by category/subcategory/severity/\npattern-kind/preset/dialect + registered logic_refs. Useful for\ncoverage-honest UI + operator debugging.","operationId":"audit_api_v1_rules_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Audit Api V1 Rules Audit Get"}}}}}}},"/api/v1/admin/dict_stats":{"get":{"tags":["Admin"],"summary":"Current dict-index stats","description":"Snapshot of the in-memory DictIndex: entry count, mtime, per-map\nsizes. Read-only; safe to poll.","operationId":"dict_stats_api_v1_admin_dict_stats_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dict Stats Api V1 Admin Dict Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reload_dict":{"post":{"tags":["Admin"],"summary":"Reload dict if file mtime advanced","description":"Trigger a mtime-gated reload of the DictIndex. If the dict file\nhasn't changed since the last load, this is a fast no-op returning\n`reloaded_now=false`. If it has, the reverse maps rebuild under a\nlock and the new state atomically replaces the old; concurrent\nreaders see either the pre-swap or post-swap map, never partial.\n\nReturns:\n  { ok: true, reloaded_now: bool, stats: <post-state DictIndex.stats()> }\n\nCalled by the systemd timer (`whisk-dict-reload.timer`) daily; also\nsafe for MDE to invoke manually after a large commit.","operationId":"reload_dict_api_v1_admin_reload_dict_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reload Dict Api V1 Admin Reload Dict Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/version":{"get":{"tags":["Health"],"summary":"Service version","operationId":"api_v1_version_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api V1 Version Api V1 Version Get"}}}}}}}},"components":{"schemas":{"AccountDeleteIn":{"properties":{"confirm":{"type":"string","title":"Confirm"}},"type":"object","required":["confirm"],"title":"AccountDeleteIn"},"AddIn":{"properties":{"email":{"type":"string","title":"Email"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"card":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Card"},"google_contact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Google Contact"}},"type":"object","required":["email"],"title":"AddIn"},"AnalogyRequest":{"properties":{"a":{"type":"string","minLength":1,"title":"A"},"b":{"type":"string","minLength":1,"title":"B"},"c":{"type":"string","minLength":1,"title":"C"},"n":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"N","default":5}},"type":"object","required":["a","b","c"],"title":"AnalogyRequest"},"AnalyseRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to scan for homograph occurrences."},"only_shortlist":{"type":"boolean","title":"Only Shortlist","description":"If True, analyse only the curated shortlist of ~200 classic homographs (fast). If False, analyse every polysemous word (slower on long text).","default":true}},"type":"object","required":["text"],"title":"AnalyseRequest"},"ApplyResponse":{"properties":{"language":{"type":"string","title":"Language"},"total_words":{"type":"integer","title":"Total Words"},"corrected_text":{"type":"string","title":"Corrected Text"},"changes":{"items":{"$ref":"#/components/schemas/Change"},"type":"array","title":"Changes"},"unresolved":{"items":{"$ref":"#/components/schemas/Misspelling"},"type":"array","title":"Unresolved"}},"type":"object","required":["language","total_words","corrected_text","changes","unresolved"],"title":"ApplyResponse"},"AskIn":{"properties":{"question":{"type":"string","title":"Question"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"coord":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Coord"}},"type":"object","required":["question"],"title":"AskIn"},"AskRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question"},"engine":{"type":"string","title":"Engine","description":"encyclopedia (default) | internetpedia (alpha) | both (alpha)","default":"encyclopedia"},"tier_filter":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Tier Filter","description":"Include claims with tier <= N","default":1},"confidence_filter":{"type":"string","title":"Confidence Filter","description":"asserted | probable | possible | speculative","default":"asserted"},"sense":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Sense","description":"Slice 28.8 — WordNet sense picker, e.g. 'n.02' or 'v.01'."},"entity_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Entity Id","description":"Slice 28.11 — direct entity_id lookup, bypasses alias/disambig."},"concept_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Concept Id","description":"Slice 30.1.1 — direct concept_id lookup, bypasses alias/entity dispatch."},"compact":{"type":"boolean","title":"Compact","description":"Slice 29a — lean response for SLM/RAG consumers; drops prose sections.","default":false},"phase":{"type":"string","title":"Phase","description":"v0.22.6.0.5.16 — 'full' | 'fast' (skip topical) | 'topics' (only topical)","default":"full"}},"type":"object","required":["question"],"title":"AskRequest"},"AutocompleteRequest":{"properties":{"prefix":{"type":"string","title":"Prefix"},"n":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"N","default":5}},"type":"object","required":["prefix"],"title":"AutocompleteRequest"},"AxisSpec":{"properties":{"axis":{"type":"string","title":"Axis"},"direction":{"type":"string","title":"Direction","default":"more"}},"type":"object","required":["axis"],"title":"AxisSpec"},"BatchAskRequest":{"properties":{"questions":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Questions","description":"Slice 29a — up to 20 questions per batch"},"compact":{"type":"boolean","title":"Compact","description":"Return compact-shape responses (default true for batch)","default":true},"tier_filter":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Tier Filter","default":1},"confidence_filter":{"type":"string","title":"Confidence Filter","default":"asserted"}},"type":"object","required":["questions"],"title":"BatchAskRequest","description":"Slice 29a Item 4 — batch endpoint for SLM/Anchor RAG consumers.\nUp to 20 questions per call, per-question error isolation, response\norder matches request order."},"BlobIn":{"properties":{"recipient_device_id":{"type":"string","maxLength":64,"minLength":8,"title":"Recipient Device Id"},"kind":{"type":"string","maxLength":32,"minLength":1,"title":"Kind"},"ciphertext_b64":{"type":"string","maxLength":4000000,"title":"Ciphertext B64"},"sender_device_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Sender Device Id"},"sender_enc_pub_b64":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Sender Enc Pub B64"}},"type":"object","required":["recipient_device_id","kind","ciphertext_b64"],"title":"BlobIn"},"Change":{"properties":{"offset":{"type":"integer","title":"Offset"},"before":{"type":"string","title":"Before"},"after":{"type":"string","title":"After"},"kind":{"type":"string","title":"Kind"}},"type":"object","required":["offset","before","after","kind"],"title":"Change"},"ChatTurnRequest":{"properties":{"message":{"type":"string","title":"Message"},"context_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Entity Id"},"context_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Context Lat"},"context_lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Context Lon"},"history":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["message"],"title":"ChatTurnRequest"},"CitationRequest":{"properties":{"authors":{"items":{"type":"string"},"type":"array","title":"Authors","description":"List of author names (e.g. ['Smith, J.', 'Doe, A.'])."},"title":{"type":"string","title":"Title","default":""},"year":{"type":"string","title":"Year","default":""},"source":{"type":"string","title":"Source","default":""},"volume":{"type":"string","title":"Volume","default":""},"issue":{"type":"string","title":"Issue","default":""},"pages":{"type":"string","title":"Pages","default":""},"url":{"type":"string","title":"Url","default":""},"doi":{"type":"string","title":"Doi","default":""},"style":{"type":"string","enum":["apa","mla","chicago","harvard","ieee","bibtex"],"title":"Style","default":"apa"}},"type":"object","title":"CitationRequest"},"ClaimCandidateRequest":{"properties":{"subject_entity_id":{"type":"string","maxLength":200,"minLength":1,"title":"Subject Entity Id"},"dimension":{"type":"string","title":"Dimension","description":"what | why | how | when | where | who"},"proposition":{"type":"string","maxLength":4000,"minLength":1,"title":"Proposition"},"tier":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Tier"},"source_id":{"type":"string","maxLength":200,"minLength":1,"title":"Source Id"},"source_portal":{"type":"string","maxLength":200,"minLength":1,"title":"Source Portal"},"value_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Min"},"value_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Max"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"convention":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Convention"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"},"temporal_anchor":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Temporal Anchor"},"supersedes_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes Claim Id"},"authoritative_primary":{"type":"boolean","title":"Authoritative Primary","default":false},"target_claim_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Claim Hint"},"target_slot_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Slot Hint"},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Value"}},"type":"object","required":["subject_entity_id","dimension","proposition","tier","source_id","source_portal"],"title":"ClaimCandidateRequest"},"ClassifyRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"ClassifyRequest"},"ClozeRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"max_cards":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Max Cards","default":8}},"type":"object","required":["text"],"title":"ClozeRequest"},"ContextRankRequest":{"properties":{"candidates":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Candidates","description":"Candidate replacement words."},"context_words":{"items":{"type":"string"},"type":"array","title":"Context Words","description":"Content words from the surrounding text."}},"type":"object","required":["candidates","context_words"],"title":"ContextRankRequest"},"ContextRequest":{"properties":{"word":{"type":"string","maxLength":100,"minLength":1,"title":"Word"},"context":{"type":"string","maxLength":10000,"minLength":1,"title":"Context"}},"type":"object","required":["word","context"],"title":"ContextRequest"},"CreateKeyRequest":{"properties":{"label":{"type":"string","maxLength":200,"title":"Label","description":"Optional user-provided label for identifying this key later.","default":""}},"type":"object","title":"CreateKeyRequest"},"DatesRequest":{"properties":{"text":{"type":"string","maxLength":100000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"DatesRequest"},"DeviceRegisterIn":{"properties":{"device_id":{"type":"string","maxLength":64,"minLength":8,"title":"Device Id"},"sign_pub_b64":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Sign Pub B64"},"enc_pub_b64":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Enc Pub B64"},"hint":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Hint"}},"type":"object","required":["device_id"],"title":"DeviceRegisterIn"},"DiscoverBulkIn":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Emails"}},"type":"object","required":["emails"],"title":"DiscoverBulkIn"},"DiscoverabilityIn":{"properties":{"is_findable":{"type":"boolean","title":"Is Findable"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"}},"type":"object","required":["is_findable"],"title":"DiscoverabilityIn"},"DropStubRequest":{"properties":{"entity_id":{"type":"string","maxLength":200,"minLength":1,"title":"Entity Id"}},"type":"object","required":["entity_id"],"title":"DropStubRequest"},"EmbedRequest":{"properties":{"texts":{"items":{"type":"string"},"type":"array","maxItems":64,"minItems":1,"title":"Texts"}},"type":"object","required":["texts"],"title":"EmbedRequest"},"FcmTokenIn":{"properties":{"device_id":{"type":"string","maxLength":64,"minLength":8,"title":"Device Id"},"fcm_token":{"type":"string","maxLength":512,"minLength":8,"title":"Fcm Token"}},"type":"object","required":["device_id","fcm_token"],"title":"FcmTokenIn"},"FindSimilarRequest":{"properties":{"query":{"type":"string","title":"Query"},"corpus":{"items":{"type":"string"},"type":"array","maxItems":1000,"minItems":1,"title":"Corpus"},"threshold":{"type":"number","title":"Threshold","default":0.3}},"type":"object","required":["query","corpus"],"title":"FindSimilarRequest"},"FlagRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question"},"entity_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Entity Id"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"},"request_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["question"],"title":"FlagRequest"},"FreqRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"top_n":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Top N","default":50}},"type":"object","required":["text"],"title":"FreqRequest"},"GoogleSignInIn":{"properties":{"id_token":{"type":"string","title":"Id Token"}},"type":"object","required":["id_token"],"title":"GoogleSignInIn"},"GrammarRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"GrammarRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HashRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"algo":{"type":"string","title":"Algo","description":"md5 | sha1 | sha256 | sha512","default":"sha256"}},"type":"object","required":["text"],"title":"HashRequest"},"HomophoneRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"log_gap_threshold":{"type":"number","maximum":10.0,"minimum":0.1,"title":"Log Gap Threshold","description":"How much better the alternative must score to flag.","default":1.5}},"type":"object","required":["text"],"title":"HomophoneRequest"},"IngestApplyRequest":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text"},"source_id":{"type":"string","maxLength":200,"minLength":1,"title":"Source Id","description":"Identifier of the document being ingested (e.g., wikipedia_isaac_newton_2026, nasa_mars_fact_sheet_2024)."},"source_portal":{"type":"string","maxLength":200,"minLength":1,"title":"Source Portal","description":"Portal / publisher of the source (Wikipedia, NASA, Britannica 11th ed., etc.)."},"source_tier":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Source Tier","description":"Source tier per v3 sourcing framework — 1=primary, 2=secondary, 3=spicy.","default":2},"create_shells":{"type":"boolean","title":"Create Shells","description":"Whether to create shell entities on disk for novel proper nouns. Set false to only apply triples against already-known entities.","default":true}},"type":"object","required":["text","source_id","source_portal"],"title":"IngestApplyRequest"},"IngestDryRunRequest":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text","description":"Text to run through the ingestion pipeline (typically 1-5 sentences at a time in slice 17)."}},"type":"object","required":["text"],"title":"IngestDryRunRequest"},"JaccardRequest":{"properties":{"text1":{"type":"string","minLength":1,"title":"Text1"},"text2":{"type":"string","minLength":1,"title":"Text2"},"shingle_k":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Shingle K","default":3}},"type":"object","required":["text1","text2"],"title":"JaccardRequest"},"JsonRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"indent":{"type":"integer","maximum":8.0,"minimum":0.0,"title":"Indent","default":2}},"type":"object","required":["text"],"title":"JsonRequest"},"KeyInfo":{"properties":{"key":{"type":"string","title":"Key","description":"The API key. Send in the X-Api-Key header."},"label":{"type":"string","title":"Label","description":"Human-readable label for this key."},"created_at":{"type":"integer","title":"Created At","description":"Unix seconds when the key was created."},"plan":{"type":"string","title":"Plan","description":"Plan tier: 'free' or (later) 'studio'."}},"type":"object","required":["key","label","created_at","plan"],"title":"KeyInfo"},"KeywordsRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"top_k":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Top K","default":12}},"type":"object","required":["text"],"title":"KeywordsRequest"},"LadderRequest":{"properties":{"start":{"type":"string","minLength":2,"title":"Start"},"end":{"type":"string","minLength":2,"title":"End"},"max_steps":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Max Steps","default":10}},"type":"object","required":["start","end"],"title":"LadderRequest"},"ListRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"ListRequest"},"MinutesIn":{"properties":{"room_code":{"type":"string","title":"Room Code"},"minutes_text":{"type":"string","title":"Minutes Text"},"both_emails":{"items":{"type":"string"},"type":"array","title":"Both Emails"}},"type":"object","required":["room_code","minutes_text","both_emails"],"title":"MinutesIn"},"Misspelling":{"properties":{"word":{"type":"string","title":"Word"},"offset":{"type":"integer","title":"Offset"},"length":{"type":"integer","title":"Length"},"suggestions":{"items":{"type":"string"},"type":"array","title":"Suggestions"},"kind":{"type":"string","title":"Kind"}},"type":"object","required":["word","offset","length","suggestions","kind"],"title":"Misspelling"},"MultiRewriteRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"axes":{"items":{"$ref":"#/components/schemas/AxisSpec"},"type":"array","minItems":1,"title":"Axes","description":"Axes to apply in order."}},"type":"object","required":["text","axes"],"title":"MultiRewriteRequest"},"MuteIn":{"properties":{"contact_id":{"type":"string","title":"Contact Id"},"muted":{"type":"boolean","title":"Muted"}},"type":"object","required":["contact_id","muted"],"title":"MuteIn"},"NearDupRequest":{"properties":{"docs":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":2,"title":"Docs"},"threshold":{"type":"number","title":"Threshold","default":0.7}},"type":"object","required":["docs"],"title":"NearDupRequest"},"NearestRequest":{"properties":{"word":{"type":"string","minLength":1,"title":"Word"},"n":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"N","default":10}},"type":"object","required":["word"],"title":"NearestRequest"},"OnDemandRequest":{"properties":{"source_query":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Source Query","description":"User-typed query to resolve"},"wikipedia_title":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Wikipedia Title","description":"Exact Wikipedia article title (from chip click)"},"if_exists":{"type":"string","pattern":"^(skip|overwrite|enrich)$","title":"If Exists","description":"Behavior when entity JSON already exists","default":"skip"}},"type":"object","title":"OnDemandRequest","description":"Accepts EITHER source_query (user-typed, engine resolves title +\nhandles disambig) OR wikipedia_title (from dangling-ref chip click,\nalready exact-title)."},"OutboxAckIn":{"properties":{"device_id":{"type":"string","maxLength":64,"minLength":8,"title":"Device Id"},"ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Ids"}},"type":"object","required":["device_id","ids"],"title":"OutboxAckIn"},"OutboxPostIn":{"properties":{"blobs":{"items":{"$ref":"#/components/schemas/BlobIn"},"type":"array","maxItems":50,"minItems":1,"title":"Blobs"}},"type":"object","required":["blobs"],"title":"OutboxPostIn"},"PIIRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"kinds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Kinds","description":"Optional whitelist of detector names. Default is all: credit_card, ssn, email, phone, iban, passport, ipv4, api_key, aba_routing."}},"type":"object","required":["text"],"title":"PIIRequest"},"PalindromeRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"ignore_spaces":{"type":"boolean","title":"Ignore Spaces","default":true},"ignore_punctuation":{"type":"boolean","title":"Ignore Punctuation","default":true},"case_insensitive":{"type":"boolean","title":"Case Insensitive","default":true}},"type":"object","required":["text"],"title":"PalindromeRequest"},"ParaphraseRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"Text to paraphrase."},"modes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Modes","description":"Subset of ['wordnet', 'simple', 'shorten']. Default: all three."},"preserve_pos":{"type":"boolean","title":"Preserve Pos","description":"If True (default), WordNet substitutions preserve part-of-speech. Setting False can produce ungrammatical output.","default":true}},"type":"object","required":["text"],"title":"ParaphraseRequest"},"PasswordRequest":{"properties":{"password":{"type":"string","minLength":1,"title":"Password"}},"type":"object","required":["password"],"title":"PasswordRequest"},"PolishRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"preset":{"type":"string","title":"Preset","description":"One of the preset personalities (see /compose/presets).","default":"default"},"custom_steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/Step"},"type":"array"},{"type":"null"}],"title":"Custom Steps","description":"Optional: override preset with a custom pipeline."}},"type":"object","required":["text"],"title":"PolishRequest"},"PrivacySettingsIn":{"properties":{"show_online":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Show Online"},"show_last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Show Last Seen"},"typing_indicator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Typing Indicator"},"screenshot_blocker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Screenshot Blocker"}},"type":"object","title":"PrivacySettingsIn"},"ProfileIn":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_seed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Seed"}},"type":"object","title":"ProfileIn"},"PromoteFromPostRequest":{"properties":{"post_id":{"type":"string","maxLength":200,"minLength":1,"title":"Post Id"},"subject_entity_id":{"type":"string","maxLength":200,"minLength":1,"title":"Subject Entity Id"},"dimension":{"type":"string","title":"Dimension"},"proposition":{"type":"string","maxLength":4000,"minLength":1,"title":"Proposition"},"tier":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Tier"},"source_id":{"type":"string","maxLength":200,"minLength":1,"title":"Source Id","description":"The UNDERLYING primary source id (not the post's own URL)"},"source_portal":{"type":"string","maxLength":200,"minLength":1,"title":"Source Portal"},"value_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Min"},"value_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Max"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"convention":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Convention"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"},"target_claim_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Claim Hint"},"target_slot_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Slot Hint"},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Value"},"supersedes_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes Claim Id"},"promotion_batch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promotion Batch","description":"Batch label. If omitted, auto-generated as 'YYYY-MM'."}},"type":"object","required":["post_id","subject_entity_id","dimension","proposition","tier","source_id","source_portal"],"title":"PromoteFromPostRequest","description":"The curator has picked an InternetPedia post as promotion candidate\nAND supplied the Encyclopedia-shaped claim payload the post supports.\n(The post URL itself is not used as the Encyclopedia source — the\nunderlying primary source IS. v3 framework rule.)"},"QueueDispositionRequest":{"properties":{"reason_note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason Note"},"override_decision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Decision","description":"approve only — force merge / new / contest / supersede"}},"type":"object","title":"QueueDispositionRequest"},"ReadingTimeRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"reading_wpm":{"type":"integer","maximum":1000.0,"minimum":50.0,"title":"Reading Wpm","default":238},"speaking_wpm":{"type":"integer","maximum":400.0,"minimum":50.0,"title":"Speaking Wpm","default":130}},"type":"object","required":["text"],"title":"ReadingTimeRequest"},"RecordRequest":{"properties":{"endpoint":{"type":"string","title":"Endpoint","description":"e.g. 'grammar.check', 'compose.polish'"},"input":{"additionalProperties":true,"type":"object","title":"Input","description":"Input payload for the endpoint"},"note":{"type":"string","title":"Note","description":"Human-readable note","default":""}},"type":"object","required":["endpoint","input"],"title":"RecordRequest"},"RegexRequest":{"properties":{"pattern":{"type":"string","minLength":1,"title":"Pattern"},"text":{"type":"string","minLength":1,"title":"Text"},"ignore_case":{"type":"boolean","title":"Ignore Case","default":false},"multiline":{"type":"boolean","title":"Multiline","default":false},"dotall":{"type":"boolean","title":"Dotall","default":false}},"type":"object","required":["pattern","text"],"title":"RegexRequest"},"RemoveIn":{"properties":{"contact_id":{"type":"string","title":"Contact Id"}},"type":"object","required":["contact_id"],"title":"RemoveIn"},"ReplayRequest":{"properties":{"input_text":{"type":"string","minLength":1,"title":"Input Text"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"expected_hash":{"type":"string","maxLength":64,"minLength":64,"title":"Expected Hash"}},"type":"object","required":["input_text","expected_hash"],"title":"ReplayRequest"},"ReportIn":{"properties":{"reported_user_id":{"type":"string","maxLength":64,"minLength":8,"title":"Reported User Id"},"msg_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Msg Id"},"reason":{"type":"string","maxLength":32,"minLength":1,"title":"Reason"},"detail":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Detail"}},"type":"object","required":["reported_user_id","reason"],"title":"ReportIn"},"ReqActionIn":{"properties":{"request_id":{"type":"string","title":"Request Id"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"}},"type":"object","required":["request_id"],"title":"ReqActionIn"},"RestructureRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"transformations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Transformations","description":"Subset of ['passive_to_active','nominalization_to_verb','cleft_simplify','there_removal','split_long_sentences']. Default: all."},"split_max_words":{"type":"integer","maximum":100.0,"minimum":15.0,"title":"Split Max Words","description":"Sentence-length threshold for splitting.","default":30}},"type":"object","required":["text"],"title":"RestructureRequest"},"RewriteRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"axis":{"type":"string","title":"Axis","description":"One of: confidence, diplomacy, concision, formality"},"direction":{"type":"string","title":"Direction","description":"'more' or 'less'","default":"more"}},"type":"object","required":["text","axis"],"title":"RewriteRequest"},"RulesCheckRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text","description":"Prose to check"},"preset":{"type":"string","title":"Preset","description":"Style-guide preset","default":"general_chicago"},"dialect":{"type":"string","title":"Dialect","description":"Dialect variant","default":"en_US"},"enabled_domains":{"items":{"type":"string"},"type":"array","title":"Enabled Domains","description":"Optional domain scoping"}},"type":"object","required":["text"],"title":"RulesCheckRequest"},"ScheduleIn":{"properties":{"counterpart_email":{"type":"string","title":"Counterpart Email"},"scheduled_at":{"type":"integer","title":"Scheduled At"},"topic":{"type":"string","title":"Topic","default":""},"organiser_location":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Organiser Location"}},"type":"object","required":["counterpart_email","scheduled_at"],"title":"ScheduleIn"},"ScoreRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"ScoreRequest"},"ShorthandRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"domain":{"type":"string","enum":["medical","legal","meeting","student","generic"],"title":"Domain","default":"generic"},"max_bullets":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Max Bullets","default":8}},"type":"object","required":["text"],"title":"ShorthandRequest"},"SpellcheckRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text","description":"Text to spellcheck."},"language":{"type":"string","title":"Language","description":"ISO 639-1 language code, or 'hi-Latn' for Hinglish.","default":"en"},"ignore":{"items":{"type":"string"},"type":"array","title":"Ignore","description":"Lowercased words to skip (session-ignore + personal dictionary)."},"purity":{"type":"string","title":"Purity","description":"Vocabulary purity axis. `pure` flags all code-mixed borrowings + foreign tokens as wordchoice. `normal` accepts common borrowings silently (default). `mixed` accepts any foreign token in a code-mix-friendly way. Combines with `formality`.","default":"normal"},"formality":{"type":"string","title":"Formality","description":"Formality axis. `strict_formal` flags contractions, colloquialisms, register-specific variants and slang. `formal` flags casual variants + slang. `casual` accepts variants silently (default). `friendly_casual` accepts even friendly slang / abbreviations.","default":"casual"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"Deprecated. Use `purity` + `formality` instead. `mode: formal` maps to purity=pure, formality=formal; `mode: casual` maps to purity=normal, formality=casual."},"translation_friendly":{"type":"boolean","title":"Translation Friendly","description":"When true, flag idioms, phrasal verbs, and culture-bound references that don't translate cleanly. Auto-enabled client-side by the Business email / Legal / Academic surface presets.","default":false},"domain_packs":{"items":{"type":"string"},"type":"array","title":"Domain Packs","description":"Opt-in domain vocab packs (e.g. ['physics', 'biology', 'medical']). Words in selected packs are accepted silently by the English spellcheck path. Full list at GET /spellcheck/domain-packs."},"simplify":{"type":"boolean","title":"Simplify","description":"When true, flag complex Latinate words with Plain English equivalents (utilise→use, commence→start). Deterministic, non-AI.","default":false},"shorten":{"type":"boolean","title":"Shorten","description":"When true, flag wordy phrases and redundancies with shorter equivalents (in order to→to, absolutely essential→essential). Deterministic, non-AI.","default":false},"skip_latex":{"type":"boolean","title":"Skip Latex","description":"Wave 4e. When true, strip LaTeX ($math$, $$display$$, \\commands, \\begin{env}...\\end{env}, %comments) before spellchecking. Preserves offsets. Auto-enabled by the Academic surface preset.","default":false}},"type":"object","required":["text"],"title":"SpellcheckRequest"},"SpellcheckResponse":{"properties":{"language":{"type":"string","title":"Language"},"total_words":{"type":"integer","title":"Total Words"},"misspellings":{"items":{"$ref":"#/components/schemas/Misspelling"},"type":"array","title":"Misspellings"},"warning":{"anyOf":[{"$ref":"#/components/schemas/Warning"},{"type":"null"}]}},"type":"object","required":["language","total_words","misspellings"],"title":"SpellcheckResponse"},"Step":{"properties":{"tool":{"type":"string","title":"Tool","description":"Step tool name (grammar_check / cliche_scan / homograph_scan / terminology_scan / homophone_check / pii_scan / tone_rewrite / restructure / paraphrase / simplify)."},"axis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Axis"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"modes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Modes"},"transformations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Transformations"}},"type":"object","required":["tool"],"title":"Step"},"SubscribeIn":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"place_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Label"},"intent":{"type":"string","title":"Intent"},"cadence":{"type":"string","title":"Cadence","default":"daily"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","required":["lat","lon","intent"],"title":"SubscribeIn"},"SummariseRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"},"max_sentences":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Max Sentences","default":5}},"type":"object","required":["text"],"title":"SummariseRequest"},"TranslateRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to translate. Chunked at sentence boundaries for long inputs."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"ISO-639-1 source language code. If omitted, auto-detected via fastText lid.176."},"target":{"type":"string","title":"Target","description":"ISO-639-1 target language code."},"max_length":{"type":"integer","maximum":2048.0,"minimum":32.0,"title":"Max Length","description":"Max output tokens per chunk.","default":512},"preserve_facts":{"type":"boolean","title":"Preserve Facts","description":"If True, NER-detected entities (PERSON/ORG/GPE/DATE/MONEY/PERCENT/CARDINAL) pass through verbatim; only the surrounding text translates.","default":false}},"type":"object","required":["text","target"],"title":"TranslateRequest"},"UrlRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"UrlRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyRequest":{"properties":{"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Any JSON payload to hash."}},"type":"object","required":["payload"],"title":"VerifyRequest"},"Warning":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"suggested_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Language"}},"type":"object","required":["code","message"],"title":"Warning"},"WritingReportRequest":{"properties":{"text":{"type":"string","maxLength":500000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"WritingReportRequest"},"_InviteBody":{"properties":{"room_code":{"type":"string","title":"Room Code"}},"type":"object","required":["room_code"],"title":"_InviteBody"},"tools__advanced_api__EncodeRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"EncodeRequest"},"tools__advanced_api__TextRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"TextRequest"},"tools__chat_auth__RegisterIn":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"RegisterIn"},"tools__cliche_api__CheckRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to scan for cliché occurrences."},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Restrict to these categories. Available: corporate, literary_dead_metaphor, sports, war, food_metaphor, body_idiom, journalism, intensifier, motivational, hedge."},"min_severity":{"type":"string","title":"Min Severity","description":"'low' | 'medium' | 'high'. Filters out weaker hits when set higher.","default":"low"}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__coherence_api__CheckRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__collocation_api__CheckRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to scan for collocation occurrences."}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__confusion_pairs_api__CheckRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to scan for commonly-confused word pairs."}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__cross_doc_terminology_api__CheckRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Manuscript text to scan."},"min_family_hits":{"type":"integer","maximum":5.0,"minimum":2.0,"title":"Min Family Hits","description":"Minimum distinct variants per family before flagging. Default 2 (flag any mixing).","default":2}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__embeddings_api__SimilarityRequest":{"properties":{"word1":{"type":"string","minLength":1,"title":"Word1"},"word2":{"type":"string","minLength":1,"title":"Word2"}},"type":"object","required":["word1","word2"],"title":"SimilarityRequest"},"tools__langdetect_api__DetectRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text whose language should be detected."},"k":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"K","description":"Number of top language candidates to return.","default":3}},"type":"object","required":["text"],"title":"DetectRequest"},"tools__language_model_api__RankRequest":{"properties":{"before":{"type":"string","title":"Before","description":"Text preceding the slot (context).","default":""},"candidates":{"items":{"type":"string"},"type":"array","minItems":2,"title":"Candidates","description":"Candidate words to fill the slot."},"after":{"type":"string","title":"After","description":"Text following the slot (context).","default":""}},"type":"object","required":["candidates"],"title":"RankRequest"},"tools__nlp_api__TextRequest":{"properties":{"text":{"type":"string","maxLength":100000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"TextRequest"},"tools__sentence_bert_api__RankRequest":{"properties":{"reference":{"type":"string","minLength":1,"title":"Reference"},"candidates":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Candidates"}},"type":"object","required":["reference","candidates"],"title":"RankRequest"},"tools__sentence_bert_api__SimilarityRequest":{"properties":{"text1":{"type":"string","minLength":1,"title":"Text1"},"text2":{"type":"string","minLength":1,"title":"Text2"}},"type":"object","required":["text1","text2"],"title":"SimilarityRequest"},"tools__sentinel_api__DetectRequest":{"properties":{"text":{"type":"string","minLength":10,"title":"Text"}},"type":"object","required":["text"],"title":"DetectRequest"},"tools__silent_errors_api__CheckRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Text to scan."},"preset":{"type":"string","title":"Preset","description":"Writing style preset — used by preset-aware checks (e.g. formal_contraction only fires when preset is email / legal / academic).","default":"blog"},"enabled":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enabled","description":"Optional whitelist of checks to run. None = all. Available: article_error, absolute_modifier, sentence_case, multi_punct, split_infinitive, redundant_phrase, weasel_words, formal_contraction, verb_prep_error, fewer_less, number_noun_agree, nominalization, acronym_expansion, numeric_inconsistency, date_inconsistency, comma_splice, word_repetition, fused_sentence"}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__statistical_grammar_api__CheckRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"suspect_log_prob":{"type":"number","maximum":-5.0,"minimum":-30.0,"title":"Suspect Log Prob","default":-12.0},"rewrite_threshold":{"type":"number","maximum":10.0,"minimum":0.5,"title":"Rewrite Threshold","default":1.2}},"type":"object","required":["text"],"title":"CheckRequest"},"tools__utilities_api__EncodeRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"urlsafe":{"type":"boolean","title":"Urlsafe","default":false}},"type":"object","required":["text"],"title":"EncodeRequest"},"tools__utilities_api__TextRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"wpm":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":50.0},{"type":"null"}],"title":"Wpm"}},"type":"object","required":["text"],"title":"TextRequest"}}}}