All Norwegian rail (Entur)

Live delays Train positions Timetables

Live delays, train positions and timetables of All Norwegian rail (Entur) in Norway, recorded since 28 Sep 2026 from GTFS-RT and GTFS feeds, and from data published on api.entur.io, which the archive converts to GTFS-RT.

Download

Pick a day on the calendar. Each day is one file with everything recorded that day, in Norway 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

Train positions of All Norwegian rail (Entur) 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. 38 versions stored, a new one when All Norwegian rail (Entur) 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 3 Nov 2026, 01:05 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
no-entur
Services
TripUpdate live delays: daily files from 28 Sep 2026 to 3 Nov 2026 (37 days)
VehiclePosition train positions: daily files from 28 Sep 2026 to 3 Nov 2026 (37 days)
Daily file
https://data.train-archive.eu/daily/provider=no-entur/service=TripUpdate/date=YYYY-MM-DD.parquet final delays per train and stop
Every update
https://data.train-archive.eu/provider=no-entur/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: 38 versions, listed in no-entur/static/latest.json
Train positions on 4 Oct 2026, with DuckDB
INSTALL httpfs; LOAD httpfs;

-- The most recent positions of the day
SELECT trip_tripId, vehicle_label, position_latitude, position_longitude, lastSeen
FROM read_parquet('https://data.train-archive.eu/provider=no-entur/service=VehiclePosition/date=2026-10-04/day.parquet?token=YOUR_TOKEN')
WHERE position_latitude IS NOT NULL
ORDER BY lastSeen DESC
LIMIT 20;
The same, in Python with Polars
import polars as pl

token = "YOUR_TOKEN"
df = pl.read_parquet(f"https://data.train-archive.eu/provider=no-entur/service=VehiclePosition/date=2026-10-04/day.parquet?token={token}")

# The most recent positions of the day
print(
    df.filter(pl.col("position_latitude").is_not_null())
    .select("trip_tripId", "vehicle_label", "position_latitude", "position_longitude", "lastSeen")
    .sort("lastSeen", descending=True)
    .head(20)
)
Or save the file, with curl
curl -L -o no-entur-VehiclePosition-2026-10-04.parquet \
  'https://data.train-archive.eu/provider=no-entur/service=VehiclePosition/date=2026-10-04/day.parquet?token=YOUR_TOKEN'

Replace YOUR_TOKEN with one of your API tokens. Times are in UTC.

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}/no-entur/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/Oslo
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, 114 files, 83.3 MB.
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 97% of the trains the timetable plans. Incomplete days: 28 Sep 2026 (23%, part of the day), 29 Sep 2026 (85%, part of the day), 10 Oct 2026 (65%).

    Train positions
    28 Sep 2026 to 4 Nov 2026, 114 files, 138.4 MB. No 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.

    Feed status, live delays
    Last update 19:32 on 4 Nov 2026, local time, 1,677 trains.
    Feed status, live delays
    Last update 19:32 on 4 Nov 2026, local time, 51 trains.
    Feed status, train positions
    Last update 19:33 on 4 Nov 2026, local time, 100 trains.
    Timetables
    38 versions stored.
    • 3 Nov 2026, 01:05 8 files, 33.4 MB current
    • 31 Oct 2026, 01:05 9 files, 33.6 MB
    • 27 Oct 2026, 01:05 9 files, 32.4 MB
    • 21 Oct 2026, 18:18 8 files, 33.9 MB
    • 20 Oct 2026, 18:18 8 files, 33.7 MB
    • 17 Oct 2026, 18:18 8 files, 32.0 MB
    Every stop in the latest timetable (51,175), 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.