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
- €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
- 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.
- 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.
- 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.
- 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.
- 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.
| Plan | Role | Session | Targeting | Price |
|---|---|---|---|---|
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 flow | Country + 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. | Rotating | Country | €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.
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000Swap _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 2025 | Change 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]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]Destatis (Statistisches Bundesamt): Linienverkehr mit Bussen und Bahnen im Jahr 2025: Fahrgastzahlen nahezu unverändert
- [3]EUR-Lex (Official Journal of the European Union): Regulation (EU) 2021/782 on rail passengers' rights and obligations
- [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
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.