We extract live train schedules, platform changes, engineering works, and dynamic pricing from Nederlandse Spoorwegen. 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 Journey Planner objects from ns.nl. All fields typed and schema-versioned.
"origin_station": "Amsterdam Centraal", "destination_station": "Utrecht Centraal", "departure_time": "2026-05-12T08:14:00Z", "arrival_time": "2026-05-12T08:41:00Z", "duration_minutes": 27, "transfers": 0, "train_type": "Intercity", "status": "On time"
| # | origin_station | destination_station | departure_time | arrival_time | duration_minutes | transfers |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Live Departures objects from ns.nl. All fields typed and schema-versioned.
"station": "Rotterdam Centraal", "destination": "Den Haag Centraal", "planned_time": "2026-05-12T09:05:00Z", "actual_time": "2026-05-12T09:10:00Z", "delay_minutes": 5, "platform": "4", "train_category": "Sprinter", "cancelled": false
| # | station | destination | planned_time | actual_time | delay_minutes | platform |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Disruptions objects from ns.nl. All fields typed and schema-versioned.
"route": "Schiphol Airport - Leiden Centraal", "disruption_type": "Engineering works", "cause": "Track maintenance", "start_time": "2026-05-14T00:00:00Z", "expected_end_time": "2026-05-16T04:00:00Z", "advice": "Use replacement buses. Extra travel time is 30 minutes.", "severity": "High", "updated_at": "2026-05-10T14:20:00Z"
| # | route | disruption_type | cause | start_time | expected_end_time | advice |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Ticket Pricing objects from ns.nl. All fields typed and schema-versioned.
"route": "Eindhoven Centraal to Maastricht", "travel_class": 2, "ticket_type": "Single fare", "base_price": 18.5, "ns_flex_discount": 11.1, "departure_date": "2026-05-12", "currency": "EUR", "scraped_at": "2026-05-11T10:00:00Z"
| # | route | travel_class | ticket_type | base_price | ns_flex_discount | departure_date |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Station Facilities objects from ns.nl. All fields typed and schema-versioned.
"station_name": "Groningen", "station_code": "Gn", "ov_fiets_availability": 142, "parking_spots": 450, "elevators_working": true, "wheelchair_accessible": true, "shops": "['AH to go', 'Kiosk', 'Smullers']", "service_desk_present": true
| # | station_name | station_code | ov_fiets_availability | parking_spots | elevators_working | wheelchair_accessible |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Our NS.nl pipeline handles dynamic journey planning, live departure boards, and real-time disruption alerts. We manage rate limits, session tokens, and geographic routing to deliver precise transit intelligence.
Extract point-to-point itineraries including transfer nodes, operator details, train types, and total duration for any date combination.
Monitor station departure boards in real time. Capture planned versus actual departure times, platform changes, and cancellation flags.
Track network outages, planned maintenance, and alternative travel advice. Timestamped updates for historical reliability analysis.
Capture base fares, off-peak discounts, first-class upgrades, and NS International pricing across specific routes and dates.
Extract station facility availability, including live OV-fiets bicycle counts, parking capacity, and accessibility status.
Scrape cross-border journey data to Belgium, Germany, and France, including Thalys, Eurostar, and ICE connections.
Extract NS's predictive crowd indicators for specific trains to analyse peak utilization and passenger density.
Execute sub-minute polling on departure boards for real-time applications without triggering IP blocks.
Automated proxy rotation and request throttling to ensure continuous data flow from NS.nl endpoints.
Brief in. Clean data out.
Provide station pairs, routes, or specific departure boards. We design the extraction schema together.
We configure Scrapy / Playwright crawlers, proxy rotation, session management, and rate-limit handling for ns.nl.
Schema validation, null-rate checks, delay-outlier detection, and sample journeys before full launch.
JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or via Webhook on agreed cadence.
Extracting live transit data requires precise timing and resilient infrastructure. Here is how we manage continuous polling.
Live transit apps require accurate delay data. We distribute requests across a large residential IP pool in the Netherlands to poll departure boards every 60 seconds without triggering rate limits.
NS.nl's Reisplanner generates session-specific tokens for complex journey queries. Our Playwright instances manage these tokens natively, allowing deep extraction of multi-leg trips.
To prevent downstream flood, our pipeline hashes train statuses. We only trigger webhooks when a delay increases, a platform changes, or a cancellation occurs.
Transit sites frequently update their frontend frameworks. We use multi-layer fallback chains to extract core data even if the presentation layer changes overnight.
Every run emits structured logs. We monitor endpoint latency and null-rates to detect API deprecations or layout shifts before they impact your data feed.
Integrate Dutch rail schedules and pricing into global multi-modal travel search engines.
Automate claims for passengers by tracking historical train delays against scheduled arrival times.
Provide employees with real-time commute updates, platform changes, and disruption alerts.
Correlate passenger rail disruptions with freight network delays to optimise supply chain routing.
Evaluate property values based on actual transit connectivity, frequency, and reliability metrics.
Analyse station facility usage, OV-fiets availability, and crowd forecasts to model city infrastructure needs.
"The Dutch railway network generates millions of state changes daily. Capturing live delays and dynamic pricing requires continuous extraction, not static API calls."
Most teams underestimate the compute required for transit data. Polling live departures and journey planners across 400 stations demands high-frequency request distribution, proxy rotation to avoid rate limits, and precise schema validation. DataFlirt absorbs that complexity so your engineers can focus on routing algorithms, not infrastructure.
Everything supported by our ns.nl 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, session tokens, and interaction flows for the Reisplanner.
We maintain pools of residential ISP proxies specifically in the Netherlands to ensure NS.nl serves accurate regional data without blocking requests.
Pipelines run on AWS Lambda for burst scaling during major disruptions. Airflow handles scheduling and SLA alerting. All state stored in managed Postgres.
Data delivered to where your team already works — no new tooling required.
Scraping publicly available transit schedules, disruptions, and pricing is generally permissible. DataFlirt targets only public, non-authenticated operational data. We do not extract personal data or circumvent authentication walls. Clients should review terms of service and consult legal counsel for specific commercial use cases.
For monitored stations, our high-frequency polling pipelines check departure boards every 60 seconds. Changes to planned times or platform assignments are pushed via webhook immediately upon detection.
Yes. We can extract cross-border journey data, including Thalys, Eurostar, and ICE routes, pricing, and schedules from the NS International portal.
Yes. Every pipeline run produces timestamped snapshots. We maintain a time-series log of disruptions, causes, and resolution times from the date your pipeline starts.
Our base packages cover daily extraction of scheduled journeys for up to 50 station pairs. High-frequency live departure polling is priced based on the number of stations monitored and update frequency.
Yes. We provide a sample run of specific routes or departure boards 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 historical disruption analysis or real-time departure webhooks across the Dutch rail network - we scope, build, and operate the pipeline. Tell us what you need.