We extract live train timetables, ticket pricing, platform changes, and route disruptions from NMBS. Delivered as clean JSON, CSV, or Parquet to S3, BigQuery, or Snowflake on your cadence.
Structured, schema-consistent data across all major object types — delivered clean, typed, and ready to query.
Complete list of extractable fields for Timetables & Routes objects from nmbs.be. All fields typed and schema-versioned.
"train_id": "IC 1532", "departure_station": "Bruxelles-Midi", "arrival_station": "Antwerpen-Centraal", "departure_time": "2026-10-12T08:24:00Z", "arrival_time": "2026-10-12T09:15:00Z", "duration_minutes": 51, "train_type": "Intercity", "departure_platform": "14"
| # | train_id | departure_station | arrival_station | departure_time | arrival_time | duration_minutes |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Live Disruptions objects from nmbs.be. All fields typed and schema-versioned.
"train_id": "IC 1532", "status": "Delayed", "delay_minutes": 12, "disruption_reason": "Infrastructure issue", "updated_at": "2026-10-12T08:10:00Z", "affected_stations": "['Bruxelles-Midi', 'Bruxelles-Central', 'Bruxelles-Nord']", "expected_resolution": "2026-10-12T11:00:00Z"
| # | train_id | status | delay_minutes | disruption_reason | updated_at | affected_stations |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Ticket Pricing objects from nmbs.be. All fields typed and schema-versioned.
"route_id": "BRU-ANT-20261012", "travel_class": "2nd Class", "fare_type": "Standard Ticket", "price": 8.4, "currency": "EUR", "passenger_type": "Adult", "refundable": false, "flexible": true
| # | route_id | travel_class | fare_type | price | currency | passenger_type |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Station Data objects from nmbs.be. All fields typed and schema-versioned.
"station_code": "FBMZ", "station_name_nl": "Brussel-Zuid", "station_name_fr": "Bruxelles-Midi", "ticket_machines": 24, "parking_capacity": 1500, "accessibility": true, "bike_storage": true, "coordinates": "50.8357, 4.3365"
| # | station_code | station_name_nl | station_name_fr | coordinates | ticket_machines | parking_capacity |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Transfer Details objects from nmbs.be. All fields typed and schema-versioned.
"journey_id": "J-98234-A", "leg_sequence": 2, "from_station": "Mechelen", "to_station": "Leuven", "train_id": "L 2864", "wait_time_minutes": 14, "connection_guaranteed": true, "platform_change": "Platform 4 to Platform 9"
| # | journey_id | leg_sequence | from_station | to_station | train_id | wait_time_minutes |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Our NMBS scraper handles the routing engine, session tokens, and multi-language interfaces to extract timetables, dynamic fares, and live platform updates.
Map A-to-B journeys across the entire Belgian rail network, capturing direct routes and multi-leg transfers.
Poll disruption endpoints to capture real-time delays, platform changes, and cancellation notices.
Extract fares for Standard, Youth, Senior, and Weekend tickets across 1st and 2nd class options.
Record exact departure and arrival platforms, alongside wait times and connection guarantees for multi-leg trips.
Compile data on station facilities, including accessibility, parking capacity, ticket machines, and bike storage.
Map station names across French, Dutch, and English variants to maintain a consistent downstream schema.
Distinguish between IC, S, L, and P trains to analyse travel times and route efficiency.
Run daily timetable refreshes or configure high-frequency polling for live disruption monitoring.
Extract latitude and longitude coordinates for all stations to feed spatial analytics models.
Brief in. Clean data out.
Provide origin-destination pairs, station lists, or specific train IDs. We design the extraction schema together.
We configure Scrapy / Playwright crawlers, proxy rotation, session management, and routing logic for nmbs.be.
Schema validation, null-rate checks, and multi-language alignment verification before full launch.
JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or Snowflake stage on agreed cadence.
Railway booking engines use session-based routing and rate-limiting. Here is how we extract reliable timetable data without triggering blocks.
The NMBS journey planner relies on stateful session tokens to progress from search to pricing. Our crawlers maintain strict session continuity, ensuring multi-step API requests return accurate fare data without expiring.
High-frequency polling for live delays triggers firewall rules. We distribute requests across a pool of Belgian residential and mobile IP addresses to keep request volumes per IP well below threshold limits.
Delays and platform changes happen instantly. We configure targeted sub-minute polling for specific train IDs or station boards, delivering webhook payloads the moment a status changes.
Belgium's bilingual infrastructure means station names change depending on the language toggle (e.g., Anvers vs Antwerpen). Our pipeline normalises all station entities to a single canonical ID.
Ticketing interfaces undergo frequent A/B testing. We use multi-layer fallback chains targeting hidden JSON payloads and DOM attributes to ensure fare extraction survives front-end redesigns.
Multimodal travel platforms sync NMBS timetables and pricing to offer cross-border rail connections.
HR and expense management platforms monitor standard fares to validate employee travel claims and budget commuter allowances.
Data teams model historical delay patterns to predict future network reliability and optimize logistics.
Bus operators and regional airlines track NMBS weekend and youth fares to adjust their own competitive pricing models.
Third-party developers build alternative routing and delay-notification apps using our low-latency webhook feeds.
Urban planners analyse train frequency and station amenity data to inform regional transit investments.
"Belgium's rail network generates thousands of real-time status changes and dynamic pricing combinations daily - none of which are accessible without a dedicated extraction pipeline."
Most teams underestimate the investment required: reliable NMBS extraction demands session token management, residential proxy rotation, and continuous monitoring of the booking engine's DOM. DataFlirt absorbs that complexity so your engineers can focus on the analysis - not the infrastructure.
Everything supported by our nmbs.be scraper — rendered SPA elements, auth walls, rate-limit evasion and beyond.
Open-source tooling on proven cloud infra — no vendor lock-in, full observability.
Scrapy handles crawl orchestration and retry logic. Playwright handles JavaScript rendering and session token progression for fare extraction.
We maintain pools of residential ISP proxies across BE regions. Rotation happens per-request with sticky sessions where required.
Pipelines run on AWS Lambda (burst) and ECS (sustained). Airflow handles scheduling, dependency management, and SLA alerting.
Data delivered to where your team already works — no new tooling required.
About nmbs.be scraping, legality, and pipeline operations.
Ask us directly →Scraping publicly available timetable and pricing information from nmbs.be is generally permissible. DataFlirt targets only public, non-authenticated schedule and fare data. We do not extract personal data or circumvent authentication walls. Clients should review NMBS terms of service and consult legal counsel for specific use cases.
We use Belgian residential ISP proxies and request timing modelled on human behaviour. For high-frequency polling, we distribute requests across wide IP pools to prevent blocking.
Yes. Our extraction maps the bilingual variants (e.g., Bruxelles-Midi and Brussel-Zuid) to a canonical station code, ensuring your downstream analytics remain consistent.
Real-time streaming pipelines achieve sub-minute latency for disruption signals on a defined route set, delivered via webhook.
Yes. We extract the full transfer sequence, including wait times and platform changes, for journeys extending into neighboring networks where available via the NMBS planner.
Our smallest packages start at a defined route list (e.g., top 500 commuter paths) with daily delivery. For full network coverage or high-frequency polling, we price based on compute volume.
Absolutely. We provide a sample run of up to 100 routes as part of the pre-engagement scoping process so you can validate schema fit and data quality.
20-minute scoping call. Pilot dataset within the week. Production within two. Whether you need a one-off station database or a continuous live-delay feed across 10,000 routes - we scope, build, and operate the pipeline. Tell us what you need.