Historical flight status API

The flight already left.
Know exactly what happened.

A historical flight status API: query any past flight by number and date and get actual block times, aircraft and arrival delay — resolved into a single, boring, dependable record.

FR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430mFR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430mFR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430mFR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430mFR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430mFR5271 · MAN→BCN · Landed +101mEW2521 · BCN→STR · Landed +247mIZ337 · TLV→MXP · Landed +139mBA2669 · OPO→LGW · Landed +189mFR4227 · BTS→DUB · Landed +7mU23490 · KRK→LPL · Landed +20mVY7827 · LGW→BCN · Landed +13mU28189 · LGW→JMK · Landed +34mFR8231 · BCN→STN · Landed +217mFR3243 · BZR→MAN · Landed +430m

Try it

Recent flights, loaded from the same table the endpoint reads.

Try it
Try our console
FR5271Ryanair
2026-10-08DELAYED

Departure

MAN

MAN (MAN)

Scheduled15:05Z
Estimated16:50Z
Actual16:50Z
Delay1h 46m late
Block time—
Cached record+1h 41min

Arrival

BCN

BCN (BCN)

Scheduled17:25Z
Estimated19:05Z
Actual19:05Z
Delay1h 41m late

Aircraft

B738

Registration

—

Record

Historical

0 ms · 2026-10-12 07:18Z

Process

Three steps, zero ambiguity

Step 01

Name the flight

Enter the carrier code and number — LH400, BA249, UA935. The parser normalizes spacing and case for you.

Step 02

Pick the date

Any past departure date. The query resolves against the historical archive, not the live schedule.

Step 03

Read the record

Actual departure and arrival, block time, aircraft and delay — returned as one immutable record.

Built like an instrument panel

01

Every leg, on record

Scheduled versus actual on both ends, aircraft, registration and carrier for each historical departure and arrival.

02

One query shape

Flight number plus a date. No airport codes, no carrier lookup tables, no pagination games.

03

Sealed resolve

You send a number and a date. You get a settled record. How we produce it stays ours — not a vendor list, not a walkthrough.

04

Built for audits

Settled records are frozen in Postgres with delay math included, ready for claims, invoicing and reconciliation.

API

One request, one record

The console on this page is the product. Send the same query with your key and you get one resolved record back — no SDK, no vendor accounts, no pagination.

Idempotent historical queries
Delay math resolved server-side
Typed FlightStatusResponse payload

lookup.sh

# resolve a settled flight
curl -sS 'https://flight-api.dev/api/v1/flights/status\
  ?flightNumber=LH400&flightDate=2026-03-12'\
  -H 'x-api-key: flt_…'

# → 200
{
  "selected": { "status": "delayed", "delayMinutes": 74 },
  "meta": { "cached": true }
}

New · Webhooks

Stop polling. We push every board change.

Subscribe an https endpoint to any of the 52 airports we watch and every flight on their arrival and departure boards is POSTed to you — new legs, delays, cancellations, diversions, gate and time moves. Signed with HMAC-SHA256, retried with backoff, and never metered against your credits.

Watched boards

OTPCLJRMOTIABUDMLABCMVIECDGLTNVCEBCNCPHBHXFCOATHMANORYWROBSLBLQALCLGWMXPBRINAPMADVLCARNBGYNCESKPLISCRLCTAAGPBTSKRKKTWBRULCAWAWCPOHRKLPLOSLWMILBAPOZPSACIASTN

Boards are read every 30 minutes. The machine-readable catalogue lives at /api/v1/airports.

Popular queries

Routes people look up most

1,240

Carriers

9,800

Airports

10 yrs

History

Sealed

Resolver

FAQ

Fine print, upfront

How far back does the archive go?

Roughly 10 years of departures and arrivals, across 1,240 carriers and 9,800 airports. Once a flight is more than three UTC days old and ended in a disruption, we freeze the record — so the answer you query today matches what you queried last quarter.

How is a record resolved?

A closed resolver we own. One request, one record. Internals are not part of the contract and do not ship in the payload.

What counts as a delay?

We compute drift on both ends: actual versus scheduled for departure and arrival. The headline delay is the arrival drift in minutes, which is what most compensation and audit rules reference.

Can I get pushed data instead of polling?

Yes. Register an https endpoint against any of the airports we watch and every flight on their arrival and departure boards is POSTed to you as it changes — signed with HMAC-SHA256, retried with backoff, and not billed against your credits.

Is this for live tracking?

No — deliberately. Flights inside the three-day settle window are resolved live but never cached, and a flight still in the air returns a clean not_found until the record finalizes.

Ready when you are

Start with one flight.

Create an account, mint a key and resolve your first record in a single request.

Get access