Changelog
Every change to the InfraNode API that is relevant to using it: new data types, newly covered cities, behaviour changes, fixes and announced deprecations. Newest first.
Stay up to date
- RSS feed of this page (works in any feed reader)
- GitHub releases (Watch for release notifications)
- Status page for availability and ongoing incidents
Planned and upcoming changes are on the roadmap. Changes affecting existing responses are announced there in advance.
-
Departure board: stop_id is now trip_stop_id
In the station departure and arrival boards this field used to be called stop_id, although it identifies a single stop of one specific train run, not a station. The name collided with the stop id of the live departures under /live/{slug}/transit/departures, which expects a DELFI id in the form de:AGS:id. Passing the value from one endpoint to the other reliably produced a 400. The field is therefore now called trip_stop_id; stop_id keeps carrying the same value and is deprecated. The live endpoint's error message now names the mix-up explicitly and points to where valid stop ids come from.
Reference: getCityStationDepartures
-
Consistent field names across all data types
The same concepts now use the same name everywhere, in snake_case and English: post_code, street, house_number, place, name, start, end, distance_km, power_kw, lat and lon. This affects charging stations (previously plz and ort), energy installations (plz, leistung_kw, einheit_typ), railway stations (zip), hospitals (zip, city), Cologne events (strasse, hausnummer, plz) and inner-city roadworks (bezeichnung, beginn, ende, art). Traffic messages from the Autobahn API additionally carry is_blocked as a real boolean, start_timestamp, delay_minutes, average_speed_kmh, abnormal_traffic_type, name, description_text plus bbox with lat and lon derived from the former comma string extent. Cologne roadworks gain event_type_label, the plain-text meaning of the former numeric code, taken straight from the service's own code list. The station catalog now calls the DB station category station_category, because category carries a text label in other data types, not a number. All changes are additive; the previous fields remain with identical values for now.
-
Deprecated: legacy field names and camelCase raw fields
The former names plz, zip, strasse, hausnummer, ort, city, bezeichnung, beginn, ende, art, dist_km, leistung_kw, einheit_typ and the stop_id of the station boards (now trip_stop_id), the category in the station catalog (now station_category), as well as the camelCase raw fields of the Autobahn traffic messages (isBlocked, startTimestamp, delayTimeValue, averageSpeed, abnormalTrafficType, extent), are deprecated. They keep carrying the same value as their canonical counterparts and will be removed no earlier than 30 days after this entry. If you rely on them, switch to the new names before then.
-
Departure times now carry a time zone
planned_time in the departure and arrival boards used to come without a time zone (2026-07-25T10:01:00), which made it ambiguous. The value is station local time and now carries the matching offset (2026-07-25T10:01:00+02:00). Also fixed: empty address fields in the Cologne events came back as an empty string instead of null, and postal codes with a leading zero could lose that zero.
Reference: getStationDepartures
-
Fuel prices: address per station
Individual stations in the fuel price payload now also carry street, house_number, post_code and place, the address reported to the German fuel price transparency unit (MTS-K). This makes a station identifiable without a map. post_code is always a five-character string, so leading zeros are preserved (01067). When the source reports no separate house number, it is often part of the street name ("Rödingsmarkt 14") and is split off, so street and house_number arrive separately. Stations without any house number keep house_number null. Purely additive, existing fields are unchanged.
Reference: getCityFuelPrices
-
Fuel prices: coordinates per station (map display)
Individual stations in the fuel price payload now also carry lat and lon, the coordinate of the station itself. This makes the stations directly mappable without an extra lookup. Purely additive, existing fields are unchanged; when the source has no coordinate, lat and lon are null.
Reference: getCityFuelPrices
-
Cologne: parking data now directly from the City of Cologne (Mobilithek)
Cologne was previously served via the ParkenDD aggregator, whose Cologne feed has been frozen since 2021 and no longer delivered any data. Parking data now comes directly from the City of Cologne via Mobilithek (DATEX II, occupancy joined with facility master data, DL-DE/Zero 2.0, Tier A): 41 parking facilities with live occupancy, capacity, name and coordinates.
Reference: getCityParking
-
Parking in 14 more cities (DB BahnPark, nationwide)
The /parking endpoint now covers 14 additional cities: Berlin, Bochum, Bonn, Bremen, Düsseldorf, Duisburg, Erfurt, Essen, Hannover, Mainz, Saarbrücken, Schwerin, Stuttgart and Wiesbaden. The source is DB BahnPark's station-adjacent parking facilities (DB API Marketplace, DL-DE/BY 2.0, Tier A). This is a static catalogue (location, name, total capacity, lot_type="station"): the source provides no numeric live occupancy (free), so that field stays null. Cities with their own live parking source (e.g. Cologne, Frankfurt, Hamburg) are unchanged.
Reference: getCityParking
-
OSM POIs now from a weekly precompute (more stable)
The POI and OSM infrastructure data types (pois, playgrounds, drinking-water, public-toilets, markets, parcel-lockers, post-offices, post-boxes, public-wifi, recycling-centres, government-offices, education) are now served from a periodic precompute of the OSM Germany extract (weekly) instead of being queried live. Envelope, fields and license (ODbL, Tier B) are unchanged; total_available still reports the real total. Benefit: no more dependency on a public live instance, hence noticeably more stable. If a city's data has not been computed yet, the route responds with 200 source_status="no_data" instead of an error.
Reference: getCityPois
-
Inner-city roadworks for Rostock
The roadworks / traffic events data type now also covers Rostock (OpenData.HRO, CC0). Each roadwork comes with measure, utility, street, section, period and traffic impact.
Reference: getCityRoadEvents
-
Council papers now also for Magdeburg and Osnabrück
The council-papers data type now covers Magdeburg (DL-DE/Zero-2.0) and Osnabrück (CC-BY-4.0) in addition to Cologne, Leipzig, Münster, Dresden and Düsseldorf, both via the standardized OParl interface. Available at /api/v1/cities/{city}/council-papers and via MCP through get_city_resource.
Reference: get_city_resource
-
Bike sharing for Kiel (SprottenFlotte)
Kiel now has bike and scooter sharing: the SprottenFlotte runs on Donkey Republic (GBFS 3.0) and reports stations and availability just like the other sharing cities. The data is licensed CC0. This also brings first-time support for GBFS version 3.0 (localized name fields, num_vehicles_available).
Reference: getCitySharing
-
Tree cadastre for Hamburg and Kiel
The tree cadastre now covers Hamburg and Kiel in addition to Berlin. Hamburg provides its street tree register (Landesbetrieb Geoinformation und Vermessung, DL-DE/BY-2.0), Kiel the trees on public ground (CC-BY-4.0). Each tree comes with location, species and crown diameter.
Reference: getCityTreeCadastre
-
Flood warnings for Hanover, Kiel and Magdeburg
Flood warnings now also cover Hanover (Herrenhausen gauge, Leine), Kiel (Kiel-Holtenau, Baltic Sea, relevant for storm surges) and Magdeburg (Niegripp, Elbe). Each gauge reports warning level, water level and timestamp. Source is the joint German flood portals (LHP).
Reference: getCityFlood
-
Official weather warnings available again (new upstream)
DWD shut down its old WarnApp interface, so the endpoint for official weather warnings briefly returned 503. Warnings are now fetched via the Bright Sky alerts API and thus remain the same official DWD data. Warning levels 1 to 4 are derived from the CAP severity; heat and UV warnings are still listed separately in special_warnings and do not count towards max_level. Note: start and end of individual warnings are now ISO 8601 timestamps instead of epoch milliseconds.
Reference: getCityWeatherWarnings
-
Live transit departures: delay-only updates and platform IDs now work
The per-stop live departures endpoint returned no_data almost everywhere: the nationwide GTFS-RT feed mostly carries delays without absolute departure times, and exactly those entries were dropped. They are now served honestly (delay_s/delay_min set, departure_time and minutes_until = null) after the timed departures available e.g. in Berlin via the VBB feed. stop_id may now also be parent or platform level (de:AGS:nr or de:AGS:nr:area:platform); both resolve.
Reference: getLiveTransitDepartures
-
Council papers: complete data set for 5 cities (112,000+ documents)
The new council-papers data type serves municipal council documents (motions, resolutions, drafts) via the standardized OParl interface for Cologne, Leipzig, Münster, Dresden and Düsseldorf. The historical backfill is now complete: more than 112,000 documents since 2020, including 48,000+ from Leipzig alone. New documents are added continuously. Available at /api/v1/cities/{city}/council-papers and via MCP through get_city_resource.
Reference: get_city_resource
-
Docs: new navigation with task-based groups and a mobile drawer
The docs menu is regrouped into Get started, Basics, API reference, AI & integrations and Project. The API reference now shows readable names instead of operationIds (the operationId appears on hover), and live endpoints sit inside their topic category with a LIVE badge instead of a separate section. The badge marks real-time data regardless of path, including fuel prices, parking occupancy, train departures and charging status. On mobile, a menu button in the top bar opens a drawer with only the active group expanded. All pages and URLs are unchanged.
-
Parking: staleness guard for frozen upstreams
The ParkenDD cities now have a freshness guard: if an upstream has not delivered new occupancy timestamps for more than 48 hours, the endpoint returns no_data instead of stale values. This prevents months-old parking counts from looking current. A missing or unreadable timestamp defensively does not count as frozen.
Reference: get_city_parking
-
Bike counters: Düsseldorf added (8 cities)
bike-counts now also serves the bicycle counting stations of Düsseldorf, bringing the data type to eight cities. Licence DL-DE/BY 2.0.
Reference: get_city_bike_counts
-
City comparison: six more data types
Comparing multiple cities in one call now additionally covers indicators, demographics, unemployment, tourism, charging status and weather warnings, on top of weather and air quality.
Reference: compare_cities
-
Roadworks and closures: Dresden and Leipzig
road-events now serves roadworks and closures for Dresden and Leipzig from Saxony's SPERRINFOSYS. Licence DL-DE/BY 2.0.
Reference: get_city_road_events
-
InfraNode as a ChatGPT GPT and GPT action
InfraNode is now available as a Custom GPT in the GPT Store and can be wired in as a GPT action via a curated actions OpenAPI, key-free and via URL import. See /en/chatgpt/.
-
Live charging occupancy for all 84 cities
New data type charging-status: the real-time occupancy of public charging points per city (available, occupied, charging, out of service), derived from the eRound feed (CC0). Complements the static charging point locations.
Reference: get_city_charging_status
-
MCP server consolidated to 12 lean tools
The hosted MCP server now bundles the 67 data types into 12 tools; the long-tail data types run through get_city_resource(slug, resource). Existing calls stay covered and the tool list is much shorter.
Older changes from before this changelog started are traceable in the commit history.