We extract train schedules, dynamic pricing, seat availability, and route intelligence from vr.fi. 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 Train Schedules objects from vr.fi. All fields typed and schema-versioned.
"train_number": "IC 27", "train_type": "InterCity", "departure_station": "Helsinki", "arrival_station": "Oulu", "departure_time": "2026-10-14T08:24:00+02:00", "arrival_time": "2026-10-14T14:32:00+02:00", "duration_minutes": 368, "transfer_count": 0
| # | train_number | train_type | departure_station | arrival_station | departure_time | arrival_time |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Ticket Pricing objects from vr.fi. All fields typed and schema-versioned.
"train_number": "IC 27", "departure_date": "2026-10-14", "ticket_class": "Eco", "price": 42.5, "currency": "EUR", "eco_class_price": 42.5, "extra_class_price": 57.5, "cancellation_policy": "Non-refundable"
| # | train_number | departure_date | ticket_class | price | currency | eco_class_price |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Seat Availability objects from vr.fi. All fields typed and schema-versioned.
"train_number": "IC 27", "departure_date": "2026-10-14", "available_seats": 142, "wheelchair_spaces": 2, "bike_spaces": 0, "pet_seats": 12, "upper_deck_available": true
| # | train_number | departure_date | total_seats | available_seats | wheelchair_spaces | bike_spaces |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Route & Stops objects from vr.fi. All fields typed and schema-versioned.
"train_number": "IC 27", "station_code": "TPE", "station_name": "Tampere", "scheduled_arrival": "2026-10-14T10:00:00+02:00", "scheduled_departure": "2026-10-14T10:05:00+02:00", "track_number": "3", "delay_minutes": 0, "stop_sequence": 4
| # | train_number | station_code | station_name | scheduled_arrival | scheduled_departure | actual_arrival |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Station Metadata objects from vr.fi. All fields typed and schema-versioned.
"station_code": "HKI", "station_name": "Helsinki Central", "city": "Helsinki", "coordinates": "60.1719, 24.9414", "accessibility": true, "luggage_lockers": true, "connecting_transit": "['Metro', 'Tram', 'Bus']"
| # | station_code | station_name | city | coordinates | ticket_office_hours | accessibility |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Our vr.fi scraper handles complex booking flows, dynamic pricing updates, and real-time transit schedules — with JavaScript rendering and session management built in.
Capture exact departure and arrival times, durations, and transfer requirements across the entire VR network.
Track price fluctuations for Eco, Extra, and Saver tickets as departure dates approach.
Extract available seat counts, specific wagon details, and speciality spaces (bikes, pets, wheelchairs).
Parse availability and pricing for sleeper cabins and car-carrier slots on northern routes.
Monitor live status updates, track changes, and delay minutes for active trains.
Extract station facilities, operating hours, and geocoordinates for the entire network.
Differentiate between HSL commuter zones and long-distance InterCity/Pendolino routes.
Extract content localised in Finnish, Swedish, or English based on parameter configuration.
Run pipelines at sub-hourly cadences to capture last-minute availability and price drops.
Brief in. Clean data out.
Provide station pairs, date ranges, or specific train numbers. We design the extraction schema together.
We configure Scrapy / Playwright crawlers, proxy rotation, and session management for vr.fi.
Schema validation, null-rate checks, price-outlier detection, and sample schedules before full launch.
JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or Snowflake stage on agreed cadence.
Transit booking systems are stateful and heavily rate-limited. Here is how we maintain stable data extraction.
VR.fi requires sequential API calls and cookie validation to surface accurate pricing and seat maps. We maintain stateful Playwright sessions to navigate the search funnel exactly as a human user would.
The modern VR frontend relies heavily on client-side React hydration. We intercept the underlying GraphQL and REST API calls directly from the browser network tab, extracting clean JSON before it hits the DOM.
Aggressive polling of train schedules triggers IP bans. We distribute requests across a pool of European residential and mobile proxies, keeping request volumes per IP well below VR's rate-limit thresholds.
For historical pricing analysis, we maintain a hash index of last-seen values per route. Subsequent runs only push diffs — reducing compute cost and downstream processing load.
Transit data is highly sensitive to timezones and daylight saving transitions. All extracted timestamps are normalised to UTC with explicit offset metadata for accurate downstream analytics.
Integrate Finnish rail schedules and pricing into global multi-modal travel platforms.
Competitor transit operators monitor VR's yield management strategies and advance booking curves.
Corporate travel platforms calculate precise CO2 emissions for rail versus domestic flight alternatives.
Urban planners and logistics firms analyse delay frequencies and route density across the network.
Tour operators combine real-time train availability with hotel inventory for automated package creation.
Local transit apps integrate long-distance rail schedules with first-mile/last-mile commuter data.
"Transit data decays the second a train departs. Querying historical pricing curves and live delay metrics requires an infrastructure built for continuous, stateful extraction."
Most teams fail at transit scraping because they treat it like static HTML. Extracting accurate seat maps and dynamic pricing from vr.fi requires mimicking complex booking flows, managing session cookies, and handling strict rate limits. DataFlirt absorbs that complexity so your engineers can focus on the analysis.
Everything supported by our vr.fi 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 route orchestration and deduplication. Playwright handles JavaScript rendering, cookie sessions, and the multi-step booking flow.
We maintain pools of residential ISP proxies across the EU region. Rotation happens per-session to maintain state during availability checks.
Pipelines run on AWS ECS for sustained polling. Airflow handles scheduling, dependency management, and SLA alerting. All state stored in managed Postgres.
Data delivered to where your team already works — no new tooling required.
Scraping publicly available timetables and pricing is generally permissible. DataFlirt targets only public, non-authenticated schedule and fare data. We do not extract personal user data or circumvent authentication walls. Clients should review VR's Terms of Service and consult legal counsel for specific use cases.
We use stateful Playwright sessions that programmatically navigate the search funnel, handling date selection, passenger configuration, and train selection to expose the final pricing and seat maps.
Yes. We can configure high-frequency polling pipelines targeting active routes to capture live status updates, track changes, and exact delay minutes.
Every pipeline run produces timestamped snapshots. We maintain a time-series table per route for pricing and availability from the date your pipeline starts, allowing you to build advance booking curves.
Our smallest packages start at a defined route list (e.g., top 50 station pairs) with daily delivery. For full network coverage or high-frequency polling, we price based on compute volume. Contact us for a scoped quote.
Yes. We provide a sample run of up to 20 routes across a 7-day departure window as part of the pre-engagement scoping process, allowing you to validate schema fit and data quality.
20-minute scoping call. Pilot dataset within the week. Production within two. Whether you need a one-off timetable dump or a continuous price-monitoring feed across the entire Finnish rail network — we scope, build, and operate the pipeline. Tell us what you need.