Developer
Menü

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

FeldTypBeschreibung
idstringKennung dieses Halts bei der Quelle
trip_id?stringKennung der Fahrt für Fahrt abrufen; bei source=iris null
trainobject{ name, category, number, line, product, operator }, z. B. ICE 1001, Gattung ICE, Linie S7, Betreiber { code, name }
stationobjectTeilbahnhof, an dem der Zug wirklich hält (bei Berlin Hbf z. B. „tief“)
origin?stringStartbahnhof der Fahrt
destination?stringAktuelles Ziel
destination_scheduled?stringZiel laut Fahrplan (weicht ab, wenn der Zug früher endet)
platformobject{ scheduled, actual, changed }, changed bei Gleiswechsel
arrival?object{ scheduled, actual, delay, cancelled, additional }; null, wenn der Zug hier beginnt
departure?objectwie arrival; null, wenn der Zug hier endet
delay?integerVerspätung in Minuten (Abfahrt, sonst Ankunft)
realtimebooleanLiegen Echtzeitdaten vor?
cancelledbooleanHalt fällt aus
partially_cancelledbooleanNur Teile der Fahrt fallen aus
additionalbooleanZusatzhalt bzw. Sonderzug
viaobject{ previous, next, important }: Halte davor, danach und die wichtigen danach
stops_cancelledstring[]Folgehalte, die heute entfallen
stops_additionalstring[]Zusätzliche Folgehalte
reasonsGrund[]Verspätungs- und Qualitätsgründe, älteste zuerst
messagesobject[]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?stringAuslastung, wenn die Quelle sie liefert
formation?objectAngaben 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

FeldTypBeschreibung
kindstringdelay (Verspätungsgrund) oder quality (Qualitätsmangel, z. B. fehlende Wagen)
code?integerCode der DB, siehe Liste der Gründe
textstringWortlaut der DB
time?stringWann 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 standard

Abfahrten 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

FeldTypBeschreibung
station_idPflichtstringEVA-Nummer

Query-Parameter

FeldTypBeschreibung
platformstring[]Nur diese Gleise, z. B. 4 oder 4,5
productsstring[]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
fromintegerBeginn relativ zu jetzt in Minuten (bereits abgefahrene, verspätete Züge)Standard: -10-60 bis 0
durationintegerZeitraum in MinutenStandard: 905 bis 180
relatedboolTeilbahnhöfe einbeziehen (Berlin Hbf: tief, oben, S-Bahn)Standard: true
sourcestringDatenquelleiris 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 standard

Wie Abfahrten, aber für ankommende Züge (inklusive Züge, die hier enden).

Pfad-Parameter

FeldTypBeschreibung
station_idPflichtstringEVA-Nummer

Query-Parameter

FeldTypBeschreibung
platformstring[]Nur diese Gleise, z. B. 4 oder 4,5
productsstring[]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
fromintegerBeginn relativ zu jetzt in Minuten (bereits abgefahrene, verspätete Züge)Standard: -10-60 bis 0
durationintegerZeitraum in MinutenStandard: 905 bis 180
relatedboolTeilbahnhöfe einbeziehen (Berlin Hbf: tief, oben, S-Bahn)Standard: true
sourcestringDatenquelleiris 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()