VR (Fintraffic Digitraffic)
Live delays Train positions Timetables
Live delays, train positions and timetables of VR (Fintraffic Digitraffic) in Finland, recorded since 28 Sep 2026 from GTFS-RT and GTFS feeds.
Download
Pick a day on the calendar. Each day is one file with everything recorded that day, in Finland 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).
November 2026
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
|---|---|---|---|---|---|---|
| 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.
The timetable
The planned timetable: stations, routes, trips and times. It comes as GTFS, the standard timetable format, one Parquet table per GTFS file. 36 versions stored, a new one when VR (Fintraffic Digitraffic) changes the coming week’s trains.
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 4 Nov 2026, 02:00 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
fi-digitraffic- Services
TripUpdatelive delays: daily files from 28 Sep 2026 to 3 Nov 2026 (37 days)VehiclePositiontrain positions: daily files from 28 Sep 2026 to 3 Nov 2026 (37 days)- Daily file
https://data.train-archive.eu/daily/provider=fi-digitraffic/service=TripUpdate/date=YYYY-MM-DD.parquetfinal delays per train and stop- Every update
https://data.train-archive.eu/provider=fi-digitraffic/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: 36 versions, listed infi-digitraffic/static/latest.json
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=fi-digitraffic/service=TripUpdate/date=2026-11-02.parquet?token=YOUR_TOKEN')
WHERE trip_status = 'scheduled'
ORDER BY arrival_delay_min DESC NULLS LAST
LIMIT 20;
import polars as pl
token = "YOUR_TOKEN"
day = pl.read_parquet(f"https://data.train-archive.eu/daily/provider=fi-digitraffic/service=TripUpdate/date=2026-11-02.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)
)
curl -L -o fi-digitraffic-TripUpdate-2026-11-02.parquet \
'https://data.train-archive.eu/daily/provider=fi-digitraffic/service=TripUpdate/date=2026-11-02.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.
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}/fi-digitraffic/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/Helsinki
- Rail filter
- Off: the feed carries trains only
- Live delays
- 28 Sep 2026 to 4 Nov 2026, 117 files, 75.5 MB.
47 missing hours
Archive outage on 29 Sep 2026, 06:00 to 13: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 100% of the trains the timetable plans. Incomplete days: 28 Sep 2026 (25%, part of the day), 29 Sep 2026 (88%, part of the day), 9 Oct 2026 (100%, part of the day), 10 Oct 2026 (100%, part of the day), 11 Oct 2026 (100%, part of the day), 12 Oct 2026 (100%, part of the day).
- Train positions
- 28 Sep 2026 to 4 Nov 2026, 117 files, 167.6 MB.
No missing hours.
Archive outage on 29 Sep 2026, 06:00 to 13: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.
- Feed status, live delays
- Last update 20:17 on 4 Nov 2026, local time, 118 trains. Last error: 400 Bad Request for https://rata.digitraffic.fi/api/v1/trains/gtfs-rt-updates: {"errorMessage":"Invalid format for parameter. Target type: LocalDate, parameter: gtfs-rt-updates","code":"PARAMETER_WRON
- Feed status, train positions
- Last update 20:17 on 4 Nov 2026, local time, 118 trains. Last error: 400 Bad Request for https://rata.digitraffic.fi/api/v1/trains/gtfs-rt-locations: {"errorMessage":"Invalid format for parameter. Target type: LocalDate, parameter: gtfs-rt-locations","code":"PARAMETER_
- Timetables
- 36 versions stored.
- 4 Nov 2026, 02:00 9 files, 1.4 MB current
- 3 Nov 2026, 02:00 11 files, 1.4 MB
- 2 Nov 2026, 02:00 11 files, 1.4 MB
- 1 Nov 2026, 02:00 9 files, 1.4 MB
- 31 Oct 2026, 02:00 11 files, 1.4 MB
- 30 Oct 2026, 02:00 9 files, 1.3 MB
Do you publish this feed? Ask for a change or its removal. Removal stops collection and deletes the files already stored.