We extract timetables, dynamic pricing signals, seat availability, and route details from SJ. 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 Fares & Timetables objects from sj.se. All fields typed and schema-versioned.
"departure_station": "Stockholm Central", "arrival_station": "Göteborg C", "departure_time": "2026-10-14T08:14:00Z", "arrival_time": "2026-10-14T11:25:00Z", "price_sek": 495.0, "train_type": "SJ Snabbtåg (X2000)", "train_number": "421", "transfers": 0
| # | departure_station | arrival_station | departure_time | arrival_time | duration_minutes | price_sek |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Route Details objects from sj.se. All fields typed and schema-versioned.
"route_id": "RT-421-STO-GOT", "origin": "Stockholm Central", "destination": "Göteborg C", "intermediate_stops": "['Södertälje Syd', 'Katrineholm C', 'Skövde C']", "train_model": "X2000", "onboard_services": "['Bistro', 'WiFi', 'Quiet Zone']", "status": "Scheduled"
| # | route_id | origin | destination | intermediate_stops | total_distance_km | operator |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Station Metadata objects from sj.se. All fields typed and schema-versioned.
"station_id": "ST-001", "station_name": "Stockholm Central", "city": "Stockholm", "latitude": 59.33, "longitude": 18.0583, "facilities": "['Lounge', 'Luggage Storage', 'Restrooms']", "short_code": "Cst"
| # | station_id | station_name | city | region | latitude | longitude |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Ticket Classes & Options objects from sj.se. All fields typed and schema-versioned.
"fare_type": "1 klass", "refundability": "Återbetalningsbar", "seat_selection_fee": 0, "wifi_included": true, "meal_included": true, "quiet_zone": false, "price_sek": 1295.0, "points_earned": 1295
| # | ticket_id | fare_type | refundability | seat_selection_fee | wifi_included | meal_included |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Complete list of extractable fields for Live Disruptions objects from sj.se. All fields typed and schema-versioned.
"disruption_id": "DIS-8942", "train_number": "421", "delay_minutes": 25, "reason": "Signal failure at Flemingsberg", "estimated_departure": "2026-10-14T08:39:00Z", "alternative_transport": false, "status": "Active"
| # | disruption_id | affected_route | train_number | delay_minutes | reason | estimated_departure |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 |
Our SJ scraper handles dynamic search sessions, multi-leg routing, and real-time availability across the entire Swedish railway network — bypassing geoblocks and rate limits.
Capture scheduled departure and arrival times, train numbers, and intermediate stops for all SJ and regional routes.
Monitor price fluctuations across 1st class, 2nd class, non-refundable, and flexible ticket tiers.
Extract capacity indicators and seat map availability to gauge route demand and booking velocity.
Parse complex journeys involving multiple transfers, varying operators, and layover durations.
Track real-time delays, cancellations, and track changes broadcasted on the SJ platform.
Extract geographical coordinates, facility details, and connection options for every station node.
Identify specific rolling stock (e.g., SJ Snabbtåg X2000, SJ InterCity, Regional) assigned to each route.
Configure hourly or daily pipelines to track price curves leading up to departure dates.
Extract the exact SJ Prio points yield for specific ticket classes and routes.
Brief in. Clean data out.
Provide origin-destination pairs, date ranges, and passenger configurations. We design the extraction schema.
We configure Playwright crawlers, Nordic proxy rotation, and session management to navigate SJ's search flow.
Schema validation, null-rate checks, and route completeness verification before full launch.
JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or Snowflake stage on agreed cadence.
SJ.se relies on complex session states and strict rate limits. Here is how we maintain extraction stability.
SJ implements strict rate limiting and geoblocking for high-velocity queries. We route requests through Swedish residential IPs to maintain realistic traffic patterns and prevent subnet bans.
The SJ booking flow is a single-page application requiring full JavaScript execution. We use Playwright to render the DOM, interact with date pickers, and wait for asynchronous network responses.
Retrieving pricing for multi-leg journeys requires maintaining session cookies and specific payload structures across multiple API calls. Our crawlers manage this state automatically.
To monitor dynamic pricing efficiently, we hash fare outputs and only deliver records where prices or availability have changed since the previous crawl.
Frontend updates to SJ.se can break standard selectors. We monitor null rates on critical fields like price and departure time, automatically alerting our engineers to patch selectors.
OTAs and metasearch engines ingest SJ fares to display accurate pricing and routing options to end consumers.
Revenue management teams analyse seat availability curves to predict peak travel periods and optimise their own pricing.
Insurance and logistics firms track real-time delays and cancellations to trigger automated compensation or rerouting protocols.
Sustainability platforms map train routes and distances to calculate accurate CO2 emissions for corporate travel reporting.
Mobility-as-a-Service (MaaS) providers combine SJ rail schedules with local bus and ferry data for door-to-door navigation.
Enterprise procurement teams verify that booked employee travel aligns with available market rates and corporate policies.
"SJ's dynamic pricing and timetable network form the backbone of Swedish transit — but extracting it requires navigating complex session states and SPA rendering."
Most teams underestimate the investment required: reliable SJ.se scraping requires Swedish residential proxies, full JavaScript rendering for their React frontend, session persistence for multi-leg searches, and anomaly monitoring. DataFlirt absorbs that complexity so your engineers can focus on the analysis — not the infrastructure.
Everything supported by our sj.se 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 manages the React SPA rendering and complex session state required for SJ search flows.
We maintain pools of Swedish residential ISP proxies to route requests natively, avoiding the strict rate limits applied to data centre IPs.
Pipelines run on AWS ECS. Airflow handles scheduling for forward-looking fare extraction. All state stored in managed Postgres.
Data delivered to where your team already works — no new tooling required.
Scraping publicly available timetable and pricing information is generally permissible under EU law, provided it does not breach database rights or cause technical harm. DataFlirt targets only public search interfaces. We do not extract personal data or circumvent authentication walls. Clients should review SJ's ToS and consult legal counsel for specific use cases.
We use Swedish residential proxies, full Playwright browser sessions, and request timing modelled on human behaviour. This ensures our requests appear as standard domestic user traffic, preventing IP bans and rate limiting.
Yes. We can configure pipelines to poll specific routes at high frequency to capture live delay minutes, platform changes, and cancellation notices as soon as they are published.
Extraction frequency is defined by your requirements. We can run forward-looking fare sweeps daily for the next 90 days, or poll specific high-priority routes hourly to capture dynamic price shifts.
Yes. The train model, operator, and onboard services (like Bistro or WiFi) are extracted as standard fields for every route.
Our smallest packages start at a defined matrix of origin-destination pairs with daily delivery. For extensive continuous polling across the entire network, we price based on compute volume.
Yes. We provide a sample run of up to 100 routes across various dates as part of the pre-engagement scoping process 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 continuous dynamic fare monitoring across the Swedish network — we scope, build, and operate the pipeline. Tell us what you need.