15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

Travel fares · Rail and bus fares

Rail and bus fare scraping for journey planners

Long-distance rail and intercity coach fares in Europe are increasingly yield-managed: the price depends on the departure, the fare family and how full the train is, and on some corridors several operators compete. Collect fares per operator, per departure and per fare family, from the market each operator sells in.

Pay per GB · No subscription · Prices in EUR, excl. VAT

Illustration. The URLs and values are fictional; the connection string is the real grammar.
€2.00
per GB on ARC Fast, excl. VAT
−44%
at 1 TB (€1.12 / GB)
185+
countries, city targeting
Never
expires — no subscription

Written for

  • Multimodal journey planners
  • Mobility and ticketing startups
  • Rail and coach operators' pricing teams
  • Transport policy researchers

The short answer

  • Competing operators move prices differently by corridor. Spain's CNMC reported Q2 2025 average basic fares up 15% on Madrid–Barcelona but down 8% on Madrid–Valencia year on year.
  • Demand is large and growing. Germany's statistics office counted 146 million long-distance rail passengers and 11 million long-distance coach passengers in 2025, coaches up 6%.
  • Store a fare per operator, train or coach, departure and fare family. A 'route price' averaged across operators hides exactly what planners and pricing teams need.
  • Use open timetable data where it exists. Spend proxy bandwidth on fares, which are rarely published as open data.

The problem

What goes wrong without the right IPs

One corridor, several operators, several websites

Where a corridor has competing operators, each one sells its own trains on its own site, with its own fare families. No single public page shows the whole market, so a planner that checks one site shows a partial price.

Fares step with load, per departure

Yield-managed long-distance fares rise as a train fills. A price observed for the 07:00 says nothing about the 09:00. Collect per departure, not per day.

Discount cards and passenger types change the price

Railcards, age-based fares and social tariffs all alter the quoted price. Collect a reference passenger, one adult with no discount card, and record any other profile explicitly. Otherwise series from different runs will not line up.

Through-tickets are not the sum of their legs

A journey with a change can be priced as one through-ticket or as separate tickets, and the two prices, conditions and passenger protections differ. Store which one you observed.

Station names do not join

Every operator has its own station identifiers and spellings. Normalise to a reference station list, from the timetable data you already hold, before comparing anything.

What to collect

What you can collect

Operator and train or coach number
Competing operators on one corridor are separate products.
Origin and destination station IDs
Normalised identifiers, so operators' data can be joined.
Departure and arrival times
Fares are per departure; duration is part of the product.
Fare family and class
Saver, semi-flex and flex fares with different conditions.
Price for the reference passenger
One adult, no discount card, so runs compare.
Conditions
Change, refund and train-bound or not.
Through-ticket or separate tickets
Different prices, and different protections if a connection is missed.
Availability or seats-left hint
Explains price steps on full trains.
Market, currency and observation time
Cross-border operators sell in several editions and currencies.

How it runs

How a collection run works

  1. 01

    Start from open timetable data

    Many operators and authorities publish timetables as open data, often in GTFS or NeTEx. Build your station and departure reference from those first; no proxy needed.

  2. 02

    Choose corridors and departures

    Pick the corridors your product covers and the departures per day that matter, such as the morning and evening peaks and the first and last trains. That is your fare matrix.

  3. 03

    Collect fares per operator with a sticky session

    Run each operator's public journey search on one residential exit per search flow, from the operator's home market. Rail sites often carry search state across steps, just like airline sites.

  4. 04

    Normalise and join

    Map stations to your reference IDs, fare families to a common scale, and departures to your timetable. Rows that do not join are your quality backlog.

  5. 05

    Publish with freshness

    Show every price with its observation time. Yield-managed fares can move between your run and the user's click, so say how fresh the price is.

Setup

Recommended setup

Timetables are reference data. Fares are stateful searches. Split them across pools the same way you would for air.

PlanRoleSessionTargetingPrice
ARC Fast
Rotating residential
Fare search per operator
Residential exits in the operator's home market. City targeting is available for listed metros such as Berlin, Milan or Paris when an operator localises offers.
Sticky, about 10 minutes per search flowCountry + city where it helps
€2.00 / GB
€1.12 at 1 TB (−44%)
ARC Basic
Rotating ISP
Timetable pages, station pages, fare-condition pages
Static or slowly changing pages that you only need when open data is missing. Cheapest per GB.
RotatingCountry
€0.75 / GB
€0.59 at 1 TB (−21%)

Prices are list prices in EUR, excl. VAT. Volume discounts apply automatically at checkout — full ladder on the pricing page.

Connect

One connection string per market

The country, city and sticky session are tokens in the username. Change the token, change the market; keep the session handle, keep the IP.

sticky · Germany · 10 min
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Swap _country-de for any market you quote. The full grammar is on the residential proxies page.

Illustration

What 150 corridors, priced daily costs

An illustration with round numbers — your pages, payloads and retry rate will differ. The arithmetic is the real price ladder.

Assumptions

Corridors
150
Departure dates ahead
30
Operator searches per corridor and date
3
Cadence
once a day
Weight per search flow
250 KB
Bandwidth per month
≈ 102 GB

On ARC Fast

€138.72per month, excl. VAT

102 GB bought in one purchase at €1.36 / GB (−32% volume rung, applied automatically).

The same 102 GB on ARC Basic: €69.36 at €0.68 / GB. Move down as soon as the cheaper pool holds up.

One search usually returns all departures for a date, which is why the matrix counts corridor-dates, not trains. Operators whose search API returns plain JSON come in well under 250 KB.

Bandwidth never expires, so a bigger single purchase is only ever cheaper per GB. See the ladder.

In depth

Rail and bus fares, in depth

How long-distance rail pricing works in Europe

Long-distance rail in much of Europe is sold with yield management: a limited number of seats at the lowest fares, rising as the train fills, and fare families with different flexibility. On corridors where the market has opened to competing operators, several such systems price the same city pair side by side.

Spain is the clearest public example, because its competition authority, the CNMC, publishes prices per corridor. Its press release for the second quarter of 2025 shows that competition does not move every corridor the same way:

Corridor (Spain, high speed)Average basic fare, Q2 2025Change vs Q2 2024
Madrid–Barcelona€63+15%
Madrid–Sevilla€49−9%
Madrid–Málaga€47−1%
Madrid–Alicante€36−9%
Madrid–Valencia€29−8%

The CNMC counted 11.8 million commercial high-speed passengers in that quarter, up 15.2%. For a journey planner, the lesson is to collect per operator and per departure, because a corridor average hides which train is cheap.

Intercity coach fares

Intercity coaches are the low-price competitor to rail on many corridors, and they use dynamic pricing too. Germany's statistics office (Destatis) counted 11 million long-distance coach passengers in 2025, up 6% after a flat 2024, against 146 million passengers on long-distance rail.

Coach fares are simpler to collect than rail: usually one operator per departure, fewer fare families and lighter pages. The same rules apply, though: per departure, a reference passenger, one sticky session per search flow, and the observation time on every row.

What EU passenger-rights rules say about tariffs

  • Rail. Article 5 of Regulation (EU) 2021/782 requires railway undertakings, ticket vendors and tour operators to offer contract conditions and tariffs to the general public without direct or indirect discrimination based on the passenger's nationality or the place of establishment of the undertaking or vendor within the Union, without prejudice to social tariffs.
  • Bus and coach. Article 4(2) of Regulation (EU) No 181/2011 contains the equivalent rule for carriers, again without prejudice to social tariffs.
  • For your data. Social and discount tariffs are legitimate and common. Keep them out of a general-public series, and label any profile-specific fare you do collect.

This summarises the texts; it is not legal advice.

Open data first, scraping second

Timetables, stops and often real-time running information are increasingly published as open data. Use them: they are complete, licensed and free, and they give you the skeleton every fare row has to join to.

Fares are the gap. Yield-managed prices are rarely in open feeds, so public-page collection fills that gap. Keep it to logged-out journey searches, respect each operator's terms and robots.txt, and keep concurrency per operator low; regional operators run small infrastructure. See handling 429 rate limits for polite backoff.

Rail, coach, air and ferry on one route

Multimodal planners compare modes on the same city pair: a train against a short-haul flight, a coach against both, a ferry against a land bridge. The same collection rules make them comparable: market, observation time, reference passenger and final price, as set out on the travel fare aggregation page.

On air, the equivalent pages are airline fare scraping and low-cost carrier fares. Sea crossings are covered under ferry fares, and the engine that puts them side by side under travel metasearch.

Works with anything that takes a proxy URL

  • Python requests / httpx
  • Playwright
  • Scrapy
  • Node.js
  • Docker

FAQ

Questions

Something not covered? Write to contact@arcproxies.io.

Are European train fares dynamic?

On many long-distance services, yes. Fares are yield-managed, with a limited number of seats at lower prices that rise as a train fills, and several fare families with different flexibility. Regional and commuter fares are more often fixed.

How do I compare rail operators on the same route?

Search each operator's own site for the same date, collect a fare per departure for the same reference passenger (one adult, no discount card), normalise station IDs and fare families, and compare departure by departure, not as one route average.

Do I need proxies for train timetables?

Usually not. Many operators and authorities publish timetables as open data in formats such as GTFS or NeTEx. Use those first. Proxies are useful for fares, which are rarely in open feeds and are often localised to an operator's home market.

Can rail operators charge foreigners more in the EU?

EU rail passenger rules require railway undertakings and ticket vendors to offer tariffs to the general public without discrimination based on the passenger's nationality or the place of establishment of the undertaking or vendor within the Union, without prejudice to social tariffs. This is a summary, not legal advice.

How much bandwidth does rail fare collection use?

One journey search returns all departures for a date, typically a few hundred kilobytes in a browser and much less from a JSON endpoint. 150 corridors, 30 dates and three operators a day comes to about 100 GB a month in our illustration, billed per GB with no expiry.

Should I collect intercity coach fares the same way as rail?

Yes, with the same rules: per departure, a reference passenger, one sticky session per search flow and a timestamp on every row. Coach sites are usually lighter, with fewer fare families, so they cost less bandwidth per search.

Sources & review

Last reviewed by the ARC Proxies team. Prices are read from the live catalog at build time.

  1. [1]CNMC (Comisión Nacional de los Mercados y la Competencia): Los viajeros en alta velocidad aumentaron un 15 % en el segundo trimestre del año
  2. [2]Destatis (Statistisches Bundesamt): Linienverkehr mit Bussen und Bahnen im Jahr 2025: Fahrgastzahlen nahezu unverändert
  3. [3]EUR-Lex (Official Journal of the European Union): Regulation (EU) 2021/782 on rail passengers' rights and obligations
  4. [4]EUR-Lex (Official Journal of the European Union): Regulation (EU) No 181/2011 concerning the rights of passengers in bus and coach transport

Travel fares

More on travel fares

OverviewProxies for travel fare aggregationAirline, hotel and rail fares change with the point of sale. Query each market from an IP inside it so the fare you store is the fare a traveller is quoted.Deep diveAirline faresCollect airline fares per point of sale: the same flight priced from each market, taxes itemised, one sticky session per search, billed per GB.Deep diveLow-cost carrier faresMonitor low-cost carrier fares where they are sold: on the airline's own site, priced per leg and per seat bucket, with mandatory fees split out. Per GB.Deep diveAirline ancillary pricesTrack airline ancillary prices (checked bags, seats, priority and fare bundles) per route, date and market, so a trip's true cost can be compared.Deep diveFerry faresMonitor ferry fares by route, sailing, season and vehicle (foot passengers, cars, cabins) from each operator's own public booking site. Per GB.Deep diveFare alertsBuild fare alerts and deal newsletters on verified prices: cheap watch-list polling, live confirmation from the right market before sending, per-GB costs.Deep diveCorporate travel benchmarkingBenchmark booked and negotiated corporate fares against public fares on the same flights, lead times and markets, for TMCs, travel managers and audits.Deep diveTravel metasearchHow to build a travel metasearch engine: partner feeds, cached prices, live re-pricing and look-to-book. Where proxies fit, and what it costs per GB.Deep diveHotel rate shoppingCollect competitor hotel rates per stay date, length of stay and market from local residential IPs. Sticky sessions per shop, billed per GB.Deep diveHotel rate parityCheck your hotel's own rates across OTAs, metasearch and markets from local IPs. Catch wholesale leakage and loading errors with evidence, billed per GB.GuideWhy flight prices differ by countryThe same flight costs different amounts in different countries because fares are filed and sold per point of sale, and taxes follow the departure airport.GuideDo airlines raise prices when you search?What regulators and researchers found about cookie and IP tracking in airline pricing, and what actually makes a fare change between two searches.GuideHow often flight prices changeFlight prices can change many times a day: filed fares update constantly and seat availability moves with every booking. What that means for collection.

Get started

Buy a gigabyte and try it on your own targets.

No subscription, no sales call. Code WELCOME15 takes 15% off your first purchase, and whatever you do not use is still there next quarter.