When you buy a ticket, it shows a three-letter airport code – LHR, CDG, JFK. When that same plane lands, the navigation screen in the cockpit shows a four-letter code – EGLL, LFPG, KJFK. These aren’t separate systems for different airports. They’re two parallel codes for the same place.

One is for passengers and booking systems (IATA). The other is for pilots, air traffic controllers, and weather reports (ICAO).

Here’s what separates them and why both exist.

Two codes for one airport – and that’s intentional

Istanbul Airport has IATA code IST and ICAO code LTFM. Both refer to the same terminal building – they just get used in different contexts. IST is what you see on your ticket and the departures board. LTFM is what pilots, controllers, and meteorologists work with.

The confusion usually hits when a regular passenger stumbles across a four-letter code in a weather report or a flight tracking service and can’t figure out what airport it refers to. It’s still the same IST – just written to a different standard.

What is IATA

IATA (International Air Transport Association) is the trade association of the world’s airlines, founded in 1945. IATA handles the commercial side of aviation – fares, schedules, booking systems, ticket sales. Those three-letter airport codes on your boarding pass are their work.

What is ICAO

ICAO (International Civil Aviation Organization) is a specialized UN agency, established in 1944 in Chicago. It handles the technical and regulatory side of aviation – flight safety, air traffic standards, airspace rules. This is the system pilots and controllers use.

IATA – the three letters passengers see

The codes came out of practical necessity. Before standardization, each airline used its own abbreviations – some two letters, some three, some the full city name. Booking a ticket with two connections across three different airlines was a headache even for travel agents.

In the 1930s, US weather stations used two-letter airport codes – telegraph transmission was expensive, and every character cost money. As commercial aviation grew, there were more airports than two-letter combinations could cover. Two letters gave 676 options; three letters gave 17,576. The switch was straightforward.

Most IATA codes are readable at a glance – HAV is Havana, BKK is Bangkok, MAD is Madrid. Some cities got codes from the first letters of their name. Others inherited old weather station codes with a third letter added for uniqueness. That’s how Los Angeles became LAX (LA + a filler letter to make it three characters), Portland became PDX, and Phoenix became PHX. The X in these codes means nothing – it’s just a placeholder.

ICAO – four letters for the people flying the plane

ICAO built its system on a different logic. Four letters instead of three, with strict geography built in – the first letter identifies the world region, the second the country, and the remaining two the specific airport.

Turkey makes this clear immediately. The prefix is LT, and every Turkish airport starts with it – LTFM (new Istanbul), LTBA (Atatürk, now closed), LTAI (Antalya), LTAC (Ankara). The UK prefix is EG – hence EGLL (Heathrow), EGKK (Gatwick), EGCC (Manchester). France is LF, so LFPG is Charles de Gaulle and LFPO is Orly.

The US uses a simplified approach. A K prefix is added to the existing IATA code (KJFK, KLAX, KORD, KSFO). This was deliberate – American pilots don’t have to memorize a completely different set of letters for every airport they fly into.

Europe takes a geographic approach. The first letter marks the regional zone, the second the country within it, and the last two the specific airport. Continental Europe is split mainly between two zones – E (UK, Northern Europe, Germany, Poland) and L (France, Italy, Spain, Czech Republic, Austria, the Balkans, Turkey). This is why ICAO and IATA codes rarely match in Europe. Czech Republic is LK, so Prague is LKPR. Austria is LO, Vienna is LOWW. Poland is EP, Warsaw is EPWA. The first two letters tell you the country immediately, which is genuinely useful for pilots working international routes every day.

Niko

In the cockpit, I work entirely with ICAO. Flight plans, weather reports, NOTAMs – everything uses four-letter codes. IATA only comes up when I need to know where the passengers are actually going. When I tell a controller “proceeding to LTFM” – everyone knows exactly what that means. If I said IST, there might be a pause, because three years ago that code referred to a completely different airport.
Niko
· Boeing 777 pilot, explores cities on layovers

Where each code is used

IATA (3 letters)
  • Flight tickets and boarding passes
  • Booking websites
  • Arrivals and departures boards
  • Baggage tags
  • Check-in systems
  • Airline mobile apps
ICAO (4 letters)
  • Flight plans
  • Crew-to-controller communications
  • METAR and TAF weather reports
  • NOTAMs (notices to airmen)
  • Aviation charts and databases
  • Aviation software (ForeFlight, Jeppesen)

The short version: as a passenger, you only need IATA codes.

ICAO codes come up in two situations. First – you’re a pilot. Second – you’re digging into specific flight details through specialist tools or looking for technical information about a particular flight or airline.

When the codes match – and when they don’t

The US is almost the only place where the system is transparent. JFK in IATA, KJFK in ICAO. Just add K at the front. That holds for virtually every American airport with an established code.

The UK follows a different logic. Heathrow is IATA code LHR, ICAO code EGLL. EG is the UK, LL is Heathrow specifically. No connection to the letters LHR at all. The same pattern plays out at Gatwick (LGW becomes EGKK) and every other airport in the country.

Frankfurt makes the contrast even sharper. IATA code FRA, ICAO code EDDF. EDDF breaks down as Germany (ED) plus Frankfurt am Main (DF). The logic is there, but it’s not obvious from the outside.

Military bases and small private airfields often have only an ICAO code and no IATA code at all. IATA only assigns codes where commercial passenger services operate. RAF Lakenheath in England is EGUL – no IATA code. Biggin Hill Airport outside London is EGKB; it technically has IATA code BQH, but most booking systems don’t recognize it.

Renamings and code reassignments

In April 2019, Istanbul opened its new airport. The IATA code IST transferred from the old Atatürk Airport to the new Istanbul Airport; Atatürk was given the temporary code ISL and closed to passenger flights. This is a rare case of an established IATA code being reassigned. If you’re looking at historical flight data for “old IST” – keep in mind that before April 2019, that code referred to an entirely different airport. ICAO avoids this kind of ambiguity – Atatürk stays LTBA, and the new Istanbul Airport is LTFM.

Cities with multiple airports

London is served by six airports. Each has its own IATA code – LHR (Heathrow), LGW (Gatwick), STN (Stansted), LTN (Luton), LCY (City), SEN (Southend). There’s also an umbrella code, LON, which search engines use when you search for flights “to London” without specifying an airport.

Paris works the same way – the city code PAR covers CDG (Charles de Gaulle), ORY (Orly), and BVA (Beauvais-Tillé). New York is NYC for JFK, LGA, and EWR. Istanbul has IST (the new airport) and SAW (Sabiha Gökçen on the Asian side), but no city-wide umbrella code – which occasionally causes confusion when booking.

Metropolitan area codes are an IATA invention. ICAO has no equivalent. ICAO deals with specific airfields, not cities. Which makes sense – a pilot can’t land at “London in general.” They need a specific runway.

Practical examples

You’re booking a flight and see “IST – LHR”

That’s IATA. IST is the new Istanbul Airport, opened in 2018, about 35 km northwest of the city center. LHR is Heathrow. No further decoding needed – everything a passenger needs is right there.

You’re reading a METAR weather report for an airport

METARs always start with the ICAO code. “METAR LTFM 121150Z…” is the weather at Istanbul Airport. Many sites that display airport weather only accept ICAO codes – entering IST will return an error.

You’re tracking a flight online

When you follow a flight in real time, the flight card shows both codes – the IATA code for the airline and flight number (e.g. TK1980), and ICAO codes for the departure and arrival airports. Airports are shown in both formats.

You’re looking up a small-city airport

If an airport has no commercial flights, it has no IATA code. RAF Lakenheath in Suffolk has ICAO code EGUL and nothing else. If a flight search returns nothing for a location, the airport probably doesn’t have an IATA code – or you’re searching the wrong city.

When knowing ICAO is useless for a traveler

Honestly – 99% of travelers will never encounter an ICAO code in practice. If you fly as a passenger, don’t follow aviation beyond your boarding pass, and don’t track flights – there’s no reason to memorize four-letter codes. Every app, departures board, and booking system runs on IATA, and that will cover you for life. IATA codes are always printed on your ticket or booking confirmation.

ICAO becomes useful in three situations:

  • First – you like watching live flights on a tracker (the flight card shows the ICAO code).
  • Second – you’re planning a flight on general aviation in Europe (four-letter codes are used in all filings there).
  • Third – you just want to understand how aviation works at a slightly deeper level than most passengers.

If none of that applies to you, you can safely forget ICAO exists after reading this.

The IATA code on your ticket is all you need for any trip.

Quick reference: codes for major airports

Airport IATA ICAO ICAO logic
Istanbul Airport IST LTFM LT = Turkey, FM = airport
Heathrow, London LHR EGLL EG = United Kingdom
JFK, New York JFK KJFK K = USA + IATA code
Charles de Gaulle, Paris CDG LFPG LF = France
Frankfurt FRA EDDF ED = Germany
José Martí, Havana HAV MUHA MU = Cuba
Dubai (main) DXB OMDB OM = UAE
Changi, Singapore SIN WSSS WS = Singapore
Schiphol, Amsterdam AMS EHAM EH = Netherlands
Haneda, Tokyo HND RJTT RJ = Japan

FAQ

IATA only assigns codes to airports with scheduled commercial passenger services. Military bases, private airfields, and cargo-only terminals get an ICAO code but no IATA code. There are around 9,000 IATA codes worldwide and over 40,000 ICAO codes – that gap is exactly why.

Rarely, but yes. Istanbul in 2019 is the clearest example: IST transferred from Atatürk to the new Istanbul Airport. This tends to happen when a city moves its main airport. IATA generally avoids reassigning established codes because it breaks historical booking records and creates confusion in archived data.

A city code (or metropolitan area code) is an IATA umbrella code that groups all airports serving one city. LON covers LHR, LGW, STN, LTN, LCY, and SEN. PAR covers CDG, ORY, and BVA. NYC covers JFK, LGA, and EWR. Searching by city code shows flights into all of those airports at once.

The first letter is the region. E is Northern Europe, L is Southern Europe and the Mediterranean, K is the US, Z is China, Y is Australia, F is sub-Saharan Africa. The second letter narrows it to the country. The full prefix list is in ICAO Doc 7910 and on icao.int. The quickest lookup is typing the code into ourairports.com.

IATA grew out of commercial booking systems, where three letters were sufficient to cover a few thousand passenger airports worldwide. ICAO covers all of civil aviation, including 30,000+ small airfields and military bases. Three letters max out at 17,576 combinations; four letters give 456,976.