SYSTEM all green source ns.nl queue 14,892 endpoints p99 latency 184ms dataflirt.com · scraper/ns-nl
RUN · 31 active pipelines · ns.nl live

NS.nl transit data,
at warehouse scale.

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.

Journeys extracted
1.2M /day
Live departure updates
8.4M /24h
Disruption alerts
4,120 /run
Active pipelines
31
Uptime
99.98%
Data Dictionary

Every field we extract from ns.nl

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_stationdestination_stationdeparture_timearrival_timeduration_minutestransferstrain_typeoperatorstatuscrowd_forecast
journey_planner
● 200 OK
"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_stationdestination_stationdeparture_timearrival_timeduration_minutestransfers
1
2
3

Complete list of extractable fields for Live Departures objects from ns.nl. All fields typed and schema-versioned.

stationdestinationplanned_timeactual_timedelay_minutesplatformtrain_categoryroute_stationscancelled
live_departures
● 200 OK
"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
# stationdestinationplanned_timeactual_timedelay_minutesplatform
1
2
3

Complete list of extractable fields for Disruptions objects from ns.nl. All fields typed and schema-versioned.

routedisruption_typecausestart_timeexpected_end_timeadviceseverityupdated_ataffected_stations
disruptions
● 200 OK
"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"
# routedisruption_typecausestart_timeexpected_end_timeadvice
1
2
3

Complete list of extractable fields for Ticket Pricing objects from ns.nl. All fields typed and schema-versioned.

routetravel_classticket_typebase_pricens_flex_discountdeparture_datecurrencyscraped_atvalidity_period
ticket_pricing
● 200 OK
"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"
# routetravel_classticket_typebase_pricens_flex_discountdeparture_date
1
2
3

Complete list of extractable fields for Station Facilities objects from ns.nl. All fields typed and schema-versioned.

station_namestation_codeov_fiets_availabilityparking_spotselevators_workingwheelchair_accessibleshopsopening_hoursservice_desk_present
station_facilities
● 200 OK
"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_namestation_codeov_fiets_availabilityparking_spotselevators_workingwheelchair_accessible
1
2
3

Capabilities

Complete Dutch transit data extraction

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.

Journey Planner Extraction

Extract point-to-point itineraries including transfer nodes, operator details, train types, and total duration for any date combination.

Live Departures & Delays

Monitor station departure boards in real time. Capture planned versus actual departure times, platform changes, and cancellation flags.

Disruptions & Engineering

Track network outages, planned maintenance, and alternative travel advice. Timestamped updates for historical reliability analysis.

Ticket Pricing Tracking

Capture base fares, off-peak discounts, first-class upgrades, and NS International pricing across specific routes and dates.

Station & OV-fiets Data

Extract station facility availability, including live OV-fiets bicycle counts, parking capacity, and accessibility status.

NS International Routes

Scrape cross-border journey data to Belgium, Germany, and France, including Thalys, Eurostar, and ICE connections.

Crowd Forecasting

Extract NS's predictive crowd indicators for specific trains to analyse peak utilization and passenger density.

High-Frequency Polling

Execute sub-minute polling on departure boards for real-time applications without triggering IP blocks.

Rate Limit Management

Automated proxy rotation and request throttling to ensure continuous data flow from NS.nl endpoints.

// engagement pipeline

From station list to warehouse record

Brief in. Clean data out.

Define Scope
d 0

Provide station pairs, routes, or specific departure boards. We design the extraction schema together.

Pipeline Build
d 2–4

We configure Scrapy / Playwright crawlers, proxy rotation, session management, and rate-limit handling for ns.nl.

Validation & QA
d 4–6

Schema validation, null-rate checks, delay-outlier detection, and sample journeys before full launch.

Delivery
ongoing

JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or via Webhook on agreed cadence.

Under the hood

How our NS.nl pipeline handles transit scale

Extracting live transit data requires precise timing and resilient infrastructure. Here is how we manage continuous polling.

pipeline-monitor · ns.nl · live ● active
// fingerprinting
Identity rotation
TLS fingerprintrandomised
User-agentrotated
IP poolresidential
Challenges blocked0
// pagination
Page coverage
48,291 pages queued running
// observability
Pipeline health
99.9%
uptime
142ms
p99 lat
0.3%
null rate
2
alerts
High-frequency polling
Sub-minute departure updates

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.

Session management
Handling dynamic journey tokens

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.

Change detection
Only emit status changes

To prevent downstream flood, our pipeline hashes train statuses. We only trigger webhooks when a delay increases, a platform changes, or a cancellation occurs.

Schema stability
Resilient DOM parsing

Transit sites frequently update their frontend frameworks. We use multi-layer fallback chains to extract core data even if the presentation layer changes overnight.

Observability
Real-time pipeline metrics

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.

Applications

Who uses NS.nl data - and how

Teams across industries use ns.nl data to build competitive products and smarter operations.

01
Travel Aggregators

Integrate Dutch rail schedules and pricing into global multi-modal travel search engines.

02
Delay Compensation Services

Automate claims for passengers by tracking historical train delays against scheduled arrival times.

03
Corporate Travel Dashboards

Provide employees with real-time commute updates, platform changes, and disruption alerts.

04
Logistics & Supply Chain

Correlate passenger rail disruptions with freight network delays to optimise supply chain routing.

05
Real Estate Analysis

Evaluate property values based on actual transit connectivity, frequency, and reliability metrics.

06
Urban Planning

Analyse station facility usage, OV-fiets availability, and crowd forecasts to model city infrastructure needs.

Why DataFlirt

"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.

Technical Spec

NS.nl scraper - technical capabilities

Everything supported by our ns.nl scraper — rendered SPA elements, auth walls, rate-limit evasion and beyond.

JavaScript rendering
Full Playwright sessions - required for journey planner interactions and dynamic pricing
Supported
CAPTCHA bypass
Automated 2Captcha + CapSolver integration for high-volume endpoints
Supported
Residential proxy rotation
ISP-grade residential IPs from NL pools to mimic local traffic
Supported
Live delay tracking
Continuous polling of departure boards with sub-minute latency
Supported
Train composition
Extraction of train length and facility indicators (WiFi, quiet zones)
Supported
Webhook delivery
HTTP POST per delay event or platform change for real-time apps
Supported
Mijn NS ticket history
Gated personal travel history and invoice extraction requires user credentials
Partial
NS Flex personalized dashboard
Gated subscription management and specific user discount profiles
Partial
Infrastructure

Infrastructure powering the NS.nl pipeline

Open-source tooling on proven cloud infra — no vendor lock-in, full observability.

ScrapyPlaywrightPython 3.12RedisPostgreSQLApache AirflowAWS LambdaS3CloudWatch2CaptchaCapSolverResidential ProxiesDockerKubernetesGrafanaPrometheus
Scrapy + Playwright Stack

Scrapy handles crawl orchestration and retry logic. Playwright handles JavaScript rendering, session tokens, and interaction flows for the Reisplanner.

Localised Proxy Infrastructure

We maintain pools of residential ISP proxies specifically in the Netherlands to ensure NS.nl serves accurate regional data without blocking requests.

Cloud-Native Orchestration

Pipelines run on AWS Lambda for burst scaling during major disruptions. Airflow handles scheduling and SLA alerting. All state stored in managed Postgres.

Output & Delivery

Your data, your destination

Data delivered to where your team already works — no new tooling required.

JSON
Newline-delimited or nested - schema versioned per run
CSV
Flat file with typed columns - Excel/Sheets compatible
XLS
Formatted spreadsheet for business analysts
Parquet
Columnar format for BigQuery, Snowflake, Athena
AWS S3
Direct bucket delivery - compatible with any data lake
Webhook
HTTP POST per record for real-time downstream processing
API
REST endpoint to query your extracted historical data
PostgreSQL
Upsert into your existing schema with conflict resolution
S3
Direct bucket delivery — compatible with any data lake
// faq

Common questions.

About ns.nl scraping, legality, and pipeline operations.

Ask us directly →
Is scraping NS.nl legal?

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.

How fast can you detect a train delay?

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.

Do you extract data from the NS International site as well?

Yes. We can extract cross-border journey data, including Thalys, Eurostar, and ICE routes, pricing, and schedules from the NS International portal.

Can you track historical disruptions?

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.

What is the minimum viable engagement?

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.

Can I request a sample dataset?

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.

$ dataflirt scope --new-project --source=ns.nl ready

Tell us what
to extract.
We do the rest.

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.

hello@dataflirt.com · Bengaluru · IST · typical reply < 4h
Related Scrapers

More in travel flights hotels buses

Services

Data Extraction for Every Industry

View All Services →