Trenitalia Train Ticket and Connection Scraper avatar

Trenitalia Train Ticket and Connection Scraper

Pricing

from $1.50 / 1,000 trips

Go to Apify Store
Trenitalia Train Ticket and Connection Scraper

Trenitalia Train Ticket and Connection Scraper

Scrape live Trenitalia train connections, schedules, ticket prices, transfers, delays, and fares across Italy and Europe. Extract structured Trenitalia timetable data for travel apps, price monitoring, analytics, and AI agents.

Pricing

from $1.50 / 1,000 trips

Rating

5.0

(3)

Developer

Jindřich Bär

Jindřich Bär

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

Share

Trenitalia / LeFrecce train tickets & connections scraper

Search Trenitalia train connections and ticket prices across Italy (and the international routes it sells, such as Munich–Rome), and get back a structured dataset of routes, times, transfers, train types, and per-class fares — ready to plug into spreadsheets, databases, dashboards, or AI agents.

Pulls live data from the official Trenitalia ticket shop (lefrecce.it), so you always get the same trains, prices, and schedules a passenger would see when booking online — including Frecciarossa, Frecciargento, Frecciabianca, Intercity, and Regionale services.

What you can do with it

  • Compare ticket prices between stations in real time — Roma–Milano, Roma–Napoli, Firenze–Venezia, and any other route the Trenitalia timetable covers, including high-speed Frecce services and cross-border connections.
  • See every fare class and offer per train — STANDARD, PREMIUM, BUSINESS, EXECUTIVE — with the cheapest BASE / Economy / Super Economy price and remaining availability for each.
  • Monitor fares over time by scheduling the actor to run daily / hourly and writing the results to your own datastore.
  • Build a travel-planning assistant — feed the JSON output directly into an LLM agent that answers "what's the cheapest Frecciarossa from Rome to Milan tomorrow morning" or "is there a direct train from Florence to Venice this afternoon."

Typical use cases: travel comparison sites, price-monitoring tools, business-trip planners, train spotters, journalists working on transport coverage, and AI agents that need a structured rail-data source for Italy.

Input

FieldRequiredDefaultDescription
fromyesDeparture station or city (e.g. "Roma Termini", "Milano Centrale", "Firenze")
toyesDestination station or city
datenotodayDeparture date (date picker, ISO YYYY-MM-DD)
timenonowDeparture time (HH:MM, 24-hour, Italy local time)
adultsno1Number of adult passengers (1–6)
childrenno0Number of child passengers (0–6)
maxResultsno20Maximum number of connections to push to the dataset (1–200)

Station names are resolved against Trenitalia's own location autocomplete, so partial names work: "Roma" resolves to the multi-station "Roma ( Tutte Le Stazioni )" (all Rome stations), while "Roma Termini" pins the single station. The actor prefers an exact (case-insensitive) match and otherwise takes Trenitalia's top-ranked suggestion.

Good to know

A few things worth knowing about the results:

  • Some connections have no price. Mixed itineraries that involve another operator's reservation system (or certain Intercity/Regionale transfers) come back with priceAmount: null and an informational note from Trenitalia — the schedule and trains are still returned.
  • Regionale legs may have no per-class fare grid. Regional trains are flat-fare, so their legs can have an empty offers array even though the connection's overall priceAmount is set.
  • Transfers are supported. Unlike a direct-only timetable, Trenitalia builds multi-leg itineraries; transfers and requiresTransfer reflect the number of train changes, and each leg is listed separately under legs.

Output

Each dataset item is one connection (a "solution"):

{
"id": "xc36fb263-fc28-4b9d-9b7d-58b9d76f957b",
"from": "Roma Termini",
"to": "Napoli Centrale",
"fromId": "830008409",
"toId": "830009218",
"departure": "2026-06-18T08:05:00.000+02:00",
"arrival": "2026-06-18T09:18:00.000+02:00",
"durationMinutes": 73,
"transfers": 0,
"requiresTransfer": false,
"priceAmount": 34.9,
"priceCurrency": "EUR",
"status": "SALEABLE",
"trainCategories": ["Frecciarossa"],
"legs": [
{
"trainNumber": "9608",
"trainCategory": "Frecciarossa",
"acronym": "FR",
"denomination": "FRECCIAROSSA",
"from": "Roma Termini",
"to": "Napoli Centrale",
"departure": "2026-06-18T08:05:00.000+02:00",
"arrival": "2026-06-18T09:18:00.000+02:00",
"durationMinutes": 73,
"offers": [
{
"serviceId": 30005,
"serviceName": "STANDARD",
"offerName": "Super Economy",
"priceAmount": 34.9,
"priceCurrency": "EUR",
"availableAmount": 12,
"status": "SALEABLE"
}
]
}
]
}
FieldDescription
idTrenitalia solution identifier
from / toConnection origin / destination station names
fromId / toIdTrenitalia location ids used for the search
departure / arrivalISO 8601 datetimes with Italy's local offset
durationMinutesTotal journey duration in minutes
transfers / requiresTransferNumber of train changes (0 = direct) / whether a change is needed
priceAmount / priceCurrencyCheapest fare for the connection (EUR), or null if no bookable offer
statusBookability status, e.g. SALEABLE
trainCategoriesDistinct train categories on the connection, e.g. ["Frecciarossa"]
legs[]Per-train legs, each with its train, times, duration, and offers[]
legs[].offers[]Per-service-class fares: serviceName (STANDARD/PREMIUM/BUSINESS/EXECUTIVE), offerName (BASE/Economy/Super Economy), priceAmount, availableAmount, status

Need a different data source?

If you're scraping connections across multiple operators, check our companion actors:

All these actors emit a comparable schema (from, to, departure, arrival, price, leg-level breakdown), so an aggregator agent can merge their outputs into a single multi-modal travel search.