Developer
Menü

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

FeldTypBeschreibung
idstringKennung der Quelle, z. B. 221CD.84 (Baustelle), BZI_10290 (Störung), RUHE000000000223 (Streckenruhe)
typestringconstruction, disruption oder line_rest
effectstringWichtigste 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_textstringDie Wirkung auf Deutsch, z. B. „Totalsperrung“
effectsobject[]Alle Wirkungen { effect, effect_text, traffic }; traffic (nur Störungen): long_distance, regional, freight
track_restriction?stringEinschränkung der Gleise: none, light, heavy
title?stringWas gemacht wird bzw. Ursache, z. B. „Oberleitungsarbeiten“, „Instandhaltung an der Strecke (gebündelte Arbeiten)“ oder „Störung am Fahrweg: Brückenbeschädigung“
text?stringWeitere Angaben (Störungen)
linesinteger[]Streckennummern
direction?stringboth, with_chainage oder against_chainage (Baustellen)
regionsstring[]Regionalbereiche der DB InfraGO, z. B. ost
from?objectBetriebsstelle am Anfang { ril100, eva, name, lat, lon }; ist sie ein Bahnhof, mit seiner EVA-Nummer und dem gewohnten Namen (z. B. „Berlin Hbf“)
to?objectBetriebsstelle am Ende
sectionsobject[]Abschnitte einer Störung { from, to, line }
periodobjectGesamtzeitraum { start, end } (ISO 8601)
validityobject[]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

GET/v1/network/restrictionsEimer standard

Alle 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.

Info

Lage der Betriebsstellen in WGS84. Woher die Daten kommen, steht unter Datenquellen.

Query-Parameter

FeldTypBeschreibung
typestring[]Nur diese Arten, mit Komma getrenntconstruction Baustelle, disruption Störung, line_rest Streckenruhe (an einer Betriebsstelle ruht der Verkehr)
effectstring[]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
trafficstring[]Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr
atISO 8601Gültig zu diesem Zeitpunkt (Standard: jetzt)
fromISO 8601Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to)
toISO 8601bis zu diesem Zeitpunkt; höchstens 14 Tage nach from
lineintegerStreckennummer (VzG), z. B. 61321 bis 99999
stationstringBetriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf
bboxstringKartenausschnitt west,süd,ost,nord (höchstens 12°)
limitintegerHöchstens so vieleStandard: 2001 bis 2000
offsetintegerSo viele überspringenStandard: 00 bis 100000

Antwort

Objekt { count, total, restrictions: Einschränkung[] }

Beispiel

curl
curl "https://developer.bahnhoftafel.de/v1/network/restrictions" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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

GET/v1/network/closuresEimer standard

Kurzform für Totalsperrungen: Strecken, über die gerade (oder zum Zeitpunkt at) kein Zug fährt. Streckenruhen nur mit line_rests=true.

Query-Parameter

FeldTypBeschreibung
trafficstring[]Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr
atISO 8601Gültig zu diesem Zeitpunkt (Standard: jetzt)
fromISO 8601Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to)
toISO 8601bis zu diesem Zeitpunkt; höchstens 14 Tage nach from
lineintegerStreckennummer (VzG), z. B. 61321 bis 99999
stationstringBetriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf
bboxstringKartenausschnitt west,süd,ost,nord (höchstens 12°)
limitintegerHöchstens so vieleStandard: 2001 bis 2000
offsetintegerSo viele überspringenStandard: 00 bis 100000
line_restsboolAuch Streckenruhen an BetriebsstellenStandard: false

Antwort

Wie Einschränkungen

Beispiel

curl
curl "https://developer.bahnhoftafel.de/v1/network/closures" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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

GET/v1/network/restrictions.geojsonEimer standard

Dieselben 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

FeldTypBeschreibung
typestring[]Nur diese Arten, mit Komma getrenntconstruction Baustelle, disruption Störung, line_rest Streckenruhe (an einer Betriebsstelle ruht der Verkehr)
effectstring[]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
trafficstring[]Nur Störungen, die diese Verkehrsart betreffenlong_distance Fernverkehr, regional Nahverkehr, freight Güterverkehr
atISO 8601Gültig zu diesem Zeitpunkt (Standard: jetzt)
fromISO 8601Gültig irgendwann ab diesem Zeitpunkt (zusammen mit to)
toISO 8601bis zu diesem Zeitpunkt; höchstens 14 Tage nach from
lineintegerStreckennummer (VzG), z. B. 61321 bis 99999
stationstringBetriebsstelle als Ril100-Kürzel, z. B. LL für Leipzig Hbf
bboxstringKartenausschnitt west,süd,ost,nord (höchstens 12°)
limitintegerHöchstens so vieleStandard: 2001 bis 2000
offsetintegerSo 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
curl "https://developer.bahnhoftafel.de/v1/network/restrictions.geojson" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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

GET/v1/network/restrictions/{id}Eimer standard

Eine Einschränkung mit allen Angaben, ob sie gerade gilt, und wann wir sie zuerst und zuletzt gesehen haben.

Pfad-Parameter

FeldTypBeschreibung
idPflichtstringKennung, z. B. 221CD.84

Antwort

Einschränkung mit active_now, first_seen, last_seen, current (in der letzten Abfrage der Quelle enthalten)

Beispiel

curl
curl "https://developer.bahnhoftafel.de/v1/network/restrictions/id" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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

GET/v1/network/operating-pointsEimer standard

Alle 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

FeldTypBeschreibung
qstringKürzel oder Teil des Namens, z. B. LL oder Erfurt
limitintegerHöchstens so vieleStandard: 501 bis 500

Antwort

Liste von { ril100, name, lat, lon }

Beispiel

curl
curl "https://developer.bahnhoftafel.de/v1/network/operating-points" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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

GET/v1/network/statusEimer standard

Wann 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
curl "https://developer.bahnhoftafel.de/v1/network/status" \
  -H "Authorization: Bearer $BT_SCHLUESSEL"
JavaScript
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();
Python
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()