{"openapi": "3.0.3", "info": {"title": "Bonn-Recherche API", "version": "2.0.0", "description": "Öffentliche, schreibgeschützte Recherche-Infrastruktur zur Bonner Kommunalpolitik: Ratsvorlagen und Anträge, Beschlüsse und Abstimmungen, Sitzungen und Tagesordnungen, Ratsdokumente (Original-PDFs), Vorgangsverläufe sowie Presse- und Medienberichte. Alle Ergebnisse sind einheitlich modelliert (id, type, title, source_name, source_url, published_at, data_quality) und verweisen auf die Originalquelle. Keine generativen Antworten, kein API-Key, Rate-Limit 60 Anfragen/Minute. MCP-Clients verbinden sich mit https://mcp.linkebonn.de/mcp."}, "servers": [{"url": "https://mcp.linkebonn.de"}], "paths": {"/api/capabilities": {"get": {"operationId": "getCapabilities", "summary": "Verfügbare Datenbestände, Zeiträume und Grenzen", "description": "Maschinenlesbare Beschreibung: Quellen, Abdeckungszeiträume, Mengen, bekannte Einschränkungen und empfohlener Rechercheablauf. Zuerst aufrufen.", "parameters": [], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/search": {"get": {"operationId": "searchBonn", "summary": "Thematische Suche über alle Quellen", "description": "Semantische + Stichwort-Suche über Ratsdaten und Presse. Einstieg für offene Fragen.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "type", "in": "query", "required": false, "description": "Quellentyp: 'ratsdaten' oder 'presse'", "schema": {"type": "string"}}, {"name": "committee", "in": "query", "required": false, "schema": {"type": "string"}}, {"name": "sort", "in": "query", "required": false, "schema": {"type": "string", "enum": ["relevance", "date"]}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/motions": {"get": {"operationId": "searchMotions", "summary": "Volltextsuche über Stadtrats-Vorlagen", "description": "Anträge, Beschlussvorlagen, Mitteilungen — mit Auszug und Original-Link.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "motion_type", "in": "query", "required": false, "description": "z. B. Antrag, Beschlussvorlage, Große Anfrage", "schema": {"type": "string"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/motions/{motion_id}": {"get": {"operationId": "getMotion", "summary": "Vorlage im Volltext", "description": "Sachverhalt, Beschlussvorschlag, Begründung, Stellungnahme der Verwaltung und verknüpfte Dokumente.", "parameters": [{"name": "motion_id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/decisions": {"get": {"operationId": "searchDecisions", "summary": "Dokumentierte Beschlüsse und Abstimmungen", "description": "Tagesordnungspunkte mit festgehaltenem Ergebnis. Ohne q: die jüngsten Beschlüsse.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "committee", "in": "query", "required": false, "schema": {"type": "string"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/sessions": {"get": {"operationId": "listSessions", "summary": "Sitzungsliste", "description": "Rat und Gremien, neueste zuerst.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "committee", "in": "query", "required": false, "schema": {"type": "string"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/sessions/{session_id}": {"get": {"operationId": "getSession", "summary": "Sitzung mit Tagesordnung", "description": "Öffentliche Tagesordnungspunkte inkl. Ergebnis, Abstimmung und Dokumenten.", "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/documents": {"get": {"operationId": "getDocument", "summary": "Ratsdokumente (Original-PDFs)", "description": "Entweder id= (Einzeldokument), parent_type+parent_key (alle Dokumente einer Vorlage/Sitzung), q= (Titelsuche) oder typ= (vorlage, einladung, wortprotokoll, beschlussprotokoll).", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "id", "in": "query", "required": false, "schema": {"type": "integer"}}, {"name": "parent_type", "in": "query", "required": false, "schema": {"type": "string", "enum": ["paper", "meeting"]}}, {"name": "parent_key", "in": "query", "required": false, "schema": {"type": "string"}}, {"name": "typ", "in": "query", "required": false, "schema": {"type": "string"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/procedure/{motion_id}": {"get": {"operationId": "traceProcedure", "summary": "Verlauf eines politischen Vorgangs", "description": "Chronologische Stationen (Vorlage, Beratungen mit Beschluss/Abstimmung, Dokumente, Presse) mit Quellen und Datenqualität.", "parameters": [{"name": "motion_id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/related": {"get": {"operationId": "getRelatedItems", "summary": "Verknüpfte Objekte", "description": "Formale Verknüpfungen (original) und semantische Nachbarn (heuristisch, prüfen).", "parameters": [{"name": "type", "in": "query", "required": true, "schema": {"type": "string", "enum": ["motion", "session", "document"]}}, {"name": "id", "in": "query", "required": true, "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/recent": {"get": {"operationId": "getRecentChanges", "summary": "Neue/geänderte Ratsdaten", "description": "Seit einem Datum erfasste oder geänderte Objekte (Monitoring).", "parameters": [{"name": "since", "in": "query", "required": true, "schema": {"type": "string", "format": "date"}}, {"name": "types", "in": "query", "required": false, "schema": {"type": "string"}, "description": "motion,decision,session,document"}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 30}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}, "/api/presse": {"get": {"operationId": "searchPresse", "summary": "Presse- und Medienberichte", "description": "Stadt Bonn, General-Anzeiger, WDR, Radio Bonn/Rhein-Sieg — Auszüge mit Original-Link.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Suchbegriff / question in German or English", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "maximum": 50}}, {"name": "offset", "in": "query", "required": false, "description": "Pagination offset (for long analyses)", "schema": {"type": "integer", "default": 0}}, {"name": "date_from", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "schema": {"type": "string", "format": "date"}}], "responses": {"200": {"description": "ToolResult: {ok, count, results[], item, has_more, offset, notes[]} — every result carries id, type, title, source_name, source_url, data_quality.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "400": {"description": "invalid_argument", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "404": {"description": "not_found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "429": {"description": "rate_limited (60 requests/minute)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}, "502": {"description": "upstream_unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ToolResult"}}}}}}}}, "components": {"schemas": {"Claim": {"additionalProperties": true, "description": "Einzelne belegte Aussage (Beschluss, Abstimmung, Stellungnahme).", "properties": {"kind": {"description": "Art der Aussage: decision | vote | statement", "enum": ["decision", "vote", "statement"], "title": "Kind", "type": "string"}, "text": {"description": "Wortlaut der belegten Aussage", "title": "Text", "type": "string"}, "data_quality": {"default": "original", "description": "original | derived | heuristic", "enum": ["original", "derived", "heuristic"], "title": "Data Quality", "type": "string"}, "source_url": {"default": "", "description": "Originalquelle der Aussage", "title": "Source Url", "type": "string"}, "vote_type": {"default": "", "description": "Abstimmungsart, falls vorhanden", "title": "Vote Type", "type": "string"}}, "required": ["kind", "text"], "type": "object"}, "RelatedRef": {"additionalProperties": true, "description": "Verweis auf ein verknüpftes Objekt.", "properties": {"type": {"description": "motion | session | document | agenda_item | press", "title": "Type", "type": "string"}, "id": {"description": "stabile Kennung, z. B. motion:12345", "title": "Id", "type": "string"}, "title": {"default": "", "title": "Title", "type": "string"}, "source_url": {"default": "", "title": "Source Url", "type": "string"}}, "required": ["type", "id"], "type": "object"}, "Item": {"additionalProperties": true, "description": "Ein Recherchetreffer im einheitlichen Quellenmodell (Citation-First).", "properties": {"id": {"description": "stabile Kennung, z. B. motion:12345, session:4711, document:42", "title": "Id", "type": "string"}, "type": {"description": "motion | decision | agenda_item | session | document | press | council_record", "title": "Type", "type": "string"}, "title": {"description": "Titel des Dokuments/Vorgangs", "title": "Title", "type": "string"}, "summary": {"default": "", "description": "Textauszug (Länge über detail_level steuerbar)", "title": "Summary", "type": "string"}, "source_name": {"default": "", "description": "Herausgeber, z. B. 'Ratsinformationssystem der Stadt Bonn'", "title": "Source Name", "type": "string"}, "source_url": {"default": "", "description": "Link zur Originalquelle (ALLRIS, Presse)", "title": "Source Url", "type": "string"}, "published_at": {"default": "", "description": "Datum der Quelle (YYYY-MM-DD)", "title": "Published At", "type": "string"}, "fetched_at": {"default": "", "description": "Zeitpunkt der Erfassung", "title": "Fetched At", "type": "string"}, "committee": {"default": "", "description": "Gremium, falls bekannt", "title": "Committee", "type": "string"}, "status": {"default": "", "description": "Status laut Quelle", "title": "Status", "type": "string"}, "procedure_id": {"default": "", "description": "zugehöriger Vorgang, z. B. motion:12345", "title": "Procedure Id", "type": "string"}, "data_quality": {"default": "derived", "description": "original | derived | heuristic", "enum": ["original", "derived", "heuristic"], "title": "Data Quality", "type": "string"}, "claims": {"description": "einzeln belegte Aussagen", "items": {"$ref": "#/components/schemas/Claim"}, "title": "Claims", "type": "array"}, "related_items": {"description": "verknüpfte Objekte", "items": {"$ref": "#/components/schemas/RelatedRef"}, "title": "Related Items", "type": "array"}}, "required": ["id", "type", "title"], "type": "object"}, "ToolResult": {"description": "Einheitliche Rückgabe aller Werkzeuge.", "properties": {"ok": {"default": true, "title": "Ok", "type": "boolean"}, "count": {"default": 0, "title": "Count", "type": "integer"}, "results": {"items": {"$ref": "#/components/schemas/Item"}, "title": "Results", "type": "array"}, "item": {"title": "Item", "additionalProperties": true, "type": "object"}, "error": {"description": "not_found | invalid_argument | rate_limited | upstream_unavailable", "title": "Error", "type": "string"}, "message": {"title": "Message", "type": "string"}, "has_more": {"default": false, "title": "Has More", "type": "boolean"}, "offset": {"default": 0, "title": "Offset", "type": "integer"}, "notes": {"items": {"type": "string"}, "title": "Notes", "type": "array"}}, "type": "object"}}}}