Abfahrten und Ankünfte
Was an einem Bahnhof abfährt oder ankommt, mit Echtzeit, Gleiswechseln, Ausfällen und den Gründen für Verspätungen, so wie die DB sie meldet.
Objekte
Objekt Abfahrt
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Kennung dieses Halts bei der Quelle |
trip_id | ?string | Kennung der Fahrt für Fahrt abrufen; bei source=iris null |
train | object | { name, category, number, line, product, operator }, z. B. ICE 1001, Gattung ICE, Linie S7, Betreiber { code, name } |
station | object | Teilbahnhof, an dem der Zug wirklich hält (bei Berlin Hbf z. B. „tief“) |
origin | ?string | Startbahnhof der Fahrt |
destination | ?string | Aktuelles Ziel |
destination_scheduled | ?string | Ziel laut Fahrplan (weicht ab, wenn der Zug früher endet) |
platform | object | { scheduled, actual, changed }, changed bei Gleiswechsel |
arrival | ?object | { scheduled, actual, delay, cancelled, additional }; null, wenn der Zug hier beginnt |
departure | ?object | wie arrival; null, wenn der Zug hier endet |
delay | ?integer | Verspätung in Minuten (Abfahrt, sonst Ankunft) |
realtime | boolean | Liegen Echtzeitdaten vor? |
cancelled | boolean | Halt fällt aus |
partially_cancelled | boolean | Nur Teile der Fahrt fallen aus |
additional | boolean | Zusatzhalt bzw. Sonderzug |
via | object | { previous, next, important }: Halte davor, danach und die wichtigen danach |
stops_cancelled | string[] | Folgehalte, die heute entfallen |
stops_additional | string[] | Zusätzliche Folgehalte |
reasons | Grund[] | Verspätungs- und Qualitätsgründe, älteste zuerst |
messages | object[] | Hinweise zum Zug (HIM, Ausstattung): { type, code, text, time, valid_from, valid_to } |
replacement | ?object | { for, by }: Ersatzzug für bzw. ersetzt durch |
wings | ?object | { of, detached_here, attached_here }: Flügelzüge |
occupancy | ?string | Auslastung, wenn die Quelle sie liefert |
formation | ?object | Angaben für Wagenreihung: { station, category, number, departure } |
{
"id": "791009188262532597-2610151214-9",
"trip_id": null,
"train": {
"name": "FLX 10",
"category": "FLX",
"number": "1242",
"line": "FLX10",
"product": "long_distance",
"operator": {
"code": "FLX10",
"name": "FlixTrain"
}
},
"station": {
"id": "8098160",
"name": "Berlin Hbf"
},
"origin": "Stuttgart Hbf",
"destination": "Hamburg Hbf",
"destination_scheduled": "Hamburg Hbf",
"platform": {
"scheduled": "5",
"actual": "5",
"changed": false
},
"arrival": {
"scheduled": "2026-10-15T18:00:00+02:00",
"actual": null,
"delay": null,
"cancelled": false,
"additional": false
},
"departure": {
"scheduled": "2026-10-15T18:18:00+02:00",
"actual": "2026-10-15T19:28:00+02:00",
"delay": 70,
"cancelled": false,
"additional": false
},
"delay": 70,
"realtime": true,
"cancelled": false,
"partially_cancelled": false,
"additional": false,
"via": {
"previous": [
"Stuttgart Hbf",
"Erfurt Hbf",
"Berlin Südkreuz"
],
"next": [
"Berlin-Spandau",
"Hamburg Hbf"
],
"important": [
"Berlin-Spandau"
]
},
"stops_cancelled": [],
"stops_additional": [],
"reasons": [
{
"kind": "delay",
"code": 36,
"text": "Technische Störung am Zug",
"time": "2026-10-15T11:51:00+02:00"
},
{
"kind": "delay",
"code": 3,
"text": "Feuerwehreinsatz auf der Strecke",
"time": "2026-10-15T16:11:00+02:00"
}
],
"messages": [],
"replacement": null,
"wings": null,
"occupancy": null,
"formation": {
"station": "8098160",
"category": "FLX",
"number": "1242",
"departure": "2026-10-15T18:18:00+02:00"
}
}Objekt Grund
| Feld | Typ | Beschreibung |
|---|---|---|
kind | string | delay (Verspätungsgrund) oder quality (Qualitätsmangel, z. B. fehlende Wagen) |
code | ?integer | Code der DB, siehe Liste der Gründe |
text | string | Wortlaut der DB |
time | ?string | Wann die DB den Grund gemeldet hat |
{
"kind": "delay",
"code": 43,
"text": "Verspätung eines vorausfahrenden Zuges",
"time": "2026-10-15T17:02:00+02:00"
}Abfahrten
GET
/v1/stations/{station_id}/departuresEimer standardAbfahrten ab jetzt (bzw. from Minuten vorher), sortiert nach der Zeit am Bahnsteig.
Info
Wir fragen die Quelle selbst in kurzen Abständen neu. Öfter abfragen bringt keine neueren Daten.
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
station_idPflicht | string | EVA-Nummer |
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
platform | string[] | Nur diese Gleise, z. B. 4 oder 4,5 |
products | string[] | Nur diese Produkte, Komma-getrenntlong_distance Fernverkehr (ICE, IC, EC, FLX, NJ …), regional Regionalverkehr (RE, RB, IRE …), suburban S-Bahn, subway U-Bahn, tram Straßenbahn, bus Bus, ferry Fähre, other Sonstiges |
from | integer | Beginn relativ zu jetzt in Minuten (bereits abgefahrene, verspätete Züge)Standard: -10-60 bis 0 |
duration | integer | Zeitraum in MinutenStandard: 905 bis 180 |
related | bool | Teilbahnhöfe einbeziehen (Berlin Hbf: tief, oben, S-Bahn)Standard: true |
source | string | Datenquelleiris DB IRIS, deutschlandweit, mit Gründen (Standard), oebb ÖBB HAFAS, mit `trip_id` für den FahrtverlaufStandard: iris |
Antwort
Objekt { station, source, departures: Abfahrt[] }
{
"station": {
"id": "8011160",
"name": "Berlin Hbf",
"ds100": "BLS",
"related": []
},
"source": {
"name": "iris",
"fetched_at": "2026-10-15T18:10:12+02:00",
"stale": false
},
"departures": [
{
"id": "791009188262532597-2610151214-9",
"trip_id": null,
"train": {
"name": "FLX 10",
"category": "FLX",
"number": "1242",
"line": "FLX10",
"product": "long_distance",
"operator": {
"code": "FLX10",
"name": "FlixTrain"
}
},
"station": {
"id": "8098160",
"name": "Berlin Hbf"
},
"origin": "Stuttgart Hbf",
"destination": "Hamburg Hbf",
"destination_scheduled": "Hamburg Hbf",
"platform": {
"scheduled": "5",
"actual": "5",
"changed": false
},
"arrival": {
"scheduled": "2026-10-15T18:00:00+02:00",
"actual": null,
"delay": null,
"cancelled": false,
"additional": false
},
"departure": {
"scheduled": "2026-10-15T18:18:00+02:00",
"actual": "2026-10-15T19:28:00+02:00",
"delay": 70,
"cancelled": false,
"additional": false
},
"delay": 70,
"realtime": true,
"cancelled": false,
"partially_cancelled": false,
"additional": false,
"via": {
"previous": [
"Stuttgart Hbf",
"Erfurt Hbf",
"Berlin Südkreuz"
],
"next": [
"Berlin-Spandau",
"Hamburg Hbf"
],
"important": [
"Berlin-Spandau"
]
},
"stops_cancelled": [],
"stops_additional": [],
"reasons": [
{
"kind": "delay",
"code": 36,
"text": "Technische Störung am Zug",
"time": "2026-10-15T11:51:00+02:00"
},
{
"kind": "delay",
"code": 3,
"text": "Feuerwehreinsatz auf der Strecke",
"time": "2026-10-15T16:11:00+02:00"
}
],
"messages": [],
"replacement": null,
"wings": null,
"occupancy": null,
"formation": {
"station": "8098160",
"category": "FLX",
"number": "1242",
"departure": "2026-10-15T18:18:00+02:00"
}
}
]
}Beispiel
curl
curl "https://developer.bahnhoftafel.de/v1/stations/8011160/departures" \
-H "Authorization: Bearer $BT_SCHLUESSEL"JavaScript
const antwort = await fetch("https://developer.bahnhoftafel.de/v1/stations/8011160/departures", {
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/stations/8011160/departures",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()Ankünfte
GET
/v1/stations/{station_id}/arrivalsEimer standardWie Abfahrten, aber für ankommende Züge (inklusive Züge, die hier enden).
Pfad-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
station_idPflicht | string | EVA-Nummer |
Query-Parameter
| Feld | Typ | Beschreibung |
|---|---|---|
platform | string[] | Nur diese Gleise, z. B. 4 oder 4,5 |
products | string[] | Nur diese Produkte, Komma-getrenntlong_distance Fernverkehr (ICE, IC, EC, FLX, NJ …), regional Regionalverkehr (RE, RB, IRE …), suburban S-Bahn, subway U-Bahn, tram Straßenbahn, bus Bus, ferry Fähre, other Sonstiges |
from | integer | Beginn relativ zu jetzt in Minuten (bereits abgefahrene, verspätete Züge)Standard: -10-60 bis 0 |
duration | integer | Zeitraum in MinutenStandard: 905 bis 180 |
related | bool | Teilbahnhöfe einbeziehen (Berlin Hbf: tief, oben, S-Bahn)Standard: true |
source | string | Datenquelleiris DB IRIS, deutschlandweit, mit Gründen (Standard), oebb ÖBB HAFAS, mit `trip_id` für den FahrtverlaufStandard: iris |
Antwort
Objekt { station, source, arrivals: Abfahrt[] }
Beispiel
curl
curl "https://developer.bahnhoftafel.de/v1/stations/8011160/arrivals" \
-H "Authorization: Bearer $BT_SCHLUESSEL"JavaScript
const antwort = await fetch("https://developer.bahnhoftafel.de/v1/stations/8011160/arrivals", {
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/stations/8011160/arrivals",
headers={"Authorization": f"Bearer {os.environ['BT_SCHLUESSEL']}"},
timeout=30,
)
daten = antwort.json()