NMBS/SNCB Scraper — Belgian Train Schedules & Data
Pricing
Pay per event
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
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
| Field | Type | Required | Description |
|---|---|---|---|
mode | String | Yes | "connections", "liveboard", or "stations" |
fromStation | String | Connections | Departure station: "Brussel-Zuid", "Gent-Sint-Pieters" |
toStation | String | Connections | Arrival station: "Antwerpen-Centraal", "Brugge" |
station | String | Liveboard | Station to monitor: "Brussel-Zuid" |
date | String | No | Date in DD/MM/YYYY format: "15/03/2026" |
time | String | No | Time in HH:MM format: "08:30" |
language | String | No | "nl", "fr", "en", or "de" (default: "en") |
maxResults | Integer | No | Maximum results (default: 20, max: 1,000) |
proxyConfiguration | Object | No | Proxy settings (usually not needed for iRail) |
Tips:
- Use official station names. The iRail API is forgiving, but
"Brussel-Zuid"works better than"Brussels South". Setlanguage: "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"withmaxResults: 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:
| Operation | Estimated CUs | Estimated 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 ApifyClientclient = 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.
Related Belgian transport and travel scrapers
- Scandlines Scraper -- ferry routes between Denmark and Germany
- Touring Scraper -- Belgian automobile club travel guides and road info
- UiTinVlaanderen Scraper -- find events to travel to across Flanders
- VDAB Scraper -- Flemish jobs (plan your commute!)
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.
