All German rail (DELFI via gtfs.de)

Live delays Timetables

Live delays and timetables of All German rail (DELFI via gtfs.de) in Germany, recorded since 28 Sep 2026 from a GTFS feed and live data published on realtime.gtfs.de, which the archive converts to GTFS-RT. It carries the trains of Deutsche Bahn (DB) and the other German rail operators.

Download

Pick a day on the calendar. Each day is one file with everything recorded that day, in Germany local time. You choose the format on the next page: a spreadsheet (CSV, opens in Excel, LibreOffice or Google Sheets) or Parquet (a compact table format for code).

‹ October 2026

November 2026

Delays of All German rail (DELFI via gtfs.de) in November 2026. Days with a file are links.
MonTueWedThuFriSatSun
1
2 3 Wednesday 4 November 2026: still being collected 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
  • A file to download
  • Collected, file ready after 02:15 UTC
  • Today, still being collected
  • No data

37 days ready to download. The archive has data for this source since 28 Sep 2026.

Several days at once

Choose the first and last day: you get one zip with a file per day.

File type

The timetable

The planned timetable: stations, routes, trips and times. It comes as GTFS, the standard timetable format, one Parquet table per GTFS file. 7 versions stored, a new one when All German rail (DELFI via gtfs.de) changes the coming week’s trains.

All versions as Parquet tables

Tools that need a GTFS zip: pip install gtfs-parquet, then gtfs_parquet.write_gtfs(gtfs_parquet.read_parquet(folder), "gtfs.zip") on a folder of the tables. This version was stored on 31 Oct 2026, 11:08 and is the current one.

Accounts are free: you sign in with a code sent to your email, no password.

Use it from code

Every day is a Parquet file at a fixed address. Read it straight from DuckDB, Polars or anything that reads Parquet over HTTP: only the columns and rows your query needs are downloaded. You need a free API token from an account.

Try it in your browser Developer guide

Source id
de-gtfsde
Services
TripUpdate live delays: daily files from 28 Sep 2026 to 3 Nov 2026 (37 days)
Daily file
https://data.train-archive.eu/daily/provider=de-gtfsde/service=TripUpdate/date=YYYY-MM-DD.parquet final delays per train and stop
Every update
https://data.train-archive.eu/provider=de-gtfsde/service=SERVICE/date=YYYY-MM-DD/day.parquet
Today
Still being collected in 15-minute files. The day’s file is built after 02:15 UTC. The developer guide shows how to read the 15-minute files.
Timetables
Service static: 7 versions, listed in de-gtfsde/static/latest.json
Live delays on 12 Oct 2026, with DuckDB
INSTALL httpfs; LOAD httpfs;

-- The final delay of each train at each stop, in minutes: the 20 largest
SELECT route, stop_name, scheduled_arrival, arrival_delay_min, delay_source
FROM read_parquet('https://data.train-archive.eu/daily/provider=de-gtfsde/service=TripUpdate/date=2026-10-12.parquet?token=YOUR_TOKEN')
WHERE trip_status = 'scheduled'
ORDER BY arrival_delay_min DESC NULLS LAST
LIMIT 20;
The same, in Python with Polars
import polars as pl

token = "YOUR_TOKEN"
day = pl.read_parquet(f"https://data.train-archive.eu/daily/provider=de-gtfsde/service=TripUpdate/date=2026-10-12.parquet?token={token}")

# The final delay of each train at each stop, in minutes: the 20 largest
print(
    day.filter(pl.col("trip_status") == "scheduled")
    .select("route", "stop_name", "scheduled_arrival", "arrival_delay_min", "delay_source")
    .sort("arrival_delay_min", descending=True, nulls_last=True)
    .head(20)
)
Or save the file, with curl
curl -L -o de-gtfsde-TripUpdate-2026-10-12.parquet \
  'https://data.train-archive.eu/daily/provider=de-gtfsde/service=TripUpdate/date=2026-10-12.parquet?token=YOUR_TOKEN'

Replace YOUR_TOKEN with one of your API tokens. Delays are in seconds in the Parquet files; the examples turn them into minutes.

Stations of the current timetable
import json, urllib.request
import polars as pl

base, token = "https://data.train-archive.eu", "YOUR_TOKEN"
latest = json.load(urllib.request.urlopen(f"{base}/de-gtfsde/static/latest.json?token={token}"))
stops = pl.read_parquet(f"{base}/{latest['tables']['stops']}?token={token}")
print(stops.select("stop_id", "stop_name"))

Also: every file of this source, listed, and asking an AI assistant to query it for you.

What is covered

Local time
Europe/Berlin
Rail filter
On: the feed mixes buses and trams, only trips the timetable lists as rail are kept
Live delays
28 Sep 2026 to 4 Nov 2026, 113 files, 1.5 GB.
7 missing hours

    Archive outage on 29 Sep 2026, 05:00 to 12:15: the archive recorded nothing from any source (the archive's collector ran out of memory and restarted in a loop). Our fault, not the source’s.

    On a usual day the live data covers 94% of the trains the timetable plans. Incomplete days: 28 Sep 2026 (25%, part of the day), 29 Sep 2026 (80%, part of the day), 17 Oct 2026 (66%), 20 Oct 2026 (62%).

    Feed status, live delays
    Last update 16:59 on 23 Oct 2026, local time, 9,456 trains.
    Feed status, live delays
    Last update 19:16 on 4 Nov 2026, local time, 9,674 trains.
    Timetables
    7 versions stored.
    • 31 Oct 2026, 11:08 9 files, 19.1 MB current
    • 24 Oct 2026, 12:08 9 files, 19.0 MB
    • 20 Oct 2026, 18:19 9 files, 19.2 MB
    • 17 Oct 2026, 18:19 9 files, 17.2 MB
    • 10 Oct 2026, 16:40 9 files, 18.7 MB
    • 3 Oct 2026, 12:17 9 files, 19.0 MB

    gtfs.de's realtime feed (CC BY 4.0) carries DB long-distance trains only where their lines cross the VRR and NVBW areas. From 23 October 2026, the DB Fernverkehr trains it lacks (international legs, SyltShuttle, EC/ECE, some IC lines) are added from Deutsche Bahn's Timetables API (DB API Marketplace, CC BY 4.0), with delays at German stations only.

    Every stop in the latest timetable (250,425), buses and trams included: this timetable covers all public transport. The live data is filtered to trains.

    Do you publish this feed? Ask for a change or its removal. Removal stops collection and deletes the files already stored.