NMBS/SNCB Scraper — Belgian Train Schedules & Data avatar

NMBS/SNCB Scraper — Belgian Train Schedules & Data

Pricing

Pay per event

Go to Apify Store
NMBS/SNCB Scraper — Belgian Train Schedules & Data

NMBS/SNCB Scraper — Belgian Train Schedules & Data

Fetch Belgian railway data from the iRail API — train connections, live departures, arrivals, and the full station list for NMBS/SNCB.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

NMBS/SNCB Scraper -- Belgian Railway Connections, Live Departures & Station Data

Extract Belgian train data from the NMBS/SNCB railway network -- route connections with transfers and durations, real-time station departure boards, and the complete list of 550+ Belgian railway stations. Powered by the open iRail API.

What is NMBS Scraper?

NMBS (Nationale Maatschappij der Belgische Spoorwegen) -- also known as SNCB in French -- is Belgium's national railway company. It operates over 4,000 daily train services connecting 550+ stations across the country. This actor does not scrape a product catalogue; it extracts live transport data.

The actor talks to the iRail API, a community-maintained open data project that provides real-time access to NMBS/SNCB schedules, delays, platform assignments, and occupancy levels. Three modes of operation:

  • Connections mode -- find routes between two stations with departure times, arrival times, durations, number of transfers, train types, delay information, and occupancy levels. Ideal for route planning applications and fare comparison.
  • Liveboard mode -- get the real-time departure board for any Belgian station, including delays, platform changes, and cancellations. Perfect for station display boards and delay monitoring.
  • Stations mode -- export the full list of Belgian railway stations with names, coordinates, and unique identifiers. Useful for building geographic databases and transport network analysis.

What people build with this data:

  • Commuter apps -- developers build dashboards showing live train status for daily commuters on specific routes.
  • Delay analytics -- researchers and journalists track punctuality on Belgian railway lines to measure service quality over time.
  • Route planning -- travel agencies and corporate travel teams find optimal connections for their Belgian itineraries.
  • Station network analysis -- urban planners and real estate analysts use station coordinates and connectivity data to study accessibility.
  • Transport data enrichment -- logistics companies overlay Belgian rail data with their delivery network to identify multimodal transport options.

What data does NMBS Scraper extract?

Connections mode

  • :bullettrain_side: Departure/arrival station -- official station names
  • :clock1: Departure/arrival time -- ISO datetime with timezone
  • :triangular_flag_on_post: Platforms -- assigned platform numbers
  • :hourglass_flowing_sand: Duration -- formatted (e.g., "1h 23min") and raw seconds
  • :arrows_counterclockwise: Transfers -- number of transfers required
  • :warning: Delays -- delay in minutes at departure and arrival
  • :no_entry: Cancellation status -- whether the connection is cancelled
  • :train: Train types -- IC, L, S, P train identifiers
  • :busts_in_silhouette: Occupancy -- estimated passenger load (low/medium/high)

Liveboard mode

  • :station: Station -- the station being monitored
  • :arrow_right: Destination -- where each train is heading
  • :clock3: Time and delay -- scheduled departure and delay in minutes
  • :1234: Platform -- current platform assignment
  • :railway_car: Vehicle info -- train type and number

Stations mode

  • :id: Station ID -- unique iRail identifier
  • :abc: Name -- standard and localised station names
  • :world_map: Coordinates -- latitude and longitude for geographic mapping

How to scrape Belgian train data

FieldTypeRequiredDescription
modeStringYes"connections", "liveboard", or "stations"
fromStationStringConnectionsDeparture station: "Brussel-Zuid", "Gent-Sint-Pieters"
toStationStringConnectionsArrival station: "Antwerpen-Centraal", "Brugge"
stationStringLiveboardStation to monitor: "Brussel-Zuid"
dateStringNoDate in DD/MM/YYYY format: "15/03/2026"
timeStringNoTime in HH:MM format: "08:30"
languageStringNo"nl", "fr", "en", or "de" (default: "en")
maxResultsIntegerNoMaximum results (default: 20, max: 1,000)
proxyConfigurationObjectNoProxy settings (usually not needed for iRail)

Tips:

  • Use official station names. The iRail API is forgiving, but "Brussel-Zuid" works better than "Brussels South". Set language: "nl" or "fr" to get names in your preferred language.
  • For commuter monitoring, set mode: "liveboard" with your home station and schedule the actor to run every 15 minutes during rush hours.
  • To build a complete station database, set mode: "stations" with maxResults: 1000 -- there are roughly 550 active stations.

Output

Connections example

{
"departureStation": "Brussel-Zuid / Bruxelles-Midi",
"departureTime": "2026-04-03T08:32:00.000Z",
"departurePlatform": "3",
"departureDelay": 0,
"arrivalStation": "Antwerpen-Centraal",
"arrivalTime": "2026-04-03T09:09:00.000Z",
"arrivalPlatform": "12",
"arrivalDelay": 2,
"duration": "37min",
"durationSeconds": 2220,
"transfers": 0,
"vehicles": ["IC 1532"],
"canceled": false,
"occupancy": "medium",
"scrapedAt": "2026-04-03T08:00:00.000Z"
}

Liveboard example

{
"station": "Gent-Sint-Pieters",
"destination": "Oostende",
"time": "2026-04-03T09:15:00.000Z",
"delay": 5,
"platform": "7",
"vehicle": "IC 1842",
"vehicleType": "IC",
"canceled": false,
"occupancy": "low",
"scrapedAt": "2026-04-03T09:10:00.000Z"
}

Stations example

{
"id": "BE.NMBS.008892007",
"name": "Ghent-Sint-Pieters",
"standardName": "Gent-Sint-Pieters",
"longitude": 3.7107,
"latitude": 51.0355,
"scrapedAt": "2026-04-03T09:00:00.000Z"
}

How much does it cost?

NMBS Scraper makes direct API calls to iRail -- no browser needed, no heavy crawling:

OperationEstimated CUsEstimated Cost
20 connections~0.005~$0.003
100 liveboard departures~0.005~$0.003
All 550 stations~0.005~$0.003

This is one of the cheapest actors to run because it simply queries a public REST API.

Can I integrate?

Belgian train data flows into your tools:

  • Google Sheets -- build a commuter delay log updated every morning
  • Slack -- get notified when your commuter train is delayed or cancelled
  • Zapier / Make -- trigger workflows based on delay thresholds
  • Webhooks -- pipe real-time departure data to your own application
  • PostgreSQL / MongoDB -- build a historical Belgian railway performance database
  • Google Maps / Mapbox -- visualise station coordinates on interactive maps

Can I use it as an API?

Yes. Perfect for building real-time transport dashboards:

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/nmbs-scraper").call(run_input={
"mode": "connections",
"fromStation": "Brussel-Zuid",
"toStation": "Antwerpen-Centraal",
"time": "08:30",
"maxResults": 5,
})
for conn in client.dataset(run["defaultDatasetId"]).iterate_items():
delay = f"+{conn['departureDelay']}min" if conn['departureDelay'] > 0 else "on time"
print(f"{conn['departureStation']} -> {conn['arrivalStation']} | {conn['duration']} | {delay}")

JavaScript:

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("studio-amba/nmbs-scraper").call({
mode: "liveboard",
station: "Gent-Sint-Pieters",
maxResults: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((d) => {
const delay = d.delay > 0 ? ` (+${d.delay}min)` : "";
console.log(`${d.vehicle} -> ${d.destination} at ${d.time}${delay} platform ${d.platform}`);
});

FAQ

Is this real-time data? Yes. The iRail API provides live data from the NMBS/SNCB systems, including current delays and platform changes.

Do I need an iRail API key? No. The iRail API is open and free. This actor handles all the request formatting and response parsing for you.

Can I query Thalys, Eurostar, or ICE international trains? iRail focuses on domestic Belgian trains. International high-speed services may appear in connections passing through Belgian stations, but coverage is limited.

What happens if a station name is wrong? The iRail API will return an error if it cannot match the station name. Use the stations mode first to get exact names.

Can I track a specific train number? Not directly. Use liveboard mode to monitor departures from a station, which includes train numbers (vehicle identifiers).

Does the scraper support bus or tram data? No. Only NMBS/SNCB railway services. For De Lijn (Flemish buses/trams) or STIB/MIVB (Brussels), different data sources are needed.

Limitations

  • Depends on the iRail API. If iRail is down or rate-limited, the actor will fail gracefully with an error message.
  • Connection results are limited to what iRail returns per query (typically 6-10 options per time slot). For more, shift the time window.
  • Occupancy data is estimated and not always available for every train.
  • Station names must match iRail's database. Use mode: "stations" to get the authoritative list.
  • Historical data is not available -- iRail only serves current/upcoming schedules.

Your feedback

Need additional transport data, want to track specific routes over time, or found an issue? Reach out through the Apify platform or open a GitHub issue. We build what users ask for.