# InfraNode API | Vollständige Endpunkt-Referenz > Volltext aller Endpunkte der InfraNode API in einem Dokument. Normalisierte Open-Data-Proxy-API für deutsche Großstädte (84 Städte, 28 Kern-Städte voll abgedeckt; Stammdaten, Luftqualität, Wetter und Wetterwarnungen, ÖPNV inkl. Echtzeit, Verkehr, Energie und Strommarkt, Pkw-Bestand und Elektro-Anteil, Arbeitslosenquote, Tourismus, Baugenehmigungen, Verkehrsunfälle, POIs). Kanonischer Envelope mit data und meta auf Top-Level (source_status, correlation_id und cache_status in meta); jeder data-Record trägt zusätzlich ein attribution-Feld mit Lizenz und Herkunft. # Live ## GET /api/v1/live/{slug}/air **Live-Alias für Luftqualität (Umweltbundesamt)** Spiegelt den bestehenden UBA-Luft-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/air, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert (Deprecation-Header und deprecated=true). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/air" ``` ## GET /api/v1/live/{slug}/air-uba **Live-Alias für Luftqualität UBA** Spiegelt den bestehenden UBA-Luft-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/air-uba, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/air-uba" ``` ## GET /api/v1/live/{city}/baustellen **[DEPRECATED] Live-Baustellen je Stadt (Nachfolger: /live/{city}/roadworks)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/{city}/roadworks. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Parameter - `city` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/bremen/baustellen" ``` ## GET /api/v1/live/berlin/traffic-reports **Live-Verkehrsmeldungen Berlin (Mobilithek DATEX-II)** Liefert die Berlin-Verkehrsmeldungen (SenMVKU, DATEX-II SituationPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/traffic-reports" ``` ## GET /api/v1/live/berlin/verkehrsmeldungen **[DEPRECATED] Live-Verkehrsmeldungen Berlin (Nachfolger: /live/berlin/traffic-reports)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/berlin/traffic-reports. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/ Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/verkehrsmeldungen" ``` ## GET /api/v1/live/dortmund/parking **[DEPRECATED] Live-Parkbelegung Dortmund (Nachfolger: /cities/dortmund/parking)** DEPRECATED (DATA-40): abgelöst vom vereinheitlichten Endpunkt GET /api/v1/cities/dortmund/parking (EIN Parking-Endpunkt für alle Städte mit Quellen-Fallback). Dieser Pfad bleibt rückwärtskompatibel und trägt Deprecation-/Link-Header auf den Nachfolger. Liefert die Dortmund-Parkbelegung (dynamisches Parkleitsystem, Parkhäuser und Park&Ride) im Live-Envelope. Quelle ist der direkte, keylose offene Datensatz der Stadt Dortmund (open-data.dortmund.de), nicht die Mobilithek. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Quelle deaktiviert -> 200 source_status="disabled" (nie 5xx); keine Daten -> 200 source_status="no_data". Lizenz Datenlizenz Deutschland Zero 2.0. Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/dortmund/parking" ``` ## GET /api/v1/live/{city}/ereignisse **[DEPRECATED] Live-Verkehrsereignisse je Stadt (Nachfolger: /live/{city}/incidents)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/{city}/incidents. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Parameter - `city` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/koeln/ereignisse" ``` ## GET /api/v1/live/eround/charging **Live-Ladesäulen-Belegung eRound (Mobilithek DATEX-II V3)** Liefert das jüngste eRound-Belegungs-Delta (AFIR-Recharging, DATEX-II V3 EnergyInfrastructureStatusPublication, JSON-Syntax) im Live-Envelope. Der Feed wird ausschließlich von einem Hintergrund-Poller gepullt (alle 5 Minuten); dieser Endpunkt liest nur dessen Redis-Snapshot, es findet kein Upstream-Abruf im Request statt. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Poll-Takt). Lizenz Creative Commons CC Zero (Tier A). Ohne Zertifikat/Abo -> 200 source_status="disabled" (nie 5xx); kein/abgelaufener Snapshot oder leeres Delta -> 200 source_status="no_data". Reine Live-Daten, nur in Redis gehalten. Je-Stadt-Aggregation: /cities/{slug}/charging-status. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/eround/charging" ``` ## GET /api/v1/live/{slug}/flood **Live-Alias für Hochwasser-Warnstufen LHP** Spiegelt den bestehenden LHP-Hochwasser-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/flood, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/flood" ``` ## GET /api/v1/live/frankfurt-am-main/departures **Live-ÖPNV-Abfahrten Frankfurt/Rhein-Main je Station (RMV-HAPI)** Liefert die Echtzeit-Abfahrtstafel einer Rhein-Main-Station aus der RMV-HAPI (HAFAS-ReST, www.rmv.de/hapi): je Abfahrt Linie, Richtung, Minuten bis zur Abfahrt und Verspätung in Sekunden. Stadt fix frankfurt-am-main (RMV deckt den Rhein-Main-Raum ab). Der Query-Parameter station ist ein Stationsname (Default "Frankfurt (Main) Hauptbahnhof"), der intern via location.name auf die HAFAS-Station-ID aufgelöst wird. Der meta-Block trägt zusätzlich as_of und refresh_seconds (60). Tier C live-only: die RMV-HAPI ist registrierungspflichtig, die Lizenz nicht offen (source license = unknown), reine Live-Daten, nur kurzlebig im Redis-Cache gehalten. Toggle aus oder fehlender accessId -> 200 source_status="disabled"; unbekannte Station oder keine Abfahrten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `station` (query, string, optional) , RMV-Stationsname (Default "Frankfurt (Main) Hauptbahnhof"). ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/frankfurt-am-main/departures" ``` ## GET /api/v1/live/frankfurt-am-main/parking **Live-Parkbelegung Frankfurt am Main (Stadt Frankfurt, Mobilithek DATEX II V3)** Liefert die Parkbelegung der Stadt Frankfurt am Main im Live-Envelope: je Parkplatz freie Plätze, Auslastung in Prozent und gestufte Auslastung (facilities), angereichert um Name, Geo-Koordinate und Kapazität aus den statischen Stammdaten. Quelle sind zwei Mobilithek-Abos (DATEX II V3, dynamisch + statisch), die der Adapter über die parkingRecord-ID joint. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Quelle deaktiviert -> 200 source_status="disabled" (nie 5xx); keine Daten -> 200 source_status="no_data". Lizenz Datenlizenz Deutschland Namensnennung 2.0. Reine Live-Daten, nur im Redis-Cache. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/frankfurt-am-main/parking" ``` ## GET /api/v1/live/hamburg/departures **Live-ÖPNV-Abfahrten Hamburg je Station (HVV-Geofox-GTI)** Liefert die Echtzeit-Abfahrtstafel einer HVV-Station aus der HVV-Geofox-GTI-API: je Abfahrt Linie, Richtung, Soll-Offset in Minuten, Verspätung in Sekunden und Linien-Störungshinweise. Stadt fix hamburg (Geofox deckt nur den HVV-Raum ab). Der Query-Parameter station ist ein Stationsname (Default Hauptbahnhof), der intern via checkName auf die Geofox-Station-ID aufgelöst wird. Der meta-Block trägt zusätzlich as_of und refresh_seconds (60). Tier C live-only: die Geofox-Lizenz ist nicht offen (source_status der Quelle = unknown), reine Live-Daten, nur kurzlebig im Redis-Cache gehalten. Toggle aus oder fehlende Credentials -> 200 source_status="disabled"; unbekannte Station oder keine Abfahrten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `station` (query, string, optional) , HVV-Stationsname (Default "Hamburg Hauptbahnhof"). ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/departures" ``` ## GET /api/v1/live/hamburg/traffic-situation **Live-Verkehrslage Hamburg (Freie und Hansestadt Hamburg, keylos)** Liefert die Hamburger Echtzeit-Verkehrslage im Live-Envelope: eine Netz-Zusammenfassung (summary.total und by_state-Zählung je Zustandsklasse fließend/dicht/zäh/gestaut) sowie die priorisierte, gedeckelte Liste der nicht-fließenden Straßenabschnitte (measurements mit Zustand und Mittelpunkt-Koordinate). Quelle ist der direkte, keylose offene Datensatz der Freien und Hansestadt Hamburg (api.hamburg.de, OGC API Features), nicht die Mobilithek. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Quelle deaktiviert -> 200 source_status="disabled" (nie 5xx); keine Daten -> 200 source_status="no_data". Lizenz Datenlizenz Deutschland Namensnennung 2.0. Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/traffic-situation" ``` ## GET /api/v1/live/hamburg/verkehrslage **[DEPRECATED] Live-Verkehrslage Hamburg (Nachfolger: /live/hamburg/traffic-situation)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/hamburg/traffic-situation. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/ Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/verkehrslage" ``` ## GET /api/v1/live/hannover/traffic-reports **Live-Verkehrsmeldungen Hannover (Mobilithek DATEX-II)** Liefert die Hannover-Verkehrsmeldungen (Landeshauptstadt Hannover, Fachbereich Tiefbau: Baustellen, verkehrsrelevante Veranstaltungen, Verkehrsstörungen, DATEX-II SituationPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hannover/traffic-reports" ``` ## GET /api/v1/live/hannover/verkehrsmeldungen **[DEPRECATED] Live-Verkehrsmeldungen Hannover (Nachfolger: /live/hannover/traffic-reports)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/hannover/traffic-reports. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/ Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hannover/verkehrsmeldungen" ``` ## GET /api/v1/live/{city}/incidents **Live-Verkehrsereignisse je Stadt (Mobilithek DATEX-II)** Liefert die Verkehrsereignisse einer Stadt aus der Mobilithek (DATEX-II SituationPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Parameter - `city` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/koeln/incidents" ``` ## GET /api/v1/live/kiel/counting-stations **Live-Zähldaten Kiel, Kfz- und Radzählstellen (Mobilithek DATEX-II)** Liefert die Kiel-Zähldaten (Kfz-Dauerzählstellen und Radzähler, DATEX-II MeasuredDataPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/kiel/counting-stations" ``` ## GET /api/v1/live/kiel/zaehlstellen **[DEPRECATED] Live-Zähldaten Kiel (Nachfolger: /live/kiel/counting-stations)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/kiel/counting-stations. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/ Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/kiel/zaehlstellen" ``` ## GET /api/v1/live/koeln/low-emission-zone **Live-Umweltzone Köln (Mobilithek DATEX-II)** Liefert die Köln-Umweltzone (LowEmissionZone, MoCKiii, DATEX-II SituationPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/koeln/low-emission-zone" ``` ## GET /api/v1/live/koeln/umweltzone **[DEPRECATED] Live-Umweltzone Köln (Nachfolger: /live/koeln/low-emission-zone)** DEPRECATED (englische Slugs): abgelöst vom kanonischen Pfad GET /api/v1/live/koeln/low-emission-zone. Dieser Pfad bleibt rückwärtskompatibel (unveränderter Envelope) und trägt Deprecation-/ Link-Header auf den Nachfolger. Bitte auf den neuen Pfad migrieren. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/koeln/umweltzone" ``` ## GET /api/v1/live/magdeburg/parking **Live-Parkbelegung Magdeburg (Landeshauptstadt Magdeburg, Mobilithek DATEX II V2)** Liefert die Parkbelegung der Landeshauptstadt Magdeburg im Live-Envelope: je Parkplatz freie Plätze, Auslastung in Prozent, Belegungstrend und Status (facilities), angereichert um Name, Geo-Koordinate und Kapazität aus den statischen Stammdaten. Quelle sind zwei Mobilithek-Abos (DATEX II V2 ParkingFacility, dynamisch + statisch, Anbieter ifak e.V.), die der Adapter über die parkingFacility-ID joint. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Quelle deaktiviert -> 200 source_status="disabled" (nie 5xx); keine Daten -> 200 source_status="no_data". Lizenz freie Nutzung/Open Data (keine benannte Standardlizenz). Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/magdeburg/parking" ``` ## GET /api/v1/live/nuernberg/departures **Live-ÖPNV-Abfahrten Nürnberg je Halt (VGN/VAG, keylos, Tier A)** Liefert die Echtzeit-Abfahrtstafel eines VGN-Halts aus der offenen, keylosen VAG-Puls-API (start.vag.de): je Abfahrt Linie, Richtung, Soll-Offset in Minuten, Verspätung in Sekunden und Produkt. Stadt fix nuernberg (VGN-Raum). Der Query-Parameter stop_id ist die numerische VGN-Halt-ID (VGNKennung, Default 510 = Nürnberg Hbf). Der meta-Block trägt zusätzlich as_of und refresh_seconds (60). Tier A: offene Lizenz Creative Commons Attribution 4.0 (opendata.vag.de), sauber verwertbar. Reine Live-Daten, nur kurzlebig im Redis-Cache gehalten. Toggle aus -> 200 source_status="disabled"; ungültige stop_id -> 400; keine Abfahrten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `stop_id` (query, string, optional) , Numerische VGN-Halt-ID (VGNKennung), Default "510" (Nürnberg Hbf). ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/nuernberg/departures" ``` ## GET /api/v1/live/{city}/roadworks **Live-Baustellen je Stadt (Mobilithek DATEX-II)** Liefert die Baustellen einer Stadt aus der Mobilithek (DATEX-II SituationPublication) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". Reine Live-Daten, nur im Redis-Cache gehalten. ### Parameter - `city` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/bremen/roadworks" ``` ## GET /api/v1/live/{slug}/traffic **Live-Alias für Verkehr und Baustellen Autobahn** Spiegelt den bestehenden Autobahn-Verkehrs-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/traffic, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/traffic" ``` ## GET /api/v1/live/{city}/traffic-flow **Live-Verkehrslage je Stadt (Mobilithek DATEX-II)** Liefert die minutenfrische Verkehrslage einer Stadt aus der Mobilithek (DATEX-II) im Live-Envelope. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Solange Zertifikat und Abo noch nicht gesetzt sind -> 200 source_status="disabled" (nie 5xx); kein Datenpaket -> 200 source_status="no_data". ### Parameter - `city` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/traffic-flow" ``` ## GET /api/v1/live/{city}/transit/departures **Live-ÖPNV-Abfahrten je Halt mit Verspätung (GTFS-RT, Tier B)** Liefert die Live-Abfahrten eines Halts mit aktueller Verspätung aus dem GTFS-RT-Feed (gtfs.de bzw. Mobilithek-DELFI, CC-BY-SA = Tier B) im Live-Envelope (meta mit as_of und refresh_seconds=45, dem Poller-Takt). Der Request-Pfad liest NUR aus Redis: ein Hintergrund-Poller parst den Feed einmal je Takt, sodass nicht bei jedem Request ein 68-MB-Feed geparst wird. RT-only-Semantik: ausgeliefert werden ausschliesslich Trips mit Echtzeit-Update; Fahrplan-Sollzeiten sind NICHT enthalten. Traegt ein Update eine absolute Abfahrtszeit (z.B. Berlin/VBB), wird sie auf Zukunft geprueft (90-s-Grace) und aufsteigend sortiert; Delay-only- Updates ohne absolute Zeit (Regelfall im bundesweiten Feed) kommen MIT delay_s/delay_min und departure_time/minutes_until = null nach den zeitbehafteten Eintraegen. stop_id darf Parent- ODER Steig-Ebene sein (de:AGS:nr bzw. de:AGS:nr:bereich:steig), beide werden aufgeloest. meta weist zusaetzlich raw_updates_total und filtered_out aus (ehrliche Rohzahlen, keine stille Kappung). Toggle aus -> 200 source_status="disabled"; kein Update in Redis oder alles gefiltert -> 200 source_status="no_data"; ungültige stop_id -> 400. Reine Live-Daten, nur im Redis-Cache gehalten (Tier B). ### Parameter - `city` (path, string, Pflicht) - `stop_id` (query, string, Pflicht) , DELFI-Halt-ID im Muster de:: (gegen eine Allowlist geprüft). Gültige IDs je Stadt liefert GET /api/v1/cities/{slug}/transit im Feld stop_id. NICHT die trip_stop_id der Bahnhofstafeln, die bezeichnet einen Halt einer Zugfahrt. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/transit/departures?stop_id=de%3A11000%3A900003101%3A%3A6" ``` ## GET /api/v1/live/{city}/transit/routes/{route_id}/status **Live-ÖPNV-Verspätungslage einer Linie (GTFS-RT, Tier B)** Aggregiert die aktiven Fahrten einer Linie aus dem GTFS-RT-Feed (Tier B): active_trips (Anzahl), avg_delay_s und max_delay_s, im Live-Envelope (refresh_seconds=45). Der Request-Pfad liest NUR aus Redis. Toggle aus -> disabled; keine aktiven Fahrten -> no_data. Reine Live-Daten, nur im Redis-Cache gehalten (Tier B). ### Parameter - `city` (path, string, Pflicht) - `route_id` (path, string, Pflicht) , GTFS-RT-Linien-ID. Fluechtig: frische IDs liefert GET /api/v1/live/{city}/transit/departures im Feld route_id. Eine abgelaufene ID ist kein Fehler, sondern 200 source_status="no_data". ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/transit/routes/17292_700/status" ``` ## GET /api/v1/live/{city}/transit/trips/{trip_id} **Live-ÖPNV-Fahrt-Detail inkl. geschätzter Position (GTFS-RT, Tier B)** Liefert das Fahrt-Detail (Verspätung, Halt-Updates) inklusive linear interpolierter Position (als estimated=true gekennzeichnet) aus dem GTFS-RT-Feed (Tier B) im Live-Envelope (refresh_seconds=45). Der Request-Pfad liest NUR aus Redis. Lässt sich die Fahrt nicht gegen das statische GTFS auflösen, trägt der Payload unresolved=true (ehrlich statt 500). Toggle aus -> disabled; kein Update -> no_data. Reine Live-Daten, nur im Redis-Cache gehalten (Tier B). ### Parameter - `city` (path, string, Pflicht) - `trip_id` (path, string, Pflicht) , GTFS-RT-Fahrt-ID. Fluechtig: frische IDs liefert GET /api/v1/live/{city}/transit/departures im Feld trip_id. Eine abgelaufene ID ist kein Fehler, sondern 200 source_status="no_data". ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/berlin/transit/trips/300657118" ``` ## GET /api/v1/live/{slug}/departures **Live-ÖPNV-Abfahrten der VRR-Kernstädte + VVS Stuttgart je Station (Mentz-EFA, Tier C)** Liefert die Echtzeit-Abfahrtstafel einer Station in einer der sechs VRR-Kernstädte (duesseldorf, dortmund, essen, duisburg, bochum, wuppertal, keylose Mentz-EFA efa.vrr.de) oder in Stuttgart (VVS, keylose Mentz-EFA www3.vvs.de): je Abfahrt Linie, Richtung, Minuten bis zur Abfahrt und Verspätung in Sekunden. Der Slug wählt die Stadt (Stadt-Scoping über das AGS5-Präfix); ein Nicht-EFA-Slug liefert 404. Der Query-Parameter station ist ein Stationsname (Default Hauptbahnhof der Stadt), intern via StopFinder auf die EFA-Global-ID aufgelöst. Der meta-Block trägt zusätzlich as_of und refresh_seconds (60). Tier C live-only: die EFA-Lizenz ist nicht klar offen (source license = unknown), reine Live-Daten, nur kurzlebig im Redis-Cache gehalten. Attribution je Verbund "Verkehrsverbund Rhein-Ruhr (VRR)" bzw. "Verkehrs- und Tarifverbund Stuttgart (VVS)". Toggle aus -> 200 source_status="disabled"; unbekannte Station oder keine Abfahrten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) , EFA-Verbund-Stadt-Slug: VRR-Kernstädte (duesseldorf, dortmund, essen, duisburg, bochum, wuppertal) oder VVS Stuttgart (stuttgart). Andere Städte liefern 404. - `station` (query, string, optional) , Stationsname (Default Hauptbahnhof der Stadt). ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/departures" ``` ## GET /api/v1/live/{slug}/water-level **Live-Alias für Pegelstand PEGELONLINE** Spiegelt den bestehenden PEGELONLINE-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/water-level, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/water-level" ``` ## GET /api/v1/live/{slug}/webcams **Live-Alias für Autobahn-Webcams** Spiegelt den bestehenden Autobahn-Webcam-Endpunkt unter der Live-Kategorie. Gleicher Envelope-Kontrakt wie /api/v1/cities/{slug}/webcams, derselbe Handler. Der alte Pfad bleibt als Alias erhalten und ist als veraltet markiert. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/hamburg/webcams" ``` ## GET /api/v1/live/wuppertal/parking **Live-Parkbelegung Wuppertal (Stadt Wuppertal, Mobilithek DATEX II V2)** Liefert die Parkbelegung der Stadt Wuppertal im Live-Envelope: je Parkplatz freie Plätze, Auslastung in Prozent, Belegungstrend und Status (facilities), angereichert um Name, Geo-Koordinate und Kapazität aus den statischen Stammdaten. Quelle sind zwei Mobilithek-Abos (DATEX II V2 ParkingFacility, dynamisch + statisch), die der Adapter über die parkingFacility-ID joint. Der meta-Block trägt zusätzlich as_of (Datenstand) und refresh_seconds (Aktualisierungstakt). Quelle deaktiviert -> 200 source_status="disabled" (nie 5xx); keine Daten -> 200 source_status="no_data". Lizenz Datenlizenz Deutschland Zero 2.0. Reine Live-Daten, nur im Redis-Cache gehalten. ### Beispiel ```bash curl "https://infranode.dev/api/v1/live/wuppertal/parking" ``` # cities ## GET /api/v1/tenders **Öffentliche Auftragsvergabe deutschlandweit (oeffentlichevergabe.de, Tier A)** Öffentliche Auftragsbekanntmachungen über ALLE Städte im Store aus dem Bekanntmachungsdienst des Bundes (oeffentlichevergabe.de, OCDS): sucht deutschlandweit, ohne jede Stadt einzeln abzufragen. Je Bekanntmachung Titel, Status, Auftraggeber, Wert und Quell-Link. status wird semantisch aus dem notice_type abgeleitet: active = laufendes Vergabeverfahren, complete = entschiedenes Verfahren inkl. aufgehobener Vergaben; der rohe Zuschlag-Status steht im Feld award_status. Entschiedene Verfahren tragen zusaetzlich Auftragnehmer (suppliers) und vergebenen Auftragswert (award_value/award_currency); Betraege <= 0 aus der Quelle werden als nicht angegeben (null) gewertet. Die Angebotsfrist (deadline) fehlt im Quell-Export fast immer und steht dann nur in der Original-Bekanntmachung über source_url. Read-only aus dem deduplizierten Store (kein Live-Pull im Request-Pfad). Filter q (Titel-Stichwort), status (active/complete) und since (ab ISO-Datum), mit Pagination (limit/offset). Keine Bekanntmachungen -> 200 source_status="no_data", data=null (ehrlich). CC0 (Tier A). Deaktiviert -> 200 source_status="disabled". ### Parameter - `q` (query, string, optional) , Titel-Stichwort (Teilstring, parametrisierter LIKE-Filter). - `status` (query, string, optional) , Verfahrens-Status (active = laufendes Vergabeverfahren, complete = entschiedenes Verfahren inkl. aufgehobener Vergaben; Detail im Feld award_status). - `since` (query, string, optional) , Nur Bekanntmachungen ab diesem ISO-Datum YYYY-MM-DD; ungültiges Datum -> 422. - `limit` (query, integer, optional) , Seitengröße (Default 50, Cap 200). - `offset` (query, integer, optional) , Seiten-Offset (>= 0); Overflow -> leere Seite, no_data. ### Beispiel ```bash curl "https://infranode.dev/api/v1/tenders" ``` ## GET /api/v1/cities **Alle bekannten Städte auflisten** Listet die Einträge des Stadt-Registers: 84 deutsche Großstädte über 100.000 Einwohner, davon 28 Kern-Städte mit voller Quellen-Abdeckung. Jeder Eintrag trägt den Slug, den du als {slug}-Pfadparameter in allen weiteren Endpunkten verwendest. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities" ``` ## GET /api/v1/cities/{slug} **Eine Stadt aus dem Register holen** Liefert den Register-Eintrag zur Stadt mit dem angegebenen {slug}. Ein unbekannter Slug löst den 404-Fehler-Envelope aus, dessen Hint auf die Stadt-Liste verweist. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg" ``` ## GET /api/v1/cities/{slug}/accidents **Straßenverkehrsunfälle je Stadt (Unfallatlas, Tier A)** Liefert das jährliche Unfall-Aggregat einer Stadt aus dem offline aufbereiteten Unfallatlas-SQLite-Store im kanonischen Envelope: Gesamtzahl sowie Aufschlüsselung nach Unfallkategorie (Getötete/Schwer-/ Leichtverletzte) und beteiligter Verkehrsart (Rad/Fuß/Pkw/Krad). Regionale Auflösung Kreis/kreisfreie Stadt. Kein Upstream im Request-Pfad. Deaktiviert -> 200 source_status="disabled". Batch noch nicht gelaufen -> 200 source_status="not_ingested" (nie 5xx). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/accidents" ``` ## GET /api/v1/cities/{slug}/air **Luftqualität je Stadt (UBA, Legacy-Pfad)** Aktuelle Luftqualitäts-Messwerte einer Stadt aus der Luftdaten-API des Umweltbundesamts im kanonischen Envelope. Die fünf Schadstoff-Messwerte (PM10, PM2.5, NO2, O3, SO2) stehen in data, Quelle und source_status in meta. Werte sind live (kein Zwischenbestand). Sonderfälle: deaktivierte Quelle liefert 200 mit data=null und source_status="disabled"; toter Upstream ohne Cache liefert 503 mit Hint auf GET /api/v1/health. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/air" ``` ## GET /api/v1/cities/{slug}/air-uba **Luftqualität je Stadt (UBA, Tier A)** Luftqualitäts-Messwerte einer Stadt aus der Luftdaten-API des Umweltbundesamts im kanonischen Envelope. Amtlicher Tier-A-Pfad für behördlich validierte Werte. Liefert dieselbe UBA-Quelle wie der ältere, nicht persistierte Pfad (/air). Sonderfälle: deaktivierte Quelle liefert 200 mit source_status="disabled"; toter Upstream ohne Cache liefert 503 mit Hint auf GET /api/v1/health. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/air-uba" ``` ## GET /api/v1/cities/{slug}/base **Stadt-Stammdaten aus Wikidata** Liefert Einwohnerzahl, Fläche und Geo-Koordinaten einer Stadt aus Wikidata im kanonischen Envelope mit Attribution und Lizenz-Tag. Ist die Quelle deaktiviert, antwortet die Route mit 200, data=null und meta.source_status="disabled" (nie 5xx). Ist der Upstream tot und liegt kein zwischengespeicherter Wert vor, kommt 503 mit einem Hint auf GET /api/v1/health. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/base" ``` ## GET /api/v1/cities/{slug}/bathing-water **Badegewässerqualität im Umkreis einer Stadt (EEA, Tier A)** Liefert die Badegewässerqualität (EU-Badegewässerrichtlinie 2006/7/EG, EEA DiscoMap) im Umkreis einer Stadt im kanonischen Envelope. Je Badestelle Klasse (Excellent/Good/Sufficient/Poor), Gewässertyp, Koordinaten, Distanz und Profil-Link. ORTSNAH (Umland), NICHT stadtgenau (distance_km je Stelle); Inland-Städte ohne Badegewässer liefern count=0. CC-BY 4.0, Tier A. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/bathing-water" ``` ## GET /api/v1/cities/{slug}/bike-counts **Radzählstellen je Stadt (kommunale Open Data, Tier A)** Radzählstellen (Dauerzählstellen) je Stadt aus kommunalen Open-Data-Quellen, je Ursprung lizenzverifiziert. Liefert je Zählstelle (counts) Name, Koordinaten, Zählwert (value), Granularität (granularity, z.B. "day") und ggf. die Werte je Richtung (directions). Eco-Counter/Eco-Visio ist bewusst NICHT eingebunden (Lizenz ungeklärt). Aktuell: München (Mobilitätsreferat, DL-DE/BY 2.0, Tagessummen der 6 Dauerzählstellen). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Zählstelle -> 200 source_status="no_data". Granularität je Quelle (siehe counts[].granularity): München Tag, Leipzig/Hamburg/Berlin Stunde, Stuttgart/Köln/Essen/Düsseldorf Jahr. Lizenzen je Ursprung (München/Leipzig/Hamburg/Essen/Düsseldorf DL-DE/BY 2.0, Berlin/Köln DL-DE/Zero 2.0, Stuttgart CC BY 4.0). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/bike-counts" ``` ## GET /api/v1/cities/{slug}/bike-parking **Radabstellanlagen je Stadt (Tier A, keylos)** Radparkraum je Stadt: Bestand an Fahrradabstellanlagen mit Stellplatzsumme (facility_count, spaces_total), Merkmalen (covered_facilities, double_deck_facilities, lit_facilities, time_limited_facilities) und Bike-and-Ride-Anlagen samt Plaetzen (bike_and_ride_facilities, bike_and_ride_spaces). by_type aggregiert je Bauform (Anlehnbuegel, Rahmenhalter, Vorderradhalter, Doppelstockabstellanlage, Fahrradstaender), cargo_bike fuehrt die Lastenradanlagen getrennt, largest_facilities die zwanzig groessten Standorte mit Ort, Plaetzen, Bauform und Merkmalen (time_limit als Freitext der Quelle). GEZAEHLT WIRD NUR DER BESTAND: geplante, abgebaute und ausser Betrieb genommene Anlagen fuehrt die Quelle im selben Layer und stehen als planned_facilities/planned_spaces, removed_facilities und out_of_service_facilities daneben, gehen aber nicht in spaces_total ein. Aktuell: Muenchen (zwei WFS-Layer des Mobilitaetsreferats, DL-DE/BY 2.0). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Daten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. Kaputte Upstream-Felder fuehren nie zu 500 (Zero-Trust). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/bike-parking" ``` ## GET /api/v1/cities/{slug}/business-registrations **Gewerbean-/-abmeldungen je Kreis (Regionalstatistik, Tier A)** Gewerbean-/-abmeldungen KREIS-genau (Gewerbeanzeigenstatistik der Statistischen Ämter, Tabelle 52311, Jahressumme, ohne Automatenaufsteller): registrations, deregistrations, balance (registrations minus deregistrations; positiv = Netto-Gründungsplus) und das Berichtsjahr (year). Die gleichwertigen deutschen Felder anmeldungen, abmeldungen, saldo und jahr waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Gründungsdynamik je Stadt. Toggle aus oder keine GENESIS-Credentials -> 200 source_status="disabled"; Batch nicht gelaufen -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/business-registrations" ``` ## GET /api/v1/cities/{slug}/care **Pflegekennzahlen als Zeitreihe (Wegweiser, Tier A)** 11 Indikatoren: Pflegebeduerftige je Altersgruppe, Pflegequote, Verteilung auf ambulante und stationaere Pflege sowie Pflegegeld, dazu die Pflegevorausberechnung bis 2030. Teilabdeckung: 73 Staedte. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/care" ``` ## GET /api/v1/cities/{slug}/charging **E-Ladesäulen-Standorte je Stadt (BNetzA, Tier A)** Liefert die E-Ladesäulen-Standorte einer Stadt (nur Stammdaten, KEINE Belegung) aus dem BNetzA-Ladesäulenregister im kanonischen Envelope. Die Daten stammen aus dem CSV-Bulk-Download der BNetzA (data.bundesnetzagentur.de) und werden periodisch aktualisiert; die Route liefert den jüngsten aufbereiteten Stand, keinen Live-Abruf. Deaktiviert -> 200 source_status="disabled"; kein Snapshot -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/charging" ``` ## GET /api/v1/cities/{slug}/charging-status **Live-Ladesäulen-Belegung je Stadt (eRound, CC0/Tier A)** Liefert die aggregierte Live-Ladesäulen-Belegung einer Stadt (eRound AFIR-Recharging, DATEX-II V3, CC0) im kanonischen Envelope. Join aus zwei Zuständen, kein Upstream-Abruf im Request: der statische eRound-Standort-Vollbestand liefert die Zuordnung Ladepunkt -> Stadt + Koordinaten (täglicher Ingest, alle 84 Städte abgedeckt), der dynamische Belegungs-Feed wird als Delta-Strom akkumuliert (Status je Ladepunkt, Staleness-Fenster 24 h). Payload: total_points (bekannte Ladepunkte im Stadtumkreis), reported_points (davon mit frischem Live-Status), status_counts (available/occupied/charging/unavailable u. a.) sowie die Einzelpunkte (refill_point_id, lat/lon, status, observed_at; Liste auf 500 gekappt, truncated markiert ehrlich). Quelle deaktiviert -> 200 source_status="disabled"; noch kein akkumulierter Live-Status -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/charging-status" ``` ## GET /api/v1/cities/{slug}/childcare **Kinderbetreuung als Zeitreihe (Wegweiser, Tier A)** 20 Indikatoren: Betreuungsquoten fuer unter Dreijaehrige, 3- bis 5-Jaehrige und Schulkinder, getrennt nach Tageseinrichtung und Tagespflege sowie nach Betreuungsumfang. Teilabdeckung: 83 der 84 Staedte (Reutlingen fehlt in der Quelle). Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/childcare" ``` ## GET /api/v1/cities/{slug}/civil-protection-warnings **Amtliche BBK-NINA-Bevölkerungsschutz-Warnungen je Stadt (Tier A)** Aktive amtliche Bevölkerungsschutz-Warnungen des Bundesamts für Bevölkerungsschutz und Katastrophenhilfe (BBK, NINA-API) für die Stadt. Füllt die Zivilschutz-Lücke (Gefahrstoff, Großbrand, Bombenentschärfung) neben weather-warnings und flood. Der Regionsbezug erfolgt über den 12-stelligen Kreis-ARS (aus dem AGS abgeleitet); coverage_granularity (city|district) weist die ARS-Kreisschärfe aus. Der amtliche Warntext (headline) wird UNVERÄNDERT, verbatim durchgereicht (§ 5 Abs. 2 UrhG, keine Umformulierung/Kürzung/Übersetzung); je Warnung stehen provider (MOWAS/KATWARN/BIWAPP/POLICE/DWD/LHP), severity, sent, onset, expires, detail_url und duplicate_of (DWD -> weather-warnings, LHP -> flood). Quelle: BBK NINA, keylos. Deaktiviert -> 200 source_status="disabled"; keine aktive Warnung -> 200 source_status="ok" (count 0). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/civil-protection-warnings" ``` ## GET /api/v1/cities/{slug}/construction **Baugenehmigungen je Stadt (GENESIS, Tier A)** Liefert genehmigte Wohngebäude und Wohnungen einer Stadt aus der Regionalstatistik (Statistik der Baugenehmigungen, Jahressumme) im kanonischen Envelope. Regionale Auflösung Kreis/kreisfreie Stadt. Quelle account-gated; deaktiviert -> 200 source_status="disabled". Kein Wert -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/construction" ``` ## GET /api/v1/cities/{slug}/council-papers **Kommunale Ratsinformationen je Stadt (OParl, Tier A)** 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. ### Parameter - `slug` (path, string, Pflicht) - `q` (query, string, optional) , Titel-Stichwort (Teilstring, parametrisierter LIKE-Filter). - `paper_type` (query, string, optional) , Exakter Paper-Typ (z. B. Beschlussvorlage, Antrag). - `since` (query, string, optional) , Nur Paper ab diesem ISO-Datum YYYY-MM-DD; ungültiges Datum -> 422. - `limit` (query, integer, optional) , Seitengröße (Default 50, Cap 100). - `offset` (query, integer, optional) , Seiten-Offset (>= 0); Overflow -> leere Seite, no_data. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/council-papers" ``` ## GET /api/v1/cities/{slug}/crime-stats **Polizeiliche Kriminalstatistik je Stadt (BKA PKS, Tier A)** Liefert die polizeiliche Kriminalstatistik je Kreis aus dem offline aufbereiteten BKA-PKS-SQLite-Store im kanonischen Envelope: je Hauptstraftatengruppe (z.B. Straftaten insgesamt, Gewaltkriminalität, Wohnungseinbruchdiebstahl) die erfassten Fälle, die Häufigkeitszahl je 100.000 Einwohner und die Aufklärungsquote in Prozent, dazu Berichtsjahr (reference_year) und Version. Lizenz DL-DE/BY 2.0 (Tier A). Regionale Auflösung Kreis/kreisfreie Stadt. Kein Upstream im Request-Pfad. Sperr-/Leerwerte -> null. Deaktiviert -> 200 source_status="disabled". Batch noch nicht gelaufen -> 200 source_status="not_ingested" (nie 5xx). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/crime-stats" ``` ## GET /api/v1/cities/{slug}/demographics **Demografie-Zeitreihen je Stadt (GENESIS/Regionalstatistik, Tier A)** Liefert Demografie-Stammwerte und Zeitreihen einer Stadt aus der POST-API der GENESIS-/Regionalstatistik im kanonischen Envelope. Der Zugang ist account-gebunden: ohne hinterlegte Zugangsdaten oder bei deaktivierter Quelle antwortet der Endpunkt mit 200 source_status="disabled". Tier A. Toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/demographics" ``` ## GET /api/v1/cities/{slug}/district-heating **Fernwärme- & Wärmenetz-Versorgung je Stadt, föderiert (Tier A)** Fernwärme-/Wärmenetz-Versorgung je Stadt aus den amtlichen Geodaten der kommunalen Wärmeplanung, föderiert je Stadt-WFS (Berlin: Energienetze, Netzgebiet Fernwärme einschl. 250 m Puffer, DL-DE/Zero 2.0; Hamburg: Gebiete mit Wärmenetz der kommunalen Wärmeplanung, DL-DE/BY 2.0). Liefert die Netzbetreiber (operators, operator_count), die Zahl der Versorgungs-/ Netzflächen (network_area_count) und je nach Quelle die versorgte Fläche (supplied_area_km2, Berlin) bzw. die Hausanschlüsse und Trassenlänge (house_connections, network_length_km, Hamburg) sowie je Betreiber ein Detail-Aggregat (networks). Read-only aus dem Batch-Store (kein WFS im Request-Pfad). Teilabgedeckt, föderiert je Stadt: Toggle aus -> 200 source_status="disabled"; Stadt außerhalb -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Snapshot -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/district-heating" ``` ## GET /api/v1/cities/{slug}/drinking-water **Trinkwasserbrunnen je Stadt (OSM, Tier B)** Öffentliche Trinkwasserbrunnen (OSM amenity=drinking_water). Die OSM-Abdeckung ist je Stadt unterschiedlich vollständig. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/drinking-water" ``` ## GET /api/v1/cities/{slug}/education **Bildungseinrichtungen je Stadt (OSM, Tier B)** Bildungseinrichtungen (OSM amenity=school/college/university/kindergarten). Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/education" ``` ## GET /api/v1/cities/{slug}/education-stats **Bildungsstatistik als Zeitreihe (Wegweiser, Tier A)** 33 Indikatoren: Schulabgaenger nach Abschlussart, Uebergangsquoten, Auszubildende, Ausbildungsplaetze, Weiterbildungsbeteiligung. NICHT zu verwechseln mit education, das OSM-Schulstandorte als POIs fuehrt. Teilabdeckung: 70 Staedte, die 14 kreisangehoerigen fehlen (die Quelle fuehrt Bildungsdaten erst ab Kreisebene). Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/education-stats" ``` ## GET /api/v1/cities/{slug}/election **Wahlergebnis je Stadt (Bundeswahlleiterin, Tier A)** Liefert das Wahlergebnis je Wahlkreis/Kreis einer Stadt aus dem offline aufbereiteten Bundeswahl-Snapshot im kanonischen Envelope. Die Abdeckung wird ehrlich ausgewiesen: kanonisch als coverage_granularity mit den Werten "city"/"partial"; das gleichwertige granularity (Werte "stadt"/"teilweise") war zum 2026-08-01 abgekündigt und ist seit dem 2026-08-31 entfernt. Deaktiviert -> 200 source_status="disabled". Batch noch nicht gelaufen -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/election" ``` ## GET /api/v1/cities/{slug}/energy **Energie-Anlagen je Stadt (MaStR, Tier A)** Liefert die Energie-Anlagen (PV/Wind/Speicher/Biogas) einer Stadt aus dem offline aufbereiteten MaStR-SQLite-Store im kanonischen Envelope. Kein Upstream im Request-Pfad, der Abruf liest nur den vorbereiteten Bestand. Deaktiviert -> 200 source_status="disabled". Batch noch nicht gelaufen -> 200 source_status="not_ingested" (nie 5xx). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/energy" ``` ## GET /api/v1/cities/{slug}/events **Veranstaltungen je Stadt (destination.one)** Aktuelle und kommende Veranstaltungen einer Stadt aus der account-gebundenen Quelle destination.one/eT4.META im kanonischen Envelope. Die Lizenz wird je Datensatz aus dem Lizenzfeld abgeleitet (CC0/CC-BY, CC-BY-SA, sonst unbekannt) und in attribution gespiegelt. Der Veranstaltungsname heißt kanonisch name (wie in allen anderen Datenarten); das gleichwertige title ist zum 2026-08-31 abgekündigt und wird frühestens am 2026-09-30 entfernt (die frühere Ankündigung vom 2026-08-01 hatte den Nachfolger für diese Quelle nie ausgeliefert, darum läuft eine neue Frist). Vergangene Termine werden herausgefiltert. Sonderfälle: ist die Quelle aus oder fehlt der licensekey, kommt 200 mit source_status="disabled"; liefert die Quelle nichts Aktuelles, kommt 200 mit source_status="no_data"; toter Upstream ohne Cache liefert 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/events" ``` ## GET /api/v1/cities/{slug}/fire-danger **Waldbrand- und Graslandfeuerindex je Stadt (DWD, Tier A)** Liefert den Waldbrandgefahrenindex (Stufe 1 sehr gering bis 5 sehr hoch) und den Graslandfeuerindex der nächsten DWD-Station zu einer Stadt im kanonischen Envelope. Der Index ist STATIONS-genau, NICHT stadtgenau (station_name und distance_km im Payload weisen die Station aus). Das Bundesland der Station heißt kanonisch federal_state; das gleichwertige bundesland war zum 2026-08-01 abgekündigt und ist seit dem 2026-08-31 entfernt. Attribution mit modified=true (GeoNutzV). Tier A. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/fire-danger" ``` ## GET /api/v1/cities/{slug}/flood **Hochwasser-Warnstufen je Stadt (LHP, Tier A)** Liefert die aktuellen Hochwasser-Warnstufen der kuratierten Pegel einer Stadt aus dem Länderübergreifenden Hochwasserportal (LHP) im kanonischen Envelope. Die Attribution trägt den "Stand:"-Zeitstempel (Pflicht). Der Payload-Zeitstempel heißt kanonisch as_of; das gleichwertige stand war zum 2026-08-01 abgekündigt und ist seit dem 2026-08-31 entfernt. Tier A. Teilabdeckung (kuratierte Pegel je Stadt): nur berlin, bonn, dresden, duesseldorf, duisburg, erfurt, essen, frankfurt-am-main, hamburg, koeln, leipzig, mainz, muenchen, nuernberg liefern Daten. Andere registrierte Städte antworten ehrlich mit 200 source_status="not_covered", data=null und meta.covered_cities (Liste der abgedeckten Städte). Weitere Sonderfälle: deaktiviert -> 200 source_status="disabled"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/flood" ``` ## GET /api/v1/cities/{slug}/fuel-prices **Aktuelle Spritpreise je Stadt, aggregiert (Tankerkönig/MTS-K, Tier A)** Aktuelle Spritpreise im Umkreis der Stadtkoordinate, aggregiert zu einer Stadt-Kennzahl: Durchschnitts- und Minimal-Preis je Sorte (e5/e10/diesel, EUR/Liter) über die geöffneten Tankstellen, plus station_count/open_count und die Einzel-Tankstellen (stations: je Tankstelle station_id, name, brand, e5, e10, diesel, is_open, dist_km, lat/lon für die Kartendarstellung sowie street, house_number, post_code, place als gemeldete Adresse; post_code ist immer ein fünfstelliger String. Meldet die Quelle keine eigene Hausnummer, wird eine im Straßennamen enthaltene Nummer abgetrennt; Tankstellen ohne Hausnummer behalten house_number null. Fehlt eine Angabe upstream, ist das Feld null). Quelle: Markttransparenzstelle für Kraftstoffe (MTS-K) via Tankerkönig (CC BY 4.0). Ohne API-Key ODER Toggle aus -> 200 source_status="disabled"; keine Tankstelle im Radius -> 200 source_status="no_data". Zwischenspeicherung: das Frische-Fenster folgt dem Tagesverlauf der Preise (Kraftstoffpreisanpassungsgesetz, seit 2026-04-01: Erhöhungen nur einmal je Kalendertag um 12:00 Uhr Europe/Berlin, Senkungen jederzeit) und endet immer spätestens um 11:50 Uhr, damit kein Preis von vor dem Mittag als frisch gilt. Ein bereits abgefragter Stand bleibt bis zu 24 Stunden lieferbar und trägt dann cache_status STALE. data.retrieved_at nennt immer den Zeitpunkt des Abrufs bei der Quelle, nicht den der Antwort. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/fuel-prices" ``` ## GET /api/v1/cities/{slug}/geo **Verwaltungsgrenze je Stadt (BKG VG250, Tier A)** Liefert die Attributdaten der Verwaltungsgrenze (AGS, Gemeindename, Fläche) einer Stadt aus dem offline aufbereiteten BKG-VG250-Snapshot im kanonischen Envelope. Attribution wortgenau "(c) GeoBasis-DE / BKG". Deaktiviert -> 200 source_status="disabled". Snapshot noch nicht gebaut -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/geo" ``` ## GET /api/v1/cities/{slug}/government-offices **Behörden/Ämter je Stadt (OSM, Tier B)** Behörden/Ämter (OSM office=government + amenity=townhall), konsolidiert Bürgerämter, Verwaltungs- und sonstige Ämter. Subtyp je Element als optionales government-Tag. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/government-offices" ``` ## GET /api/v1/cities/{slug}/health **Krankenhaus-Stammdaten je Stadt (Destatis-Verzeichnis, Tier A)** Liefert die Krankenhaus-Stammdaten einer Stadt aus dem Destatis-Krankenhausverzeichnis (über GENESIS) im kanonischen Envelope. Die Attribution trägt den exakten Destatis-Wortlaut (nicht pauschal DL-DE/BY). Tier A. Deaktiviert -> 200 source_status="disabled". Toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/health" ``` ## GET /api/v1/cities/{slug}/heritage **Denkmäler/Baudenkmale je Stadt (Land-WFS, Tier A)** Bau- und Denkmalobjekte einer Stadt aus der Denkmalliste des jeweiligen Bundeslandes (WFS), je Objekt ein Repräsentativpunkt plus Typ/Link. Die Attribute heißen kanonisch type, name, building_type, build_year, site_name, site_designation und publication_source; die gleichwertigen rohen Quell-Feldnamen (z.B. typ, bezeichnung, siteName) waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Denkmalschutz ist Ländersache: Teilabdeckung, nur Städte in Ländern mit verifiziertem offenem WFS (Berlin DL-DE/Zero 2.0; Hamburg, Baden-Württemberg, Hessen DL-DE/BY 2.0, Flächenländer per Stadt-Umkreis eingegrenzt). Andere Städte antworten ehrlich mit 200 source_status="not_covered", data=null und meta.covered_cities. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/heritage" ``` ## GET /api/v1/cities/{slug}/holidays **Feiertage und Schulferien je Stadt (Seed, gemeinfrei)** Liefert Feiertage und Schulferien je Bundesland (über entry.state aufgelöst) aus den eingebetteten Seed-Daten (data/seeds/) im kanonischen Envelope. Kein Upstream, gemeinfrei. Deaktiviert -> 200 source_status="disabled". Kein Seed für das Bundesland -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/holidays" ``` ## GET /api/v1/cities/{slug}/hospitals-atlas **Krankenhausstandorte je Stadt (Bundes-Klinik-Atlas, fail-closed)** Liefert standortgenaue Krankenhausdaten (Name, Adresse, Betten, Kontakt, Koordinaten) im Umkreis einer Stadt aus dem Bundes-Klinik-Atlas (BMG/IQTIG) im kanonischen Envelope. FAIL-CLOSED: keine explizite offene Lizenz ausgewiesen -> license_id UNKNOWN/Tier C und per Default DEAKTIVIERT (-> 200 source_status="disabled"), bis BMG/IQTIG die Lizenz bestätigt. ORTSNAH gefiltert (distance_km je Standort). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/hospitals-atlas" ``` ## GET /api/v1/cities/{slug}/indicators **Sozialökonomische Indikatoren je Stadt (INKAR/BBSR, Tier A)** Kuratiertes, breites Set sozialökonomischer Indikatoren je Kreis/ kreisfreie Stadt (Arbeitsmarkt, Wirtschaft, Einkommen, Demografie, Wohnen, Erreichbarkeit, Verkehr, Bildung, Gesundheit, Fläche), aus der offenen INKAR-Wizard-API des BBSR. Je Indikator der jüngste Jahreswert mit Bezeichnung (inkl. Einheit), Wert, Jahr und Kategorie. Quelle: BBSR / INKAR (DL-DE/BY 2.0). Toggle aus -> 200 source_status="disabled"; kein Snapshot für den Kreis -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/indicators" ``` ## GET /api/v1/cities/{slug}/insolvencies **Beantragte Insolvenzen je Kreis (Regionalstatistik, Tier A)** Beantragte Insolvenzen KREIS-genau (Insolvenzstatistik der Statistischen Ämter, Tabelle 52411, Jahressumme): corporate_insolvencies (beantragte Unternehmensinsolvenzen, Tabelle 52411-02) und other_debtor_insolvencies (beantragte Insolvenzen übriger Schuldner, Tabelle 52411-03; umfasst Verbraucher, ehemalige Selbständige und sonstige natürliche Personen, NICHT nur Verbraucher) sowie das Berichtsjahr (year, neuester Jahrgang mit beiden Werten). Die gleichwertigen deutschen Felder unternehmensinsolvenzen, uebrige_schuldner_insolvenzen und jahr waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Toggle aus oder keine GENESIS-Credentials -> 200 source_status="disabled"; Batch nicht gelaufen -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/insolvencies" ``` ## GET /api/v1/cities/{slug}/integration **Integrationskennzahlen als Zeitreihe (Wegweiser, Tier A)** 26 Indikatoren zur Lage von Menschen mit auslaendischer Staatsangehoerigkeit und Migrationshintergrund: Bevoelkerungsanteile, Beschaeftigung, Arbeitslosigkeit, Kinderbetreuung, Schulabschluesse, Einbuergerungen. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/integration" ``` ## GET /api/v1/cities/{slug}/labour-market **Arbeitsmarkt und Pendler als Zeitreihe (Wegweiser, Tier A)** 40 Indikatoren: Arbeitslosenquoten (gesamt, Jugendliche, Langzeit, Auslaender), Beschaeftigungsquoten nach Alter und Geschlecht, geringfuegige Beschaeftigung, Hochqualifizierte, Ein- und Auspendler. ABGRENZUNG: unemployment (GENESIS) bleibt aktueller fuer die reine Arbeitslosenzahl, indicators (INKAR) nutzt eine andere Methodik. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/labour-market" ``` ## GET /api/v1/cities/{slug}/land-values **Amtliche Bodenrichtwerte je Stadt, aggregiert (BORIS, Tier A)** Amtliche Bodenrichtwerte (BORIS, Bodenrichtwert-Informationssystem der Gutachterausschüsse) je Stadt zu einer Bauland-Kennzahl aggregiert (Bauland = Wohnen/Misch/Gewerbe, ohne Wald/Wasser/Landwirtschaft): brw_median_eur_m2, brw_min_eur_m2, brw_max_eur_m2, zone_count, der Bewertungsstichtag (kanonisch reference_date; das gleichwertige stichtag war zum 2026-08-01 abgekündigt und ist seit dem 2026-08-31 entfernt) und der bbox_radius_deg (Umkreis um das Stadtzentrum). BORIS ist pro Bundesland föderiert (je Land ein WFS). Toggle aus -> 200 source_status="disabled"; Bundesland ohne BORIS-WFS -> 200 source_status="not_covered" (mit covered_cities); abgedeckt, aber kein Snapshot -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/land-values" ``` ## GET /api/v1/cities/{slug}/markets **Wochenmärkte/Marktplätze je Stadt (OSM, Tier B)** Marktplätze (OSM amenity=marketplace). Markttage/Zeiten kommen als optionales opening_hours je Element (häufig leer). Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/markets" ``` ## GET /api/v1/cities/{slug}/mobility-points **Mobilitaetspunkte und Carsharing-Parkflaechen je Stadt (Tier A, keylos)** Mobilitaetspunkte je Stadt: eine Informationsstele buendelt Carsharing-Stellplaetze (carsharing_spaces), Taxi-Stellplaetze, Ladepunkte (charging_points_ac/charging_points_dc), Abstellflaechen fuer geteilte Mikromobilitaet (has_scooter_area, has_bikeshare_area, has_cargo_bike_area, has_moped_area), Radservice (has_bike_service_station, has_bike_pump) und die OePNV-Anbindung (near_bus, near_tram, near_subway, near_suburban_rail). Dazu carsharing_areas mit kind=general (alle in der Stadt registrierten Carsharing-Fahrzeuge) bzw. kind=station_based (nur die dem Anbieter zugewiesenen), je mit provider, district, in_service_since und Koordinate. Aktuell: Muenchen (WFS des Mobilitaetsreferats, DL-DE/BY 2.0). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Daten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. Kaputte Upstream-Felder fuehren nie zu 500 (Zero-Trust). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/mobility-points" ``` ## GET /api/v1/cities/{slug}/municipal-finance **Kommunale Finanzkennzahlen als Zeitreihe (Wegweiser, Tier A)** 30 Indikatoren: Hebesaetze fuer Gewerbe- und Grundsteuer, Steuereinnahmekraft, kommunale Schulden, Investitionen, Personal- und Sozialausgaben je Einwohner. ABGRENZUNG: tax-rates (Regionalstatistik) bleibt die aktuellere Quelle fuer die reinen Hebesaetze; hier steht die Historie ab 2006. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/municipal-finance" ``` ## GET /api/v1/cities/{slug}/office-wait-times **Behörden-Wartezeiten je Stadt (live, keylos, Tier A)** Live-Wartezeiten der Bürgerämter/Kundenzentren + Kfz-Zulassungsstelle je Stadt aus dem offenen Feed der Stadt. Liefert je Standort (offices) name, wait_minutes (Wartezeit in Minuten, null bei fehlendem/nicht-numerischem Wert), is_open (bool), status_text (Klartext), detail_url (Detailseite) und observed_at (ISO-UTC). Reine Live-Daten (keine Speicherung). Aktuell: Köln (waiting-od.php, DL-DE/Zero 2.0, minütlich während der Öffnungszeiten). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Standort -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. Kaputte Upstream-Felder führen nie zu 500 (Zero-Trust). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/office-wait-times" ``` ## GET /api/v1/cities/{slug}/overview **Stadt-Überblick (Katalog aller Datenarten + Live-Highlights)** Ein-Aufruf-Überblick einer Stadt: Basisdaten, ein Katalog ALLER verfügbaren Datenarten (je mit Abdeckungsstatus und dem passenden MCP-Tool) sowie ein kleiner Live-Highlight-Snapshot (Wetter, Luft, Bahn-Abfahrten), parallel und zeitgedeckelt. Ideal als Einstieg, um die ganze Breite je Stadt zu sehen (nicht nur Wetter). Eine noch nicht abgedeckte Datenart wird ehrlich, aber vorwärts gewandt dargestellt (sie nennt die bereits abgedeckten Städte plus einen Roadmap-Hinweis, weil InfraNode laufend mehr Daten und Städte bekommt). Unbekannte Stadt liefert 404. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/overview" ``` ## GET /api/v1/cities/{slug}/parcel-lockers **Paketstationen je Stadt (OSM, Tier B)** Paketstationen/Locker (OSM amenity=parcel_locker) mit optionalem operator/brand (DHL/Amazon/DPD/Hermes/GLS). Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/parcel-lockers" ``` ## GET /api/v1/cities/{slug}/park-and-ride **P+R- und B+R-Anlagen je Stadt (Tier A, keylos)** Park-and-Ride- und Bike-and-Ride-Anlagen je Stadt. car_facilities traegt je Anlage name, address, lat/lon, die Stellplatzzahlen (spaces_total plus spaces_accessible, spaces_women, spaces_family, spaces_electric, spaces_motorcycle), structure_type, entrance_height_m, barrier_operation, max_duration, die Preise (price_single_eur, price_ten_trip_eur, price_month_eur, price_year_eur, price_level), transit_lines und occupancy_forecast. occupancy_forecast ist eine PROGNOSE aus historischen Erfahrungswerten (Ampelstufe green/yellow/red je Zeitscheibe, getrennt fuer weekday/saturday/sunday), KEINE Echtzeit-Belegung. bike_facilities traegt spaces, structure_type, at_park_and_ride und transit_lines. Aktuell: Muenchen (P+R Park & Ride GmbH Muenchen, DL-DE/BY 2.0). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Daten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. Kaputte Upstream-Felder fuehren nie zu 500 (Zero-Trust). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/park-and-ride" ``` ## GET /api/v1/cities/{slug}/parking **Parkhaus-Belegung/-Katalog je Stadt (EIN Endpunkt mit Quellen-Fallback)** Parkhaus-Daten je Stadt aus EINEM Endpunkt mit Quellen-Fallback (Dedup): bevorzugt ParkenDD-Live-Belegung (frei/gesamt je Parkhaus, 13 Städte mit verifiziert offener Lizenz, keylos), für München der statische Open-Data-Standortkatalog (DL-DE/BY 2.0, ohne Live-Belegung), für Frankfurt am Main, Wuppertal und Magdeburg die Mobilithek-Quellen der Städte (DATEX II, Live-Belegung + Stammdaten, DL-DE/BY bzw. DL-DE/Zero). Lizenz/Tier kommen pro Datensatz aus der am Ursprung verifizierten Quelle (alle Tier A: z.B. Köln/Dortmund DL-DE/Zero 2.0, Hamburg DL-DE/BY 2.0, Aachen/Ulm CC0, Karlsruhe/Heidelberg CC BY 4.0). Löst den deprecateten Pfad /api/v1/live/dortmund/parking ab. Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Parkhaus -> 200 source_status="no_data". Staleness-Guard: ist der ParkenDD-Datenstand (last_updated) aelter als 48 Stunden (eingefrorener Upstream, z.B. Koeln seit 2021), antwortet die Stadt ehrlich mit source_status="no_data" statt einer veralteten "Live"-Belegung; liefert der Ursprung wieder, kippt sie automatisch auf ok zurueck. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/parking" ``` ## GET /api/v1/cities/{slug}/parking-onstreet **Strassenparkraum je Stadt (Tier A, keylos)** Bewirtschafteter Strassenparkraum je Stadt aus den offenen Fachdaten der Stadt. Liefert die Gesamtsummen (segment_count = Strassenabschnitte mit eigener Parkregelung, total_spaces = Stellplaetze, zone_count, accessible_bay_count/accessible_spaces, loading_zone_count/loading_spaces) plus drei Aggregate: by_regulation (je Regelungsgruppe wie Bewohnerparken oder Mischparken), by_street (je Strasse, alphabetisch) und zones (je Parkraummanagementgebiet mit measure, status, enforcement, opened). Dazu accessible_bays (Behindertenparkplaetze) und loading_zones (Laden, Liefern, Leisten), je Eintrag mit lat/lon. Die Rohsegmente werden bewusst nicht ausgeliefert. Stammdaten, KEINE Belegung. Aktuell: Muenchen (WFS des Mobilitaetsreferats, DL-DE/BY 2.0). Teilabgedeckt: Toggle aus -> 200 source_status="disabled"; nicht-abgedeckte Stadt -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Daten -> 200 source_status="no_data"; toter Upstream ohne Cache -> 503 mit Hint. Kaputte Upstream-Felder fuehren nie zu 500 (Zero-Trust). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/parking-onstreet" ``` ## GET /api/v1/cities/{slug}/playgrounds **Spielplätze je Stadt (OSM, Tier B)** Öffentliche Spielplätze (OSM leisure=playground) im kanonischen Envelope. Tier B (copyleft, ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/playgrounds" ``` ## GET /api/v1/cities/{slug}/pois **POIs je Stadt, nach Typ gefiltert (OSM, Tier B)** Liefert POIs einer Stadt aus OpenStreetMap im kanonischen Envelope, gefiltert nach dem Query-Parameter type. Der Typ wird gegen eine feste Liste geprüft; ein unbekannter Typ löst 422 aus. Die Daten stammen aus einem periodischen Precompute (OSM-Deutschland-Extrakt, wöchentlich); die Route liest read-only aus dem Store, nicht live. total_available nennt den echten Gesamtbestand, die items-Liste ist eine gedeckelte, paginierbare Stichprobe. Tier B (copyleft, ODbL). Deaktiviert -> 200 source_status="disabled"; noch kein Bestand -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) - `type` (query, string, Pflicht) , POI-Typ aus der erlaubten Liste (z.B. hospital, school, pharmacy). ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/pois?type=hospital" ``` ## GET /api/v1/cities/{slug}/pollen-uv **Pollenflug und UV-Index je Stadt (DWD opendata, Tier A)** Liefert Pollenflug-Gefahrenindex und UV-Index für die Großregion einer Stadt aus DWD opendata im kanonischen Envelope. Die Daten sind nach DWD-Großregionen gegliedert, NICHT stadtgenau (region_name im Payload). Attribution mit modified=true (GeoNutzV). Tier A. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/pollen-uv" ``` ## GET /api/v1/cities/{slug}/population-density **Einwohnerdichte je Stadt (Zensus-2022-Gitter, Tier A)** Einwohnerdichte einer Stadt aus dem amtlichen Zensus-2022-100m-Gitter, exakt aggregiert über die Gitterzellen mit der Stadt-AGS: Summe Einwohner, Zahl bewohnter 100m-Zellen, bewohnte Fläche (km²) und Dichte (Einwohner/km² über die bewohnte Fläche, nicht die Gesamtfläche). Flächendeckend (alle Städte); ohne Gitterzellen -> 200 source_status="no_data". DL-DE/BY 2.0. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/population-density" ``` ## GET /api/v1/cities/{slug}/population-structure **Altersaufbau der Bevoelkerung als Zeitreihe (Wegweiser, Tier A)** 110 Indikatoren zum Altersaufbau je Stadt aus dem Wegweiser Kommune (CC0): Zahl und Anteil je Altersgruppe (0-2 bis ab 80), nach Geschlecht, nach Generationen, Altenquotient und Jugendquotient. Ist-Daten ab 2006, Prognosewerte bis 2040. Ungefiltert wiegt die Antwort rund 90 KB; fuer einen einzelnen Stand lohnt ?from=2023&to=2023. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/population-structure" ``` ## GET /api/v1/cities/{slug}/population-trend **Bevoelkerungsentwicklung als Zeitreihe (Wegweiser, Tier A)** 70 Indikatoren zur Veraenderung statt zum Bestand: Entwicklung der Altersgruppen (absolut und seit 2011, auch nach Geschlecht), Geburten- und Sterberate, Wanderungssaldo, Gesamtbevoelkerungsentwicklung. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/population-trend" ``` ## GET /api/v1/cities/{slug}/post-boxes **Briefkästen je Stadt, mit Leerungszeiten (OSM, Tier B)** Öffentliche Briefkästen (OSM amenity=post_box). Leerungszeiten als optionales collection_times je Element (ca. drei Viertel getaggt; fehlend = Datenpunkt-Lücke). Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/post-boxes" ``` ## GET /api/v1/cities/{slug}/post-offices **Postfilialen je Stadt (OSM, Tier B)** Postfilialen (OSM amenity=post_office) mit optionalem opening_hours/operator. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/post-offices" ``` ## GET /api/v1/cities/{slug}/power-load **Stromverbrauch (Netzlast) der Regelzone je Stadt (SMARD, Tier A)** Realisierter Stromverbrauch (Netzlast) der Regelzone, in der die Stadt liegt (50Hertz/Amprion/TenneT/TransnetBW), als Tageswert in MWh. Regionale Kennzahl, nicht stadtgenau. Quelle: Bundesnetzagentur | SMARD.de (CC BY 4.0). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/power-load" ``` ## GET /api/v1/cities/{slug}/power-price **Day-ahead-Börsenstrompreis bundesweit (SMARD, Tier A)** Day-ahead-Großhandelspreis der Gebotszone DE/LU als Tageswert in EUR/MWh (bundesweit, für alle Städte identisch). Quelle: Bundesnetzagentur | SMARD.de (CC BY 4.0). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/power-price" ``` ## GET /api/v1/cities/{slug}/public-tenders **Öffentliche Auftragsvergabe je Stadt (oeffentlichevergabe.de, Tier A)** Öffentliche Auftragsbekanntmachungen einer Stadt aus dem Bekanntmachungsdienst des Bundes (oeffentlichevergabe.de, OCDS): laufende Vergabeverfahren und entschiedene Verfahren, je Bekanntmachung Titel, Status, Auftraggeber, Wert und Quell-Link; bei entschiedenen Verfahren zusaetzlich die Auftragnehmer (suppliers, Namensliste; leer wenn die Quelle nicht offenlegt) und der tatsaechlich vergebene Auftragswert (award_value/award_currency, getrennt vom Ausschreibungswert value). status wird semantisch aus dem notice_type abgeleitet: active = laufendes Vergabeverfahren (Auftragsbekanntmachung), complete = entschiedenes Verfahren inkl. aufgehobener Vergaben; der rohe Zuschlag-Status steht im Feld award_status (active/pending/unsuccessful/null). Betraege <= 0 aus der Quelle werden als nicht angegeben (null) gewertet. Die Angebotsfrist (deadline) fehlt im Quell-Export fast immer und steht dann nur in der Original-Bekanntmachung über source_url. Read-only aus dem deduplizierten Store (kein Live-Pull im Request-Pfad). Filter status (active/complete) und match (buyer_city/place_of_performance), mit Pagination (limit/offset). Keine Bekanntmachungen -> 200 source_status="no_data", data=null (ehrlich). CC0 (Tier A). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) - `status` (query, string, optional) , Verfahrens-Status (active = laufendes Vergabeverfahren, complete = entschiedenes Verfahren inkl. aufgehobener Vergaben; Detail im Feld award_status). - `match` (query, string, optional) , Stadt-Zuordnung (buyer_city = Sitz des Amts, place_of_performance = Erfüllungsort). - `q` (query, string, optional) , Titel-Stichwort (Teilstring, parametrisierter LIKE-Filter). - `since` (query, string, optional) , Nur Bekanntmachungen ab diesem ISO-Datum YYYY-MM-DD; ungültiges Datum -> 422. - `limit` (query, integer, optional) , Seitengröße (Default 50, Cap 200). - `offset` (query, integer, optional) , Seiten-Offset (>= 0); Overflow -> leere Seite, no_data. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/public-tenders" ``` ## GET /api/v1/cities/{slug}/public-toilets **Öffentliche Toiletten je Stadt (OSM, Tier B)** Öffentliche Toiletten (OSM amenity=toilets) mit Barrierefreiheits-Tags je Element (wheelchair, changing_table) sowie fee/access/opening_hours/ unisex. Die OSM-Abdeckung ist je Stadt unterschiedlich vollständig. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/public-toilets" ``` ## GET /api/v1/cities/{slug}/public-wifi **Öffentliche WLAN-Standorte je Stadt (OSM, Tier B)** Öffentliche WLAN-Standorte (OSM internet_access=wlan) mit optionalem operator. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/public-wifi" ``` ## GET /api/v1/cities/{slug}/recycling-centres **Recycling-/Wertstoffhöfe je Stadt (OSM, Tier B)** Recycling-/Wertstoffhöfe (OSM amenity=recycling + recycling_type=centre) mit optionalem opening_hours. Tier B (ODbL). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/recycling-centres" ``` ## GET /api/v1/cities/{slug}/road-events **Innerstädtische Baustellen und Sperrungen je Stadt (Tier A)** Liefert innerstädtische Baustellen und Sperrungen einer Stadt aus den schlüssellosen Pro-Stadt-Quellen (Berlin VIZ, Hamburg, Köln, München, MobiData BW, Dortmund, SPERRINFOSYS Sachsen) im kanonischen Envelope. Die Events tragen kanonische englische Feldnamen (z.B. description, event_type, start, end, street); die gleichwertigen deutschen Felder der Stadtquellen (z.B. beschreibung, art, von, bis, strasse) waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Teilabdeckung (kuratierte Connectoren): berlin, hamburg, koeln, muenchen, stuttgart, dortmund, bremen, dresden, leipzig liefern Daten. Eine Stadt ohne Connector antwortet ehrlich mit 200 source_status="not_covered", data=null und meta.covered_cities (Liste der abgedeckten Städte), klar unterscheidbar von no_data (Connector vorhanden, aber gerade keine Ereignisse). Tier A. Deaktiviert -> 200 source_status="disabled". Toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/road-events" ``` ## GET /api/v1/cities/{slug}/sharing **Bike-/Scooter-Sharing je Stadt, aggregiert (GBFS, Tier A)** Live-Bike-/Scooter-Sharing je Stadt, aus offenen GBFS-Feeds der kuratierten Tier-A-Anbieter (Nextbike, CC0; für Frankfurt am Main DB Call a Bike über MobiData BW, DL-DE/BY-2.0) im Stadtgebiet zu einer Kennzahl aggregiert: vehicles_available (frei abgestellt + an Stationen), station_count und je Anbieter eine fail-closed verifizierte Tier-A-license_id. Toggle aus -> 200 source_status="disabled"; Stadt ohne kuratiertes GBFS-System -> 200 source_status="not_covered" (mit covered_cities); kein akzeptierter Tier-A-Anbieter -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/sharing" ``` ## GET /api/v1/cities/{slug}/social-situation **Soziale Lage als Zeitreihe (Wegweiser, Tier A)** 17 Indikatoren: SGB-II-Quoten (gesamt, Kinder, Aeltere), Altersarmut, Grundsicherung, Wohngeld, Schuldnerquote, Einkommensverteilung. Jede Kennzahl traegt ihre ZEITREIHE mit latest_year und latest_value; Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). Toggle aus -> 200 source_status="disabled"; kein Snapshot oder leeres Jahresfenster -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) - `from` (query, integer, optional) , Erstes Jahr der Reihe (inklusive, 2006-2040). Ohne Angabe kommt die volle Reihe. Keine Zahl oder ausserhalb des Bestands -> 400. - `to` (query, integer, optional) , Letztes Jahr der Reihe (inklusive, 2006-2040). Muss groesser oder gleich from sein, sonst 400. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/social-situation" ``` ## GET /api/v1/cities/{slug}/solar **Solar-Einstrahlung + PV-Ertrag je Stadt (PVGIS, Tier A)** Solar-Potenzial je Stadt aus der keylosen PVGIS-Rechen-API (EU JRC, PVcalc). PVGIS rechnet jede EU-Koordinate, daher sind alle Städte abgedeckt. Klimatologisches Mehrjahresmittel am Stadtzentrum, normiert auf 1 kWp bei optimalem Neigungswinkel: annual_yield_kwh_kwp (Jahresertrag kWh/kWp), annual_irradiation_kwh_m2 (Globalstrahlung kWh/m²), optimal_slope_deg/optimal_azimuth_deg und 12 Monatswerte (monthly). system_loss_pct ist der konfigurierte (gewollte) Systemverlust aus Verkabelung/Wechselrichter/Verschmutzung (an PVGIS übergebener loss-Parameter, i.d.R. 14 %), NICHT die Gesamt-Performance-Differenz; diese steht separat als total_performance_delta_pct (PVGIS l_total, inkl. Temperatur-/Einstrahlungs-/Winkel-Effekten, negativ = Gesamtminderung). Kein Messzeitpunkt, daher observed_at=null; der Bezugszeitraum steht als period_start/period_end. Tier A (EU-Reuse-Policy). Toggle aus -> 200 source_status="disabled"; toter Upstream ohne Cache -> 503 mit Hint. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/solar" ``` ## GET /api/v1/cities/{slug}/solar-roofs **Dach-Solarkataster je Stadt, föderiert (Tier A)** Dach-Solarkataster je Stadt aus den amtlichen Aggregaten der Länder (NRW: Solarkataster NRW, MaStR/LANUK/Geobasis NRW, DL-DE/Zero 2.0; Bayern: Energie-Atlas Bayern, CC BY 4.0; Berlin: Umweltatlas/SenMVKU, DL-DE/Zero 2.0; Hamburg: LGV-Solarpotenzialanalyse, DL-DE/BY 2.0). Liefert das gesamte installierbare Dach-PV-Potenzial (potential_kwp, potential_yield_mwh), den bereits installierten Bestand (installed_kwp, installed_yield_mwh), den Ausschöpfungsgrad (exploitation_pct) und die Aufschlüsselung des Potenzials je Gebäudekategorie (potential_by_category). Der Umfang variiert je Quelle (z.B. Hamburg nur Potenzial, keine Kategorien). Anders als /solar (PVGIS-Einstrahlung je kWp) trägt diese Route die Mengen je Stadt. Teilabgedeckt, föderiert je Bundesland: Toggle aus -> 200 source_status="disabled"; Stadt außerhalb der abgedeckten Länder -> 200 source_status="not_covered" (mit covered_cities); abgedeckte Stadt ohne Seed-Eintrag -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/solar-roofs" ``` ## GET /api/v1/cities/{slug}/station-arrivals **Live-Ankunftstafel Haupt-Bahnhof der Stadt, alle Gattungen (DB Timetables, Tier A)** Spiegelbild zu station-departures: ankommende Züge am Haupt-Bahnhof der Stadt mit Echtzeit-Verspätung (Soll /plan + Änderungen /fchg gemerged), je Eintrag mit origin (Startbahnhof), line, category, planned_time, platform, delay_minutes, cancelled, long_distance. Volle Abdeckung über alle 84 Städte: der Haupt-Bahnhof wird automatisch aus dem amtlichen StaDa-Katalog abgeleitet. Quelle: Deutsche Bahn AG (CC BY 4.0). Ohne Zugangsdaten ODER Toggle aus -> 200 source_status="disabled"; keine Ankunft im Zeitfenster -> 200 source_status="no_data". Für einen bestimmten Bahnhof statt der Stadt-Auswahl dient /api/v1/stations/{eva}/arrivals. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/station-arrivals" ``` ## GET /api/v1/cities/{slug}/station-departures **Live-Abfahrtstafel Haupt-Bahnhof der Stadt, alle Gattungen (DB Timetables, Tier A)** Nächste Zugabfahrten am Haupt-Bahnhof der Stadt mit Echtzeit-Verspätung: Sollfahrplan (/plan) und aktuelle Abweichungen (/fchg) der DB-Timetables-API, je Bahnhof zu einer nach Abfahrt sortierten Liste zusammengeführt (line, category, destination, planned_time mit Zeitzone, platform, delay_minutes, cancelled, long_distance). trip_stop_id bezeichnet EINEN HALT EINER ZUGFAHRT und ist KEINE Haltestellen-ID; fuer /api/v1/live/{slug}/transit/departures wird die DELFI-ID aus /api/v1/cities/{slug}/transit gebraucht. Das gleichwertige stop_id ist abgekuendigt. Volle Abdeckung über alle 84 Städte: der Haupt-Bahnhof wird automatisch aus dem amtlichen StaDa-Katalog abgeleitet (für die großen Knoten eine verifizierte Auswahl). Quelle: Deutsche Bahn AG (CC BY 4.0). Ohne Zugangsdaten ODER Toggle aus -> 200 source_status="disabled"; keine Abfahrt im Zeitfenster -> 200 source_status="no_data". Ein einzelner gestörter Bahnhof wird übersprungen und die Tafel aus den erreichbaren Bahnhöfen gebaut; erst wenn alle Bahnhöfe gestört sind und kein Cache vorliegt -> 503 upstream_unavailable. Für einen bestimmten Bahnhof statt der Stadt-Auswahl dient /api/v1/stations/{eva}/departures. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/station-departures" ``` ## GET /api/v1/cities/{slug}/station-facilities **Aufzug-/Rolltreppen-Status an Bahnhöfen je Stadt (DB FaSta, Tier A)** Liefert den Echtzeit-Betriebsstatus von Aufzügen und Rolltreppen an Bahnhöfen einer Stadt (DB FaSta) im kanonischen Envelope. Je Anlage Typ (ELEVATOR/ESCALATOR), Status (ACTIVE/INACTIVE/UNKNOWN) + Begründung, Bahnhofsnummer, Koordinaten und Distanz. KEY-GATED: ohne DB-API-Schlüssel -> 200 source_status="disabled". CC-BY 4.0, Tier A. ORTSNAH (Bahnhöfe im Stadtgebiet), distance_km je Anlage. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/station-facilities" ``` ## GET /api/v1/cities/{slug}/stations **Bahnhofs-Katalog einer Stadt, alle DB-Bahnhöfe (StaDa, Tier A)** Liste ALLER DB-Bahnhöfe im Stadtgebiet (Zuordnung über den amtlichen Gemeindeschlüssel: StaDa municipalityCode == Stadt-ags), nicht nur der Fernverkehrs-Hbf. Je Bahnhof eva (EVA-Nummer, füttert GET /stations/{eva}/departures), name, station_category (1-7, das gleichwertige category ist abgekuendigt), lat, lon, post_code (fuenfstelliger String; das gleichwertige zip ist abgekuendigt). Quelle: Deutsche Bahn AG / StaDa (CC BY 4.0). Ohne Zugangsdaten ODER Toggle aus -> 200 source_status="disabled"; kein DB-Bahnhof im Stadtgebiet -> 200 source_status="no_data". Volle Abdeckung (alle Städte). ### Parameter - `slug` (path, string, Pflicht) - `q` (query, string, optional) , Optionaler Namensfilter: umlaut-toleranter Teilstring-Match auf dem Bahnhofsnamen (munchen UND muenchen matchen "München Hbf"). Kein Treffer -> 200 source_status="no_data". - `limit` (query, integer, optional) , Kappt die sortierte Liste (Default: alle Bahnhöfe). Werte über 100 werden auf 100 geklemmt; nicht-numerisch oder kleiner 1 -> 422. ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/stations" ``` ## GET /api/v1/cities/{slug}/sustainability **Nachhaltigkeits- und SDG-Indikatoren als Zeitreihe (Wegweiser, Tier A)** Kommunale Nachhaltigkeits- und SDG-Indikatoren je Gemeinde aus dem Wegweiser Kommune der Bertelsmann Stiftung (CC0): Flächeninanspruchnahme, Naherholungsflächen, erneuerbare Energie im Wohnungsneubau, Breitbandversorgung, Beschäftigung, Bildung, soziale Teilhabe und weitere. Anders als /indicators (INKAR, jüngster Wert) trägt jeder Indikator hier die ganze ZEITREIHE, in der Regel 2006 bis 2023, dazu latest_year/latest_value für den jüngsten Punkt. Jahre ohne Wert fehlen in der Reihe (nie eine erfundene Null). 53 Indikatoren liegen erst ab Kreisebene vor und fehlen deshalb bei kreisangehörigen Städten. Toggle aus -> 200 source_status="disabled"; kein Snapshot -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/sustainability" ``` ## GET /api/v1/cities/{slug}/tax-rates **Realsteuer-Hebesätze je Gemeinde (Regionalstatistik, Tier A)** Amtliche Realsteuer-Hebesätze GEMEINDE-genau (Regionalstatistik der Statistischen Ämter, Tabelle 71231): trade_tax_rate (Gewerbesteuer), property_tax_a/b/c (Grundsteuer, alle in %, ein nicht festgesetzter Satz ist null) sowie reference_date (Stand 31.12., neuester Jahrgang). Die gleichwertigen deutschen Felder gewerbesteuer_hebesatz, grundsteuer_a/b/c und stichtag waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Standort-/immobilienrelevant. Toggle aus oder keine GENESIS-Credentials -> 200 source_status="disabled"; Batch nicht gelaufen -> 200 source_status="not_ingested". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/tax-rates" ``` ## GET /api/v1/cities/{slug}/tourism **Gästeübernachtungen und Ankünfte je Stadt (GENESIS, Tier A)** Liefert Gästeübernachtungen und Gästeankünfte einer Stadt aus der Regionalstatistik (Monatserhebung im Tourismus, Jahressumme) im kanonischen Envelope. Regionale Auflösung Kreis/kreisfreie Stadt. Quelle account-gated; deaktiviert -> 200 source_status="disabled". Kein Wert -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/tourism" ``` ## GET /api/v1/cities/{slug}/traffic **Baustellen und Verkehrsmeldungen je Stadt (Autobahn-API)** Baustellen (roadworks) und Verkehrswarnungen (warnings) im Umfeld einer Stadt aus der Autobahn-API im kanonischen Envelope. Die Meldungen werden per Bounding-Box um die Stadt-Koordinaten gefiltert, data enthält die passenden Einträge. Flächendeckend: jeder der 84 Städte sind die nahen Autobahnen kuratiert zugeordnet (datengetrieben aus der Autobahn-API), eine Stadt ohne aktuelle Meldung antwortet ehrlich mit no_data. Stau/Verkehrslage: jede Verkehrswarnung trägt zusätzlich ein congestion-Feld (level stau/stockend/dicht/unspezifisch aus dem DATEX-abnormalTrafficType, delay_minutes = Reisezeitverlust, blocked), und payload.congestion_summary verdichtet die Stau-Lage je Stadt (count/stau/stockend/blocked/ max_delay_minutes; null wenn keine Stau-Meldung). Geometrie: die Antwort ist per Default schlank (die Roh-Polyline je Meldung ist weggelassen); mit include=geometry (oder ?full=1) bleibt das geometry-Feld in roadworks und warnings erhalten. Feldnamen: jedes Ereignis trägt die Werte zusätzlich in der API-Konvention (is_blocked als echtes Boolean, start_timestamp, delay_minutes, average_speed_kmh, abnormal_traffic_type, name, description_text sowie bbox/lat/lon aus extent); die sechs camelCase-Rohfelder des Autobahn-Feeds mit kanonischem Nachfolger (isBlocked, extent, startTimestamp, delayTimeValue, averageSpeed, abnormalTrafficType) waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Weitere Sonderfälle: deaktivierte Quelle liefert 200 mit source_status="disabled"; toter Upstream ohne Cache liefert 503 mit Hint auf GET /api/v1/health. ### Parameter - `slug` (path, string, Pflicht) - `include` (query, string, optional) , Feld-Opt-in: include=geometry behält die Roh-Polyline (geometry) je roadwork/warning; Default ist schlank (geometry weggelassen). - `full` (query, boolean, optional) , Äquivalentes Flag zu include=geometry (?full=1 behält die Polyline). ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/traffic" ``` ## GET /api/v1/cities/{slug}/transit **ÖPNV-Haltestellen je Stadt (DELFI und HVV GTFS)** Normalisierte ÖPNV-Haltestellen einer Stadt aus dem bundesweiten DELFI-GTFS-Feed bzw. dem HVV-Feed im kanonischen Envelope. Die Daten werden offline aufbereitet und als Snapshot je Stadt gehalten, sodass der Abruf schnell antwortet, ohne den Feed pro Request zu parsen. Sonderfälle: sind beide Quellen deaktiviert, kommt 200 mit source_status="disabled"; liegt noch kein Snapshot vor, kommt 200 mit source_status="not_ingested" und leeren data, nie ein 5xx. Mit q (Namenssuche) oder near (Umkreissuche) lassen sich gezielt einzelne Haltestellen finden, statt die Vollliste abzurufen. ### Parameter - `slug` (path, string, Pflicht) - `q` (query, string, optional) , Case-insensitiver Substring-Filter auf den Haltestellennamen (stop_name), z.B. alsterdorf. - `near` (query, string, optional) , "lat,lon"; liefert nur Haltestellen im Umkreis, aufsteigend nach Distanz sortiert. Ungültige Werte -> 400. - `radius_m` (query, integer, optional) , Suchradius für near in Metern (Default 1000). - `page` (query, integer, optional) , Seitennummer der Default-Paginierung ohne q/near (Default 50 Einträge, Cap 200); meta.pagination weist total/returned/limit/offset/truncated aus. - `limit` (query, integer, optional) , Einträge pro Seite der Default-Paginierung ohne q/near (Default 50, Cap 200). ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/transit" ``` ## GET /api/v1/cities/{slug}/tree-cadastre **Baumkataster je Stadt (kommunaler WFS, Tier A)** Das städtische Baumkataster (Straßenbäume) aus dem kommunalen WFS, je Baum Punkt plus Attribute (Art, Pflanzjahr, Höhe, Straße, Bezirk). Die Attribute heißen kanonisch species, species_botanical, genus, planting_year und crown_diameter_m; die gleichwertigen rohen Quell-Feldnamen (z.B. art_dtsch, pflanzjahr, Baumart) waren zum 2026-08-01 abgekündigt und sind seit dem 2026-08-31 entfernt. Kataster sind sehr groß: die Antwort ist eine gedeckelte Stichprobe (count = ausgelieferte Bäume, nicht der Gesamtbestand). Teilabdeckung (kommunal, nur Städte mit verifiziertem offenem WFS, aktuell Berlin, DL-DE/Zero 2.0); andere Städte antworten mit 200 source_status="not_covered" + meta.covered_cities. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/tree-cadastre" ``` ## GET /api/v1/cities/{slug}/unemployment **Arbeitslose und Arbeitslosenquote je Stadt (GENESIS, Tier A)** Liefert Arbeitslose (Anzahl) und Arbeitslosenquote (Prozent) einer Stadt aus der Regionalstatistik (Arbeitsmarktstatistik der Bundesagentur für Arbeit, Jahresdurchschnitt) im kanonischen Envelope. Regionale Auflösung Kreis/kreisfreie Stadt (region_name). Quelle account-gated; deaktiviert -> 200 source_status="disabled". Kein Wert -> 200 source_status="no_data". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/unemployment" ``` ## GET /api/v1/cities/{slug}/vehicle-registrations **Pkw-Bestand und Elektro-Anteil je Stadt (KBA, Tier A)** Liefert den Pkw-Bestand und den Elektro-Anteil einer Stadt aus dem offline aufbereiteten KBA-SQLite-Store im kanonischen Envelope. Die regionale Auflösung ist der Zulassungsbezirk (= Kreis bzw. kreisfreie Stadt) und wird über district/district_key ehrlich ausgewiesen. Kein Upstream im Request-Pfad, der Abruf liest nur den vorbereiteten Bestand. Deaktiviert -> 200 source_status="disabled". Batch noch nicht gelaufen -> 200 source_status="not_ingested" (nie 5xx). ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/vehicle-registrations" ``` ## GET /api/v1/cities/{slug}/water-level **Pegelstand je Stadt (PEGELONLINE, Tier A, Teilabdeckung)** Liefert den aktuellen Pegelstand der nächstgelegenen Station einer Stadt aus PEGELONLINE im kanonischen Envelope. Teilabdeckung: nur Städte an Bundeswasserstraßen haben eine Station, sonst kommt 200 mit source_status="no_data" (kein 5xx). Tier A. Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/water-level" ``` ## GET /api/v1/cities/{slug}/weather **Wetter je Stadt (DWD über Bright Sky)** Aktuelle Wetter-Messwerte einer Stadt vom Deutschen Wetterdienst (über Bright Sky) im kanonischen Envelope. data trägt die Messwerte, attribution den GeoNutzV-Bearbeitungshinweis (modified=true). Sonderfälle: deaktivierte Quelle liefert 200 mit source_status="disabled"; toter Upstream ohne Cache liefert 503 mit Hint auf GET /api/v1/health. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/weather" ``` ## GET /api/v1/cities/{slug}/weather-warnings **Amtliche DWD-Wetterwarnungen je Stadt (Tier A)** Aktive amtliche Wetterwarnungen des Deutschen Wetterdienstes für die Stadt, bezogen über die keylose Bright-Sky-Alerts-API (Stadt-Zuordnung per Koordinaten aus dem Städte-Register). Liefert max_level (0 = keine reguläre Warnung, 1-4 = Warnstufe aus der CAP-severity), count und die Einzelwarnungen (start/end als ISO-8601-Zeitstempel). Hitze- und UV-Gesundheitswarnungen zählen NICHT in max_level, sondern stehen separat in special_warnings. Quelle: Deutscher Wetterdienst (GeoNutzV). Deaktiviert -> 200 source_status="disabled". ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/weather-warnings" ``` ## GET /api/v1/cities/{slug}/webcams **Autobahn-Webcams je Stadt (Autobahn-API, Tier A)** Liefert Autobahn-Webcams (Koordinaten und Bild-URLs) im Umfeld einer Stadt aus dem schlüssellosen Autobahn-Webcam-Service. Die Webcams werden per Bounding-Box um die Stadt gefiltert. Tier A. Flächendeckend: jeder der 84 Städte sind die nahen Autobahnen kuratiert zugeordnet; eine Stadt ohne Webcam antwortet ehrlich mit no_data. Weitere Sonderfälle: deaktiviert -> 200 source_status="disabled"; toter Upstream ohne Cache -> 503 mit Hint. Hinweis: Die Autobahn-Webcam-Quelle liefert aktuell bundesweit keine Webcams, daher antwortet der Endpunkt derzeit durchgehend mit no_data. ### Parameter - `slug` (path, string, Pflicht) ### Beispiel ```bash curl "https://infranode.dev/api/v1/cities/hamburg/webcams" ``` # compare ## GET /api/v1/compare **Eine Ressource über mehrere Städte vergleichen** Vergleicht EINE Ressource (resource) über mehrere Städte (cities, kommasepariert) in einer einzigen Antwort. Jede Stadt trägt einen eigenen source_status (ok/disabled/no_data/error/not_found); eine fehlende oder tote Stadt-Quelle führt nicht zu einem Gesamt-5xx, sondern wird pro Stadt ehrlich ausgewiesen. resource wird gegen eine feste Liste geprüft (unbekannt -> 400). Neben weather/air sind auch indicators, demographics, unemployment, tourism, charging-status und weather-warnings vergleichbar. Das Ergebnis ist paginierbar (page/limit/offset/sort). ### Parameter - `cities` (query, string, Pflicht) , Kommaseparierte Stadt-Slugs (auf MAX_CITIES begrenzt). - `resource` (query, string, Pflicht) , Zu vergleichende Ressource; unbekannt -> 400 invalid_request. weather/air = Live-Adapter (DWD/UBA); indicators, demographics, unemployment, tourism, charging-status und weather-warnings delegieren an die jeweiligen Stadt-Endpunkte (identisches Verhalten inkl. Attribution). charging-status liefert im Compare nur die Aggregate (points_omitted statt Einzelpunkt-Liste). - `page` (query, integer, optional) - `limit` (query, integer, optional) - `offset` (query, integer, optional) - `sort` (query, string, optional) - `order` (query, string, optional) - `If-None-Match` (header, string, optional) , Conditional GET; If-None-Match == ETag -> 304 Not Modified ohne Body. ### Beispiel ```bash curl "https://infranode.dev/api/v1/compare?cities=berlin%2Ckoeln%2Chamburg&resource=weather" ``` # meta ## GET /api/v1/health **Liveness und Readiness der App prüfen** Liefert den App-Status und die Redis-Erreichbarkeit. Gedacht für Uptime-Monitore und Load-Balancer-Probes: antwortet mit 200, sobald die App bereit ist, sonst mit einem Fehlerstatus. ### Beispiel ```bash curl "https://infranode.dev/api/v1/health" ``` ## GET /api/v1/openapi.yaml **Diese OpenAPI-Spec als YAML** Liefert die handgepflegte Spec als application/yaml. FastAPI serviert intern nur /openapi.json; diese Route stellt die stabile YAML-Variante bereit. ### Beispiel ```bash curl "https://infranode.dev/api/v1/openapi.yaml" ``` ## GET /api/v1/sources **Status aller Upstream-Quellen** Listet je bekannter Quelle den enabled-Zustand (aus den Settings) und den Circuit-Breaker-Zustand (CLOSED/OPEN/HALF_OPEN). So ist auf einen Blick sichtbar, welche Quelle gerade liefert und welche pausiert ist. ### Parameter - `If-None-Match` (header, string, optional) , Conditional GET. Stimmt der Wert mit dem aktuellen ETag überein, antwortet der Server mit 304 Not Modified ohne Body. - `page` (query, integer, optional) - `limit` (query, integer, optional) , Seitengröße. Wird auf MAX_LIMIT (200) gedeckelt: zu große Werte liefern eine 200er-Seite mit 200 Einträgen statt eines Fehlers. - `offset` (query, integer, optional) , Ein zu großer Offset liefert eine leere Seite (200), nie 500. - `sort` (query, string, optional) , Nur die gelisteten Felder sind erlaubt; ein unbekanntes Feld wird mit 400 (invalid_request) abgewiesen, bevor es ausgewertet wird. - `order` (query, string, optional) ### Beispiel ```bash curl "https://infranode.dev/api/v1/sources" ``` # stations ## GET /api/v1/stations/{eva}/arrivals **Live-Ankünfte eines beliebigen Bahnhofs per EVA, alle Gattungen (DB Timetables, Tier A)** Spiegelbild zu /stations/{eva}/departures: ankommende Züge jedes DB- Bahnhofs über seine EVA-Nummer (inkl. Nahverkehr, origin = Startbahnhof, Echtzeit-Verspätung, Störungen/Meldungen). Quelle: Deutsche Bahn AG (CC BY 4.0). Ohne Zugangsdaten ODER Toggle aus -> 200 source_status="disabled"; keine Ankunft im Zeitfenster -> 200 source_status="no_data"; ungültige EVA -> 422. ### Parameter - `eva` (path, string, Pflicht) , EVA-Nummer des Bahnhofs (6-8-stellige Zahl). ### Beispiel ```bash curl "https://infranode.dev/api/v1/stations/8000105/arrivals" ``` ## GET /api/v1/stations/{eva}/departures **Live-Abfahrten eines beliebigen Bahnhofs per EVA, alle Gattungen (DB Timetables, Tier A)** Live-Abfahrtstafel JEDES DB-Bahnhofs über seine EVA-Nummer (aus GET /cities/{slug}/stations), inkl. Nahverkehr (alle Gattungen ICE/IC/RE/RB/S), Echtzeit-Verspätung und Störungen/Meldungen (messages je Eintrag). Quelle: Deutsche Bahn AG (CC BY 4.0). Ohne Zugangsdaten ODER Toggle aus -> 200 source_status="disabled"; keine Abfahrt im Zeitfenster -> 200 source_status="no_data"; ungültige EVA -> 422. ### Parameter - `eva` (path, string, Pflicht) , EVA-Nummer des Bahnhofs (6-8-stellige Zahl). ### Beispiel ```bash curl "https://infranode.dev/api/v1/stations/8000105/departures" ```