Flight Route Timetable Scraper avatar

Flight Route Timetable Scraper

Pricing

from $1.80 / 1,000 scheduled flight founds

Go to Apify Store
Flight Route Timetable Scraper

Flight Route Timetable Scraper

Get the published timetable for any airport pair. One row per scheduled flight: airline, flight number, aircraft type, local departure and arrival times, block time, weekday pattern and the dates each schedule runs. Filter by airline, season or frequency. No account or login needed.

Pricing

from $1.80 / 1,000 scheduled flight founds

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Give it an airport pair and get the published timetable back as a clean table — one row for every scheduled flight, with the airline, flight number, aircraft type, departure and arrival times, block time, the days of the week it operates and the dates each schedule is valid for. It is built for airline network planners, aviation consultancies, schedule-data teams, travel products and anyone who needs to know exactly what flies between two airports and when, in a form they can load straight into a model or a spreadsheet.

What you can do with it

  • Map a competitor's schedule on a route — every flight number an airline publishes between two airports, with the aircraft it plans to use and the weeks each timing runs.
  • Build a schedule dataset for a market — feed in a list of airport pairs and get one consistent table covering all of them, both directions if you add both.
  • Find the capacity picture behind a route — how many flights a week, which days, which aircraft types, how many cabins are sold.
  • Track seasonal service — which airlines only fly a route in some months, and the exact dates each seasonal timing starts and stops.
  • Feed connection and rotation modelling — local departure and arrival times, the day marker for a flight that lands the next day, block time in minutes and the great-circle distance.
  • Keep a schedule history — schedule it to run daily or weekly and keep the results, so you can see when a timing, an aircraft type or a frequency changed.

What you get

One row per scheduled flight. A real record, abridged:

{
"routeId": "JFK-LHR",
"originIata": "JFK",
"originName": "New York City (JFK)",
"originCity": "New York",
"originCountry": "US",
"destinationIata": "LHR",
"destinationName": "London Heathrow (LHR)",
"destinationCity": "London",
"destinationCountry": "GB",
"airline": "Virgin Atlantic",
"airlineIata": "VS",
"flightNumber": "VS 26",
"aircraft": "Airbus A330-900neo",
"departureTimeLocal": "08:00:00",
"arrivalTimeLocal": "20:10:00",
"arrivalDaysLater": 0,
"blockTimeMin": 430,
"originTimeZone": "America/New_York",
"destinationTimeZone": "Europe/London",
"validFrom": "2026-11-01",
"validTo": "2027-03-13",
"validToOpenEnded": false,
"validityHasGaps": false,
"validityPeriods": [
{ "validFrom": "2026-11-01", "validTo": "2027-03-13", "daysPerWeek": 7 }
],
"routeIsComplete": true,
"operatesMon": true,
"operatesSat": true,
"daysOfWeek": ["sun", "mon", "tue", "wed", "thu", "fri", "sat"],
"daysPerWeek": 7,
"cabinClassCount": 3,
"publishedDurationMin": 440,
"distanceMi": 3440,
"distanceKm": 5536.1,
"routeIsSeasonal": false,
"collectedAt": "2026-08-16T09:14:00.000Z"
}

Input reference

FieldTypeDefaultWhat it does
routeslist of text— (required)The airport pairs you want, one per line: JFK-LHR. JFK > LHR, JFK to LHR and JFK LHR also work. Timetables are directional, so add both JFK-LHR and LHR-JFK for both directions. City-wide codes such as NYC or LON are not accepted — use the individual airports.
airlineslist of textemptyKeep only these airlines. Two-letter codes (BA, VS) match the airline code exactly, never a word inside another airline's name; longer text (Virgin, British Airways) matches the name. Empty means every airline on the route.
rowGranularityselectscheduleOne row per scheduled flight merges the published periods of the same timing into one line — the usual choice — and each merged line lists the periods it merged and says whether they run back to back. One row per validity period keeps every period separately, for exact week-by-week work.
languageselectenThe language used for airport names, e.g. German gives München (MUC). Airline and aircraft names are published in English whichever you pick.
yearFromintegeremptyKeep only schedules running in this year or later.
yearTointegeremptyKeep only schedules starting in this year or earlier.
minDaysPerWeekinteger0Keep only flights operating on at least this many days a week within a single published period. Set 7 for daily services only — a flight that runs six days in one period and five in another does not qualify.
includeSeasonalOnlytrue/falsefalseKeep only airlines whose service on the route runs in some months rather than all year.
includeCodesharestrue/falsetrueTurn off to be certain a flight sold under a partner airline's number can never appear.
maxFlightsPerRouteinteger500Ceiling on flights returned for any one route. Busy routes publish several hundred.
maxRoutesinteger50Safety ceiling on how many routes one run reads.
parallelRoutesinteger6How many routes to work on at once, 1–8.

Output fields

FieldDescription
routeIdThe pair this row belongs to, e.g. JFK-LHR.
originIata, destinationIataAirport codes, in the direction flown.
originName, destinationNameAirport names, in the language you chose.
originCity, originCountry, destinationCity, destinationCountryWhere each airport is.
airline, airlineIataThe airline publishing the flight.
flightNumber, flightNumberDigitsThe flight number, tidied, and its numeric part on its own.
flightNumberMatchesAirlinetrue when the flight number belongs to the airline it is listed under.
aircraft, aircraftIdThe aircraft type planned for the flight.
departureTimeLocal, arrivalTimeLocalScheduled times, local to each airport.
arrivalDaysLater1 when the flight lands the next day, 2 for two days later, 0 otherwise.
blockTimeMinGate-to-gate time in minutes, worked out across the two time zones rather than by subtracting clocks.
originTimeZone, destinationTimeZoneThe time zone each local time belongs to.
validFrom, validToThe outer dates this schedule runs between. On a merged row this is the earliest start and the latest end of the periods it merged, which is not the same as service on every day in between — see validityHasGaps.
validToOpenEndedtrue when the source published no end date; validTo is then empty rather than guessed.
validityBandCountHow many published periods were merged into this row.
validityPeriodsEvery one of those periods exactly as published — start, end and the weekdays it runs — so you can count the schedule yourself instead of reading the outer window as continuous.
validityHasGapstrue when there is at least one day inside the outer window on which the source publishes no service for this flight, false when the periods run back to back, empty when a missing date makes it impossible to tell.
daysOfWeekAreUnionOfBandstrue when the weekday pattern covers several merged periods rather than a single one.
operatesMonoperatesSunWhether the flight operates on each weekday. On a merged row this is true if it operates that day in any of the merged periods. Empty when the source published no weekday pattern at all.
daysOfWeek, daysPerWeekThe same pattern as a list, and how many days a week that is.
maxDaysPerWeekInAnyPeriodThe most days a week the flight runs in any single published period. This is what the minimum-days-a-week filter is judged on, because the merged figure above can be higher than any period on its own.
routeIsCompletetrue when every airline on the route was collected for this run. false means some of the route's airlines could not be read, so the route's table is partial and says so.
airlinesReadOnRoute, airlinesUnreadableOnRouteHow many of the route's airlines were collected, and how many were not.
cabinClassCount, cabinClassPatternHow many cabins are sold on the flight, and the published pattern. Cabin names are not published, so they are never guessed.
publishedDurationMinThe typical journey time published for the route.
distanceMi, distanceKmRoute distance in statute miles and in kilometres.
routeIsSeasonal, routeMonthsWhether the airline's service on the route is seasonal, and the months it runs. Empty when nothing was published.
isSharedSchedule, sharedWithFlightNumbersFlags the rare case where two airlines publish the same timing, without guessing which one operates it.
languageThe language your airport names came back in.
collectedAtWhen the row was collected.
flagsShort notes on anything that qualifies the row, e.g. that a merged row's weekdays cover several periods.

Pricing

You pay per result, plus a small amount for each route the actor works through.

What you pay forPrice
Scheduled flight found — one row in your results$1.80 per 1,000
Route timetabled — one airport pair taken all the way through$0.015 each

Working through a route means resolving both airports, finding every airline that flies the pair and collecting each of their published timetables. That happens whether the route turns out to have two flights or two hundred, and a route with no published service is charged too, because the work was still done — you get a clear "no service published" answer instead of silence. A route the source could not complete is not charged at all: if some of its airlines could not be read and the rest published nothing, you are told the route failed, and you pay nothing for it.

Worked example. Ten transatlantic pairs, averaging 40 scheduled flights each: 400 rows × $0.0018 = $0.72, plus 10 routes × $0.015 = $0.15. Total $0.87.

A single busy route such as JFK–LHR returns around 170 flights across five airlines for about $0.32.

Limits & what this actor cannot do

  • Schedules are a snapshot at the moment of collection. Airlines refile schedules constantly; a timing, an aircraft type or a frequency can change after the row was written.
  • It reports what the source publishes to the public. It does not check seat availability, does not hold or book anything, and it does not include fares.
  • Non-stop service only. These are published timetables for an airport pair, not connecting itineraries. Two airports with no published non-stop service are reported as having none — which is an answer, not an error.
  • Routes and schedules are seasonal. A route can be genuinely out of season on the dates you care about; that is reported as no published service rather than as a failure.
  • A route the source refuses to complete is reported as a failed route, never as "no flights". That holds airline by airline: if some of a route's airlines could not be read and the rest published nothing, the route is failed and is not charged — it is never reported as a route with no service. Failed routes are counted separately in the run summary, and a run where nothing could be read ends as a failed run instead of a green run with an empty table.
  • A partly collected route says so on every row. If one airline of five could not be read, the rows you get carry routeIsComplete: false with the counts, and the route is listed under partial routes in the run summary. You are never left comparing a one-airline table against a five-airline one without knowing.
  • Timetables are directional. JFK-LHR does not include the return; add LHR-JFK as well.
  • Not every airport is carried. Smaller fields may not be listed, and city-wide codes such as NYC or LON are rejected with the individual airports named instead of being guessed at.
  • Aircraft type is the type planned for the flight, which can differ from the aircraft that actually operates on the day.
  • How many cabins are sold is published; what those cabins are called is not, so cabin names are left empty rather than invented.
  • Flights are listed under the airline that operates them. A flight marketed by a partner airline under its own number is usually not listed separately.
  • Airport names follow the language you choose; airline and aircraft names are published in English whichever language you pick.
  • Merged rows describe a whole window, and that window can have holes in it. With one row per scheduled flight, the weekday pattern and block time cover the merged periods and each row says so. A schedule that runs in October and again in March is one row spanning both, with validityHasGaps: true and every period listed in validityPeriods — read those, not the outer dates, if you are counting departures. Choose one row per validity period when you want every period as its own line.
  • A per-route ceiling keeps the earliest departures. If a route publishes more flights than your ceiling allows, the day's earliest departures are kept and the number left behind is stated in the run summary — nothing is dropped without telling you.
  • Speed depends on the size of the job and on how quickly the source answers. No fixed throughput is promised.
  • The source's terms govern automated access. You are responsible for using the results lawfully and in line with those terms.

FAQ

Do I need an account on the source site? No. Nothing is signed into and nothing is set up — you fill in the routes and run it.

Does it need my login or password? No. It never asks for credentials of any kind.

Can I schedule it? Yes. Run it daily or weekly and keep each result to build a schedule history, which is the only way to see when an airline quietly changed a timing or swapped an aircraft type.

Are these flights bookable? They are published schedules, not live availability. A flight in your results is a service the airline has filed; whether a seat is for sale on a given date, and at what price, is a different question this actor does not answer.

What happens if a route can't be read? It is reported as a failed route and counted separately from routes that genuinely have no service. That distinction is the point of the run summary: you always know whether an empty result means "nothing flies here" or "this one did not come back".

Why do I sometimes get several rows with the same flight number? Because the airline publishes the same flight number with different timings or a different aircraft across the year — for example a winter timing and a summer one. Each distinct schedule is its own row, with its own valid-from and valid-to dates.

Can I get both directions at once? Add both pairs, for example JFK-LHR and LHR-JFK. Each direction is its own timetable and they routinely differ in frequency, aircraft and timings.