Fahrten
Der ganze Weg eines Zuges: jeder Halt mit geplanter und tatsächlicher Zeit, Gleis, Ausfällen, Hinweisen, Ausstattung und auf Wunsch dem Linienverlauf für Karten.
Objekte
Objekt Fahrt
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Kennung der Fahrt (undurchsichtig, bleibt für diese Fahrt gleich) |
train | object | Zug wie bei Abfahrt |
origin | object | Startbahnhof { id, name, location } |
destination | object | Zielbahnhof |
cancelled | boolean | Fährt die ganze Fahrt nicht? |
position? | ?object | { lat, lon, estimated }: berechnete Position des Zuges, wenn er gerade fährt |
stops | Halt[] | Alle Halte in Fahrtrichtung |
messages | object[] | Hinweise zur Fahrt (Störungen, Bauarbeiten): { type, code, text } |
attributes | object[] | Ausstattung (WLAN, Fahrradmitnahme, Bordbistro …): { code, text } |
polyline? | ?object | Linienverlauf als GeoJSON LineString, nur mit polyline=true |
Objekt Halt
| Feld | Typ | Beschreibung |
|---|---|---|
station | object | { id, name, location } |
arrival | ?object | { scheduled, actual, delay }, null am Start |
departure | ?object | { scheduled, actual, delay }, null am Ziel |
platform | ?object | { scheduled, actual, changed } |
cancelled | boolean | Halt entfällt |
additional | boolean | Zusätzlicher Halt |
remarks | object[] | Hinweise nur für diesen Halt, z. B. „Hält nur zum Einsteigen“ |
{
"station": {
"id": "8098160",
"name": "Berlin Hbf (Tiefgeschoß)",
"location": {
"lat": 52.52585,
"lon": 13.368892
}
},
"arrival": null,
"departure": {
"scheduled": "2026-10-15T17:36:00+02:00",
"actual": "2026-10-15T18:28:00+02:00",
"delay": 52
},
"platform": {
"scheduled": "4",
"actual": "4",
"changed": false
},
"cancelled": false,
"additional": false,
"remarks": [
{
"type": "status",
"code": "text.realtime.stop.exit.disabled",
"text": "Hält nur zum Einsteigen"
}
]
}Züge suchen
/v1/trainsEimer standardFindet die Fahrten eines Zuges über seinen Namen, z. B. ICE 1603, RE 1 oder S 7, die zum Zeitpunkt time unterwegs sind. Die id geht an Fahrt abrufen.
Gesucht wird nur im Bahnverkehr. Ein Zug, der erst später losfährt, wird mit time zu seiner Fahrzeit gefunden.
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
namePflicht | string | Zugname wie auf der Anzeige |
time | ISO 8601 | Zeitpunkt (ISO 8601), zu dem der Zug fährt. Standard: jetzt |
Antwort
Liste { id, train, origin, destination, departure }
[
{
"id": "b2ViYh8yfCNWTiMxI1NUIzE3OTIw…",
"train": {
"name": "ICE 1603",
"category": "ICE",
"number": "1603",
"line": "ICE 1603",
"product": "long_distance",
"operator": {
"code": "db-fernverkehr-ag",
"name": "DB Fernverkehr AG"
}
},
"origin": {
"id": "8011102",
"name": "Berlin Gesundbrunnen",
"location": null
},
"destination": {
"id": "8000261",
"name": "München Hbf",
"location": null
},
"departure": "2026-10-15T17:26:00+02:00"
}
]Beispiel
curl "https://developer.bahnhoftafel.de/v1/trains?name=ICE%201603" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/trains?name=ICE%201603", {
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/trains?name=ICE%201603",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Fahrt abrufen
/v1/trips/{trip_id}Eimer standardVerlauf einer Fahrt. Die trip_id kommt aus Züge suchen, aus Abfahrten mit source=oebb oder aus dem Radar.
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
trip_idPflicht | string | Kennung der Fahrt |
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
polyline | bool | Linienverlauf als GeoJSON mitliefern (deutlich größere Antwort)Standard: false |
Antwort
Beispiel
curl "https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…", {
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/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Fahrt als Kalendertermin
/v1/trips/{trip_id}/calendar.icsEimer standardEin Termin für den Kalender, vom Einstieg bis zum Ausstieg: Zug, Gleis, Halte unterwegs und auf Wunsch eine Erinnerung. Lässt sich in jeden Kalender übernehmen (Google, Apple, Outlook, Thunderbird).
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
trip_idPflicht | string | Kennung der Fahrt |
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
from | string | Einsteigen an diesem Bahnhof (EVA-Nummer aus stops[].station.id), Standard: erster Halt |
to | string | Aussteigen an diesem Halt, Standard: letzter Halt |
reminder | integer | Erinnerung so viele Minuten vor der Abfahrt0 bis 240 |
Antwort
text/calendar, Datei fahrt.ics mit einem Termin. Beginn und Ende sind die Planzeiten; eine Verspätung zum Zeitpunkt des Abrufs steht in der Beschreibung.
Beispiel
curl "https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/calendar.ics" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/calendar.ics", {
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/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/calendar.ics",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Streckenverlauf als GPX
/v1/trips/{trip_id}/route.gpxEimer standardDer Weg eines Zuges als GPX-Datei: der echte Verlauf über die Gleise als Track und jeder Halt als Wegpunkt mit Planzeit. Für Karten-Apps, Fahrtenbücher wie travelynx oder eigene Auswertungen.
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
trip_idPflicht | string | Kennung der Fahrt |
Antwort
application/gpx+xml, Datei fahrt.gpx (GPX 1.1)
Beispiel
curl "https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/route.gpx" \
-H "Authorization: Bearer $BT_SCHLUESSEL"const antwort = await fetch("https://developer.bahnhoftafel.de/v1/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/route.gpx", {
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/trips/b2ViYh8yfCNWTiMxI1NUIzE3OTIwNjk4OTgj…/route.gpx",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()