Streckeninfo
Baustellen, Störungen und Streckenruhen im Netz der DB: wo eine Strecke gesperrt ist, wo Züge auf dem Gegengleis fahren, langsamer fahren oder umgeleitet werden. Von gestern bis in die kommenden Wochen.
Objekte
Objekt Einschränkung
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Kennung der Quelle, z. B. 221CD.84 (Baustelle), BZI_10290 (Störung), RUHE000000000223 (Streckenruhe) |
type | string | construction, disruption oder line_rest |
effect | string | Wichtigste Wirkung: closure, cancellation, partial_cancellation, diversion, diversion_eased, longer_running_time, opposite_track, opposite_track_temporary, timetable_change, no_route_change, holding_trains, other |
effect_text | string | Die Wirkung auf Deutsch, z. B. „Totalsperrung“ |
effects | object[] | Alle Wirkungen { effect, effect_text, traffic }; traffic (nur Störungen): long_distance, regional, freight |
track_restriction | ?string | Einschränkung der Gleise: none, light, heavy |
title | ?string | Was gemacht wird bzw. Ursache, z. B. „Oberleitungsarbeiten“, „Instandhaltung an der Strecke (gebündelte Arbeiten)“ oder „Störung am Fahrweg: Brückenbeschädigung“ |
text | ?string | Weitere Angaben (Störungen) |
lines | integer[] | Streckennummern |
direction | ?string | both, with_chainage oder against_chainage (Baustellen) |
regions | string[] | Regionalbereiche der DB InfraGO, z. B. ost |
from | ?object | Betriebsstelle am Anfang { ril100, eva, name, lat, lon }; ist sie ein Bahnhof, mit seiner EVA-Nummer und dem gewohnten Namen (z. B. „Berlin Hbf“) |
to | ?object | Betriebsstelle am Ende |
sections | object[] | Abschnitte einer Störung { from, to, line } |
period | object | Gesamtzeitraum { start, end } (ISO 8601) |
validity | object[] | Wann genau { from_date, to_date, weekdays, from_time, to_time }; 00:00 bis 00:00 heißt ganztägig, über Mitternacht möglich |
{
"id": "221CD.84",
"type": "construction",
"effect": "closure",
"effect_text": "Totalsperrung",
"effects": [
{
"effect": "closure",
"effect_text": "Totalsperrung",
"traffic": []
}
],
"track_restriction": "heavy",
"title": "Oberleitungsarbeiten",
"text": null,
"lines": [
4000
],
"direction": "both",
"regions": [
"suedwest"
],
"from": {
"ril100": "RBB",
"eva": "8000026",
"name": "Basel Bad Bf",
"lat": 47.567,
"lon": 7.607
},
"to": {
"ril100": "RRH",
"eva": "8000311",
"name": "Rheinfelden (Baden)",
"lat": 47.561,
"lon": 7.792
},
"sections": [],
"period": {
"start": "2026-10-16T22:00:00+02:00",
"end": "2026-10-19T05:00:00+02:00"
},
"validity": [
{
"from_date": "2026-10-16",
"to_date": "2026-10-19",
"weekdays": [
"freitag",
"samstag",
"sonntag",
"montag"
],
"from_time": "22:00",
"to_time": "05:00"
}
]
}Einschränkungen
/v1/network/restrictionsEimer standardAlle Baustellen, Störungen und Streckenruhen, die zu einem Zeitpunkt (Standard: jetzt) oder irgendwann in einem Zeitraum gelten, gefiltert nach Art, Wirkung, Verkehrsart, Strecke, Betriebsstelle oder Kartenausschnitt.
Lage der Betriebsstellen in WGS84. Woher die Daten kommen, steht unter Datenquellen.
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
type | string[] | Nur diese Arten, mit Komma getrenntconstruction Baustelle, disruption Störung, line_rest Streckenruhe (an einer Betriebsstelle ruht der Verkehr) |
effect | string[] | Nur diese Wirkungen, z. B. closure für Sperrungenclosure Totalsperrung, cancellation Ausfall, partial_cancellation Teilausfall, diversion Umleitung, diversion_eased Umleitung unter erleichterten Bedingungen, longer_running_time Fahrzeitverlängerung, opposite_track Fahrt auf dem Gegengleis (Zs 6), opposite_track_temporary Fahrt auf dem Gegengleis (Zs 8), timetable_change Abweichung vom Fahrplan, no_route_change Ohne Abweichung des Laufwegs, holding_trains Züge werden zurückgehalten, other Sonstiges |
traffic | string[] | Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr |
at | ISO 8601 | Gültig zu diesem Zeitpunkt (Standard: jetzt) |
from | ISO 8601 | Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to) |
to | ISO 8601 | bis zu diesem Zeitpunkt; höchstens 14 Tage nach from |
line | integer | Streckennummer (VzG), z. B. 61321 bis 99999 |
station | string | Betriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf |
bbox | string | Kartenausschnitt west,süd,ost,nord (höchstens 12°) |
limit | integer | Höchstens so vieleStandard: 2001 bis 2000 |
offset | integer | So viele überspringenStandard: 00 bis 100000 |
Antwort
Objekt { count, total, restrictions: Einschränkung[] }
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/restrictions" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/restrictions", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/restrictions",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Sperrungen
/v1/network/closuresEimer standardKurzform für Totalsperrungen: Strecken, über die gerade (oder zum Zeitpunkt at) kein Zug fährt. Streckenruhen nur mit line_rests=true.
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
traffic | string[] | Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr |
at | ISO 8601 | Gültig zu diesem Zeitpunkt (Standard: jetzt) |
from | ISO 8601 | Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to) |
to | ISO 8601 | bis zu diesem Zeitpunkt; höchstens 14 Tage nach from |
line | integer | Streckennummer (VzG), z. B. 61321 bis 99999 |
station | string | Betriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf |
bbox | string | Kartenausschnitt west,süd,ost,nord (höchstens 12°) |
limit | integer | Höchstens so vieleStandard: 2001 bis 2000 |
offset | integer | So viele überspringenStandard: 00 bis 100000 |
line_rests | bool | Auch Streckenruhen an BetriebsstellenStandard: false |
Antwort
Wie Einschränkungen
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/closures" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/closures", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/closures",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Einschränkungen als GeoJSON
/v1/network/restrictions.geojsonEimer standardDieselben Filter wie Einschränkungen, als GeoJSON für Karten (MapLibre, Leaflet, QGIS): Linie entlang der Gleise von der Betriebsstelle am Anfang zu der am Ende, sonst ein Punkt.
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
type | string[] | Nur diese Arten, mit Komma getrenntconstruction Baustelle, disruption Störung, line_rest Streckenruhe (an einer Betriebsstelle ruht der Verkehr) |
effect | string[] | Nur diese Wirkungen, z. B. closure für Sperrungenclosure Totalsperrung, cancellation Ausfall, partial_cancellation Teilausfall, diversion Umleitung, diversion_eased Umleitung unter erleichterten Bedingungen, longer_running_time Fahrzeitverlängerung, opposite_track Fahrt auf dem Gegengleis (Zs 6), opposite_track_temporary Fahrt auf dem Gegengleis (Zs 8), timetable_change Abweichung vom Fahrplan, no_route_change Ohne Abweichung des Laufwegs, holding_trains Züge werden zurückgehalten, other Sonstiges |
traffic | string[] | Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr |
at | ISO 8601 | Gültig zu diesem Zeitpunkt (Standard: jetzt) |
from | ISO 8601 | Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to) |
to | ISO 8601 | bis zu diesem Zeitpunkt; höchstens 14 Tage nach from |
line | integer | Streckennummer (VzG), z. B. 61321 bis 99999 |
station | string | Betriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf |
bbox | string | Kartenausschnitt west,süd,ost,nord (höchstens 12°) |
limit | integer | Höchstens so vieleStandard: 2001 bis 2000 |
offset | integer | So viele überspringenStandard: 00 bis 100000 |
Antwort
GeoJSON FeatureCollection; properties wie Einschränkung ohne from, to, sections, validity, dazu from_name, to_name und geometry_source: track (Linie entlang der Gleise), straight (kurzer Abschnitt unter 2 km ohne Weg im Netz, Luftlinie), endpoints (kein Weg im Netz: nur die beiden Enden als MultiPoint) oder point
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/restrictions.geojson" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/restrictions.geojson", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/restrictions.geojson",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Einschränkung abrufen
/v1/network/restrictions/{id}Eimer standardEine Einschränkung mit allen Angaben, ob sie gerade gilt, und wann wir sie zuerst und zuletzt gesehen haben.
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
idPflicht | string | Kennung, z. B. 221CD.84 |
Antwort
Einschränkung mit active_now, first_seen, last_seen, current (in der letzten Abfrage der Quelle enthalten)
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/restrictions/id" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/restrictions/id", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/restrictions/id",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Betriebsstellen
/v1/network/operating-pointsEimer standardAlle Betriebsstellen des DB-Netzes (rund 12.000: Bahnhöfe, Haltepunkte, Abzweige, Blockstellen) mit Ril100-Kürzel, Name und Lage. Suche nach Kürzel oder Namen.
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
q | string | Kürzel oder Teil des Namens, z. B. LL oder Erfurt |
limit | integer | Höchstens so vieleStandard: 501 bis 500 |
Antwort
Liste von { ril100, name, lat, lon }
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/operating-points" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/operating-points", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/operating-points",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Stand der Streckeninfo
/v1/network/statusEimer standardWann wir zuletzt gefragt haben, die Revision der Quelle und wie viele Einschränkungen und Betriebsstellen bekannt sind.
Antwort
Objekt { revision, sources: { stoerung, baustelle, streckenruhe }, count, stations_known, network }; je Quelle { revision, datenstand, geholt, anzahl }; network: Streckennetz für den Verlauf entlang der Gleise { loaded, fetched, lines, operating_points }
Beispiel
curl "https://developer.bahnhoftafel.de/v1/network/status" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/network/status", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BT_SCHLUESSEL}`, },
});
const daten = await antwort.json();import os, requests
antwort = requests.get(
"https://developer.bahnhoftafel.de/v1/network/status",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()