Airport codes are supposed to be a system. Three letters, one airport, unambiguous. In practice, the system has been assigning codes to airports for almost a century, and a century is enough time for the three-letter namespace to accumulate a lot of weird corners. Some codes look nothing like the city they serve. Some codes serve multiple cities that are nowhere near each other. Some pairs of codes differ by a single letter and mean completely different continents. Travelers, mistakenly booked passengers, and even occasionally pilots have been tripped up by codes that do not behave the way a reasonable person would expect.
This is a collection of the most confusing airport codes in active use, organized by the specific kind of confusion they cause.
The ones that look nothing like the city
A surprising number of major airports have codes that reference something other than the name of the city they serve. Usually the reason is historical. The code was assigned when the airport had a different name, and the code persisted even after the airport was renamed.
ORD for Chicago. O'Hare International Airport was built on the site of Orchard Field, a small airport run by Douglas Aircraft during the Second World War. When it was renamed for Lieutenant Commander Edward O'Hare in 1949, the ORD code stuck. Travelers who see ORD for the first time often assume it must stand for some longer form of the word "Chicago," but the O, R, and D all come from Orchard.
MCO for Orlando. Same pattern. Orlando International Airport was built on the grounds of the former McCoy Air Force Base, a Strategic Air Command B-52 base that closed in 1975. The code MCO is a memorial to the old military installation. The word "McCoy" does not appear on any signage at the airport today, but the code remains.
IAD for Washington Dulles. This one is not a fossil, it is a deliberate choice. The code was intended to be DIA for Dulles International Airport, but DIA was already in use. The letters were rearranged to create something unique, and IAD was selected. It is one of the few major airport codes that is essentially an anagram of its intended abbreviation.
BDL for Hartford. Bradley International Airport in Connecticut serves Hartford and Springfield. The B, D, and L come from the name Bradley, which honors Lieutenant Eugene Bradley, a pilot killed in a training accident at the field in 1941. The airport is in Windsor Locks, not Hartford, and its code does not reference either location.
EWR for Newark. Newark Liberty International Airport's code uses the letters E, W, and R, which do not obviously spell anything related to Newark. The origin involves a 1930s-era set of weather station identifiers used by the National Weather Service, which standardized two-letter codes for airports in the early days of commercial aviation. Newark's two-letter code was EN, and when the system expanded to three letters, a W was inserted. It is also sometimes proposed that the code comes from the full spelling "Newark" with a specific selection pattern, but the records are ambiguous.
Cities with two or more airports
Some cities have more than one airport, and the codes for each airport tell you something about the geography and history of the local aviation system.
London has six. LHR is Heathrow, the main international hub to the west. LGW is Gatwick, to the south. STN is Stansted, to the northeast. LTN is Luton, to the north. LCY is London City, in the east inside the M25 motorway ring. SEN is Southend, further east. All six serve the London metropolitan area, and each has its own specific niche: Heathrow for long-haul and flag carriers, Gatwick for mixed traffic, Stansted and Luton for low-cost carriers, City for business travelers needing close access to the financial district, Southend for small-scale operations.
New York has three major airports plus outliers. JFK is the largest and handles most international traffic. EWR is Newark Liberty, just across the Hudson in New Jersey, also a major international gateway. LGA is LaGuardia, the smaller domestic-focused airport on the Queens waterfront. HPN is Westchester, a commuter airport north of the city. SWF is Stewart International, further north still. ISP is MacArthur on Long Island.
Tokyo has two. HND is Haneda, the closer-in airport that handles domestic flights and an increasing volume of international services. NRT is Narita, the international hub sixty kilometers outside the city. A traveler to Tokyo is usually routed through Narita on long-haul flights and through Haneda on shorter Asian flights, though the two have been converging in recent years.
Seoul has two. ICN is Incheon, the massive international hub opened in 2001. GMP is Gimpo, the older airport that now handles domestic and short-haul international services to Japan and China. Incheon took over almost all of Seoul's international traffic when it opened.
Istanbul has two, now renamed. IST used to refer to Atatürk Airport, the old hub on the European side of the city. When Istanbul Airport opened in 2018 as the new primary hub, the IST code moved with the commercial operation. Atatürk is now closed to commercial traffic. The older Sabiha Gökçen Airport on the Asian side uses the code SAW.

Beijing has two, using an old and a new name. PEK is Beijing Capital International Airport, and the code comes from the old Wade-Giles romanization "Peking." When Beijing Daxing International Airport opened in 2019, it was assigned the code PKX. Both codes now refer to Beijing, and airlines sometimes split services between the two.
Washington has three major airports. DCA is Reagan National, the closest to downtown, with restrictions that limit long-haul service. IAD is Dulles, about forty minutes west, the international hub. BWI is Baltimore-Washington, also used by Washington-area travelers and located between the two cities.
Paris has two and a third that is rarely used. CDG is Charles de Gaulle, the main international hub north of the city. ORY is Orly, the secondary airport south of the city. BVA is Beauvais-Tillé, about eighty kilometers north, which is technically in a different city but is marketed as Paris by some low-cost carriers.
The codes that differ by one letter
Some airport codes are so close to one another that they are a common source of booking errors.
GVA and GNV. GVA is Geneva, Switzerland, a global finance hub. GNV is Gainesville, Florida, home of the University of Florida. Travelers occasionally end up at the wrong one. The codes differ by a single letter, and both appear in the same IATA dropdown when you start typing "G."
YKM and YUM. YKM is Yakima, Washington. YUM is Yuma, Arizona. Both are small airports, and both codes begin with Y, though for different reasons. Yakima's Y is part of a station-identifier pattern. Yuma's Y comes from the actual name of the city. Travelers booking within the American West occasionally confuse them.
BRU and BRI. BRU is Brussels, Belgium. BRI is Bari, Italy. Both start with BR, and both are European cities. If you type "Brussels" quickly, the autocomplete occasionally surfaces BRI first on some platforms.
SYD and SID. SYD is Sydney, Australia. SID is the international airport on Sal Island, Cape Verde. Very different places, very similar codes. Sal's island is a popular tourist destination, which means the codes actually compete for the same type of traveler in some scenarios.
CPH and CPT. CPH is Copenhagen, Denmark. CPT is Cape Town, South Africa. Both are capital cities, both are major international hubs, and both start with the same two letters. Travelers have booked the wrong one.
AMS and AMM. AMS is Amsterdam Schiphol, a major European hub. AMM is Queen Alia International Airport in Amman, Jordan. The letters are close enough that autocomplete systems occasionally fail in unhelpful ways.
The codes that look like something else
A small but memorable set of airport codes spell or strongly resemble words in English or other languages, which creates an entirely different kind of confusion.
SUX for Sioux City. Sioux City, Iowa, has the code SUX, which has become a running joke in aviation. The local airport has sold merchandise that plays on the code, including shirts that read "Fly SUX." When IATA offered the airport a chance to change the code in the 1980s, the alternatives were reportedly all worse, and the community decided to embrace it.
PUS for Busan. The South Korean city of Busan uses the Romanization "Pusan" in some older systems, which produces the IATA code PUS. It looks unfortunate in English but is technically correct from a linguistic standpoint.
PIS for Poitiers. Poitiers in France has the code PIS, taken from the French name of the city. It is unfortunate in English and, to some extent, in French as well.
DOH for Doha. Doha's Hamad International Airport uses the code DOH, which is phonetically fine in most languages but has occasionally been noted for its resemblance to the Homer Simpson exclamation. This is not confusing in a booking sense, just a branding one.
FAT for Fresno. Fresno Yosemite International in California uses FAT, the initials of the old airport name Fresno Air Terminal. The airport has not changed its code, and the letters remain what they are.
Codes that are not where you think they are
FRA for Frankfurt. Most travelers assume FRA means Frankfurt am Main, Germany, and they are right. But Frankfurt an der Oder, a smaller city on the Polish border, has its own small airfield with a different code. The city name is the same, which is a minor source of confusion for people booking travel to Germany who do not know there are two Frankfurts.
LAX for Los Angeles. Not confusing in itself. But LGB is Long Beach, which is part of the LA metro area. SNA is John Wayne Airport in Orange County. ONT is Ontario International, in the Inland Empire. BUR is Hollywood Burbank. A traveler booking "a flight to LA" might be offered any of five airports depending on the booking platform, and only LAX is consistently treated as the default.

Canadian Y-prefixes
Almost every major airport in Canada has a code starting with Y. YYZ is Toronto. YVR is Vancouver. YYC is Calgary. YUL is Montreal. YEG is Edmonton. YHZ is Halifax. YOW is Ottawa. YWG is Winnipeg. YQB is Quebec City.
The Y prefix is a fossil of the Canadian weather and telegraph reporting system, which used Y to indicate a station co-located with a specific type of radio navigation aid. The second and third letters of the code come from the underlying two-letter station identifier of the specific airport. YYZ is Y plus YZ, where YZ was the code for Malton, the site where Toronto Pearson was built. YVR is Y plus VR for Vancouver. YUL is Y plus UL for Dorval, Montreal. You can almost read Canadian codes like a key to a regional telegraph map.
Codes that have changed
IATA codes are stable. Once assigned, they rarely change. But they do change sometimes, and the historical record of the changes is its own source of confusion.
New York's JFK was IDL from 1948 to 1963, when the airport was called Idlewild. After President Kennedy's assassination, the airport was renamed and the code was changed to JFK. It is one of the few major American airports that got a new code in the modern era.
Kyiv's airport situation is notable. IEV was the code for Kyiv Zhulyany, the original city-center airport. When Boryspil opened as a larger international hub further from the city, it was assigned KBP. For a long time, airlines treated KBP as the primary Kyiv airport and IEV as secondary. The two codes still coexist.
Mumbai's airport is BOM, based on the old English-language name of the city. When Mumbai was officially renamed from Bombay in 1995, the airport code did not change. BOM is now a historical artifact that points to a city name that officially no longer exists.
Why the system tolerates this
You might wonder why IATA does not simply clean up the codes. The answer is that the cost of changing an established code is enormous. Every reservation system, every airline internal database, every printed boarding pass, every baggage tag, every pilot's operations manual would need to be updated. The aviation industry has enormous amounts of operational data organized around the existing codes. Changing a major airport's code is a multi-year project that requires coordination across hundreds of stakeholders. It is almost never worth doing.
The result is that the code list accumulates historical oddities the way a very old city accumulates streets named after people nobody remembers. Travelers live with the codes because everyone else does. The weird ones are part of the texture of modern travel.
If you are ever unsure which airport you actually need to fly into, the safe move is to check the actual airport name on the booking, not just the code. A ticket to BRI is not a ticket to BRU, and a ticket to GNV is a problem if you thought you were going to GVA. The code is a useful shorthand, but it is not the destination. It is a pointer to a place.