---
title: "Kommunale Ratsinformationen je Stadt (OParl, Tier A)"
method: GET
path: "/api/v1/cities/{slug}/council-papers"
tags: ["cities"]
---

# Kommunale Ratsinformationen je Stadt (OParl, Tier A)

`GET /api/v1/cities/{slug}/council-papers`

Kommunale Ratsinformationen einer Stadt aus dem OParl-1.x-Standard (OParl "Paper" = Vorlagen, Anträge, Beschlüsse): je Paper Titel, Referenz, Datum, Paper-Typ und der Link zur Hauptdatei (main_file_url, das PDF wird NICHT gespiegelt). Abgedeckt sind die acht lizenzgeklärten Städte Dresden, Köln, Düsseldorf, Münster, Leipzig, Magdeburg, Osnabrück und Freiburg im Breisgau (je eigene Lizenz in der attribution). Read-only aus dem deduplizierten Store (kein Live-Pull im Request-Pfad). Filter q (Titel-Stichwort), paper_type und since (ab ISO-Datum), mit Pagination (limit/offset); data.total nennt den Gesamtbestand zu den aktiven Filtern. Nicht abgedeckte Stadt -> 404 mit Hint. Keine Paper -> 200 source_status="no_data", data=null. Deaktiviert -> 200 source_status="disabled". Zusätzlich unter dem Alias /api/v1/cities/{slug}/council/papers erreichbar.

## Path parameters

- `slug` string, required

## Query parameters

- `q` string
- `paper_type` string
- `since` string, date
- `limit` integer
- `offset` integer

## Response `200`

Ratsinformations-Envelope (aggregierte papers-Liste + count, oder null bei no_data/disabled)

- object
  - `data` object, nullable, required
    - `papers` object[]
    - `count` integer
    - `license_id` string — Lizenz des Datensatzes je Stadt (Tier A).
    - `license_tier` string
    - `attribution` object
      - `text` string
      - `license_url` string
      - `source` string
      - `modified` boolean
  - `meta` Meta, required
    - `correlation_id` string, nullable
    - `source_status` 'ok' | 'no_data' | 'disabled' | 'not_ingested' | 'not_covered' — Ehrlicher Quellen-Status der Antwort. "ok" (Daten vorhanden), "no_data" (Quelle erreichbar/abgedeckt, aber gerade keine Daten), "disabled" (Quelle per Toggle aus), "not_ingested" (kein Snapshot), "not_covered" (Stadt ist für diesen teilabgedeckten Endpunkt strukturell nicht abgedeckt; data=null, siehe covered_cities). Klar unterscheidbar vom 404 (Stadt unbekannt).
    - `cache_status` string, nullable — Cache-Herkunft (hit/miss/stale), sofern die Route cacht.
    - `covered_cities` string[] — Nur bei source_status="not_covered": die Stadt-Slugs, die dieser teilabgedeckte Endpunkt tatsächlich bedient (z. B. flood, webcams, traffic, road-events).
    - `pagination` object — Bei paginierbaren Datenart-Listen (charging, energy, events, transit, OSM-Feature-Endpunkte): der EHRLICH ausgewiesene Ausschnitt (keine stille Kappung). KANAL-ABHÄNGIGER Default für gleiche URL: direktes REST liefert die volle Liste (limit=null, returned==total, truncated=false); GPT-Actions (erkannt am OpenAI-Header) bekommen ein serverseitig gebundenes Default-Limit; MCP-Aufrufe sind gebunden, weil der MCP-Client selbst ein Default-Limit setzt. Kanalunabhängige Overrides: limit=all (oder ?all=1) erzwingt die volle Liste, limit + offset blättern gezielt. meta.pagination ist bei ALLEN Kanälen gesetzt.
      - `total` integer — Gesamtzahl der Einträge (voller Bestand).
      - `returned` integer — Zahl der auf dieser Seite ausgelieferten Einträge.
      - `limit` integer, nullable — Angewandtes Seiten-Limit; null bei Vollausgabe (REST-Default oder limit=all).
      - `offset` integer — Start-Offset der Seite.
      - `truncated` boolean — true, wenn hinter dieser Seite noch Einträge liegen (offset + returned < total); bei Vollausgabe false.

## Other responses

- `404` — Unbekannte oder nicht abgedeckte Stadt (mit Hint)
- `422` — Ungültiger Query-Parameter (q/paper_type/since/limit/offset)

---

[API](https://skmtc.net/infranode/apis/infranode-api.md) · [All operations](https://skmtc.net/infranode/apis/infranode-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/infranode/infranode-api/versions/8fee8b095f31/schema)
