FlightStats Flight Status Scraper - Delays, Gates, Tails avatar

FlightStats Flight Status Scraper - Delays, Gates, Tails

Pricing

from $2.72 / 1,000 results

Go to Apify Store
FlightStats Flight Status Scraper - Delays, Gates, Tails

FlightStats Flight Status Scraper - Delays, Gates, Tails

Track live flight status on FlightStats by flight number or route: delay minutes, gate, terminal, aircraft and tail number. Export to CSV, Excel, JSON or XML.

Pricing

from $2.72 / 1,000 results

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

ParseForge Banner

✈️ FlightStats Flight Status Scraper

πŸš€ Export live flight status from FlightStats in seconds. One flight page or a whole route board, 50 columns per flight, 5 rows in 7.8 seconds and roughly 120 flights a minute on a single run.

FlightStats by Cirium publishes a free flight tracker: type a flight number, get its status, its delay in minutes, the terminal and gate it leaves from, the belt the bags land on, the aircraft type and the tail number. This Actor reads that same public page and turns it into a flat table you can open in Excel.

Give it a flight designator such as BA112, an airport pair such as JFK-LHR, or a FlightStats URL you already have. A route returns the whole departure board for that day: 23 operating flights on JFK to LHR, 22 on ATL to MCO, measured 2026-09-08. Every row carries both the naive local time at the airport and a real UTC instant, so a mixed-timezone export still sorts correctly.

Coverage. The public tracker publishes roughly 3 days back and 2 days forward. Day minus 4 answers "out of date range" and day plus 3 returns an empty board. Older status sits behind Cirium's paid product and is not available here, so this Actor does not pretend to offer a flight history archive.

Who it is forWhat they get
🚚 Freight forwarders and ground handlersGate, terminal, baggage belt and live delay minutes for every inbound flight
🧳 Travel agencies and OTAsStatus for a customer's booked flight number, including the operating carrier behind a codeshare
πŸ“Š Aviation analystsDeparture and arrival boards for a route with aircraft type and tail number on every leg
πŸ€– Automation buildersA clean JSON feed to drive alerts in Make, Zapier or n8n without touching a paid aviation API
🏒 Corporate travel desksOne table of every flight your travellers are on today, with delay minutes ready to sort

πŸ“‹ What the FlightStats Flight Status Scraper does

  • Reads the public FlightStats flight tracker page and lifts the flight record straight out of the page state, so nothing depends on fragile CSS selectors.
  • Accepts three kinds of source at once: flight designators (BA112, AA 100, B6 615), airport pairs (JFK-LHR, LAX to SFO) and FlightStats URLs.
  • Sweeps a route board across four time windows so one route request covers the whole day rather than a six hour slice.
  • Drops codeshare duplicates by default: JFK to LHR lists 120 ticketed flight numbers for the same 23 aircraft, and you almost never want all 120.
  • Returns scheduled and actual times twice, once as airport local time and once as a UTC instant, plus the IANA time zone of both airports.
  • Carries delay minutes at departure and at arrival, terminal, gate, baggage claim, aircraft type, aircraft code and tail number.
  • Keeps the codeshare list on the row, so you can see that BA 112 also sells as AA 6925, AS 5250, AY 5512, EI 8812 and IB 3540.
  • Filters by status, by minimum delay, and by date inside the published window.
  • Rotates its exit IP every 100 requests, because the load balancer in front of the site answers HTTP 403 after roughly 182 requests from one address.
  • Rounds robin across every source you give it, so a cap of 50 rows spreads over all your flights and routes instead of being eaten by the first busy board.

🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is on the way. Until then the sample records below are real rows from a real run.

πŸ“Š Output

Every row is one ticketed flight number on one calendar day.

FieldTypeWhat it holds
flightNumberstringAirline code and number as printed on a boarding pass, for example BA 112
flightCodestringThe same designator with no space, for example BA112
sourceUrlstringThe FlightStats page this row was read from
airlineNamestringMarketing airline name
airlineCodestringTwo or three character IATA airline code
flightDatestringScheduled departure date at the origin airport, YYYY-MM-DD
flightStatusstringScheduled, Departed, Arrived, Cancelled or Diverted
statusDetailstringThe site's own wording, for example On time or Delayed by 45m
originAirportCodestringIATA code of the departure airport
originAirportNamestringFull airport name
originCitystringCity the departure airport serves
originCountrystringTwo letter country code
destinationAirportCodestringIATA code of the arrival airport
destinationAirportNamestringFull airport name
destinationCitystringCity the arrival airport serves
destinationCountrystringTwo letter country code
scheduledDeparturestringScheduled departure in airport local time, ISO 8601
scheduledDepartureUtcstringThe same instant in UTC
actualDeparturestringActual departure once off the gate, estimate before that
actualDepartureUtcstringThe same instant in UTC
departureTimeTypestringActual or Estimated, so you know which one you are reading
departureDelayMinutesintegerMinutes late off the gate, 0 when on time
scheduledArrivalstringScheduled arrival in airport local time
scheduledArrivalUtcstringThe same instant in UTC
actualArrivalstringActual arrival once landed, estimate before that
actualArrivalUtcstringThe same instant in UTC
arrivalTimeTypestringActual or Estimated
arrivalDelayMinutesintegerMinutes late on arrival, 0 when on time
flightDurationstringBlock time as the site prints it, for example 7h 10m
originTerminalstringDeparture terminal
originGatestringDeparture gate
destinationTerminalstringArrival terminal
destinationGatestringArrival gate
baggageClaimstringBaggage belt at the arrival airport
aircraftTypestringAircraft description, for example Boeing 777-300ER
aircraftCodestringIATA equipment code, for example 77W
tailNumberstringRegistration of the aircraft flying the leg
operatedBystringThe flight that actually flies the metal
isCodesharestringYes when this number is sold on someone else's aircraft
divertedstringYes or No
divertedAirportCodestringWhere a diverted flight actually went
cancelledstringYes or No
finalStatusstringOn Time or Delayed, set once the flight has landed
flightPhasestringClimbing, Cruising, Descending or Landed while airborne
originTimeZonestringIANA zone of the departure airport
destinationTimeZonestringIANA zone of the arrival airport
flightIdintegerThe site's own identifier for this leg on this day
codesharesarrayEvery other airline and number selling the same seat
scrapedAtstringISO timestamp of the read
errorstringOnly on an error row, null on a data row

Three real records from a run:

[
{
"flightNumber": "BA 112",
"flightCode": "BA112",
"sourceUrl": "https://www.flightstats.com/v2/flight-tracker/BA/112?year=2026&month=9&date=8",
"airlineName": "British Airways",
"airlineCode": "BA",
"flightDate": "2026-09-08",
"flightStatus": "Scheduled",
"statusDetail": "On time",
"originAirportCode": "JFK",
"originAirportName": "New York John F. Kennedy International Airport",
"originCity": "New York",
"originCountry": "US",
"destinationAirportCode": "LHR",
"destinationAirportName": "London Heathrow Airport",
"destinationCity": "London",
"destinationCountry": "GB",
"scheduledDeparture": "2026-09-08T18:30:00",
"scheduledDepartureUtc": "2026-09-08T22:30:00.000Z",
"actualDeparture": "Not Disclosed",
"actualDepartureUtc": "Not Disclosed",
"departureTimeType": "Estimated",
"departureDelayMinutes": 0,
"scheduledArrival": "2026-09-09T06:40:00",
"scheduledArrivalUtc": "2026-09-09T05:40:00.000Z",
"actualArrival": "Not Disclosed",
"actualArrivalUtc": "Not Disclosed",
"arrivalTimeType": "Estimated",
"arrivalDelayMinutes": 0,
"flightDuration": "7h 10m",
"originTerminal": "8",
"originGate": "Not Disclosed",
"destinationTerminal": "5",
"destinationGate": "Not Disclosed",
"baggageClaim": "Not Disclosed",
"aircraftType": "Boeing 777-300ER",
"aircraftCode": "77W",
"tailNumber": "G-STBK",
"operatedBy": "British Airways 112",
"isCodeshare": "No",
"diverted": "No",
"divertedAirportCode": "N/A",
"cancelled": "No",
"finalStatus": "N/A",
"flightPhase": "N/A",
"originTimeZone": "America/New_York",
"destinationTimeZone": "Europe/London",
"flightId": 1407025436,
"codeshares": [
{ "airlineName": "American Airlines", "airlineCode": "AA", "flightNumber": "6925" },
{ "airlineName": "Alaska Airlines", "airlineCode": "AS", "flightNumber": "5250" },
{ "airlineName": "Finnair", "airlineCode": "AY", "flightNumber": "5512" },
{ "airlineName": "Aer Lingus", "airlineCode": "EI", "flightNumber": "8812" },
{ "airlineName": "Iberia", "airlineCode": "IB", "flightNumber": "3540" }
],
"scrapedAt": "2026-09-08T15:39:28.912Z",
"error": null
},
{
"flightNumber": "DL 1562",
"flightCode": "DL1562",
"sourceUrl": "https://www.flightstats.com/v2/flight-tracker/DL/1562?year=2026&month=9&date=8&flightId=1406836587",
"airlineName": "Delta Air Lines",
"airlineCode": "DL",
"flightDate": "2026-09-07",
"flightStatus": "Arrived",
"statusDetail": "On time",
"originAirportCode": "ATL",
"originAirportName": "Atlanta Hartsfield-Jackson International Airport",
"originCity": "Atlanta",
"originCountry": "US",
"destinationAirportCode": "MCO",
"destinationAirportName": "Orlando International Airport",
"destinationCity": "Orlando",
"destinationCountry": "US",
"scheduledDeparture": "2026-09-07T23:59:00",
"scheduledDepartureUtc": "2026-09-08T03:59:00.000Z",
"actualDeparture": "2026-09-07T23:43:00",
"actualDepartureUtc": "2026-09-08T03:43:00.000Z",
"departureTimeType": "Actual",
"departureDelayMinutes": 0,
"scheduledArrival": "2026-09-08T01:33:00",
"scheduledArrivalUtc": "2026-09-08T05:33:00.000Z",
"actualArrival": "2026-09-08T01:00:00",
"actualArrivalUtc": "2026-09-08T05:00:00.000Z",
"arrivalTimeType": "Actual",
"arrivalDelayMinutes": 0,
"flightDuration": "1h 17m",
"originTerminal": "S",
"originGate": "T8",
"destinationTerminal": "B",
"destinationGate": "86",
"baggageClaim": "31",
"aircraftType": "Airbus A321 (sharklets)",
"aircraftCode": "32B",
"tailNumber": "N370DN",
"operatedBy": "Delta Air Lines 1562",
"isCodeshare": "No",
"diverted": "No",
"divertedAirportCode": "N/A",
"cancelled": "No",
"finalStatus": "On Time",
"flightPhase": "Landed",
"originTimeZone": "America/New_York",
"destinationTimeZone": "America/New_York",
"flightId": 1406836587,
"codeshares": [
{ "airlineName": "Aeromexico", "airlineCode": "AM", "flightNumber": "3604" },
{ "airlineName": "Korean Air", "airlineCode": "KE", "flightNumber": "3127" },
{ "airlineName": "LATAM Airlines", "airlineCode": "LA", "flightNumber": "6514" },
{ "airlineName": "SAS", "airlineCode": "SK", "flightNumber": "3118" },
{ "airlineName": "Virgin Atlantic", "airlineCode": "VS", "flightNumber": "5159" }
],
"scrapedAt": "2026-09-08T15:39:29.169Z",
"error": null
},
{
"flightNumber": "BA 178",
"flightCode": "BA178",
"sourceUrl": "https://www.flightstats.com/v2/flight-tracker/BA/178?year=2026&month=9&date=8&flightId=1407025585",
"airlineName": "British Airways",
"airlineCode": "BA",
"flightDate": "2026-09-08",
"flightStatus": "Departed",
"statusDetail": "On time",
"originAirportCode": "JFK",
"originAirportName": "New York John F. Kennedy International Airport",
"originCity": "New York",
"originCountry": "US",
"destinationAirportCode": "LHR",
"destinationAirportName": "London Heathrow Airport",
"destinationCity": "London",
"destinationCountry": "GB",
"scheduledDeparture": "2026-09-08T07:50:00",
"scheduledDepartureUtc": "2026-09-08T11:50:00.000Z",
"actualDeparture": "2026-09-08T07:44:00",
"actualDepartureUtc": "2026-09-08T11:44:00.000Z",
"departureTimeType": "Actual",
"departureDelayMinutes": 0,
"scheduledArrival": "2026-09-08T19:45:00",
"scheduledArrivalUtc": "2026-09-08T18:45:00.000Z",
"actualArrival": "2026-09-08T19:21:00",
"actualArrivalUtc": "2026-09-08T18:21:00.000Z",
"arrivalTimeType": "Estimated",
"arrivalDelayMinutes": 0,
"flightDuration": "6h 55m",
"originTerminal": "8",
"originGate": "Not Disclosed",
"destinationTerminal": "5",
"destinationGate": "Not Disclosed",
"baggageClaim": "Not Disclosed",
"aircraftType": "Boeing 777-200 / 200ER",
"aircraftCode": "772",
"tailNumber": "G-VIID",
"operatedBy": "British Airways 178",
"isCodeshare": "No",
"diverted": "No",
"divertedAirportCode": "N/A",
"cancelled": "No",
"finalStatus": "N/A",
"flightPhase": "Cruising",
"originTimeZone": "America/New_York",
"destinationTimeZone": "Europe/London",
"flightId": 1407025585,
"codeshares": [
{ "airlineName": "American Airlines", "airlineCode": "AA", "flightNumber": "6939" },
{ "airlineName": "Alaska Airlines", "airlineCode": "AS", "flightNumber": "5262" },
{ "airlineName": "Finnair", "airlineCode": "AY", "flightNumber": "5478" },
{ "airlineName": "Aer Lingus", "airlineCode": "EI", "flightNumber": "8878" },
{ "airlineName": "Iberia", "airlineCode": "IB", "flightNumber": "3564" }
],
"scrapedAt": "2026-09-08T15:39:29.900Z",
"error": null
}
]

Not Disclosed means the airport or airline did not publish that value; Heathrow, for instance, publishes terminals but almost never arrival gates. N/A means the field does not apply yet, such as a final on-time verdict on a flight that has not landed.

✨ Why choose this Actor

  • Reads the page state, not the pixels. The flight record comes out of the data the page ships with itself, so a redesign of the layout does not silently empty your rows.
  • Both clock faces. Local airport time and a real UTC instant on every timestamp, plus the IANA zone, so a spreadsheet of flights across five countries sorts correctly.
  • Codeshares handled properly. One flag tells you whether a number is sold on someone else's metal, and the whole codeshare family stays on the row.
  • A route is one input. You do not need to know which flight numbers fly JFK to LHR; ask for the pair and get the board.
  • Honest about the window. 3 days back, 2 days forward. No promise of an archive that the free site does not have.
  • Survives the rate rule. The exit IP rotates before the site's 403 threshold instead of after it.
  • No account, no key. Everything it reads is served to a logged-out visitor.

πŸ“ˆ How it compares to alternatives

ApproachFlight number lookupWhole route boardGate, terminal, beltTail numberHistorical archiveAccount needed
This Actorβœ…βœ… 4 window sweepβœ…βœ…βŒ 3 days back only❌
Cirium's own paid APIβœ…βœ…βœ…βœ…βœ…βœ… paid contract
Copying the site by handβœ…πŸ’ one page at a timeβœ…βœ…βŒβŒ
ADS-B trackers (OpenSky, ADSB.lol)🀏 by registrationβŒβŒβœ…πŸ€ limited❌
Airline websites one by oneβœ…βŒβœ…πŸ€ sometimes❌🀏 sometimes
A generic browser scraperβœ…πŸ€ fragile selectors🀏🀏❌❌

πŸš€ How to use

  1. Create a free Apify account. Sign up here and you start with $5 of free platform credit, enough to try this Actor properly.
  2. Open the Actor and paste what you want to track: a flight number such as BA112, an airport pair such as JFK-LHR, or a FlightStats URL.
  3. Pick a date inside the published window, or leave it empty for today.
  4. Set Max Items to the number of flights you want back.
  5. Click Start, wait a few seconds, then download CSV, Excel, JSON or XML from the Storage tab.

πŸ’Ό Business use cases

🚚 Ground handling and cargo recovery

Feed tomorrow's inbound flight numbers in every morning and get the terminal, gate and belt for each one, with the delay in minutes attached. Crews get rostered against reality instead of against the published schedule.

🧳 Proactive customer service for travel sellers

Run the booked flight numbers of every traveller departing today, filter to a minimum delay of 15 minutes, and you have the exact list of customers to email before they call you.

πŸ“Š Route and fleet analysis

Pull a route board for a few days and you have every operator on the pair, the aircraft type each one uses and the tail numbers in rotation, which is the raw material for a capacity or competitor study.

🏒 Duty of care for corporate travel

Cross the day's route boards with your traveller manifest and you know instantly which of your people are on a flight that is airborne, delayed, cancelled or diverted.

πŸ”Œ Automating FlightStats Flight Status Scraper

Schedule it in Apify to run every hour on the flight numbers you care about and pipe the dataset into Slack, a Google Sheet or your own webhook. Because the output is flat, arrivalDelayMinutes alone is enough to drive an alert rule, and flightStatus plus flightPhase tells you whether an aircraft is still climbing, cruising, descending or already on the ground. Apify's API returns the dataset as JSON, CSV or Excel from a single URL, so any tool that can read an HTTP endpoint can consume it.

🌟 Beyond business use cases

Track the family flight home and get a text when it pushes back. Follow a specific tail number across the week to see which routes it flies. Build a small board for the airport you live near. Settle a bet about whether a route is really always late by pulling three days of arrival delay minutes and taking the average. Teach a class about time zones with a table where the same flight has two departure clocks.

πŸ€– Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to get help building on top of it:

I am using the ParseForge FlightStats Flight Status Scraper on Apify
(https://apify.com/parseforge). It returns one row per ticketed flight number
per day with these fields: flightNumber, flightCode, sourceUrl, airlineName,
airlineCode, flightDate, flightStatus, statusDetail, originAirportCode,
originAirportName, originCity, originCountry, destinationAirportCode,
destinationAirportName, destinationCity, destinationCountry,
scheduledDeparture, scheduledDepartureUtc, actualDeparture, actualDepartureUtc,
departureTimeType, departureDelayMinutes, scheduledArrival,
scheduledArrivalUtc, actualArrival, actualArrivalUtc, arrivalTimeType,
arrivalDelayMinutes, flightDuration, originTerminal, originGate,
destinationTerminal, destinationGate, baggageClaim, aircraftType, aircraftCode,
tailNumber, operatedBy, isCodeshare, diverted, divertedAirportCode, cancelled,
finalStatus, flightPhase, originTimeZone, destinationTimeZone, flightId,
codeshares, scrapedAt, error.
Local timestamps have no offset and belong to the airport time zone in the
matching time zone column; the Utc columns are real instants. Coverage is about
3 days back and 2 days forward. Help me build ...

❓ Frequently Asked Questions

❓ How far back can I go?

About 3 days. Measured 2026-09-08, the tracker reports "out of date range" at 4 days back, and the route board returns nothing 3 days ahead. Anything older is part of Cirium's paid historical product and this Actor will not invent it.

❓ Do I need a FlightStats or Cirium account?

No. Everything this Actor reads is what a logged-out visitor sees. The departures and arrivals board and the historical flight status feature both redirect to a login, so they are deliberately out of scope.

❓ What is the difference between asking for a flight number and asking for a route?

A flight number returns exactly one row for that day. A route returns the whole departure board for the airport pair: 23 operating flights on JFK to LHR and 22 on ATL to MCO on 2026-09-08.

❓ Why did I get 120 rows from one route instead of 23?

Because you turned codeshares on. FlightStats lists every ticketed number, so one aircraft can appear six times under six different airlines. The default keeps only the carrier that actually flies it.

❓ What is operatedBy for?

It names the flight that actually flies the aircraft. On an operating flight it repeats that flight's own designator; on a codeshare it points at the metal, for example Virgin Atlantic 4 on a row sold as Air France 6753.

❓ Why is a row's flightDate a day earlier than the date I asked for?

A route board window can reach across midnight, so a board pulled for the 8th can include a flight that departs at 23:59 on the 7th. The flightDate column always reflects the real scheduled departure date at the origin airport.

❓ Why is the arrival gate Not Disclosed?

Not every airport publishes one. Heathrow gives terminals and baggage belts but almost never an arrival gate, while Atlanta and Orlando publish gate, terminal and belt. Not Disclosed means the source withheld it, never that the Actor failed to read it.

❓ Are the times local or UTC?

Both. Every timestamp comes twice: a naive local time at the airport and a matching UTC instant in the column ending in Utc. The originTimeZone and destinationTimeZone columns give the IANA zone so you can convert either way.

❓ What does departureTimeType mean?

It tells you whether the "actual" column is a real observed time or still an estimate. Before pushback the site shows an estimate, after pushback it shows the actual.

❓ How fast is it and what is the ceiling?

A five row run over one flight and two routes took 7.8 seconds and 13 requests. One request returns one flight, so throughput sits near 120 flights a minute. The hard ceiling is the size of the boards you ask for, not a page limit.

❓ Why do I sometimes get fewer rows than Max Items?

Because a flight number with no published status for that date returns nothing, filters drop rows, and duplicates are removed. Widen the date, drop the status filter, or add another route.

❓ Does it deduplicate?

Yes, on flight code plus date plus origin plus destination, so the same flight arriving through both a URL and a route board is written once.

❓ Do I need a proxy?

It is on by default and you should leave it on. The load balancer in front of the site returns a bare HTTP 403 after roughly 182 requests from a single address, so the Actor rotates its exit IP every 100 requests.

❓ Can I get the live position of the aircraft?

No. The tracker does carry position points once a flight is airborne, but they are empty before departure and disappear again after landing, so a column for them would be blank on most rows. Use flightPhase for a reliable in-flight signal.

❓ Is this the Cirium API?

No, and it is not a substitute for it. This reads the free public web tracker. If you need contracted coverage, guaranteed history or an SLA, buy the Cirium product directly.

πŸ”Œ Integrate with any app

Every run writes an Apify dataset you can pull as JSON, CSV, Excel or XML from one API URL, so Make, Zapier, n8n, Google Sheets, Power BI, Airtable and your own code can all read it without any extra glue. Webhooks fire when a run finishes, which is enough to push a delay alert straight into Slack or an on-call queue.

  • FlightAware Public Tracker Scraper for a second opinion on a flight from a different public source.
  • Flightradar24 Live Flights Scraper when you want live positions rather than schedule and gate data.
  • OpenSky Network Live Flight Scraper for raw ADS-B state vectors by registration.
  • ADSB.lol Live Flights Scraper for an open community feed of airborne aircraft.

πŸ’‘ Pro Tip: Browse the whole ParseForge collection at https://apify.com/parseforge for more travel and aviation data Actors that plug into the same workflow.

πŸ†˜ Need Help? Open our contact form

Not affiliated with, endorsed by or connected to FlightStats or Cirium. This Actor collects only publicly available data from pages that FlightStats serves to any logged-out visitor, and it does not access the Cirium API or any account-protected feature.