{"openapi":"3.1.0","info":{"title":"Politik Einfach Erklärt API","description":"\nÖffentliche, kostenlose API von **Politik Einfach Erklärt**.\n\nDie API stellt die aufbereiteten Parlamentsdaten des Deutschen Bundestages\n(Debatten, Abstimmungen, Abgeordnete, Fraktionen, Themen, Verfahren, Statistik\nund Feeds) maschinenlesbar zur Verfügung. Sie richtet sich an Civic-Tech-,\nJournalismus- und Bildungsprojekte.\n\n### Basis-Pfad\n\nAlle Endpunkte sind unter `/api/v1` versioniert, z. B. `GET /api/v1/debates`.\n\n### Antwortformat\n\nListen- und Detail-Antworten verwenden eine einheitliche Hülle:\n\n```json\n{\n  \"data\": ...,\n  \"meta\": { \"total\": 123, \"page\": 1, \"per_page\": 20 }\n}\n```\n\n`data` enthält die eigentlichen Inhalte, `meta` die Paginierungsinformationen.\n\n### Paginierung\n\nListen-Endpunkte akzeptieren die Query-Parameter `page` (Standard `1`) und\n`per_page` (Standard `20`). Die Gesamtzahl der Treffer steht in `meta.total`.\n\n### Authentifizierung\n\nDie **Lese-Endpunkte sind öffentlich** und benötigen keine Authentifizierung.\nNur die Verwaltungs-, Konto- und Ingestion-Endpunkte (`/admin`, `/auth`,\n`/user`, `/ingest`) erfordern ein JWT bzw. einen API-Schlüssel und sind nicht\nfür Drittanbieter gedacht.\n\n### Rate Limiting\n\nZum Schutz vor Missbrauch gilt ein IP-basiertes Rate Limiting (über\n`slowapi`). Aktuell sind nur die Konto-Endpunkte (Login, Registrierung,\nToken-Refresh) eng limitiert; die öffentlichen Lese-Endpunkte sind nicht\ngedrosselt. Bitte gehen Sie dennoch sparsam mit Anfragen um. Wird ein Limit\nüberschritten, antwortet die API mit HTTP `429`.\n\n### Nutzungsbedingungen\n\nDie Parlamentsdaten stammen aus offenen Quellen des Deutschen Bundestages.\nBitte beachten Sie die Hinweise und Kontaktangaben im\n[Impressum](/impressum) sowie die Entwickler-Dokumentation unter\n[/entwickler](/entwickler).\n","contact":{"name":"Politik Einfach Erklärt","url":"https://politik-einfach-erklaert.de/entwickler","email":"kontakt@politik-einfach-erklaert.de"},"license":{"name":"Daten des Deutschen Bundestages (offene Lizenz)","url":"https://politik-einfach-erklaert.de/impressum"},"version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"Health","description":"Liveness probe — fast, no external dependencies.","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/readyz":{"get":{"tags":["health"],"summary":"Readyz","description":"Readiness probe — verifies PostgreSQL and Redis connectivity.","operationId":"readyz_api_v1_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/debates":{"get":{"tags":["debates"],"summary":"Debatten auflisten","description":"List debate topics with filtering, search, and pagination.","operationId":"list_debates_api_v1_debates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Full-text search query","title":"Q"},"description":"Full-text search query"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"party","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by party short_name","title":"Party"},"description":"Filter by party short_name"},{"name":"mp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by MP id","title":"Mp Id"},"description":"Filter by MP id"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category tag","title":"Category"},"description":"Filter by category tag"},{"name":"has_vote","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter debates that have a vote","title":"Has Vote"},"description":"Filter debates that have a vote"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort by 'date' or 'relevance'","default":"date","title":"Sort"},"description":"Sort by 'date' or 'relevance'"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_DebateListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debates/trending":{"get":{"tags":["debates"],"summary":"List Trending Debates","description":"Return trending debate topics scored by recency, vote activity, and speaker count.","operationId":"list_trending_debates_api_v1_debates_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of trending topics to return","default":5,"title":"Limit"},"description":"Number of trending topics to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrendingDebateItem"},"title":"Response List Trending Debates Api V1 Debates Trending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debates/weekly-recap":{"get":{"tags":["debates"],"summary":"Weekly Recap","description":"Public weekly recap: debates and votes of one ISO sitting week.\n\nWithout query parameters, returns the most recent week that has debates.\n``year`` and ``week`` must be given together.\n\nAll debates of the week are listed regardless of summary review status (raw\nparliament data is public); the AI summary text is only included for\napproved debates so unreviewed text never leaks. Empty weeks return 404\n(consistent with the detail-endpoint convention). ``prev_week``/``next_week``\npoint to the adjacent weeks that have debates, for archive navigation.","operationId":"weekly_recap_api_v1_debates_weekly_recap_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"description":"ISO calendar year","title":"Year"},"description":"ISO calendar year"},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":53,"minimum":1},{"type":"null"}],"description":"ISO calendar week","title":"Week"},"description":"ISO calendar week"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeeklyRecapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debates/{debate_id}":{"get":{"tags":["debates"],"summary":"Debatte im Detail","description":"Get a single debate topic with speeches and vote breakdown.","operationId":"get_debate_api_v1_debates__debate_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"debate_id","in":"path","required":true,"schema":{"type":"integer","title":"Debate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DebateDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debates/{debate_id}/export.md":{"get":{"tags":["debates"],"summary":"Export Debate Markdown","description":"Download a full debate topic as a German Markdown document.","operationId":"export_debate_markdown_api_v1_debates__debate_id__export_md_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"debate_id","in":"path","required":true,"schema":{"type":"integer","title":"Debate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/votes":{"get":{"tags":["votes"],"summary":"Abstimmungen auflisten","description":"List votes with filtering and pagination.","operationId":"list_votes_api_v1_votes_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by result (e.g. 'passed', 'rejected')","title":"Result"},"description":"Filter by result (e.g. 'passed', 'rejected')"},{"name":"party","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by party short_name","title":"Party"},"description":"Filter by party short_name"},{"name":"mp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by MP id","title":"Mp Id"},"description":"Filter by MP id"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_VoteListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/votes/{vote_id}/records.csv":{"get":{"tags":["votes"],"summary":"Export Vote Records Csv","description":"Download all individual MP votes for a vote as a CSV file.","operationId":"export_vote_records_csv_api_v1_votes__vote_id__records_csv_get","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"integer","title":"Vote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/votes/{vote_id}/dissenters":{"get":{"tags":["votes"],"summary":"Get Vote Dissenters","description":"List MPs who voted against the majority of their own party in this vote.","operationId":"get_vote_dissenters_api_v1_votes__vote_id__dissenters_get","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"integer","title":"Vote Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_DissenterOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/votes/check":{"get":{"tags":["votes"],"summary":"Get Vote Check","description":"Questions for the Abstimmungs-Check (\"Wie hätte ich abgestimmt?\").\n\nReturns recent named votes with a clear result, each with the majority\ndecision of every party. The user answers ja/nein/enthaltung client-side\nand we compare against these party positions.","operationId":"get_vote_check_api_v1_votes_check_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":2,"description":"Number of questions","default":8,"title":"Limit"},"description":"Number of questions"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/votes/{vote_id}":{"get":{"tags":["votes"],"summary":"Abstimmung im Detail","description":"Get a single vote with party breakdown and individual votes.","operationId":"get_vote_api_v1_votes__vote_id__get","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"integer","title":"Vote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps":{"get":{"tags":["mps"],"summary":"Abgeordnete auflisten","description":"List MPs with search, filtering, and pagination.","operationId":"list_mps_api_v1_mps_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"},{"name":"party","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by party short_name","title":"Party"},"description":"Filter by party short_name"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"constituency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by constituency (Wahlkreis) name or city","title":"Constituency"},"description":"Search by constituency (Wahlkreis) name or city"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_MpListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/by-plz/{plz}":{"get":{"tags":["mps"],"summary":"Lookup Mps By Plz","description":"Find the Bundestag constituencies for a postal code and their MPs.\n\nA PLZ can span multiple constituencies, so the response is a list. When\nthe static PLZ mapping has not been imported yet, `meta.mapping_loaded`\nis false so clients can fall back to constituency-name search.","operationId":"lookup_mps_by_plz_api_v1_mps_by_plz__plz__get","parameters":[{"name":"plz","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{5}$","description":"Five-digit German postal code","title":"Plz"},"description":"Five-digit German postal code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlzLookupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/{mp_id}/votes.csv":{"get":{"tags":["mps"],"summary":"Export Mp Votes Csv","description":"Download an MP's complete voting record as a CSV file.","operationId":"export_mp_votes_csv_api_v1_mps__mp_id__votes_csv_get","parameters":[{"name":"mp_id","in":"path","required":true,"schema":{"type":"integer","title":"Mp Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/{mp_id}/vote-timeline":{"get":{"tags":["mps"],"summary":"Get Mp Vote Timeline","description":"Chronological list of an MP's vote records, flagging party-line dissents.","operationId":"get_mp_vote_timeline_api_v1_mps__mp_id__vote_timeline_get","parameters":[{"name":"mp_id","in":"path","required":true,"schema":{"type":"integer","title":"Mp Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_VoteTimelineItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/{mp_id}/speeches":{"get":{"tags":["mps"],"summary":"Get Mp Speeches","description":"Paginated list of all speeches by an MP, most recent debate first.","operationId":"get_mp_speeches_api_v1_mps__mp_id__speeches_get","parameters":[{"name":"mp_id","in":"path","required":true,"schema":{"type":"integer","title":"Mp Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_RecentSpeech_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/compare":{"get":{"tags":["mps"],"summary":"Compare Mps","description":"Compare two or three MPs side by side.\n\nReturns each MP's stats plus the roll-call votes they all took part in,\nflagging where they agreed.","operationId":"compare_mps_api_v1_mps_compare_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated MP ids (2-3)","title":"Ids"},"description":"Comma-separated MP ids (2-3)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MpCompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mps/{mp_id}":{"get":{"tags":["mps"],"summary":"Abgeordnete:r im Detail","description":"Get a single MP with stats, recent votes, and recent speeches.","operationId":"get_mp_api_v1_mps__mp_id__get","parameters":[{"name":"mp_id","in":"path","required":true,"schema":{"type":"integer","title":"Mp Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MpDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/parties":{"get":{"tags":["parties"],"summary":"List Parties","description":"List all parties with member count and avg attendance.","operationId":"list_parties_api_v1_parties_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartyListResponse"}}}}}}},"/api/v1/parties/{party_id}":{"get":{"tags":["parties"],"summary":"Fraktion im Detail","description":"Get a single party with aggregate stats and its active members.","operationId":"get_party_api_v1_parties__party_id__get","parameters":[{"name":"party_id","in":"path","required":true,"schema":{"type":"integer","title":"Party Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartyDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/procedures":{"get":{"tags":["procedures"],"summary":"Verfahren auflisten","description":"List legislative procedures (\"Vorhaben\"), most recently active first.\n\nEach item carries enough to render the current stage badge and deep-link to\nthe related debate (``debate_topic_id`` -> ``/debatten/{id}``).","operationId":"list_procedures_api_v1_procedures_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by title substring","title":"Q"},"description":"Filter by title substring"},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by canonical current_stage key","title":"Stage"},"description":"Filter by canonical current_stage key"},{"name":"procedure_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by DIP vorgangstyp","title":"Procedure Type"},"description":"Filter by DIP vorgangstyp"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProcedureListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/procedures/{external_id}":{"get":{"tags":["procedures"],"summary":"Get Procedure","description":"Get a single procedure with its full stepper + timeline.\n\nAddressed by the stable DIP ``external_id`` (the ingest key), so the\noverview can link to ``/gesetze/{external_id}`` without exposing internal ids.","operationId":"get_procedure_api_v1_procedures__external_id__get","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcedureDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"get":{"tags":["search"],"summary":"Volltextsuche","description":"Search across debates, votes, and MPs. Returns merged results sorted by relevance.","operationId":"unified_search_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: debate, vote, mp","title":"Type"},"description":"Filter by type: debate, vote, mp"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (inclusive)","title":"Date From"},"description":"Start date (inclusive)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (inclusive)","title":"Date To"},"description":"End date (inclusive)"},{"name":"party","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by party short_name","title":"Party"},"description":"Filter by party short_name"},{"name":"mp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by MP id","title":"Mp Id"},"description":"Filter by MP id"},{"name":"vote_result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by vote result","title":"Vote Result"},"description":"Filter by vote result"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SearchResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/semantic":{"get":{"tags":["search"],"summary":"Semantische Suche (Bedeutung)","description":"Find approved debates by meaning, using summary-embedding cosine similarity.\n\nEmbeds the query with the same model as the debate corpus\n(``intfloat/multilingual-e5-large``, e5 ``query:`` prefix) and ranks\napproved debates by cosine similarity over ``debate_topic.embedding``\n(pgvector).\n\nDegrades gracefully with a 503 (empty ``data`` + ``meta.note``) — never a\n500 — when the dialect is not PostgreSQL (no pgvector) or the embedding\nmodel is unavailable (e.g. not yet downloaded).","operationId":"semantic_search_api_v1_search_semantic_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Natural-language search query","title":"Q"},"description":"Natural-language search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum number of debates to return","default":20,"title":"Limit"},"description":"Maximum number of debates to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SemanticSearchResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats":{"get":{"tags":["stats"],"summary":"Öffentliche Kennzahlen","description":"Return public content counts.\n\nThe debate count matches the publicly listed debates (``GET /debates``),\nwhich include every debate topic regardless of summary review status — the\nraw parliament data is public, only the AI summary text is gated per-item.","operationId":"get_public_stats_api_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicStats"}}}}}}},"/api/v1/stats/votes/timeline":{"get":{"tags":["stats"],"summary":"Vote Timeline","description":"Monthly vote counts split by outcome.","operationId":"vote_timeline_api_v1_stats_votes_timeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteTimelineResponse"}}}}}}},"/api/v1/stats/parties/agreement":{"get":{"tags":["stats"],"summary":"Party Agreement","description":"Pairwise party agreement: share of votes where two parties' majority\ndecisions (ja/nein) matched, among votes where both had a majority.","operationId":"party_agreement_api_v1_stats_parties_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartyAgreementResponse"}}}}}}},"/api/v1/stats/parties/cohesion":{"get":{"tags":["stats"],"summary":"Party Cohesion","description":"Per-party voting cohesion (Rice index of cohesion).\n\nFor a party in a single vote: cohesion = |ja − nein| / (ja + nein), counting\nonly ``ja``/``nein`` (Enthaltung and nicht_abgegeben are ignored, consistent\nwith the majority logic in ``party_agreement``). A party's overall cohesion is\nthe mean of its per-vote cohesion over all votes where it cast ≥1 ja/nein,\nexpressed as a percent (0 = perfectly split … 100 = unanimous).\n\nThis is *measured* cohesion from roll-call votes, not a formal \"Fraktionszwang\".","operationId":"party_cohesion_api_v1_stats_parties_cohesion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartyCohesionResponse"}}}}}}},"/api/v1/stats/mps/{mp_id}/attendance":{"get":{"tags":["stats"],"summary":"Mp Attendance","description":"Monthly attendance rate for an MP (share of recorded votes where the\nMP actually cast a vote rather than 'nicht_abgegeben').","operationId":"mp_attendance_api_v1_stats_mps__mp_id__attendance_get","parameters":[{"name":"mp_id","in":"path","required":true,"schema":{"type":"integer","title":"Mp Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttendanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/topics":{"get":{"tags":["topics"],"summary":"Themen auflisten","description":"All canonical categories with published-debate and vote counts.","operationId":"list_topics_api_v1_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicListResponse"}}}}}}},"/api/v1/topics/clusters":{"get":{"tags":["topics"],"summary":"Themencluster und Trends","description":"Current topic clusters derived from approved-debate embeddings.\n\nGroups approved debates by their summary embeddings (cosine k-means over the\n1024-dim vectors), labels each cluster from its dominant category tags and\nfrequent title terms, and exposes representative debates plus a 30/90-day\nrecency trend signal. Computed on demand and memoised in-process for a short\nTTL. PostgreSQL-only at runtime (needs real embeddings); on SQLite or before\nembeddings exist it degrades to an empty list with an explanatory meta note.","operationId":"list_topic_clusters_api_v1_topics_clusters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicClusterResponse"}}}}}}},"/api/v1/topics/{slug}":{"get":{"tags":["topics"],"summary":"Get Topic Dossier","description":"Dossier for one category: chronological published debates (with their\nvotes), overall stats, and a monthly activity trend.","operationId":"get_topic_dossier_api_v1_topics__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicDossierResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Revoke the current access token, effectively logging the user out.","operationId":"logout_api_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/user/profile":{"get":{"tags":["user"],"summary":"Get Profile","operationId":"get_profile_api_v1_user_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/user/bookmarks":{"get":{"tags":["user"],"summary":"List Bookmarks","operationId":"list_bookmarks_api_v1_user_bookmarks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["user"],"summary":"Create Bookmark","operationId":"create_bookmark_api_v1_user_bookmarks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookmarkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookmarkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/user/bookmarks/{bookmark_id}":{"delete":{"tags":["user"],"summary":"Delete Bookmark","operationId":"delete_bookmark_api_v1_user_bookmarks__bookmark_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bookmark_id","in":"path","required":true,"schema":{"type":"integer","title":"Bookmark Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/user/settings":{"get":{"tags":["user"],"summary":"Get Settings","operationId":"get_settings_api_v1_user_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsOut"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["user"],"summary":"Update Settings","operationId":"update_settings_api_v1_user_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/unsubscribe":{"get":{"tags":["notifications"],"summary":"Unsubscribe Page","description":"Return a simple HTML confirmation page for email clients that open the link.","operationId":"unsubscribe_page_api_v1_notifications_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["notifications"],"summary":"Unsubscribe","description":"RFC 8058 one-click unsubscribe endpoint.\n\nAccepts the signed token as a query parameter, verifies it, and disables\nemail notifications for the corresponding user.  No session auth required —\nthe token itself authorises the action.","operationId":"unsubscribe_api_v1_notifications_unsubscribe_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feeds/debates":{"get":{"tags":["feeds"],"summary":"Debates Rss Feed","description":"Return an RSS 2.0 feed of the most recent approved debate topics.","operationId":"debates_rss_feed_api_v1_feeds_debates_get","parameters":[{"name":"party","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by party short_name","title":"Party"},"description":"Filter by party short_name"},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category tag","title":"Tag"},"description":"Filter by category tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Get Admin Stats","description":"Return counts of all key database objects.","operationId":"get_admin_stats_api_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStats"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/scrape-runs":{"get":{"tags":["admin"],"summary":"List Scrape Runs","description":"List scraping runs, ordered by started_at descending.","operationId":"list_scrape_runs_api_v1_admin_scrape_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ScrapeRunOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Scrape Run","description":"Create a new scrape run record and dispatch the Celery task.","operationId":"create_scrape_run_api_v1_admin_scrape_runs_post","security":[{"HTTPBearer":[]}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeRunOut"}}}}}}},"/api/v1/admin/scrape-votes":{"post":{"tags":["admin"],"summary":"Trigger Scrape Votes","description":"Trigger vote scraping via Celery task.","operationId":"trigger_scrape_votes_api_v1_admin_scrape_votes_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/enrich-mps":{"post":{"tags":["admin"],"summary":"Trigger Enrich Mps","description":"Trigger MP data enrichment via Celery task.","operationId":"trigger_enrich_mps_api_v1_admin_enrich_mps_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/summaries/review":{"get":{"tags":["admin"],"summary":"List Summaries For Review","description":"List debate topics that have a summary draft awaiting review.\n\nOnly topics with an actual draft (``summary_short`` set) and not yet approved\nare returned — freshly scraped topics default to ``review_status=\"pending\"``\nwith no summary, and would otherwise flood the review queue.","operationId":"list_summaries_for_review_api_v1_admin_summaries_review_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SummaryReviewItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/summaries/batch":{"post":{"tags":["admin"],"summary":"Batch Update Summaries","description":"Set the review_status for many summaries at once (e.g. bulk approve).\n\nOnly topics that actually have a draft (``summary_short`` set) are touched.\nIf ``ids`` is given, the update is restricted to those topics; otherwise it\napplies to every draft still awaiting review (status not ``approved``).","operationId":"batch_update_summaries_api_v1_admin_summaries_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryBatchUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryBatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/summaries/{topic_id}":{"patch":{"tags":["admin"],"summary":"Update Summary","description":"Update a debate topic's review_status and optional summary text.","operationId":"update_summary_api_v1_admin_summaries__topic_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryReviewUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryReviewItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/pending":{"get":{"tags":["ingest"],"summary":"List Pending","description":"List debate topics that have no summary yet, with their transcripts.\n\n``meta.total`` reports how many topics are pending overall (not just this page),\nso the worker can log remaining work.","operationId":"list_pending_api_v1_ingest_pending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"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/PaginatedResponse_PendingDebateItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/pending-embeddings":{"get":{"tags":["ingest"],"summary":"List Pending Embeddings","description":"List summarized debate topics that still lack an embedding.\n\nEach item carries the summary text the external embedder should encode.\n``meta.total`` reports the overall backlog so the embedder can log progress.","operationId":"list_pending_embeddings_api_v1_ingest_pending_embeddings_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"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/PaginatedResponse_PendingEmbeddingItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/{topic_id}/embedding":{"post":{"tags":["ingest"],"summary":"Push Embedding","description":"Store the externally generated summary embedding for a debate topic.\n\nIdempotent: re-posting overwrites the stored vector. The embedding model name\nis recorded in ``ai_metadata`` for traceability and re-embedding decisions.","operationId":"push_embedding_api_v1_ingest__topic_id__embedding_post","parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingIngest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/unlinked-votes":{"get":{"tags":["ingest"],"summary":"List Unlinked Votes","description":"List votes not yet linked to a debate, for the external linker.\n\n``meta.total`` reports the overall backlog of unlinked votes.","operationId":"list_unlinked_votes_api_v1_ingest_unlinked_votes_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"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/PaginatedResponse_UnlinkedVoteItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/votes/{vote_id}/match-debate":{"post":{"tags":["ingest"],"summary":"Match Vote Debate","description":"Link a vote to the nearest debate by summary embedding, on the same date.\n\nThe caller supplies the vote-title embedding; the server runs a date-filtered\nnearest-neighbour over stored debate embeddings (pgvector cosine). The link is\nonly set when the best distance is within ``max_distance`` — otherwise the vote\nstays unlinked. ``dry_run`` returns the proposed match without writing.","operationId":"match_vote_debate_api_v1_ingest_votes__vote_id__match_debate_post","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"integer","title":"Vote Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteMatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteMatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/{topic_id}/summary":{"post":{"tags":["ingest"],"summary":"Push Summary","description":"Store summaries for a debate topic as a pending draft (idempotent upsert).\n\nRe-posting the same topic overwrites its summaries and resets review to\n``pending``. Category tags are filtered against the canonical list.","operationId":"push_summary_api_v1_ingest__topic_id__summary_post","parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryIngest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryReviewItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminStats":{"properties":{"sessions":{"type":"integer","title":"Sessions"},"debates":{"type":"integer","title":"Debates"},"speeches":{"type":"integer","title":"Speeches"},"votes":{"type":"integer","title":"Votes"},"mps":{"type":"integer","title":"Mps"},"parties":{"type":"integer","title":"Parties"},"scrape_runs":{"type":"integer","title":"Scrape Runs"}},"type":"object","required":["sessions","debates","speeches","votes","mps","parties","scrape_runs"],"title":"AdminStats"},"AttendanceEntry":{"properties":{"month":{"type":"string","title":"Month"},"total":{"type":"integer","title":"Total"},"attendance_rate":{"type":"number","title":"Attendance Rate"}},"type":"object","required":["month","total","attendance_rate"],"title":"AttendanceEntry"},"AttendanceResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AttendanceEntry"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"AttendanceResponse"},"AuthResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserOut"}},"type":"object","required":["access_token","refresh_token","user"],"title":"AuthResponse"},"BookmarkCreate":{"properties":{"type":{"type":"string","enum":["debate","mp","topic"],"title":"Type"},"target_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Id"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},"type":"object","required":["type"],"title":"BookmarkCreate"},"BookmarkOut":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"},"mp_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mp Id"},"topic_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Tag"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","type","created_at"],"title":"BookmarkOut"},"ClusterRepresentative":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},"type":"object","required":["id","title"],"title":"ClusterRepresentative"},"DebateDetail":{"properties":{"id":{"type":"integer","title":"Id"},"session_number":{"type":"integer","title":"Session Number"},"session_date":{"type":"string","format":"date","title":"Session Date"},"topic_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Number"},"title":{"type":"string","title":"Title"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"summary_detailed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Detailed"},"summary_leichte_sprache":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Leichte Sprache"},"headline_leichte_sprache":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline Leichte Sprache"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"ai_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Metadata"},"speeches":{"items":{"$ref":"#/components/schemas/SpeechSummary"},"type":"array","title":"Speeches","default":[]},"vote":{"anyOf":[{"$ref":"#/components/schemas/VoteInDebate"},{"type":"null"}]},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"related_debates":{"items":{"$ref":"#/components/schemas/RelatedDebate"},"type":"array","title":"Related Debates","default":[]},"procedure":{"anyOf":[{"$ref":"#/components/schemas/ProcedureSummary"},{"type":"null"}]}},"type":"object","required":["id","session_number","session_date","title"],"title":"DebateDetail"},"DebateListItem":{"properties":{"id":{"type":"integer","title":"Id"},"session_number":{"type":"integer","title":"Session Number"},"session_date":{"type":"string","format":"date","title":"Session Date"},"topic_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Number"},"title":{"type":"string","title":"Title"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"has_vote":{"type":"boolean","title":"Has Vote","default":false},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result"},"parties_involved":{"items":{"type":"string"},"type":"array","title":"Parties Involved","default":[]},"speaker_count":{"type":"integer","title":"Speaker Count","default":0}},"type":"object","required":["id","session_number","session_date","title"],"title":"DebateListItem"},"DissenterOut":{"properties":{"mp_id":{"type":"integer","title":"Mp Id"},"mp_name":{"type":"string","title":"Mp Name"},"party":{"type":"string","title":"Party"},"party_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Party Color"},"decision":{"type":"string","title":"Decision"},"party_majority":{"type":"string","title":"Party Majority"}},"type":"object","required":["mp_id","mp_name","party","decision","party_majority"],"title":"DissenterOut","description":"An MP who voted against the majority of their own party in one vote."},"EmbeddingIngest":{"properties":{"embedding":{"items":{"type":"number"},"type":"array","maxItems":1024,"minItems":1024,"title":"Embedding"},"model":{"type":"string","minLength":1,"title":"Model"}},"type":"object","required":["embedding","model"],"title":"EmbeddingIngest","description":"A summary embedding pushed back by the external embedder."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IndividualVote":{"properties":{"mp_id":{"type":"integer","title":"Mp Id"},"mp_name":{"type":"string","title":"Mp Name"},"party":{"type":"string","title":"Party"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["mp_id","mp_name","party","decision"],"title":"IndividualVote"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MpCompareData":{"properties":{"mps":{"items":{"$ref":"#/components/schemas/MpCompareEntry"},"type":"array","title":"Mps","default":[]},"shared_votes":{"items":{"$ref":"#/components/schemas/SharedVote"},"type":"array","title":"Shared Votes","default":[]},"shared_vote_count":{"type":"integer","title":"Shared Vote Count","default":0},"agreement_count":{"type":"integer","title":"Agreement Count","default":0}},"type":"object","title":"MpCompareData"},"MpCompareEntry":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"party":{"anyOf":[{"$ref":"#/components/schemas/PartyOut"},{"type":"null"}]},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constituency"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"stats":{"$ref":"#/components/schemas/MpStats","default":{"total_votes":0,"votes_participated":0,"attendance_rate":0.0,"party_loyalty":0.0,"speeches_count":0,"vote_breakdown":{"enthaltung":0,"ja":0,"nein":0,"nicht_abgegeben":0}}}},"type":"object","required":["id","first_name","last_name"],"title":"MpCompareEntry","description":"One MP in a side-by-side comparison."},"MpCompareResponse":{"properties":{"data":{"$ref":"#/components/schemas/MpCompareData"}},"type":"object","required":["data"],"title":"MpCompareResponse"},"MpDetail":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"party":{"anyOf":[{"$ref":"#/components/schemas/PartyOut"},{"type":"null"}]},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constituency"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"biography":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Biography"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"stats":{"$ref":"#/components/schemas/MpStats","default":{"total_votes":0,"votes_participated":0,"attendance_rate":0.0,"party_loyalty":0.0,"speeches_count":0,"vote_breakdown":{"enthaltung":0,"ja":0,"nein":0,"nicht_abgegeben":0}}},"recent_votes":{"items":{"$ref":"#/components/schemas/RecentVote"},"type":"array","title":"Recent Votes","default":[]},"recent_speeches":{"items":{"$ref":"#/components/schemas/RecentSpeech"},"type":"array","title":"Recent Speeches","default":[]}},"type":"object","required":["id","first_name","last_name"],"title":"MpDetail"},"MpListItem":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"party":{"type":"string","title":"Party","default":""},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constituency"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"attendance_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Attendance Rate"},"party_loyalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Party Loyalty"}},"type":"object","required":["id","first_name","last_name"],"title":"MpListItem"},"MpStats":{"properties":{"total_votes":{"type":"integer","title":"Total Votes","default":0},"votes_participated":{"type":"integer","title":"Votes Participated","default":0},"attendance_rate":{"type":"number","title":"Attendance Rate","default":0.0},"party_loyalty":{"type":"number","title":"Party Loyalty","default":0.0},"speeches_count":{"type":"integer","title":"Speeches Count","default":0},"vote_breakdown":{"$ref":"#/components/schemas/VoteDecisionBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}}},"type":"object","title":"MpStats"},"PaginatedResponse_DebateListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DebateListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[DebateListItem]"},"PaginatedResponse_DissenterOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DissenterOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[DissenterOut]"},"PaginatedResponse_MpListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MpListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[MpListItem]"},"PaginatedResponse_PendingDebateItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PendingDebateItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[PendingDebateItem]"},"PaginatedResponse_PendingEmbeddingItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PendingEmbeddingItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[PendingEmbeddingItem]"},"PaginatedResponse_ProcedureListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProcedureListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ProcedureListItem]"},"PaginatedResponse_RecentSpeech_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RecentSpeech"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[RecentSpeech]"},"PaginatedResponse_ScrapeRunOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ScrapeRunOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ScrapeRunOut]"},"PaginatedResponse_SearchResult_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[SearchResult]"},"PaginatedResponse_SemanticSearchResult_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SemanticSearchResult"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[SemanticSearchResult]"},"PaginatedResponse_SummaryReviewItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SummaryReviewItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[SummaryReviewItem]"},"PaginatedResponse_UnlinkedVoteItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/UnlinkedVoteItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[UnlinkedVoteItem]"},"PaginatedResponse_VoteListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VoteListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[VoteListItem]"},"PaginatedResponse_VoteTimelineItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VoteTimelineItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[VoteTimelineItem]"},"PaginationMeta":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"}},"type":"object","required":["total","page","per_page"],"title":"PaginationMeta"},"PartyAgreementData":{"properties":{"parties":{"items":{"type":"string"},"type":"array","title":"Parties"},"matrix":{"items":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array"},"type":"array","title":"Matrix"}},"type":"object","required":["parties","matrix"],"title":"PartyAgreementData"},"PartyAgreementResponse":{"properties":{"data":{"$ref":"#/components/schemas/PartyAgreementData"}},"type":"object","required":["data"],"title":"PartyAgreementResponse"},"PartyCohesionData":{"properties":{"parties":{"items":{"$ref":"#/components/schemas/PartyCohesionEntry"},"type":"array","title":"Parties"}},"type":"object","required":["parties"],"title":"PartyCohesionData"},"PartyCohesionEntry":{"properties":{"party":{"type":"string","title":"Party"},"cohesion":{"type":"number","title":"Cohesion"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"votes":{"type":"integer","title":"Votes"}},"type":"object","required":["party","cohesion","votes"],"title":"PartyCohesionEntry"},"PartyCohesionResponse":{"properties":{"data":{"$ref":"#/components/schemas/PartyCohesionData"}},"type":"object","required":["data"],"title":"PartyCohesionResponse"},"PartyDetail":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"type":"string","title":"Short Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"id":{"type":"integer","title":"Id"},"stats":{"$ref":"#/components/schemas/PartyStats","default":{"member_count":0,"speeches_count":0,"vote_breakdown":{"enthaltung":0,"ja":0,"nein":0,"nicht_abgegeben":0}}},"members":{"items":{"$ref":"#/components/schemas/PartyMember"},"type":"array","title":"Members","default":[]}},"type":"object","required":["name","short_name","id"],"title":"PartyDetail"},"PartyDetailResponse":{"properties":{"data":{"$ref":"#/components/schemas/PartyDetail"}},"type":"object","required":["data"],"title":"PartyDetailResponse"},"PartyListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PartyWithStats"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"PartyListResponse"},"PartyMember":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"party":{"type":"string","title":"Party","default":""},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constituency"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"attendance_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Attendance Rate"},"party_loyalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Party Loyalty"}},"type":"object","required":["id","first_name","last_name"],"title":"PartyMember","description":"A party member as shown on the party page.\n\nSame shape as ``schemas.mp.MpListItem`` (defined locally to avoid a circular\nimport, since ``schemas.mp`` already depends on ``PartyOut`` here)."},"PartyOut":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"type":"string","title":"Short Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["name","short_name","id"],"title":"PartyOut"},"PartyStats":{"properties":{"member_count":{"type":"integer","title":"Member Count","default":0},"avg_attendance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Attendance"},"avg_party_loyalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Party Loyalty"},"cohesion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cohesion"},"speeches_count":{"type":"integer","title":"Speeches Count","default":0},"vote_breakdown":{"$ref":"#/components/schemas/PartyVoteBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}}},"type":"object","title":"PartyStats","description":"Aggregate voting/activity stats for a whole Fraktion."},"PartyVoteBreakdown":{"properties":{"ja":{"type":"integer","title":"Ja","default":0},"nein":{"type":"integer","title":"Nein","default":0},"enthaltung":{"type":"integer","title":"Enthaltung","default":0},"nicht_abgegeben":{"type":"integer","title":"Nicht Abgegeben","default":0}},"type":"object","title":"PartyVoteBreakdown"},"PartyWithStats":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"type":"string","title":"Short Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"id":{"type":"integer","title":"Id"},"mp_count":{"type":"integer","title":"Mp Count","default":0},"avg_attendance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Attendance"}},"type":"object","required":["name","short_name","id"],"title":"PartyWithStats"},"PendingDebateItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["id","title","transcript"],"title":"PendingDebateItem","description":"A debate topic awaiting summarization, served to the worker."},"PendingEmbeddingItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"}},"type":"object","required":["id","title","text"],"title":"PendingEmbeddingItem","description":"A summarized debate topic still missing its embedding.\n\n``text`` is the summary text the external embedder should encode."},"PlzLookupMeta":{"properties":{"plz":{"type":"string","title":"Plz"},"total":{"type":"integer","title":"Total"},"mapping_loaded":{"type":"boolean","title":"Mapping Loaded"}},"type":"object","required":["plz","total","mapping_loaded"],"title":"PlzLookupMeta"},"PlzLookupResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WahlkreisMps"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PlzLookupMeta"}},"type":"object","required":["data","meta"],"title":"PlzLookupResponse"},"ProcedureDetail":{"properties":{"external_id":{"type":"string","title":"External Id"},"title":{"type":"string","title":"Title"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"beratungsstand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beratungsstand"},"current_stage":{"type":"string","title":"Current Stage"},"current_stage_label":{"type":"string","title":"Current Stage Label"},"current_stage_explanation":{"type":"string","title":"Current Stage Explanation"},"stepper":{"items":{"$ref":"#/components/schemas/ProcedureStepView"},"type":"array","title":"Stepper","default":[]},"timeline":{"items":{"$ref":"#/components/schemas/ProcedureTimelineStep"},"type":"array","title":"Timeline","default":[]},"initiative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiative"},"legislative_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Legislative Period"},"last_activity":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Activity"},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"}},"type":"object","required":["external_id","title","current_stage","current_stage_label","current_stage_explanation"],"title":"ProcedureDetail","description":"Full procedure view for the Gesetze detail page.\n\nExtends :class:`ProcedureSummary` (current stage + stepper + timeline) with\nthe metadata needed for a standalone page and the linked debate."},"ProcedureListItem":{"properties":{"external_id":{"type":"string","title":"External Id"},"title":{"type":"string","title":"Title"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"initiative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiative"},"beratungsstand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beratungsstand"},"current_stage":{"type":"string","title":"Current Stage"},"current_stage_label":{"type":"string","title":"Current Stage Label"},"last_activity":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Activity"},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"}},"type":"object","required":["external_id","title","current_stage","current_stage_label"],"title":"ProcedureListItem","description":"One legislative procedure (\"Vorhaben\") in the overview list.\n\nAggregated from the standalone ``procedure`` table so the Gesetze overview\ncan show where each bill stands without loading its full timeline."},"ProcedureStepView":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status"}},"type":"object","required":["key","label","status"],"title":"ProcedureStepView","description":"One node of the citizen-facing five-step progress bar."},"ProcedureSummary":{"properties":{"external_id":{"type":"string","title":"External Id"},"title":{"type":"string","title":"Title"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"beratungsstand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beratungsstand"},"current_stage":{"type":"string","title":"Current Stage"},"current_stage_label":{"type":"string","title":"Current Stage Label"},"current_stage_explanation":{"type":"string","title":"Current Stage Explanation"},"stepper":{"items":{"$ref":"#/components/schemas/ProcedureStepView"},"type":"array","title":"Stepper","default":[]},"timeline":{"items":{"$ref":"#/components/schemas/ProcedureTimelineStep"},"type":"array","title":"Timeline","default":[]}},"type":"object","required":["external_id","title","current_stage","current_stage_label","current_stage_explanation"],"title":"ProcedureSummary","description":"Where a bill stands, in plain German."},"ProcedureTimelineStep":{"properties":{"label":{"type":"string","title":"Label"},"zuordnung":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zuordnung"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url"}},"type":"object","required":["label"],"title":"ProcedureTimelineStep","description":"A real DIP procedure position (detailed history)."},"PublicStats":{"properties":{"debates":{"type":"integer","title":"Debates"},"votes":{"type":"integer","title":"Votes"}},"type":"object","required":["debates","votes"],"title":"PublicStats"},"RecentSpeech":{"properties":{"debate_topic_id":{"type":"integer","title":"Debate Topic Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"position_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Summary"}},"type":"object","required":["debate_topic_id","date","title"],"title":"RecentSpeech"},"RecentVote":{"properties":{"vote_id":{"type":"integer","title":"Vote Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"decision":{"type":"string","title":"Decision"},"party_majority":{"type":"string","title":"Party Majority"}},"type":"object","required":["vote_id","date","title","decision","party_majority"],"title":"RecentVote"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"display_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"RelatedDebate":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"date":{"type":"string","format":"date","title":"Date"}},"type":"object","required":["id","title","date"],"title":"RelatedDebate"},"ScrapeRunOut":{"properties":{"id":{"type":"integer","title":"Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"status":{"type":"string","title":"Status"},"items_scraped":{"type":"integer","title":"Items Scraped","default":0},"items_summarized":{"type":"integer","title":"Items Summarized","default":0},"error_log":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Log"}},"type":"object","required":["id","started_at","status"],"title":"ScrapeRunOut"},"SearchResult":{"properties":{"type":{"type":"string","title":"Type"},"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"snippet":{"type":"string","title":"Snippet","default":""},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"relevance_score":{"type":"number","title":"Relevance Score","default":0.0},"href":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Href"}},"type":"object","required":["type","id","title"],"title":"SearchResult"},"SemanticSearchResult":{"properties":{"id":{"type":"integer","title":"Id"},"session_number":{"type":"integer","title":"Session Number"},"session_date":{"type":"string","format":"date","title":"Session Date"},"topic_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Number"},"title":{"type":"string","title":"Title"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"has_vote":{"type":"boolean","title":"Has Vote","default":false},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result"},"parties_involved":{"items":{"type":"string"},"type":"array","title":"Parties Involved","default":[]},"speaker_count":{"type":"integer","title":"Speaker Count","default":0},"similarity":{"type":"number","title":"Similarity","default":0.0}},"type":"object","required":["id","session_number","session_date","title"],"title":"SemanticSearchResult","description":"A debate ranked by semantic similarity to the query.\n\nExtends :class:`DebateListItem` (so the frontend can reuse debate\ncomponents) with a cosine-derived ``similarity`` score in ``[0, 1]`` where\n1.0 is most similar."},"SharedVote":{"properties":{"vote_id":{"type":"integer","title":"Vote Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"decisions":{"additionalProperties":{"type":"string"},"type":"object","title":"Decisions","default":{}},"agreement":{"type":"boolean","title":"Agreement","default":false}},"type":"object","required":["vote_id","date","title"],"title":"SharedVote","description":"A roll-call vote in which all compared MPs took part."},"SpeechMp":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"party":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Party"}},"type":"object","required":["id","first_name","last_name"],"title":"SpeechMp"},"SpeechSummary":{"properties":{"id":{"type":"integer","title":"Id"},"mp":{"anyOf":[{"$ref":"#/components/schemas/SpeechMp"},{"type":"null"}]},"position_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Summary"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"speech_order":{"type":"integer","title":"Speech Order","default":0}},"type":"object","required":["id"],"title":"SpeechSummary"},"SummaryBatchResult":{"properties":{"updated":{"type":"integer","title":"Updated"}},"type":"object","required":["updated"],"title":"SummaryBatchResult"},"SummaryBatchUpdate":{"properties":{"review_status":{"type":"string","enum":["pending","edited","approved","rejected"],"title":"Review Status","default":"approved"},"ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"SummaryBatchUpdate"},"SummaryIngest":{"properties":{"summary_short":{"type":"string","minLength":1,"title":"Summary Short"},"summary_detailed":{"type":"string","minLength":1,"title":"Summary Detailed"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"summary_leichte_sprache":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Leichte Sprache"},"headline_leichte_sprache":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline Leichte Sprache"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"ai_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Metadata"}},"type":"object","required":["summary_short","summary_detailed"],"title":"SummaryIngest","description":"Summaries pushed back by the worker for a single debate topic."},"SummaryReviewItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"summary_detailed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Detailed"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"ai_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Metadata"},"review_status":{"type":"string","title":"Review Status"}},"type":"object","required":["id","title","review_status"],"title":"SummaryReviewItem"},"SummaryReviewUpdate":{"properties":{"review_status":{"type":"string","enum":["pending","edited","approved","rejected"],"title":"Review Status"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"summary_detailed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Detailed"},"category_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Tags"}},"type":"object","required":["review_status"],"title":"SummaryReviewUpdate"},"TopicClusterItem":{"properties":{"label":{"type":"string","title":"Label"},"size":{"type":"integer","title":"Size"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","default":[]},"representatives":{"items":{"$ref":"#/components/schemas/ClusterRepresentative"},"type":"array","title":"Representatives","default":[]},"recent_count_30d":{"type":"integer","title":"Recent Count 30D","default":0},"recent_count_90d":{"type":"integer","title":"Recent Count 90D","default":0}},"type":"object","required":["label","size"],"title":"TopicClusterItem"},"TopicClusterMeta":{"properties":{"total":{"type":"integer","title":"Total"},"total_debates":{"type":"integer","title":"Total Debates","default":0},"available":{"type":"boolean","title":"Available","default":false},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["total"],"title":"TopicClusterMeta"},"TopicClusterResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TopicClusterItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/TopicClusterMeta"}},"type":"object","required":["data","meta"],"title":"TopicClusterResponse"},"TopicDossierData":{"properties":{"category":{"type":"string","title":"Category"},"slug":{"type":"string","title":"Slug"},"stats":{"$ref":"#/components/schemas/TopicStats"},"trend":{"items":{"$ref":"#/components/schemas/TopicTrendEntry"},"type":"array","title":"Trend","default":[]},"debates":{"items":{"$ref":"#/components/schemas/DebateListItem"},"type":"array","title":"Debates","default":[]}},"type":"object","required":["category","slug","stats"],"title":"TopicDossierData"},"TopicDossierResponse":{"properties":{"data":{"$ref":"#/components/schemas/TopicDossierData"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"TopicDossierResponse"},"TopicListMeta":{"properties":{"total":{"type":"integer","title":"Total"}},"type":"object","required":["total"],"title":"TopicListMeta"},"TopicListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TopicSummary"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/TopicListMeta"}},"type":"object","required":["data","meta"],"title":"TopicListResponse"},"TopicStats":{"properties":{"debate_count":{"type":"integer","title":"Debate Count","default":0},"vote_count":{"type":"integer","title":"Vote Count","default":0},"first_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"First Date"},"latest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Date"}},"type":"object","title":"TopicStats"},"TopicSummary":{"properties":{"category":{"type":"string","title":"Category"},"slug":{"type":"string","title":"Slug"},"debate_count":{"type":"integer","title":"Debate Count","default":0},"vote_count":{"type":"integer","title":"Vote Count","default":0},"latest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Date"}},"type":"object","required":["category","slug"],"title":"TopicSummary"},"TopicTrendEntry":{"properties":{"month":{"type":"string","title":"Month"},"debates":{"type":"integer","title":"Debates","default":0},"votes":{"type":"integer","title":"Votes","default":0}},"type":"object","required":["month"],"title":"TopicTrendEntry"},"TrendingDebateItem":{"properties":{"id":{"type":"integer","title":"Id"},"session_number":{"type":"integer","title":"Session Number"},"session_date":{"type":"string","format":"date","title":"Session Date"},"title":{"type":"string","title":"Title"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short"},"category_tags":{"items":{"type":"string"},"type":"array","title":"Category Tags","default":[]},"has_vote":{"type":"boolean","title":"Has Vote","default":false},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result"},"speaker_count":{"type":"integer","title":"Speaker Count","default":0},"trending_score":{"type":"number","title":"Trending Score","default":0.0}},"type":"object","required":["id","session_number","session_date","title"],"title":"TrendingDebateItem"},"UnlinkedVoteItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"date":{"type":"string","format":"date","title":"Date"}},"type":"object","required":["id","title","date"],"title":"UnlinkedVoteItem","description":"A vote not yet linked to a debate, served to the external linker."},"UserOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["id","email"],"title":"UserOut"},"UserSettingsOut":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email_notifications":{"type":"boolean","title":"Email Notifications","default":false},"followed_topics":{"items":{"type":"string"},"type":"array","title":"Followed Topics","default":[]},"followed_mp_ids":{"items":{"type":"integer"},"type":"array","title":"Followed Mp Ids","default":[]}},"type":"object","title":"UserSettingsOut"},"UserSettingsUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email_notifications":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Notifications"},"followed_topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Followed Topics"},"followed_mp_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Followed Mp Ids"}},"type":"object","title":"UserSettingsUpdate"},"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"},"VoteBreakdown":{"properties":{"ja":{"type":"integer","title":"Ja","default":0},"nein":{"type":"integer","title":"Nein","default":0},"enthaltung":{"type":"integer","title":"Enthaltung","default":0},"nicht_abgegeben":{"type":"integer","title":"Nicht Abgegeben","default":0}},"type":"object","title":"VoteBreakdown"},"VoteCheckItem":{"properties":{"vote_id":{"type":"integer","title":"Vote Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description","default":""},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"party_positions":{"items":{"$ref":"#/components/schemas/VoteCheckPosition"},"type":"array","title":"Party Positions","default":[]}},"type":"object","required":["vote_id","date","title"],"title":"VoteCheckItem","description":"One question of the Abstimmungs-Check (\"Wie hätte ich abgestimmt?\")."},"VoteCheckPosition":{"properties":{"party":{"type":"string","title":"Party"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["party","decision"],"title":"VoteCheckPosition","description":"How one party's majority voted on a check question."},"VoteCheckResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VoteCheckItem"},"type":"array","title":"Data","default":[]}},"type":"object","title":"VoteCheckResponse"},"VoteDecisionBreakdown":{"properties":{"ja":{"type":"integer","title":"Ja","default":0},"nein":{"type":"integer","title":"Nein","default":0},"enthaltung":{"type":"integer","title":"Enthaltung","default":0},"nicht_abgegeben":{"type":"integer","title":"Nicht Abgegeben","default":0}},"type":"object","title":"VoteDecisionBreakdown"},"VoteDetail":{"properties":{"id":{"type":"integer","title":"Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"total":{"$ref":"#/components/schemas/VoteBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"},"party_breakdown":{"additionalProperties":{"$ref":"#/components/schemas/VoteBreakdown"},"type":"object","title":"Party Breakdown","default":{}},"individual_votes":{"items":{"$ref":"#/components/schemas/IndividualVote"},"type":"array","title":"Individual Votes","default":[]},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["id","date","title"],"title":"VoteDetail"},"VoteInDebate":{"properties":{"id":{"type":"integer","title":"Id"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"party_breakdown":{"additionalProperties":{"$ref":"#/components/schemas/VoteBreakdown"},"type":"object","title":"Party Breakdown","default":{}},"total":{"$ref":"#/components/schemas/VoteBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}}},"type":"object","required":["id"],"title":"VoteInDebate"},"VoteListItem":{"properties":{"id":{"type":"integer","title":"Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"total":{"$ref":"#/components/schemas/VoteBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"}},"type":"object","required":["id","date","title"],"title":"VoteListItem"},"VoteMatchRequest":{"properties":{"embedding":{"items":{"type":"number"},"type":"array","maxItems":1024,"minItems":1024,"title":"Embedding"},"max_distance":{"type":"number","title":"Max Distance","default":0.35},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","required":["embedding"],"title":"VoteMatchRequest","description":"A vote-title embedding for which the server finds the nearest debate.\n\nThe embedder supplies the vector; the server does the date-filtered\nnearest-neighbour over stored debate embeddings (pgvector)."},"VoteMatchResult":{"properties":{"matched":{"type":"boolean","title":"Matched"},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"},"distance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance"},"debate_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debate Title"}},"type":"object","required":["matched"],"title":"VoteMatchResult"},"VoteTimelineEntry":{"properties":{"month":{"type":"string","title":"Month"},"total":{"type":"integer","title":"Total"},"passed":{"type":"integer","title":"Passed"},"rejected":{"type":"integer","title":"Rejected"},"other":{"type":"integer","title":"Other"}},"type":"object","required":["month","total","passed","rejected","other"],"title":"VoteTimelineEntry"},"VoteTimelineItem":{"properties":{"vote_id":{"type":"integer","title":"Vote Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"decision":{"type":"string","title":"Decision"},"party_majority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Party Majority"},"is_dissent":{"type":"boolean","title":"Is Dissent","default":false}},"type":"object","required":["vote_id","date","title","decision"],"title":"VoteTimelineItem","description":"One entry in an MP's chronological roll-call vote timeline."},"VoteTimelineResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VoteTimelineEntry"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"VoteTimelineResponse"},"WahlkreisMps":{"properties":{"wahlkreis_nr":{"type":"integer","title":"Wahlkreis Nr"},"wahlkreis_name":{"type":"string","title":"Wahlkreis Name"},"is_primary":{"type":"boolean","title":"Is Primary","default":true},"overlap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overlap"},"mps":{"items":{"$ref":"#/components/schemas/MpListItem"},"type":"array","title":"Mps","default":[]}},"type":"object","required":["wahlkreis_nr","wahlkreis_name"],"title":"WahlkreisMps","description":"One constituency matched for a PLZ, with the MPs representing it."},"WeekRef":{"properties":{"year":{"type":"integer","title":"Year"},"week":{"type":"integer","title":"Week"}},"type":"object","required":["year","week"],"title":"WeekRef"},"WeeklyRecapData":{"properties":{"year":{"type":"integer","title":"Year"},"week":{"type":"integer","title":"Week"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"stats":{"$ref":"#/components/schemas/WeeklyRecapStats"},"debates":{"items":{"$ref":"#/components/schemas/DebateListItem"},"type":"array","title":"Debates","default":[]},"votes":{"items":{"$ref":"#/components/schemas/WeeklyRecapVote"},"type":"array","title":"Votes","default":[]},"prev_week":{"anyOf":[{"$ref":"#/components/schemas/WeekRef"},{"type":"null"}]},"next_week":{"anyOf":[{"$ref":"#/components/schemas/WeekRef"},{"type":"null"}]}},"type":"object","required":["year","week","start_date","end_date","stats"],"title":"WeeklyRecapData"},"WeeklyRecapResponse":{"properties":{"data":{"$ref":"#/components/schemas/WeeklyRecapData"}},"type":"object","required":["data"],"title":"WeeklyRecapResponse"},"WeeklyRecapStats":{"properties":{"debate_count":{"type":"integer","title":"Debate Count","default":0},"vote_count":{"type":"integer","title":"Vote Count","default":0},"session_count":{"type":"integer","title":"Session Count","default":0}},"type":"object","title":"WeeklyRecapStats"},"WeeklyRecapVote":{"properties":{"id":{"type":"integer","title":"Id"},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"debate_topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Debate Topic Id"},"total":{"$ref":"#/components/schemas/VoteBreakdown","default":{"ja":0,"nein":0,"enthaltung":0,"nicht_abgegeben":0}}},"type":"object","required":["id","date","title"],"title":"WeeklyRecapVote"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"debates","description":"Debatten des Bundestages: Liste, Detail, Trending und Wochenrückblick."},{"name":"votes","description":"Namentliche Abstimmungen und deren Ergebnisse."},{"name":"mps","description":"Abgeordnete (MdB): Profile, Reden, Abstimmungsverhalten und Kontakt."},{"name":"parties","description":"Fraktionen und Parteien."},{"name":"topics","description":"Themen-Kategorien zur thematischen Navigation."},{"name":"procedures","description":"Gesetzgebungsverfahren und deren Stand ('Wo steht das Gesetz?')."},{"name":"search","description":"Volltextsuche über Debatten und Reden (deutsches Stemming)."},{"name":"stats","description":"Aggregierte Kennzahlen über den Datenbestand."},{"name":"feeds","description":"RSS-/Atom-Feeds für Debatten und Abstimmungen."},{"name":"health","description":"Liveness- und Readiness-Checks (für Betrieb/Monitoring)."},{"name":"auth","description":"Konto-Authentifizierung (nicht öffentlich)."},{"name":"user","description":"Konto- und Profileinstellungen (nicht öffentlich)."},{"name":"notifications","description":"Benachrichtigungen (nicht öffentlich)."},{"name":"admin","description":"Redaktions-/Verwaltungs-Endpunkte (nicht öffentlich)."},{"name":"ingest","description":"Ingestion-API für den externen Summarizer (API-Key, nicht öffentlich)."}]}