Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the FlightAware API page →
Travel & Lodging

FlightAware API & Scraper

The FlightAware API returns live flight-tracking data as clean JSON.

3 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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.

ItemWhat we measuredEvidence
ident that worksICAO airline code plus the numberUAL100, AAL100, BAW178 and DAL47 all resolved to a flight
ident that failsIATA airline code plus the numberUA100, AA100, BA178 and DL47 each returned NOT_FOUND, "no live flight found"
iata_identThe IATA form is returned in the response but is not accepted as inputUAL100 came back with iata_ident "UA100", which itself fails as an ident
registration as identA tail number works, and is the only case where aircraft.tail is filledN628JB returned tail "N628JB"; all four airline flights returned tail null
Time fieldsUnix epoch SECONDS in UTC, never localgate_departure.scheduled 1774659000 for UAL100
Time phasesgate_departure, takeoff, landing and gate_arrival, each with scheduled / estimated / actualUAL100: 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 departureDAL353 before pushback returned status "", not "scheduled"
airport_board airportICAO or IATA both acceptedKJFK and JFK both returned the John F Kennedy Intl boards
board enumarrivals, departures, enroute, scheduled. Anything else is rejected outrightboard=cargo returned INVALID_PARAM with the allowed list in error.detail
Board row timesLocal clock strings with a zone abbreviation and no date, each side in its own airport's zoneOne JFK arrivals row read departure_time "03:48p BST" and arrival_time "06:05p EDT"
Board sizelimit is capped at 20 rows per boardThe 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.

Live example

Real request and response JSON

Captured from the indexed primary action, flight_status, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/flightaware/v1/flight_status",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "ident": "UAL100"
  }
}
Captured response
{
  "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
    }
  }
}
Actions

What the FlightAware API does

ActionDescriptionConcrete use caseKey params
flight_statusLive 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_positionLive 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_boardLive 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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.flightaware.flight_status with {"ident":"UAL100"}.
Use cases

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.
FAQ

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.

docs / flightaware

FlightAware

FlightAware

base /flightaware/v13 endpoints
post/flightaware/v1/flight_status1 credit

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.

ParameterAllowed / rangeDescription
identrequired—Flight identifier — an airline flight number in ICAO form (UAL100, DAL47, BAW178) or IATA form (UA100, DL47, BA178), or a registration/callsign. IATA is auto-resolved to the operating flight. The aircraft's most recent/active leg is returned.
Try in playground →
post/flightaware/v1/live_position1 credit

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.

ParameterAllowed / rangeDescription
identrequired—Flight identifier — an airline flight number in ICAO form (UAL100, DAL47, BAW178) or IATA form (UA100, DL47, BA178), or a registration/callsign. IATA is auto-resolved to the operating flight. The aircraft's most recent/active leg is returned.
Try in playground →
post/flightaware/v1/airport_board1 credit

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.

ParameterAllowed / rangeDescription
airportrequired—Airport code — ICAO (KJFK, EGLL, EDDF) or IATA (JFK, LHR, FRA). ICAO is the most reliable. Returns the live activity boards for that airport.
board = arrivalsoptionalarrivals · departures · enroute · scheduledWhich activity board to return: arrivals, departures, enroute or scheduled.
limit = 20optional1–20Max flights to return from the board (1-20; FlightAware renders ~20 per board to logged-out requests).
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.