Most airline status feeds describe a flight with a single letter. The letters are compact, stable, and older than JSON, and each one covers more ground than it looks. This guide is what they mean, what they leave out, and how a phase fills the gap.
The codes
| Code | Name | What it actually covers |
|---|---|---|
S | Scheduled | Published and not yet departed. Includes flights that are delayed, boarding, or pushing back in a minute; S says nothing about any of that. |
A | Active | Left the gate. Covers taxiing out, airborne, and on approach: the whole span between pushback and touchdown. |
L | Landed | On the ground at the destination. Covers taxiing in, at the gate, and bags on the belt. |
C | Cancelled | Not operating. Can be reversed, and occasionally is. |
D | Diverted | Landed, or landing, somewhere other than the planned destination. |
R | Redirected | Re-routed to a different destination before landing, without the "emergency" flavour of a diversion. Rare. |
U | Unknown | The feed has no usable status. Common far ahead of departure and for flights the feed does not track live. |
NO | Not operational | The number exists in the schedule but did not operate on this date. |
DN | Data needed | The feed is waiting on a source. Treated as cancelled in practice: nothing will arrive. |
Three of these are ambiguous in a way that matters to anyone writing a notification. S includes "delayed". A includes "still on the taxiway" and "an hour from landing". L includes "not at the gate yet" and "bags on belt 7 twenty minutes ago". The code is where the aircraft was last filed, not what a passenger is experiencing.
What a phase adds
A phase is the code plus the times. FlightByte derives it like this:
| Code | Phase | Decided by |
|---|---|---|
S | scheduled | |
A | departed | No actual runway departure time yet: left the gate, not airborne. |
A | en_route | An actual runway departure time exists. |
L | landed | No actual gate arrival time yet. |
L | arrived | An actual gate arrival time exists. |
C, DN | cancelled | |
D | diverted | |
R | redirected | |
U, NO | unknown | Unless the feed's live state says the aircraft is airborne, which yields en_route. |
A boarding phase is reserved for feeds that report gate activity; most flights go from scheduled straight to departed.
Delay is deliberately not a phase. A flight forty minutes late is still scheduled, with status.delayed: true and departure.delayMinutes: 40. Two questions, two fields.
{
"status": {
"code": "A",
"label": "Active",
"phase": "departed",
"delayed": true,
"cancelled": false,
"diverted": false,
"departureGateDelayMinutes": 22
}
}code and label are the upstream's words, kept for display and debugging. phase is the enum; branch on it. See Flight phase for the full list and Flights → Phases in the reference.
The transitions worth an event
Most integrations do not care about every phase, only about four moments. FlightByte names them so a subscription can ask for just those:
| Event | Fires when the phase becomes |
|---|---|
flight.departed | departed or en_route from anything earlier |
flight.arrived | arrived |
flight.cancelled | cancelled |
flight.diverted | diverted |
flight.reinstated | anything from cancelled |
status.changed | anything else, including landed |
To be told about touchdown specifically, subscribe to status.changed and read flight.status.phase in the delivery; the 20-minute guide does exactly that.
The same moments, in other vendors' words
If you are migrating, or reading two feeds at once, this is the table to keep open.
| Moment | FlightByte phase | aviationstack | AeroDataBox | AeroAPI |
|---|---|---|---|---|
| Published, not departed | scheduled | scheduled | Expected, CheckIn, Boarding, GateClosed | "Scheduled" |
| Late, not departed | scheduled + delayed | scheduled | Delayed | "Delayed" |
| Left the gate | departed | active | Departed | "Taxiing / Left Gate" |
| Airborne | en_route | active | EnRoute, Approaching | "En Route" |
| On the runway | landed | landed | Arrived | "Landed / Taxiing" |
| At the gate | arrived | landed | Arrived | "Arrived / Gate Arrival" |
| Cancelled | cancelled | cancelled | Canceled, CanceledUncertain | "Cancelled" |
| Diverted | diverted | diverted | Diverted | "Diverted" |
| Nothing usable | unknown | — | Unknown | — |
Two things the table shows. aviationstack's active and landed have the same two-in-one problem as A and L, so a migration from it gains a distinction it never had. AeroAPI's status is a sentence, useful to display and fragile to branch on; its actual_off and actual_on times are the reliable signal, which is the same trick the phase derivation uses.
A rule for any feed
Whatever the vocabulary, the actual times are the truth. A status that says "active" with no actual take-off time is a flight on the taxiway; a status that says "landed" with an actual gate time is a flight whose passengers are already walking. Branch on the times when the words are ambiguous, and let the phase do it for you when it can.