FlightAware API & Scraper
The FlightAware API returns live flight-tracking data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary flight_status endpoint returns a flight's ident, status, airline, aircraft, origin, destination and gate times, and you can pull a live_position and an airport_board. It is built for travel apps, logistics and flight-tracking products that need live flight data. One ReefAPI key, one shared credit pool, the standard envelope.
Flight identifiers, timestamps and status values
The most common failed call here is an IATA flight number. The identifier format, the time base and the status vocabulary are all different from what a booking site shows you. Every row was measured on 2026-08-26 and 2026-08-27 against live flights and the KJFK activity boards.
| Item | What we measured | Evidence |
|---|---|---|
| ident that works | ICAO airline code plus the number | UAL100, AAL100, BAW178 and DAL47 all resolved to a flight |
| ident that fails | IATA airline code plus the number | UA100, AA100, BA178 and DL47 each returned NOT_FOUND, "no live flight found" |
| iata_ident | The IATA form is returned in the response but is not accepted as input | UAL100 came back with iata_ident "UA100", which itself fails as an ident |
| registration as ident | A tail number works, and is the only case where aircraft.tail is filled | N628JB returned tail "N628JB"; all four airline flights returned tail null |
| Time fields | Unix epoch SECONDS in UTC, never local | gate_departure.scheduled 1774659000 for UAL100 |
| Time phases | gate_departure, takeoff, landing and gate_arrival, each with scheduled / estimated / actual | UAL100: gate_departure scheduled 1774659000, estimated and actual both 1774659600, ten minutes late off the gate |
| status values seen | "airborne", "arrived", and an empty string before departure | DAL353 before pushback returned status "", not "scheduled" |
| airport_board airport | ICAO or IATA both accepted | KJFK and JFK both returned the John F Kennedy Intl boards |
| board enum | arrivals, departures, enroute, scheduled. Anything else is rejected outright | board=cargo returned INVALID_PARAM with the allowed list in error.detail |
| Board row times | Local clock strings with a zone abbreviation and no date, each side in its own airport's zone | One JFK arrivals row read departure_time "03:48p BST" and arrival_time "06:05p EDT" |
| Board size | limit is capped at 20 rows per board | The parameter range is 1-20, and a logged-out board renders about 20 rows |
Board rows and flight_status speak different dialects. A board gives you ident, aircraft_type, the other airport as an IATA code and those local time strings; flight_status gives you epoch seconds and full airport objects with gate, terminal, timezone and coordinates. The ident on a board is already in ICAO form, so you can feed it straight back into flight_status.
Real request and response JSON
Captured from the indexed primary action, flight_status, on .
{
"method": "POST",
"url": "https://api.reefapi.com/flightaware/v1/flight_status",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"ident": "UAL100"
}
}{
"ok": true,
"meta": {
"api": "flightaware",
"endpoint": "flight_status",
"mode": "live",
"latency_ms": 3351.8,
"record_count": 1,
"bytes": 589768,
"cache_hit": false,
"charged_credits": 1,
"version": "1.0.0"
},
"data": {
"flight": {
"ident": "UAL100",
"display_ident": "UAL100",
"iata_ident": "UA100",
"friendly_ident": "United 100",
"flight_id": "UAL100-1774486910-schedule-29p:8",
"status": "arrived",
"cancelled": false,
"diverted": false,
"airline": {
"name": "United Air Lines Inc.",
"short_name": "United",
"icao": "UAL",
"iata": "UA",
"callsign": "United",
"url": "https://www.united.com/"
},
"aircraft": {
"type": "B789",
"friendly_type": "Boeing 787-9 Dreamliner (twin-jet)",
"manufacturer": "Boeing",
"model": "787-9 Dreamliner",
"engines": "2",
"engine_type": "jet",
"tail": null,
"heavy": true
},
"origin": {
"iata": "SYD",
"icao": "YSSY",
"name": "Sydney",
"city": "Sydney, Australia",
"timezone": "Australia/Sydney",
"gate": "26",
"terminal": "1",
"coord": {
"latitude": -33.9461,
"longitude": 151.1772
},
"delays": null
},
"destination": {
"iata": "IAH",
"icao": "KIAH",
"name": "Houston Bush Int'ctl",
"city": "Houston, TX",
"timezone": "America/Chicago",
"gate": "E5",
"terminal": "E",
"coord": {
"latitude": 29.9844,
"longitude": -95.3414
},
"delays": null
},
"gate_departure": {
"scheduled": 1774659000,
"estimated": 1774659600,
"actual": 1774659600
},
"takeoff": {
"scheduled": 1774659600,
"estimated": 1774660680,
"actual": 1774660680
},
"landing": {
"scheduled": 1774714680,
"estimated": 1774715700,
"actual": 1774715700
},
"gate_arrival": {
"scheduled": 1774715100,
"estimated": 1774716180,
"actual": 1774716300
},
"progress": {
"flown_miles": 7479,
"remaining_miles": 1,
"actual_miles": 7693,
"percent_complete": 100
},
"position": {
"latitude": 29.9934,
"longitude": -95.3487,
"altitude_100ft": null,
"groundspeed_kts": 141,
"heading": null,
"timestamp": 1774715672
},
"flight_plan": {
"route": "M082F290 DCT NOBAR B474 ISTEM/M084F330 DCT 23S163E DCT 18S168E DCT 14S172E/M084F350 DCT GITON DCT 05S179W DCT 01N170W/M084F370 DCT 06N160W DCT 11N150W DCT 17N140W/M084F390 DCT 21N130W DCT 24N120W/M084F410 DCT LTO/N0482F410 DCT DUTES DCT DLF DCT SAT HTOWN3",
"filed_altitude": 290,
"filed_speed": 486,
"direct_distance": 7479,
"planned_distance": 7503,
"ete_seconds": 55080
},
"last_updated": 1774716363
}
}
}What the FlightAware API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| flight_status | Live status for one flight by ident or flight number. Returns origin/destination (airport name, IATA/ICAO, gate, terminal, timezone, coordinates), scheduled / estimated / actual times for gate-out, take-off, landing and gate-in, aircraft type, airline, trip progress (percent complete, miles flown/remaining), the live position (altitude, groundspeed, heading) when airborne, and the filed flight plan. | Travel apps call flight_status to get live status for one flight by ident or flight number. | ident |
| live_position | Live ADS-B track for one airborne flight: current position plus the full position history (lat/lon/altitude/groundspeed per timestamp) FlightAware has logged for this leg. Use flight_status first to confirm the flight is airborne. For grounded / arrived flights `position` is null and `track` is whatever was logged on the ground. | Pricing monitors call live_position to get live ADS-B track for one airborne flight. | ident |
| airport_board | Live activity board for an airport: the arrivals, departures, en-route or scheduled flights FlightAware shows for that airport. Each row gives the flight ident, aircraft type, the other airport (IATA), and the scheduled/estimated times. Feed an ident back into flight_status for full detail. | Itinerary products call airport_board to get live activity board for an airport. | airport, board, limit |
Call flight_status from your stack
curl -X POST https://api.reefapi.com/flightaware/v1/flight_status \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"ident":"UAL100"}'import requests
r = requests.post(
"https://api.reefapi.com/flightaware/v1/flight_status",
headers={"x-api-key": REEF_KEY},
json={
"ident": "UAL100"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/flightaware/v1/flight_status", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"ident": "UAL100"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.flightaware.flight_status with {"ident":"UAL100"}.Who uses this API and why
- Travel apps call flight_status to show a passenger's live flight state.
- Logistics tracks cargo flights with live_position.
- Airport apps use airport_board for departures and arrivals.
Questions developers ask before integrating
Does ident accept an IATA flight number like UA100 or BA178?
No. Measured on 2026-08-26: UAL100, AAL100, BAW178 and DAL47 all resolved, while UA100, AA100, BA178 and DL47 each came back NOT_FOUND with "no live flight found". Use the three-letter ICAO airline prefix. The response then hands you the IATA form back in iata_ident (UAL100 returns "UA100"), which is useful for display but will not work as an input.
Are the timestamps UTC or local time?
flight_status and live_position return Unix epoch seconds, which are UTC by definition; there is no local-time field and no offset to apply. airport_board is the exception: its rows are local clock strings with a zone abbreviation and no date at all, like "03:46p EDT" or "12:26p +08", and each side is in its own airport's zone. One measured JFK arrival departed London at "03:48p BST" and landed at "06:05p EDT".
What is the difference between scheduled, estimated and actual?
Each of the four phases (gate_departure, takeoff, landing, gate_arrival) is an object with up to those three keys. scheduled is the published time, estimated is the current prediction, actual is what happened. UAL100 measured on 2026-08-26 had gate_departure scheduled 1774659000 with estimated and actual both 1774659600, so it left the gate ten minutes late. Before a flight departs, the actual key is absent from the object rather than present and null.
Which fields are empty before a flight has departed?
Measured on two JFK departures still at the gate: status is an empty string rather than a word, position is null, and every field in progress (flown_miles, remaining_miles, actual_miles, percent_complete) is null. The time objects hold only scheduled and sometimes estimated. One of the two, AZA603, had gate_departure and gate_arrival null entirely while takeoff and landing still carried times. flight_plan is partly filled: route and filed_speed were present, planned_distance was null.
Why is aircraft.tail null?
Airline flights looked up by flight number do not carry a registration in this response. tail came back null for UAL100, AAL100, BAW178 and DAL47. Looking a flight up by its registration instead does fill it: N628JB returned tail "N628JB". The aircraft object is otherwise populated either way, with type (B789), friendly_type ("Boeing 787-9 Dreamliner (twin-jet)"), manufacturer, model, engines and a heavy boolean.
Why did live_position return an empty track for an airborne flight?
Because status flips to airborne on schedule before any position has been logged for the leg. AAL100 read status "airborne" with meta.track_points 0 and position null, measured a minute after its scheduled gate departure. Three genuinely en-route flights checked at the same moment returned 624, 1490 and 152 track points with a live position. Read meta.track_points before you trust the track, and remember the track covers this leg only: the SIA24 track started at Singapore Changi and ran to the New Jersey coast.
What unit is altitude_100ft, and what is in a track point?
Hundreds of feet, as the name says: a measured value of 30 is 3,000 feet and 61 is 6,100 feet. A track point holds timestamp, latitude, longitude, altitude_100ft and groundspeed_kts. It does not include heading. heading exists only on the current position object, alongside the same five fields.
Why did I get a flight from months ago?
flight_status returns the most recent leg it has for that identifier, and if the route no longer runs, the most recent leg can be old. On 2026-08-27 UAL100 returned a Sydney to Houston leg with a scheduled gate departure of 2026-03-28 and status "arrived". There is no date parameter to pin a day, so always read gate_departure.scheduled and last_updated to see which day you actually got. flight_id encodes an epoch too, in the form IDENT-epoch-source-suffix.
What is the FlightAware API?
FlightAware API is a ReefAPI endpoint group for flightaware It returns live JSON through POST requests under /flightaware/v1.
Is the FlightAware API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. FlightAware calls use the same shared credit balance as every other ReefAPI engine.
Do I need a FlightAware login or account?
No login to FlightAware is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the FlightAware data?
The page example is captured from a live flight_status call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the FlightAware API use?
FlightAware actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call FlightAware from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call flightaware actions with the same key, credit pool and JSON envelope used by normal REST requests.