Pull a flight up on a tracker and you'll see something like BAW117. Look at your boarding pass for the same journey and it says BA117. They're obviously related — but they are not the same identifier, they come from two different systems, and assuming they're interchangeable is one of the most common bugs in flight software. One is a radio callsign; the other is a commercial flight number. This post explains the difference, why they sometimes diverge completely, and how to resolve one to the other by API.
Two identifiers, two audiences
- Flight number (
BA117) is the commercial identifier — the airline's IATA 2-letter code plus a number. It's what passengers book, what prints on the boarding pass, and what scrolls on the departure board. It identifies a product: a scheduled service sold to travelers. - Callsign (
BAW117) is the operational identifier — what the crew says on the radio and what the transponder broadcasts on ADS-B. It's usually the airline's ICAO 3-letter code plus a suffix, spoken with the airline's telephony name (BAW117is "Speedbird 117"). It identifies a flight operation: a specific aircraft moving through controlled airspace.
The airline codes underneath are the same split we cover in ICAO vs IATA Codes: BA is British Airways' IATA code, BAW its ICAO code. So BA117 and BAW117 often describe the same journey — but "often" is not "always," and the gap is where bugs live.

Why they diverge
If callsign were always just "ICAO code + flight number," you could convert with string surgery. You can't, for three real reasons:
Codeshares. One physical aircraft, one callsign — but it can be sold under several flight numbers by different airlines. A single BAW117 operation might be marketed as BA117, AA6110, and IB4106 simultaneously. The callsign identifies the metal in the air; the flight numbers identify the tickets. There's no one-to-one mapping.
Callsign de-confliction. When two flights with similar-sounding callsigns are in the same airspace, controllers can mix them up — a genuine safety issue known as callsign confusion. To avoid it, airlines increasingly use alphanumeric callsigns that deliberately differ from the flight number: BA117 might actually fly as BAW23AX. The commercial flight number is unchanged; the radio callsign is scrambled on purpose.
Positioning, ferry, and charter flights. An aircraft repositioned empty between airports has a callsign but no passenger-facing flight number at all.
Side by side
| Flight number | Callsign | |
|---|---|---|
| Example | BA117 | BAW117 (or BAW23AX) |
| Airline code used | IATA (2-letter) | ICAO (3-letter) |
| Audience | Passengers, booking | Pilots, ATC, ADS-B |
| Where you see it | Ticket, boarding pass, board | Radio, tracker, flight plan |
| Shared across airlines? | Yes (codeshares) | No — one per operation |
| Always equal to the other? | No | No |

Resolving one to the other by API
Which identifier you have depends on where your data came from, and you'll often need to bridge them.
If you have a callsign (from a live tracking feed), resolve its route with the callsign → route endpoint, which maps a broadcast callsign to departure and arrival airports:
curl "https://skylink-api.p.rapidapi.com/routes/callsign/BAW117" \
-H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: skylink-api.p.rapidapi.com"{
"callsign": "BAW117",
"callsign_prefix": "BAW",
"airline_code": "BAW",
"departure_icao": "KJFK",
"arrival_icao": "EGLL",
"confidence": "high"
}If you have a flight number (from a booking or schedule), the flight status endpoint takes the IATA form directly:
curl "https://skylink-api.p.rapidapi.com/flight_status/BA117" \
-H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: skylink-api.p.rapidapi.com"And to bridge the airline codes themselves — BAW ↔ BA — the airlines endpoint returns both codes plus the telephony callsign for any carrier, so you can normalize between the operational and commercial worlds.
The practical takeaway
If you're joining a live ADS-B feed to a booking system, you are joining a callsign to a flight number, and the join is not a string match. Resolve the callsign's airline prefix to the IATA carrier, use the route and schedule to disambiguate, and treat codeshares as one operation mapping to many numbers. The hex address is the only truly stable key across all of it — see Mode S Hex Codes for why the ICAO 24-bit address, not the callsign, should anchor your tracking database.
SkyLink API gives you a free tier of 1,000 requests/month to resolve callsigns, flight numbers, and airline codes against, with paid plans starting at $19/mo for production traffic. It's available through the free trial — sign up, grab a key, and stop guessing whether BAW117 and BA117 are the same flight.
