{"openapi":"3.1.0","info":{"title":"Georgia Commons API","description":"Georgia government documents with plain-language summaries and grounded Q&A. A project of Georgia Civic Data; not affiliated with the State of Georgia.","version":"0.1.0"},"paths":{"/api/opinions/beacon":{"post":{"tags":["opinions"],"summary":"Beacon","description":"Count one action-bar use: `{\"class\": \"send_to_ai\"}`. Coarse class\nonly; no document id, no text, nothing about the caller.","operationId":"beacon_api_opinions_beacon_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/recent":{"get":{"tags":["opinions"],"summary":"Get Recent Opinions","description":"Most recent Georgia Supreme Court opinions, newest first.\n\nReturns a list of opinion dicts (slim list projection: identity,\ndates, and summary-level LLM fields; no opinion_text).","operationId":"get_recent_opinions_api_opinions_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results (1-100)","default":20,"title":"Limit"},"description":"Maximum results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Results to skip (pagination)","default":0,"title":"Offset"},"description":"Results to skip (pagination)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/filtered":{"get":{"tags":["opinions"],"summary":"Get Filtered Opinions","description":"Recent opinions with optional year, case-type, and name filters.","operationId":"get_filtered_opinions_api_opinions_filtered_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results (1-100)","default":20,"title":"Limit"},"description":"Maximum results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Results to skip (pagination)","default":0,"title":"Offset"},"description":"Results to skip (pagination)"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated years to include (e.g. '2025,2026')","title":"Year"},"description":"Comma-separated years to include (e.g. '2025,2026')"},{"name":"case_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated case types (e.g. 'criminal appeal')","title":"Case Type"},"description":"Comma-separated case types (e.g. 'criminal appeal')"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Case-name substring to match (case-insensitive)","title":"Q"},"description":"Case-name substring to match (case-insensitive)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/search":{"get":{"tags":["opinions"],"summary":"Search Opinions","description":"Full-text search over the stored opinion text, case names, and the\nlabeled summaries (the Code's shape: bm25, stopwords dropped, AND then\nOR). A bare docket or citation is a direct lookup; one among words\nreturns that opinion first. Search matches the words of the document:\nask in the words the opinion would use.","operationId":"search_opinions_api_opinions_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"description":"Words, or a docket or reporter citation, or both","title":"Q"},"description":"Words, or a docket or reporter citation, or both"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1900},{"type":"null"}],"title":"Year"}},{"name":"case_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Case Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`headings` to search only case names, legal areas, and case types","title":"In"},"description":"`headings` to search only case names, legal areas, and case types"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/meta":{"get":{"tags":["opinions"],"summary":"Get Meta","description":"The collection described from the store at request time: coverage\nsentence, counts, date range, years, last change, license, and the\nmachine addresses. The numbers are computed here, never typed.","operationId":"get_meta_api_opinions_meta_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/index/markdown":{"get":{"tags":["opinions"],"summary":"Get Index Markdown","description":"`/opinions/index.md`: years with counts and case types.","operationId":"get_index_markdown_api_opinions_index_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/about/markdown":{"get":{"tags":["opinions"],"summary":"Get About Markdown","description":"`/opinions/about.md`: provenance, summaries, coverage, addresses, independence.","operationId":"get_about_markdown_api_opinions_about_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/search/markdown":{"get":{"tags":["opinions"],"summary":"Search Opinions Markdown","description":"`/opinions/search.md?q=`: about ten hits with docket, case name, date, snippet, URL.","operationId":"search_opinions_markdown_api_opinions_search_markdown_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"title":"Q"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1900},{"type":"null"}],"title":"Year"}},{"name":"case_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Case Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":1,"default":10,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/years/{year}/markdown":{"get":{"tags":["opinions"],"summary":"Get Year Markdown","description":"`/opinions/2026.md`: one line per opinion, 400 per page.","operationId":"get_year_markdown_api_opinions_years__year__markdown_get","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"case_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Case Type"}},{"name":"start","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Start"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/years":{"get":{"tags":["opinions"],"summary":"Get All Years","description":"All years with opinion counts: [{\"year\": 2026, \"count\": 6}, ...].","operationId":"get_all_years_api_opinions_years_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/sitemap-entries":{"get":{"tags":["opinions"],"summary":"Get Sitemap Entries","description":"Lightweight [{\"id\", \"date\"}, ...] entries for sitemap generation.","operationId":"get_sitemap_entries_api_opinions_sitemap_entries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/opinions/search-by-name":{"get":{"tags":["opinions"],"summary":"Search Opinions By Name","description":"Search opinions by case name; prefix matches rank first.","operationId":"search_opinions_by_name_api_opinions_search_by_name_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Case-name search query (minimum 2 characters)","title":"Q"},"description":"Case-name search query (minimum 2 characters)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results (1-100)","default":20,"title":"Limit"},"description":"Maximum results (1-100)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/clusters/{cluster_id}":{"get":{"tags":["opinions"],"summary":"Redirect Cluster","description":"CourtListener's numeric id, redirected permanently to the docket address.","operationId":"redirect_cluster_api_opinions_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/clusters/{cluster_id}/full-text":{"get":{"tags":["opinions"],"summary":"Redirect Cluster Full Text","operationId":"redirect_cluster_full_text_api_opinions_clusters__cluster_id__full_text_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/resolve":{"get":{"tags":["opinions"],"summary":"Resolve Opinion","description":"Where a written reference leads. A case name falls back to the\ncase-name search and returns every match.","operationId":"resolve_opinion_api_opinions_resolve_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"A docket (S26A0060), a reporter citation (883 S.E.2d 746), a CourtListener id, or a case name","title":"Q"},"description":"A docket (S26A0060), a reporter citation (883 S.E.2d 746), a CourtListener id, or a case name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/cases/{ref}":{"get":{"tags":["opinions"],"summary":"Get Case","description":"Full metadata for one opinion, excluding the opinion text. `ref` is a\ndocket in any case, a reporter citation, or a CourtListener id; a\nnon-canonical form redirects permanently. When several opinions share\nthe docket, this is the lead and `other_opinions` lists the rest.","operationId":"get_case_api_opinions_cases__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/cases/{docket}/{cluster_id}":{"get":{"tags":["opinions"],"summary":"Get Case In Docket","description":"One opinion by docket and CourtListener id: the stable address of\nevery row, lead or not. The second segment may also be `markdown`,\n`full-text`, or `text` for the one-segment address (`/cases/{ref}/markdown`),\nsince a path with two segments reaches this route first.","operationId":"get_case_in_docket_api_opinions_cases__docket___cluster_id__get","parameters":[{"name":"docket","in":"path","required":true,"schema":{"type":"string","title":"Docket"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"full","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For /cases/{ref}/markdown: `1` to include the extras","title":"Full"},"description":"For /cases/{ref}/markdown: `1` to include the extras"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/cases/{docket}/{cluster_id}/markdown":{"get":{"tags":["opinions"],"summary":"Get Case In Docket Markdown","operationId":"get_case_in_docket_markdown_api_opinions_cases__docket___cluster_id__markdown_get","parameters":[{"name":"docket","in":"path","required":true,"schema":{"type":"string","title":"Docket"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"full","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/clusters/{cluster_id}/markdown":{"get":{"tags":["opinions"],"summary":"Redirect Cluster Markdown","operationId":"redirect_cluster_markdown_api_opinions_clusters__cluster_id__markdown_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/cases/{docket}/{cluster_id}/full-text":{"get":{"tags":["opinions"],"summary":"Get Case In Docket Full Text","operationId":"get_case_in_docket_full_text_api_opinions_cases__docket___cluster_id__full_text_get","parameters":[{"name":"docket","in":"path","required":true,"schema":{"type":"string","title":"Docket"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/cases/{docket}/{cluster_id}/text":{"get":{"tags":["opinions"],"summary":"Get Case In Docket Text","operationId":"get_case_in_docket_text_api_opinions_cases__docket___cluster_id__text_get","parameters":[{"name":"docket","in":"path","required":true,"schema":{"type":"string","title":"Docket"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/years/{year}":{"get":{"tags":["opinions"],"summary":"Get Year","description":"One year: counts by case type and a window of its opinions in filing\norder (400 per page, `start` to continue).","operationId":"get_year_api_opinions_years__year__get","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"case_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Case Type"}},{"name":"start","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Start"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":1,"default":400,"title":"Limit"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/items":{"get":{"tags":["opinions"],"summary":"Get Items","description":"Batch read: up to 20 opinions with their metadata and text, under a\n300,000-character text budget with `next_ids` naming the rest.","operationId":"get_items_api_opinions_items_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":2000,"description":"Comma-separated: dockets, DOCKET/cluster ids, reporter citations, or CourtListener ids","title":"Ids"},"description":"Comma-separated: dockets, DOCKET/cluster ids, reporter citations, or CourtListener ids"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/verify":{"post":{"tags":["opinions"],"summary":"Verify Quote","description":"Whether a quote appears verbatim in the stored opinion text, after\nthe same normalization the ingestion quote filter applies. `id` is a\ndocket, DOCKET/cluster id, reporter citation, or CourtListener id.","operationId":"verify_quote_api_opinions_verify_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opinions/clusters/{cluster_id}/ask":{"post":{"tags":["opinions"],"summary":"Ask About Cluster","description":"Ask a question about one case, streamed as Server-Sent Events.\n\nThe body carries the full conversation (`messages`); the last message\nmust be the user's current question. Multi-turn continuity is handled\nclient-side: there is no server-side conversation store.\n\nThe answer is grounded in the case's stored opinion text: the QA system\nprompt and the document context (metadata header + full opinion text)\nare sent as cached system blocks, and the prompt requires verbatim\nquotes from the opinion.\n\nSecurity:\n    - Rate limited per IP (10/minute, 100/hour): 429 with Retry-After.\n    - Every user turn (live question and replayed history) is validated\n      for injection patterns and sanitized; rejections stream back as a\n      polite SSE error event.\n    - Model output is filtered for prompt leakage while streaming.\n\nReturns:\n    SSE stream of `{\"type\": \"token\", \"content\": ...}` events followed by\n    `{\"type\": \"done\"}`; failures become `{\"type\": \"error\", \"message\":\n    ...}` events.\n\nRaises:\n    HTTPException: 404 when the case is unknown or has no stored text;\n        429 when the client is over the rate limit.","operationId":"ask_about_cluster_api_opinions_clusters__cluster_id__ask_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/beacon":{"post":{"tags":["bills"],"summary":"Beacon","description":"Count one action-bar use: `{\"class\": \"send_to_ai\"}`. Coarse class\nonly; no document id, no text, nothing about the caller.","operationId":"beacon_api_bills_beacon_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/recent":{"get":{"tags":["bills"],"summary":"Get Recent Bills","description":"Most recently active Georgia General Assembly bills, newest first.\n\nReturns a list of bill dicts (slim list projection: identity, status,\nand summary-level LLM fields; no bill_text or narrative JSON columns).","operationId":"get_recent_bills_api_bills_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results (1-100)","default":20,"title":"Limit"},"description":"Maximum results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Results to skip (pagination)","default":0,"title":"Offset"},"description":"Results to skip (pagination)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/filtered":{"get":{"tags":["bills"],"summary":"Get Filtered Bills","description":"Recent bills with optional session, chamber, type, status, and text\nfilters.","operationId":"get_filtered_bills_api_bills_filtered_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results (1-100)","default":20,"title":"Limit"},"description":"Maximum results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Results to skip (pagination)","default":0,"title":"Offset"},"description":"Results to skip (pagination)"},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"LegiScan session id (e.g. 2167)","title":"Session Id"},"description":"LegiScan session id (e.g. 2167)"},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Session slug (e.g. 2025-2026), the human alternative to session_id","title":"Session"},"description":"Session slug (e.g. 2025-2026), the human alternative to session_id"},{"name":"chamber","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1},{"type":"null"}],"description":"Origin chamber: H (House) or S (Senate)","title":"Chamber"},"description":"Origin chamber: H (House) or S (Senate)"},{"name":"bill_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"description":"Bill type: B, R, CR, or JR","title":"Bill Type"},"description":"Bill type: B, R, CR, or JR"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"LegiScan status code (1=Introduced ... 6=Failed)","title":"Status"},"description":"LegiScan status code (1=Introduced ... 6=Failed)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Bill-number or title substring (case-insensitive)","title":"Q"},"description":"Bill-number or title substring (case-insensitive)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/search":{"get":{"tags":["bills"],"summary":"Search Bills","description":"Full-text search over the stored bill text, titles, and the labeled\nsummaries (the Code's shape: bm25, stopwords dropped, AND then OR). A\nbare bill number is a direct lookup; a number among words returns that\nbill first. Search matches the words of the document: ask in the words\nthe bill would use.","operationId":"search_bills_api_bills_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"description":"Words, or a bill number, or both","title":"Q"},"description":"Words, or a bill number, or both"},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Session slug, e.g. 2025-2026","title":"Session"},"description":"Session slug, e.g. 2025-2026"},{"name":"chamber","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1},{"type":"null"}],"title":"Chamber"}},{"name":"bill_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Bill Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`headings` to search only titles, topic tags, and subjects","title":"In"},"description":"`headings` to search only titles, topic tags, and subjects"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/meta":{"get":{"tags":["bills"],"summary":"Get Meta","description":"The collection described from the store at request time: coverage\nsentence, counts, sessions, latest action, last change, license, and the\nmachine addresses. Never overstates: the numbers are computed here.","operationId":"get_meta_api_bills_meta_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/index/markdown":{"get":{"tags":["bills"],"summary":"Get Index Markdown","description":"`/bills/index.md`: sessions with counts, kinds, and caption subjects.","operationId":"get_index_markdown_api_bills_index_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/about/markdown":{"get":{"tags":["bills"],"summary":"Get About Markdown","description":"`/bills/about.md`: provenance, summaries, coverage, independence.","operationId":"get_about_markdown_api_bills_about_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/search/markdown":{"get":{"tags":["bills"],"summary":"Search Bills Markdown","description":"`/bills/search.md?q=`: about ten hits with id, title, status, snippet, URL.","operationId":"search_bills_markdown_api_bills_search_markdown_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"title":"Q"}},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Session"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":1,"default":10,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/sessions":{"get":{"tags":["bills"],"summary":"Get All Sessions","description":"All sessions with bill counts:\n[{\"session_id\": 2167, \"session_name\": \"...\", \"count\": 5480}, ...].","operationId":"get_all_sessions_api_bills_sessions_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/sitemap-entries":{"get":{"tags":["bills"],"summary":"Get Sitemap Entries","description":"Lightweight [{\"id\", \"date\"}, ...] entries for sitemap generation.","operationId":"get_sitemap_entries_api_bills_sitemap_entries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/bills/bills/{bill_id}":{"get":{"tags":["bills"],"summary":"Redirect Bill By Id","description":"LegiScan's numeric id, redirected permanently to the human address.","operationId":"redirect_bill_by_id_api_bills_bills__bill_id__get","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"integer","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{bill_id}/full-text":{"get":{"tags":["bills"],"summary":"Redirect Bill Text By Id","operationId":"redirect_bill_text_by_id_api_bills_bills__bill_id__full_text_get","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"integer","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{bill_id}/markdown":{"get":{"tags":["bills"],"summary":"Redirect Bill Markdown By Id","operationId":"redirect_bill_markdown_by_id_api_bills_bills__bill_id__markdown_get","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"integer","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/resolve":{"get":{"tags":["bills"],"summary":"Resolve Bill","description":"Where a written bill reference leads. A reference with no session\nresolves against the newest session. 404 names the neighbors.","operationId":"resolve_bill_api_bills_resolve_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"A bill reference in any written form: HB 136, H.B. 136, House Bill 136, with or without a session","title":"Q"},"description":"A bill reference in any written form: HB 136, H.B. 136, House Bill 136, with or without a session"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{session}/{number}":{"get":{"tags":["bills"],"summary":"Get Bill","description":"Full metadata for one bill, excluding the bill text.\n\n`session` is the session slug (2025-2026) or a year in it; `number` is\nthe bill number in any form (hb136, HB136, HB-136). A non-canonical\nform redirects permanently. LLM-extracted fields are null when\nextraction has not run for this bill. `has_text` tells clients whether\nthe /full-text endpoint has stored text to serve.","operationId":"get_bill_api_bills_bills__session___number__get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"number","in":"path","required":true,"schema":{"type":"string","title":"Number"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{session}/{number}/full-text":{"get":{"tags":["bills"],"summary":"Get Bill Full Text","description":"The stored cleaned bill text plus minimal bill metadata.\n\nRaises 404 with an explanatory detail when the bill exists but its text\nhas not been fetched from LegiScan yet (bill_text is null).","operationId":"get_bill_full_text_api_bills_bills__session___number__full_text_get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"number","in":"path","required":true,"schema":{"type":"string","title":"Number"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{session}/{number}/text":{"get":{"tags":["bills"],"summary":"Get Bill Text","description":"The stored bill text alone, as text/plain, with the page and twin in\na Link header. 404 when the text has not been fetched.","operationId":"get_bill_text_api_bills_bills__session___number__text_get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"number","in":"path","required":true,"schema":{"type":"string","title":"Number"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{session}/{number}/markdown":{"get":{"tags":["bills"],"summary":"Get Bill Markdown","description":"The bill as a Markdown twin: frontmatter, the verbatim text, the\nsummaries Georgia Commons wrote (labeled), status; history and votes\nbehind `?full=1`.","operationId":"get_bill_markdown_api_bills_bills__session___number__markdown_get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"number","in":"path","required":true,"schema":{"type":"string","title":"Number"}},{"name":"full","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`1` to include the history, votes, and amendments","title":"Full"},"description":"`1` to include the history, votes, and amendments"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/sessions/{session}":{"get":{"tags":["bills"],"summary":"Get Session","description":"One session: identity, counts by kind, the caption subjects, and a\nwindow of its bills in number order (500 per page, `start` to continue).","operationId":"get_session_api_bills_sessions__session__get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"description":"hb, sb, hr, or sr","title":"Kind"},"description":"hb, sb, hr, or sr"},{"name":"start","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Start"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/sessions/{session}/markdown":{"get":{"tags":["bills"],"summary":"Get Session Markdown","description":"`/bills/2025-2026.md`: counts by kind, then 500 bills per page.","operationId":"get_session_markdown_api_bills_sessions__session__markdown_get","parameters":[{"name":"session","in":"path","required":true,"schema":{"type":"string","title":"Session"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"description":"hb, sb, hr, or sr","title":"Type"},"description":"hb, sb, hr, or sr"},{"name":"start","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Start"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/items":{"get":{"tags":["bills"],"summary":"Get Items","description":"Batch read: up to 20 bills with their metadata and text, under a\n300,000-character text budget with `next_ids` naming the rest.","operationId":"get_items_api_bills_items_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":2000,"description":"Comma-separated bill ids: 2025-2026/hb136, hb136 (newest session), or LegiScan numeric ids","title":"Ids"},"description":"Comma-separated bill ids: 2025-2026/hb136, hb136 (newest session), or LegiScan numeric ids"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/verify":{"post":{"tags":["bills"],"summary":"Verify Quote","description":"Whether a quote appears verbatim in the stored bill text, after the\nsame normalization the ingestion quote filter applies. `id` is the\npublic id (2025-2026/hb136), a bill number (newest session), or the\nLegiScan numeric id.","operationId":"verify_quote_api_bills_verify_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bills/bills/{bill_id}/ask":{"post":{"tags":["bills"],"summary":"Ask About Bill","description":"Ask a question about one bill, streamed as Server-Sent Events.\n\nMirrors the opinions ask route: the body carries the full conversation,\nthe last message must be the user's current question, and continuity is\nhandled client-side.\n\nGrounding: the QA system prompt and the document context (the bill's\nstatus record: status, latest action, sponsors, history, votes, plus the\nfull stored bill text) are sent as cached system blocks. Content claims\nmust quote <bill_text> verbatim; procedural claims cite the status\nrecord.\n\nSecurity: per-IP rate limiting (429 with Retry-After), injection\nvalidation on every user turn, streaming output filtering.\n\nRaises:\n    HTTPException: 404 when the bill is unknown or its text has not\n        been fetched yet; 429 when the client is over the rate limit.","operationId":"ask_about_bill_api_bills_bills__bill_id__ask_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"integer","title":"Bill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/beacon":{"post":{"tags":["code"],"summary":"Beacon","description":"Count one action-bar use: `{\"class\": \"send_to_ai\"}`. Coarse class\nonly; no document id, no text, nothing about the caller.","operationId":"beacon_api_code_beacon_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/meta":{"get":{"tags":["code"],"summary":"Get Meta","description":"The meta row: corpus version, the coverage sentence with its\nqualifications, counts, license, and where the bulk download lives.","operationId":"get_meta_api_code_meta_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/index/markdown":{"get":{"tags":["code"],"summary":"Get Index Markdown","description":"`/code/index.md`: the titles with their chapters, one line each, with\nabsolute links to the next level. About 47 KB.","operationId":"get_index_markdown_api_code_index_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/about/markdown":{"get":{"tags":["code"],"summary":"Get About Markdown","description":"`/code/about.md`: provenance, coverage and its qualifications, license, independence.","operationId":"get_about_markdown_api_code_about_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/acts/markdown":{"get":{"tags":["code"],"summary":"Get Acts Markdown","description":"`/code/acts.md`: every short title the Code states, alphabetically.","operationId":"get_acts_markdown_api_code_acts_markdown_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/search/markdown":{"get":{"tags":["code"],"summary":"Search Code Markdown","description":"`/code/search.md?q=`: about ten hits with id, catchline, heading path,\nsnippet, and URL, plus the terms used and the vocabulary sentence.","operationId":"search_code_markdown_api_code_search_markdown_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"title":"Q"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":99,"minimum":1},{"type":"null"}],"title":"Title"}},{"name":"chapter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Chapter"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"active","title":"Status"}},{"name":"scheme","in":"query","required":false,"schema":{"type":"string","default":"ocga","title":"Scheme"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":1,"default":10,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/tree":{"get":{"tags":["code"],"summary":"Get Tree","description":"Titles with headings and counts, plus the constitutions, for the dropdowns.","operationId":"get_tree_api_code_tree_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/titles/{title}":{"get":{"tags":["code"],"summary":"Get Title","description":"One title's chapters, each with its articles, parts, and subparts.","operationId":"get_title_api_code_titles__title__get","parameters":[{"name":"title","in":"path","required":true,"schema":{"type":"integer","title":"Title"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/titles/{title}/markdown":{"get":{"tags":["code"],"summary":"Get Title Markdown","description":"`/code/44.md`: a title's chapters with their articles and parts.","operationId":"get_title_markdown_api_code_titles__title__markdown_get","parameters":[{"name":"title","in":"path","required":true,"schema":{"type":"integer","title":"Title"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/titles/{title}/chapters/{chapter}/markdown":{"get":{"tags":["code"],"summary":"Get Chapter Markdown","description":"`/code/44-7.md`: one line per section; `?full=1` inlines the text.","operationId":"get_chapter_markdown_api_code_titles__title__chapters__chapter__markdown_get","parameters":[{"name":"title","in":"path","required":true,"schema":{"type":"integer","title":"Title"}},{"name":"chapter","in":"path","required":true,"schema":{"type":"string","title":"Chapter"}},{"name":"full","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`1` to inline every section's text, capped, with a pointer to continue","title":"Full"},"description":"`1` to inline every section's text, capped, with a pointer to continue"},{"name":"start","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Start"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/titles/{title}/chapters/{chapter}":{"get":{"tags":["code"],"summary":"Get Chapter","description":"The chapter's sections, slim: citation, catchline, status, versions\ncount, in-force flag.","operationId":"get_chapter_api_code_titles__title__chapters__chapter__get","parameters":[{"name":"title","in":"path","required":true,"schema":{"type":"integer","title":"Title"}},{"name":"chapter","in":"path","required":true,"schema":{"type":"string","title":"Chapter"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/sections/{ref}":{"get":{"tags":["code"],"summary":"Get Section","description":"Every version of one citation, full record shape, `in_force_now` on\neach, in-force first; plus the previous and next citations. `ref` is\nany written form of the citation (`O.C.G.A. § 44-7-34`, `Title 44,\nChapter 7, Section 34`, `44-7-34(a)(1)`); a range or list redirects to\nthe batch read.","operationId":"get_section_api_code_sections__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/items":{"get":{"tags":["code"],"summary":"Get Items","description":"Batch read for the \"read these five\" case: up to 20 ids, ranges\nexpanded to at most 40 sections in all, under a 300,000-character text\nbudget with `next_ids` naming what was left for the next call.","operationId":"get_items_api_code_items_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":2000,"description":"Comma-separated citations; `a..b` for a range","title":"Ids"},"description":"Comma-separated citations; `a..b` for a range"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/verify":{"post":{"tags":["code"],"summary":"Verify Quote","description":"Whether a quote appears verbatim in the stored text of a section or\nconstitutional provision, after the same normalization the ingestion\nquote filter applies (typographic quotes and dashes, whitespace,\n`[T]he`, case). Deterministic. `id` is a citation, or `ga-const:{slug}`\nor `us-const:{slug}`; `quote` is the text to check.","operationId":"verify_quote_api_code_verify_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/sections/{ref}/markdown":{"get":{"tags":["code"],"summary":"Get Section Markdown","description":"The in-force version as a Markdown twin: frontmatter, the verbatim\ntext, then the printed notes (capped unless `notes=all`). Shared with\nthe site's `.md` twins and the MCP server. `ref` takes any written form\nof the citation; a subsection suffix on it (`44-7-34(a)`) selects that\npart, as `?subsection=a` does.","operationId":"get_section_markdown_api_code_sections__ref__markdown_get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Effective-date qualifier of the version wanted (default: in force)","title":"Version"},"description":"Effective-date qualifier of the version wanted (default: in force)"},{"name":"notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`all` to lift the cap on the printed notes","title":"Notes"},"description":"`all` to lift the cap on the printed notes"},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"One structure anchor to render, such as `a` or `a-1`","title":"Subsection"},"description":"One structure anchor to render, such as `a` or `a-1`"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/sections/{ref}/text":{"get":{"tags":["code"],"summary":"Get Section Text","description":"The verbatim statute text as text/plain, nothing else.","operationId":"get_section_text_api_code_sections__ref__text_get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Effective-date qualifier of the version wanted (default: in force)","title":"Version"},"description":"Effective-date qualifier of the version wanted (default: in force)"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/search":{"get":{"tags":["code"],"summary":"Search Code","description":"The shared search: a bare citation is a direct lookup; a citation\namong words returns that section first and the text hits after it; a\nquery that names an act puts its section first. `in=headings` searches\nonly the hierarchy headings and catchlines and returns the matching\ntitles, chapters, articles, and parts as `nodes`.","operationId":"search_code_api_code_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"description":"Words, or a citation, or both","title":"Q"},"description":"Words, or a citation, or both"},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":99,"minimum":1},{"type":"null"}],"title":"Title"}},{"name":"chapter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Chapter"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"active (default), repealed, reserved, redesignated, superseded, note_only, or all","default":"active","title":"Status"},"description":"active (default), repealed, reserved, redesignated, superseded, note_only, or all"},{"name":"scheme","in":"query","required":false,"schema":{"type":"string","description":"ocga (default), ga, or us","default":"ocga","title":"Scheme"},"description":"ocga (default), ga, or us"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"in","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`headings` to search only the hierarchy headings and catchlines","title":"In"},"description":"`headings` to search only the hierarchy headings and catchlines"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/acts":{"get":{"tags":["code"],"summary":"List Acts","description":"The short-title index: every act the Code names (\"shall be known and\nmay be cited as\"), alphabetically, with the section that states the\nname and the unit it covers; or the acts whose name matches `q`.","operationId":"list_acts_api_code_acts_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Words of the act's name; omit for every act","title":"Q"},"description":"Words of the act's name; omit for every act"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/sitemap-entries":{"get":{"tags":["code"],"summary":"Get Sitemap Entries","description":"Without `page`: the list of sitemap pages (one per title, one per\nconstitution). With `page`: that page's entries (citation, slug, scheme).","operationId":"get_sitemap_entries_api_code_sitemap_entries_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/bulk":{"get":{"tags":["code"],"summary":"Get Bulk","description":"A JSON listing of the bundle's assets with URLs that download them:\nunder the configured release asset base URL, or from the local bundle\nwhen GC_CODE_BULK_URL is unset. 404 when neither exists.","operationId":"get_bulk_api_code_bulk_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/bulk/{filename}":{"get":{"tags":["code"],"summary":"Get Bulk File","description":"One bundle asset: a redirect to the release, or the local file.","operationId":"get_bulk_file_api_code_bulk__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/constitution/{scheme}":{"get":{"tags":["code"],"summary":"Get Constitution","description":"A constitution's articles (and sections), plus its standalone\nprovisions (preamble, amendments).","operationId":"get_constitution_api_code_constitution__scheme__get","parameters":[{"name":"scheme","in":"path","required":true,"schema":{"type":"string","title":"Scheme"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/constitution/{scheme}/index/markdown":{"get":{"tags":["code"],"summary":"Get Constitution Index Markdown","description":"`/constitution/{ga,us}/index.md`: every provision one per line.","operationId":"get_constitution_index_markdown_api_code_constitution__scheme__index_markdown_get","parameters":[{"name":"scheme","in":"path","required":true,"schema":{"type":"string","title":"Scheme"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/constitution/{scheme}/{citation}":{"get":{"tags":["code"],"summary":"Get Constitution Provision","description":"One provision by slug (`art-i-sec-i-para-i`) or citation.","operationId":"get_constitution_provision_api_code_constitution__scheme___citation__get","parameters":[{"name":"scheme","in":"path","required":true,"schema":{"type":"string","title":"Scheme"}},{"name":"citation","in":"path","required":true,"schema":{"type":"string","title":"Citation"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/constitution/{scheme}/{citation}/markdown":{"get":{"tags":["code"],"summary":"Get Constitution Markdown","operationId":"get_constitution_markdown_api_code_constitution__scheme___citation__markdown_get","parameters":[{"name":"scheme","in":"path","required":true,"schema":{"type":"string","title":"Scheme"}},{"name":"citation","in":"path","required":true,"schema":{"type":"string","title":"Citation"}},{"name":"notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`all` to lift the cap on the printed notes","title":"Notes"},"description":"`all` to lift the cap on the printed notes"},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"One structure anchor to render","title":"Subsection"},"description":"One structure anchor to render"},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/code/constitution/{scheme}/{citation}/text":{"get":{"tags":["code"],"summary":"Get Constitution Text","operationId":"get_constitution_text_api_code_constitution__scheme___citation__text_get","parameters":[{"name":"scheme","in":"path","required":true,"schema":{"type":"string","title":"Scheme"}},{"name":"citation","in":"path","required":true,"schema":{"type":"string","title":"Citation"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Index  Get"}}}}}}},"/api/{slug}":{"get":{"tags":["index"],"summary":"Collection Index","description":"A collection's own root: where its routes are, and what it holds now.\nThe address the API index, llms.txt, and /for-assistants publish as the\ncollection's API; until 2026-09-11 it answered 404.","operationId":"collection_index_api__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Collection Index Api  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"AskRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","maxItems":40,"minItems":1,"title":"Messages"}},"type":"object","required":["messages"],"title":"AskRequest","description":"Request body for any Q&A streaming endpoint.\n\nThe list must end with a `user` message — that is the question being\nasked this turn. Earlier turns provide conversational context.\n\nExample:\n    # First turn\n    {\"messages\": [{\"role\": \"user\", \"content\": \"What was the holding?\"}]}\n\n    # Follow-up\n    {\"messages\": [\n        {\"role\": \"user\", \"content\": \"What was the holding?\"},\n        {\"role\": \"assistant\", \"content\": \"The Court held that...\"},\n        {\"role\": \"user\", \"content\": \"What did the dissent say?\"}\n    ]}"},"ChatMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","minLength":1,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage","description":"One turn in a Q&A conversation."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}