Which route to open is the central question of network planning. It is decided not by the aircraft but by the market: how many people want to fly between two cities, whether demand is growing, how many seats are already offered on the pair and by whom, whether the airports will let you in and what it costs. Below: how airlines and airports assess this, what of it can be measured from open data, and our rating of city pairs for Europe and India. It does not say 'fly here': it shows where the market is large, growing and already short of seats — where your own calculation should start.
When an airline decides whether to open a route, it first assesses not the aircraft but the market: how many people want to travel from one city to another. What matters is the city pair, not the airport pair — a Dublin–Brussels flight does not substitute for London–Paris, but for a Londoner Stansted and Heathrow are interchangeable. A good illustration is Newcastle–Madrid: there is no direct flight, yet 81,000 people a year travel between Newcastle's catchment area and Madrid, and 12,000–14,000 of them each leave via Heathrow, Stansted, Gatwick, Manchester and Edinburgh. Ryanair, incidentally, has already been on this pair — from 2017 to 2018 — and left.1,2
For pairs with no flights yet, gravity models are used: demand grows with population, income and the economy at both ends and falls with distance and travel time; neighbouring airports within 200 km are taken into account too. Such a model on 1,228 Germany–Europe pairs explained 70 to 76 % of the variation, but price was not included — there were no data. Where a market is already served, carrier shares are estimated with the quality of service index (QSI): a non-stop flight, a convenient time and a larger aircraft score more points. But QSI only splits existing demand; it does not forecast its growth.8,9
Market growth when a new, especially low-cost, carrier enters is called stimulation. On routes from London, Ryanair's arrival grew the market by 10–44 %, partly by taking passengers from British Airways. In the US, demand on 109 new Southwest markets rose by 28 % on average. The benchmark for a calculation is elasticity: −1.4 at route level but only −0.8 at national level. The difference is diversion: the UK CAA concluded that without low-cost carriers the national market would have grown almost as much, and their growth came largely at the expense of charters.3,10,11,12
The flip side of stimulation is falling yield. In Europe in 2016–2019, fares on pairs with a low-cost carrier were about 11 % lower, and the entry of a new low-cost carrier meant around −21 %. In the US, a non-stop Southwest lowered the fare on a pair by 27–29 %, even its mere presence at both airports without a flight on the pair by 9 %, while a second legacy carrier cut it by only ≈4 %. It works the other way too: after Go First's exit in India, fares for near-term Delhi–Mumbai flights rose by 37 %, and on the thin Delhi–Leh pair they multiplied.4,13,14
Frequency is a weapon of its own. The classic S-curve says that the passenger share grows faster than the frequency share: share = frequency to the power α divided by the sum of the same values for everyone, with α around 1.5. However, as early as 2006 McKinsey showed that where a low-cost carrier competes with legacy carriers, the effect almost disappears — passengers choose on price. So in Europe and India, where low-cost carriers hold most of the market, the S-curve should be applied with care; an alternative model looks at how far the schedule is from the desired departure time.15,16,17
Competition on a pair is usually measured by the number of carriers and by the Herfindahl–Hirschman index — the sum of squared shares; above 1,800 a market is considered highly concentrated. By this criterion almost any pair is concentrated. In Europe more than 60 % of city pairs are served by a single carrier, but they account for less than 20 % of revenue, and the most lucrative pairs have three or more carriers. In India the whole market is concentrated: in 2025 IndiGo carried about 64 % of domestic passengers, and together with Air India Group about 90 %.1,18,19,20
Even a good market can be closed off by infrastructure. At Level 3 airports demand exceeds capacity, and without a slot from the coordinator you cannot fly; in the EU a slot is kept only if it is used at least 80 % of the time. In Mumbai in 2026, it was proposed to temporarily withdraw 265 of 770 weekly international departure slots because of terminal reconstruction, and the new Navi Mumbai airport, with 20 million passengers a year, opened in December 2025. Night bans, such as Frankfurt's from 23:00 to 04:00, narrow the window for flights, and India's international pairs are subject to quotas under bilateral agreements — for example, no more than 66,000 seats a week with Dubai.21,22,23,24,25,26
Money for launching a route is a topic of its own. Airports publish incentive schemes: in Vilnius a new year-round route gets a 50, 40 and 30 % discount on charges over three years. The EU's 2014 guidelines allowed start-up aid of up to 50 % of charges for three years, but the 2026 draft of new guidelines proposes abolishing it altogether. Low-cost carriers react sharply to taxes: in 2025–2026 Ryanair removed about 800,000 seats in Germany and about a million in Belgium and moved aircraft to countries that are cutting charges. Planners themselves say an incentive is only a tool; in the end a route has to pay for itself.27,28,29,30
Social routes are subsidised by the state. In the EU these are public service obligations (PSO): if nobody flies commercially, the right to the route is tendered with exclusivity and compensation for losses; Norway spends NOK 2.43 billion on this, or NOK 1,000–1,500 per passenger. In India the UDAN scheme caps the fare at INR 2,500 per flight hour on half the seats and pays for 9–40 seats per flight. The auditors' verdict is sobering: of 774 routes awarded, only 54 (7 %) were operating after the subsidy ended, so traffic from subsidised years is poor proof of a market.7,31,32,33
Airports and consultants publish their own attractiveness metrics. ACI EUROPE calculates direct, indirect and hub connectivity of airports every year; tourism consultants such as Mabrian track seats, carriers, seasonality, prices and search demand; EUROCONTROL publishes a seasonality index by which Greece (88) is seven times more seasonal than Finland (13). But the underlying data of these indices are commercial schedules and bookings; only the final figures are open.34,35,36
Finally, routes in Europe are short-lived. In 2025 the EU closed 1,127 routes and opened 1,281 out of a network of about 14,800 — so roughly 7–8 % disappear each year. Low-cost carriers deliberately try out and close destinations; short and low-capacity routes, pairs of primary airports and Eastern European markets close more often, and seasonality and market share also significantly affect the risk of closure. Network carriers face one more trap: the profit of an individual sector depends on subjective cost allocation and does not see the contribution of connecting passengers. So our rating is most honestly applied to point-to-point routes, with hub pairs flagged separately.6,37,38
Open statistics show only part of the picture. Eurostat publishes passengers by airport pair but openly admits it does not see the true origin and destination, and it discloses airlines only as 'EU / non-EU'. So transfer traffic through a hub ends up in the pair statistics, and the competitors on a pair have to be reconstructed from schedules. Fares by pair are not openly available in Europe: researchers buy OAG data or scrape prices from websites, and as early as 2008 they called for a European counterpart to the US DB1B database, which publishes a 10 % sample of tickets.4,5,39,51
The picture in India is similar. The regulator DGCA publishes airline shares and passengers by city pair — domestic monthly, international quarterly — but without the carrier on a pair and without fares: DGCA monitors prices on some routes but does not publish the series52. The market is almost a duopoly: in 2025 IndiGo carried about 64 % of domestic passengers19.
| Source | What it provides | Granularity | Access |
|---|---|---|---|
| Eurostat avia_par_<cc> (Air passenger transport between main airports of <country> and their main partner airports) | passengers on board (PAS_BRD), carried (PAS_CRD), seats (ST_PAS), commercial passenger flights (CAF_PAS), each +_ARR/_DEP; no carrier (only an EU/non-EU label) | airport pair (reporting × partner, segment), month/quarter/year | free: Eurostat API/databrowser39 |
| Eurostat Reference Manual on Air Transport Statistics v14 | definitions: seats available, commercial air flight, dataset B1 by airport pairs of embarkation/disembarkation | methodology | free PDF40 |
| Eurostat HICP CP0733 Passenger transport by air (FRED mirror) | consumer price index for air passenger transport, by country and EU | country, month; not a pair | free (FRED / Eurostat prc_hicp_midx)41 |
| Destatis CPI Personenbeförderung im Luftverkehr | air fare price index over ~100 routes; only the index is published (domestic/Europe/intercontinental) | group of destinations, month | free (index)42 |
| IATA WASG Annex 12.7 — list of Level 2 / Level 3 airports | airport coordination levels | airport, season | free xlsx21,43 |
| AESA: Clasificación de los aeropuertos españoles | Level 3 / Level 2 of Spanish airports | airport, season | free44 |
| ACL airport info pages | IATA level, night rules (local rules), opening hours | airport | free45,46,47 |
| COHOR (French slot coordinator) | level changes; Level 3 in the site menu | airport, season | free48 |
| FHKV § 1 (Germany) | 17 coordinated/facilitated airports without a split by level | airport | free49 |
| ACNL AMS Capacity Declaration W26/27 | seasonal capacity, night limit, hourly runway values | airport, season, 20/60 min | free PDF50 |
Bottom line for the rating: market size and growth are open in both regions, the seat load factor on a pair only in Europe (Eurostat publishes seats), competition on a pair and fares are not. Slot-coordinated airports are known only in part: Spain, the UK, Dublin, Warsaw, part of France, four airports in India; Germany does not split its 17 airports by level 44,45,46,47,49,53,54,55,56,57,58,59. So slots are a flag in the rating, not a penalty.
One more caveat: the latest full year in Europe's open statistics is 2024. We downloaded the Eurostat tables at the end of October 2026, and for all 32 countries the series end in December 2024; for India, data run to 2026-07.
The rating answers one question: where is the market already large, growing and short of seats. For each pair three pillars are calculated, each a percentile within its own market (100 is best); the index is their average.
IndexEurope = ⅓ · ( P[ln passengers] + P[growth 2024/23] + P[passengers ÷ seats] )
IndexIndia = ⅓ · ( P[ln passengers] + P[growth, 12 months] + P[growth 2025/24] )
P[x] = share of pairs in the same market with a worse value of x, 0–100
| Term | What it is | Source |
|---|---|---|
| ln passengers | passengers per year in both directions; the logarithm keeps million-passenger pairs from eclipsing the rest | Eurostat PAS_CRD (2024), DGCA (12 months) |
| growth | passengers versus the previous year; in India 2025/24 uses the months present in both years (the DGCA series has no May 2024) | same series |
| passengers ÷ seats | seat load factor on the pair over the year — a measure of undersupply | Eurostat ST_PAS |
The rating includes pairs with at least 200,000 passengers a year in Europe and 150,000 in India — below that a market will not fill a daily narrowbody flight. European pairs beyond 4,500 km are in a separate table: that is no longer A320 or 737 territory. A pair in Europe is an airport pair (that is how Eurostat publishes; London airports are not merged), in India a city pair (Mumbai and Goa have two airports each, which are added together).
What the rating does not account for: fares and yield, transfer traffic via hubs (Eurostat counts people on board), seasonality, traffic rights and sanctions. Pairs with Russian airports are flights by Turkish and other non-European carriers; they are closed to European carriers.
At the top are pairs that combine a large market, growth and full aircraft. 5 of the first 30 involve Turkey and Russia; without them the top is taken by leisure and capital-city pairs in Spain, Germany and the Benelux: Frankfurt FRA — Palma de Mallorca PMI, Berlin BER — Rome FCO, Amsterdam AMS — Málaga AGP.
| # | Pair | km | Passengers | Growth 2024/23 | Load factor | Index | Constraints |
|---|---|---|---|---|---|---|---|
| 1 | Gaziantep GZT — Istanbul SAW | 832 | 908,584 | +29 % | 92 % | 93 | |
| 2 | Antalya AYT — Yekaterinburg SVX | 3,128 | 583,475 | +48 % | 92 % | 90 | Russia: non-EU carriers only |
| 3 | Nevşehir NAV — Istanbul IST | 567 | 523,328 | +30 % | 93 % | 89 | |
| 4 | Frankfurt FRA — Palma de Mallorca PMI | 1,251 | 957,995 | +14 % | 92 % | 87 | slots: LEPA |
| 5 | Berlin BER — Rome FCO | 1,178 | 521,832 | +63 % | 90 % | 87 | |
| 6 | Antalya AYT — Moscow SVO | 2,178 | 1,373,168 | +41 % | 87 % | 86 | Russia: non-EU carriers only |
| 7 | Amsterdam AMS — Málaga AGP | 1,883 | 912,495 | +19 % | 90 % | 85 | slots: LEMG |
| 8 | Warsaw WAW — Antalya AYT | 1,864 | 652,427 | +15 % | 92 % | 84 | slots: EPWA |
| 9 | Berlin BER — Barcelona BCN | 1,502 | 617,388 | +15 % | 92 % | 84 | slots: LEBL |
| 10 | Antalya AYT — Kazan KZN | 2,502 | 461,742 | +20 % | 94 % | 84 | Russia: non-EU carriers only |
| # | Pair | km | Passengers | Growth 2024/23 | Load factor | Index | Constraints |
|---|---|---|---|---|---|---|---|
| 11 | Brussels BRU — Barcelona BCN | 1,084 | 882,536 | +16 % | 90 % | 83 | slots: LEBL |
| 12 | Brussels BRU — Málaga AGP | 1,735 | 620,651 | +22 % | 90 % | 83 | slots: LEMG |
| 13 | Diyarbakır DIY — Istanbul SAW | 993 | 618,145 | +12 % | 94 % | 83 | |
| 14 | Barcelona BCN — Budapest BUD | 1,522 | 482,176 | +30 % | 90 % | 83 | slots: LEBL |
| 15 | Barcelona BCN — Paris CDG | 858 | 1,288,959 | +15 % | 89 % | 82 | slots: LEBL, LFPG |
| 16 | Antalya AYT — Moscow VKO | 2,135 | 1,547,990 | +8 % | 91 % | 82 | Russia: non-EU carriers only |
| 17 | Bergamo BGY — Bucharest OTP | 1,290 | 553,013 | +24 % | 90 % | 82 | |
| 18 | Hannover HAJ — Palma de Mallorca PMI | 1,531 | 462,388 | +33 % | 90 % | 82 | slots: LEPA |
| 19 | Barcelona BCN — Paris ORY | 827 | 1,129,008 | +11 % | 90 % | 82 | slots: LEBL, LFPO |
| 20 | Madrid MAD — Paris CDG | 1,062 | 1,055,318 | +21 % | 88 % | 81 | slots: LEMD, LFPG |
| 21 | Greven FMO — Antalya AYT | 2,475 | 389,274 | +47 % | 91 % | 81 | |
| 22 | Barcelona BCN — Seville SVQ | 809 | 1,113,832 | +10 % | 91 % | 81 | slots: LEBL |
| 23 | Madrid MAD — Milan MXP | 1,149 | 956,259 | +32 % | 86 % | 81 | slots: LEMD |
| 24 | Trabzon TZX — Istanbul SAW | 880 | 1,403,913 | +16 % | 88 % | 81 | |
| 25 | Antalya AYT — St. Petersburg LED | 2,547 | 757,738 | +18 % | 89 % | 81 | Russia: non-EU carriers only |
| 26 | Brussels BRU — Alicante ALC | 1,458 | 541,435 | +15 % | 91 % | 80 | slots: LEAL |
| 27 | Amsterdam AMS — Madrid MAD | 1,459 | 1,229,083 | +15 % | 88 % | 80 | slots: LEMD |
| 28 | Berlin BER — Palma de Mallorca PMI | 1,646 | 864,826 | +10 % | 91 % | 80 | slots: LEPA |
| 29 | Berlin BER — Madrid MAD | 1,850 | 538,897 | +17 % | 90 % | 80 | slots: LEMD |
| 30 | Köln CGN — Antalya AYT | 2,432 | 1,021,404 | +11 % | 90 % | 80 | |
| 31 | Hannover HAJ — Antalya AYT | 2,387 | 786,830 | +11 % | 90 % | 80 | |
| 32 | Dublin DUB — Málaga AGP | 1,868 | 831,603 | +7 % | 92 % | 80 | slots: EIDW, LEMG |
| 33 | Amsterdam AMS — Alicante ALC | 1,613 | 580,008 | +12 % | 92 % | 80 | slots: LEAL |
| 34 | Amsterdam AMS — Athens ATH | 2,182 | 619,734 | +21 % | 89 % | 79 | |
| 35 | Paris ORY — Rome FCO | 1,090 | 1,181,970 | +8 % | 91 % | 79 | slots: LFPO |
| 36 | Barcelona BCN — Rome FCO | 848 | 1,704,556 | +15 % | 87 % | 79 | slots: LEBL |
| 37 | Erzurum ERZ — Istanbul SAW | 1,009 | 463,594 | +14 % | 92 % | 79 | |
| 38 | Barcelona BCN — Porto OPO | 899 | 703,182 | +8 % | 92 % | 79 | slots: LEBL |
| 39 | Hamburg HAM — Palma de Mallorca PMI | 1,659 | 974,294 | +12 % | 89 % | 78 | slots: LEPA |
| 40 | Dublin DUB — Rome FCO | 1,886 | 502,678 | +17 % | 90 % | 78 | slots: EIDW |
| 41 | Antalya AYT — Chişinău RMO | 1,126 | 666,743 | — | 88 % | 78 | |
| 42 | Elazığ EZS — Istanbul SAW | 890 | 352,546 | +20 % | 93 % | 78 | |
| 43 | Katowice KTW — Antalya AYT | 1,775 | 638,307 | +10 % | 91 % | 78 | |
| 44 | Amsterdam AMS — Porto OPO | 1,595 | 419,980 | +20 % | 90 % | 77 | |
| 45 | Şanlıurfa GNY — Istanbul SAW | 911 | 311,864 | +33 % | 93 % | 77 | |
| 46 | Alicante ALC — Barcelona BCN | 404 | 582,616 | +35 % | 86 % | 77 | slots: LEAL, LEBL |
| 47 | Tenerife TFN — Madrid MAD | 1,772 | 1,785,863 | +25 % | 83 % | 77 | slots: LEMD |
| 48 | London LGW — Rome FCO | 1,406 | 923,766 | +16 % | 87 % | 77 | slots: EGKK |
| 49 | Athens ATH — Tel Aviv TLV | 1,194 | 1,006,877 | +32 % | 83 % | 77 | |
| 50 | Warsaw WAW — Barcelona BCN | 1,870 | 370,426 | +36 % | 89 % | 77 | slots: EPWA, LEBL |
| # | Pair | km | Passengers | Growth 2024/23 | Load factor | Index | Constraints |
|---|---|---|---|---|---|---|---|
| 1 | Madrid MAD — Santiago SCL | 10,719 | 777,760 | +49 % | 92 % | 94 | slots: LEMD |
| 2 | Madrid MAD — Lima LIM | 9,526 | 985,526 | +18 % | 93 % | 90 | slots: LEMD |
| 3 | Amsterdam AMS — Willemstad CUR | 7,834 | 720,627 | +18 % | 94 % | 89 | |
| 4 | Madrid MAD — Buenos Aires EZE | 10,087 | 1,077,881 | +17 % | 92 % | 88 | slots: LEMD |
| 5 | Lisbon LIS — São Paulo GRU | 7,935 | 864,997 | +18 % | 91 % | 87 | |
| 6 | Madrid MAD — São Paulo GRU | 8,378 | 786,006 | +22 % | 90 % | 86 | slots: LEMD |
| 7 | Paris CDG — Tokyo HND | 9,708 | 653,683 | +39 % | 88 % | 82 | slots: LFPG |
| 8 | Madrid MAD — Mexico City MEX | 9,065 | 1,208,106 | +11 % | 89 % | 80 | slots: LEMD |
| 9 | Zurich ZRH — Hong Kong HKG | 9,280 | 316,135 | +53 % | 91 % | 79 | |
| 10 | Barcelona BCN — Doha DOH | 4,862 | 590,053 | +41 % | 87 % | 79 | slots: LEBL |
Source: Eurostat avia_par, 2024, pairs with a full year of data; load factor — passengers ÷ seats.
In India the top of the rating is not Delhi — Mumbai (the largest pair, but its growth is moderate and both airports are slot-constrained) but pairs growing faster than the market: Bagdogra — Mumbai, Delhi — Varanasi, Indore — Pune. Growth of 50–70 % a year on a pair often means new flights or a new airport — it should be checked, not taken on trust.
| # | Pair | km | Passengers | Growth, 12 months | Growth 2025/24 | Index | Constraints |
|---|---|---|---|---|---|---|---|
| 1 | Bagdogra — Mumbai | 1,793 | 535,540 | +68 % | +27 % | 79 | slots: VABB |
| 2 | Ahmedabad — Bengaluru | 1,222 | 1,160,344 | +9 % | +21 % | 79 | |
| 3 | Ahmedabad — Kolkata | 1,620 | 572,452 | +12 % | +53 % | 78 | slots: VECC |
| 4 | Delhi — Indore | 662 | 1,125,785 | +12 % | +17 % | 78 | slots: VIDP |
| 5 | Bengaluru — Kozhikode | 298 | 418,074 | +79 % | +31 % | 78 | |
| 6 | Delhi — Varanasi | 667 | 986,296 | +14 % | +16 % | 78 | slots: VIDP |
| 7 | Indore — Pune | 500 | 306,353 | +58 % | +83 % | 77 | |
| 8 | Darbhanga — Delhi | 910 | 338,207 | +33 % | +79 % | 76 | slots: VIDP |
| 9 | Bengaluru — Nagpur | 889 | 518,196 | +19 % | +28 % | 76 | |
| 10 | Coimbatore — Hyderabad | 706 | 526,347 | +11 % | +51 % | 76 |
| # | Pair | km | Passengers | Growth, 12 months | Growth 2025/24 | Index | Constraints |
|---|---|---|---|---|---|---|---|
| 11 | Delhi — Rajkot | 917 | 382,487 | +72 % | +28 % | 76 | slots: VIDP |
| 12 | Darbhanga — Mumbai | 1,553 | 266,327 | +76 % | +107 % | 75 | slots: VABB |
| 13 | Bengaluru — Mangalore | 307 | 830,937 | +10 % | +18 % | 74 | |
| 14 | Delhi — Udaipur | 541 | 694,697 | +17 % | +12 % | 73 | slots: VIDP |
| 15 | Delhi — Imphal | 1,720 | 316,939 | +56 % | +30 % | 73 | slots: VIDP |
| 16 | Delhi — Mangalore | 1,750 | 250,375 | +42 % | +85 % | 72 | slots: VIDP |
| 17 | Bagdogra — Delhi | 1,126 | 1,260,830 | +25 % | −0 % | 72 | slots: VIDP |
| 18 | Guwahati — Hyderabad | 1,678 | 373,702 | +11 % | +57 % | 71 | |
| 19 | Delhi — Patna | 857 | 1,525,446 | +12 % | +1 % | 71 | slots: VIDP |
| 20 | Chennai — Kolkata | 1,386 | 1,141,602 | +14 % | +2 % | 71 | slots: VOMM, VECC |
| 21 | Chennai — Pune | 913 | 805,417 | +4 % | +24 % | 71 | slots: VOMM |
| 22 | Bengaluru — Coimbatore | 252 | 435,911 | +11 % | +28 % | 70 | |
| 23 | Bengaluru — Gorakhpur | 1,620 | 248,304 | +20 % | +226 % | 70 | |
| 24 | Hyderabad — Pune | 500 | 734,831 | +8 % | +18 % | 70 | |
| 25 | Gorakhpur — Mumbai | 1,377 | 263,443 | +18 % | +57 % | 69 | slots: VABB |
| 26 | Mumbai — Patna | 1,449 | 463,774 | +16 % | +18 % | 69 | slots: VABB |
| 27 | Mumbai — Varanasi | 1,248 | 911,684 | +4 % | +18 % | 69 | slots: VABB |
| 28 | Guwahati — Jaipur | 1,571 | 201,983 | +84 % | +55 % | 69 | |
| 29 | Hyderabad — Vishakhapatnam | 512 | 1,020,892 | +1 % | +20 % | 69 | |
| 30 | Bengaluru — Indore | 1,078 | 485,896 | +5 % | +38 % | 69 | |
| 31 | Delhi — Nagpur | 853 | 760,429 | +11 % | +8 % | 68 | slots: VIDP |
| 32 | Mumbai — Udaipur | 624 | 641,195 | +16 % | +6 % | 68 | slots: VABB |
| 33 | Chandigarh — Kolkata | 1,460 | 184,712 | +48 % | +81 % | 68 | slots: VECC |
| 34 | Mumbai — Nagpur | 683 | 780,802 | +9 % | +9 % | 68 | slots: VABB |
| 35 | Bengaluru — Lucknow | 1,544 | 823,200 | +7 % | +11 % | 67 | |
| 36 | Kochi — Pune | 975 | 225,278 | +20 % | +68 % | 67 | |
| 37 | Delhi — Gorakhpur | 658 | 445,378 | +5 % | +38 % | 67 | slots: VIDP |
| 38 | Bhubaneswar — Delhi | 1,277 | 1,201,331 | +7 % | +4 % | 67 | slots: VIDP |
| 39 | Kochi — Mumbai | 1,064 | 1,309,191 | +13 % | −3 % | 67 | slots: VABB |
| 40 | Bengaluru — Chennai | 268 | 1,516,377 | +4 % | +5 % | 66 | slots: VOMM |
| 41 | Goa — Indore | 842 | 179,514 | +46 % | +70 % | 66 | |
| 42 | Goa — Pune | 356 | 456,149 | +12 % | +14 % | 66 | |
| 43 | Bengaluru — Delhi | 1,709 | 4,877,158 | +7 % | −2 % | 65 | slots: VIDP |
| 44 | Bengaluru — Tiruchirappalli | 292 | 210,620 | +43 % | +29 % | 65 | |
| 45 | Delhi — Kolkata | 1,313 | 2,912,808 | +5 % | −1 % | 65 | slots: VIDP, VECC |
| 46 | Kolkata — Mumbai | 1,666 | 2,215,829 | −2 % | +10 % | 65 | slots: VECC, VABB |
| 47 | Bengaluru — Patna | 1,580 | 643,043 | −2 % | +29 % | 65 | |
| 48 | Delhi — Nashik | — | 164,614 | +41 % | +78 % | 65 | slots: VIDP |
| 49 | Delhi — Deoghar | 1,059 | 192,376 | +34 % | +37 % | 64 | slots: VIDP |
| 50 | Bengaluru — Port Blair | 1,640 | 298,793 | +33 % | +16 % | 64 |
Source: DGCA, domestic flights by city pair, last 12 months to 2026-07; compiled by github.com/Vonter/india-aviation-traffic (ODbL).
The rating looks at the market but not at rivals: Eurostat does not publish the carrier on a pair. They can be seen from the aircraft themselves. Every airliner broadcasts its position via ADS-B, and the OpenSky receiver network turns this into flights with departure and arrival airports. We collected departures and arrivals at the top airports — 18 days in autumn 2026 — and aggregated the flights by pair and carrier; the call sign gives the carrier, the aircraft register the type. This is no longer Eurostat's 2024 but the current schedule — an autumn one: leisure pairs have more flights in summer.
The picture is familiar from the theory above. On large capital-city pairs two or three carriers share the market: Madrid — Paris is split evenly between Iberia and Air France, Barcelona — Orly is two-thirds Vueling. Pairs between secondary cities are almost purely low-cost: Berlin — Rome is held by Ryanair and easyJet, Barcelona — Budapest by Wizz Air and Ryanair, Bergamo — Bucharest by Ryanair and Wizz Air; that is exactly where a new low-cost carrier finds entry most expensive and a network carrier cheapest. The fleet on these pairs is still old: of flights with a known type only about 18 % are operated by new-generation aircraft (A320neo, A321neo, 737 MAX, A220), the A321neo about 2 %; so the fuel advantage the calculator gives the A321neo is not yet shared by every rival on the pair.
On Europe's medium-haul pairs the picture is the same everywhere: previous-generation A320s and 737-800s, with neo and MAX only scattered, most visibly at low-cost carriers (Wizz Air flies Barcelona — Budapest with the A321neo). On long-haul pairs the fleet is newer: 787s and A350s sit alongside previous-generation A330s and 777-300ERs (except TAP's A330-900).
| # | Pair | Flights per day | Leader share | Who flies: flights per day (types) |
|---|---|---|---|---|
| 1 | Gaziantep GZT — Istanbul SAW | — | — | no flights seen |
| 2 | Antalya AYT — Yekaterinburg SVX | — | — | no flights seen |
| 3 | Nevşehir NAV — Istanbul IST | — | — | no flights seen |
| 4 | Frankfurt FRA — Palma de Mallorca PMI | 8.4 | 48 % | Condor 4.1 (A320) · Discover Airlines 2.1 (A320) · Lufthansa 1.3 (A321, A321neo) · TUIfly 0.9 (737 MAX 8, 737-800) |
| 5 | Berlin BER — Rome FCO | 3.3 | 59 % | Ryanair 2.0 (737-800, 737 MAX 8) · easyJet 1.4 (A319, A320) |
| 6 | Antalya AYT — Moscow SVO | 2.4 | 67 % | Southwind 1.6 · Aeroflot 0.8 (A321) |
| 7 | Amsterdam AMS — Málaga AGP | 9.6 | 39 % | Transavia 3.8 (737-800) · easyJet 2.3 (A320neo, A319) · Vueling 1.6 (A320, A320neo) · Ryanair 1.0 (737-800) |
| 8 | Warsaw WAW — Antalya AYT | 2.9 | 62 % | Enter Air 1.8 (737-800) · SunExpress 0.7 (737-800) · Corendon 0.4 (737 MAX 8, 737-800) |
| 9 | Berlin BER — Barcelona BCN | 6.4 | 53 % | Vueling 3.4 (A321, A320) · Ryanair 1.6 (737-800, 737 MAX 8) · easyJet 1.4 (A319, A320) |
| 10 | Antalya AYT — Kazan KZN | — | — | no flights seen |
| 11 | Brussels BRU — Barcelona BCN | 4.8 | 50 % | Vueling 2.4 (A320, A321) · Brussels Airlines 1.7 (A320, A319) · Ryanair 0.6 (737-800) |
| 12 | Brussels BRU — Málaga AGP | 2.9 | 42 % | Brussels Airlines 1.2 (A320) · TUI fly Belgium 0.6 (737 MAX 8, 737-800) · Transavia 0.4 (737-800) · Vueling 0.4 (A320) |
| 13 | Diyarbakır DIY — Istanbul SAW | — | — | no flights seen |
| 14 | Barcelona BCN — Budapest BUD | 4.4 | 54 % | Wizz Air 2.4 (A321neo) · Ryanair 2.0 (737-800, 737 MAX 8) |
| 15 | Barcelona BCN — Paris CDG | 11.8 | 66 % | Air France 7.8 (A320, A321) · Vueling 3.6 (A320, A321) · Air France Hop 0.3 (E190) |
| 16 | Antalya AYT — Moscow VKO | — | — | no flights seen |
| 17 | Bergamo BGY — Bucharest OTP | 3.0 | 75 % | Ryanair 2.2 (737-800, 737 MAX 8) · Wizz Air Malta 0.8 (A321, A321neo) |
| 18 | Hannover HAJ — Palma de Mallorca PMI | 3.4 | 50 % | TUIfly 1.7 (737-800, 737 MAX 8) · Eurowings 1.4 (A320) · Corendon Europe 0.3 (737-800) |
| 19 | Barcelona BCN — Paris ORY | 12.4 | 67 % | Vueling 8.3 (A320, A321) · Transavia France 4.1 (737-800) |
| 20 | Madrid MAD — Paris CDG | 13.9 | 50 % | Iberia 7.0 (A320neo, A321) · Air France 6.7 (A320) · Air France Hop 0.2 (E190) |
| # | Pair | Flights per day | Leader share | Who flies: flights per day (types) |
|---|---|---|---|---|
| 1 | Madrid MAD — Santiago SCL | 0.9 | 91 % | LATAM Chile 0.8 (787-9, 787-8) · LATAM Perú 0.1 (787-9) |
| 2 | Madrid MAD — Lima LIM | 3.5 | 39 % | Iberia 1.4 (A330-200, A350-900) · Plus Ultra 0.8 (A330-200) · LATAM Perú 0.7 (787-9, 787-8) · Air Europa 0.7 (787-9) |
| 3 | Amsterdam AMS — Willemstad CUR | — | — | no flights seen |
| 4 | Madrid MAD — Buenos Aires EZE | 5.8 | 46 % | Iberia 2.7 (A350-900, A330-200) · Aerolíneas Argentinas 1.7 (A330-200) · Air Europa 0.9 (787-8, 787-9) · Plus Ultra 0.5 (A330-200) |
| 5 | Lisbon LIS — São Paulo GRU | 4.1 | 61 % | TAP 2.5 (A330-900) · LATAM Brasil 1.6 (777-300ER) |
| 6 | Madrid MAD — São Paulo GRU | 5.2 | 41 % | Iberia 2.1 (A330-300, A350-900) · LATAM Chile 0.9 (787-9) · Air Europa 0.9 (787-9) · LATAM Brasil 0.8 (777-300ER, 787-9) |
| 7 | Paris CDG — Tokyo HND | 4.1 | 58 % | Air France 2.4 (777-300ER) · JAL 0.9 (777-300ER) · ANA 0.8 (787-9) |
| 8 | Madrid MAD — Mexico City MEX | 5.6 | 52 % | Iberia 2.9 (A350-900) · Aeroméxico 2.7 (787-9, 787-8) |
| 9 | Zurich ZRH — Hong Kong HKG | 1.6 | 51 % | Swiss 0.8 (777-300ER) · Cathay Pacific 0.8 (A350-900, A350-1000) |
| 10 | Barcelona BCN — Doha DOH | 2.9 | 100 % | Qatar Airways 2.9 (787-9) |
Source: OpenSky Network, flights by airport (ADS-B); aggregated with bin/observed_export.py and bin/competitors.py. Flights per day — one direction, average per observed day. Excluded: business aviation, cargo carriers and carriers with one or two flights in the period (most often an airport estimation error: the aircraft passed nearby rather than landed). Long-haul flights are a lower bound: there are no receivers over the ocean, and the destination airport is not always determined (which is why, for example, no flights at all are seen on Amsterdam — Curaçao, although KLM flies there). Antalya pairs — 5 days; domestic Turkish pairs and pairs with Russian airports other than Sheremetyevo are not visible in OpenSky data — there are few receivers. We have not yet collected India; the data will come with the next update.
For each top pair the calculator computed the breakeven fare — how much a passenger must pay for the flight to break even at an 80 % load factor — on the types that can be obtained new today: A320neo, A321neo, 737 MAX 8 and 9, A220-300, E195-E2, and for long-haul pairs A350-900 and 787-9. On every narrowbody pair the A321neo is cheapest per passenger: 4–5 % cheaper than the A320neo and 5–6 % cheaper than the 737 MAX 8. The gap is smaller than it might seem: the A321neo has more seats, but the flight costs more too — it burns more fuel, and charges and air navigation fees are calculated from weight. In the database the A321neo has a 97 t maximum take-off weight and 33 t of tankage, like the long-range A321LR/XLR, which is why it 'reaches' Curaçao and São Paulo from Europe; a standard 93.5 t A321neo would not get there without extra tanks. But a bigger aircraft also means fewer frequencies: the 'flights per day needed' column shows how many A321neo flights in each direction the pair's market fills at an 80 % load factor, and 'flown now' how many flights all carriers together operate on the pair (from the observations above). Where it comes to fewer than two, a smaller type with a convenient schedule is the wiser choice — frequency sells tickets by itself (the S-curve above).
For pairs with Russian airports the choice is different. Western types are unavailable to Russian carriers, and of the Russian ones only the Tu-214 is currently in series production — certified, four aircraft in 2026; the SJ-100 awaits certification by late 2026 – early 2027, the MC-21 by the end of 2027. The calculator now computes the Tu-214. The manufacturer does not publish fuel burn, so the anchor is a reference hourly burn of 3.7 t/h (the same reference gives 19 g per passenger-kilometre — at 210 seats and 850 km/h that is 3.4 t/h [airlines-inform]; layout — Red Wings) via the 757-200 as an analogue on the Tu-214 airframe. We checked it against a non-public table of trip fuel by distance obtained from industry contacts: the calculation with this anchor differs from it by 1–2 % between 1,000 and 4,000 km. Per trip the Tu-214 burns 7–11 % more than the 757-200 — exactly the generation gap between the PS-90A and PW2000 engines. The result on the Antalya pairs: a 194-seat Tu-214 (Red Wings layout) comes out 21–25 % more expensive per passenger than the A321neo, on which Turkish carriers fly the same routes — trip fuel almost a third higher, maintenance by the default rate twice as high, and fewer seats. The calculator does not yet compute the MC-21 — there is no certified version and no published burn; the SJ-100 below is an estimate: the PD-8 version's empty weight and burn are unpublished.
| # | Pair | Best type | Breakeven fare | A320neo | 737 MAX 8 | Flights per day needed | Flown now |
|---|---|---|---|---|---|---|---|
| 1 | Gaziantep GZT — Istanbul SAW | A321neo | 85 EUR | 88 EUR | 89 EUR | 7.1 | — |
| 2 | Antalya AYT — Yekaterinburg SVX | Tu-214 (A321neo — 182 EUR) | 228 EUR | — | 195 EUR | 5.2 | — |
| 3 | Nevşehir NAV — Istanbul IST | A321neo | 75 EUR | 78 EUR | 79 EUR | 4.1 | — |
| 4 | Frankfurt FRA — Palma de Mallorca PMI | A321neo | 106 EUR | 111 EUR | 112 EUR | 7.5 | 8.4 |
| 5 | Berlin BER — Rome FCO | A321neo | 89 EUR | 93 EUR | 94 EUR | 4.1 | 3.3 |
| 6 | Antalya AYT — Moscow SVO | Tu-214 (A321neo — 150 EUR) | 182 EUR | — | 159 EUR | 12.1 | 2.4 |
| 7 | Amsterdam AMS — Málaga AGP | A321neo | 122 EUR | 127 EUR | 129 EUR | 7.1 | 9.6 |
| 8 | Warsaw WAW — Antalya AYT | A321neo | 121 EUR | 126 EUR | 128 EUR | 5.1 | 2.9 |
| 9 | Berlin BER — Barcelona BCN | A321neo | 109 EUR | 114 EUR | 116 EUR | 4.8 | 6.4 |
| 10 | Antalya AYT — Kazan KZN | Tu-214 (A321neo — 142 EUR) | 177 EUR | — | 152 EUR | 4.1 | — |
| 11 | Brussels BRU — Barcelona BCN | A321neo | 95 EUR | 98 EUR | 100 EUR | 6.9 | 4.8 |
| 12 | Brussels BRU — Málaga AGP | A321neo | 117 EUR | 121 EUR | 123 EUR | 4.8 | 2.9 |
| 13 | Diyarbakır DIY — Istanbul SAW | A321neo | 90 EUR | 94 EUR | 95 EUR | 4.8 | — |
| 14 | Barcelona BCN — Budapest BUD | A321neo | 110 EUR | 115 EUR | 116 EUR | 3.8 | 4.4 |
| 15 | Barcelona BCN — Paris CDG | A321neo | 87 EUR | 90 EUR | 91 EUR | 10.0 | 11.8 |
| 16 | Antalya AYT — Moscow VKO | Tu-214 (A321neo — 129 EUR) | 160 EUR | — | 138 EUR | 13.7 | — |
| 17 | Bergamo BGY — Bucharest OTP | A321neo | 98 EUR | 103 EUR | 104 EUR | 4.3 | 3.0 |
| 18 | Hannover HAJ — Palma de Mallorca PMI | A321neo | 106 EUR | 111 EUR | 113 EUR | 3.6 | 3.4 |
| 19 | Barcelona BCN — Paris ORY | A321neo | 86 EUR | 89 EUR | 90 EUR | 8.8 | 12.4 |
| 20 | Madrid MAD — Paris CDG | A321neo | 93 EUR | 96 EUR | 98 EUR | 8.2 | 13.9 |
| # | Pair | Best type | Breakeven fare | A320neo | 737 MAX 8 | Flights per day needed | Flown now |
|---|---|---|---|---|---|---|---|
| 1 | Madrid MAD — Santiago SCL | A350-900 | 601 EUR | — | — | 3.8 | 0.9 |
| 2 | Madrid MAD — Lima LIM | A350-900 | 540 EUR | — | — | 4.8 | 3.5 |
| 3 | Amsterdam AMS — Willemstad CUR | A321neo | 343 EUR | — | — | 5.6 | — |
| 4 | Madrid MAD — Buenos Aires EZE | A350-900 | 568 EUR | — | — | 5.3 | 5.8 |
| 5 | Lisbon LIS — São Paulo GRU | A321neo | 347 EUR | — | — | 6.7 | 4.1 |
| 6 | Madrid MAD — São Paulo GRU | A350-900 | 481 EUR | — | — | 3.8 | 5.2 |
| 7 | Paris CDG — Tokyo HND | A350-900 | 555 EUR | — | — | 3.2 | 4.1 |
| 8 | Madrid MAD — Mexico City MEX | A350-900 | 511 EUR | — | — | 5.9 | 5.6 |
| 9 | Zurich ZRH — Hong Kong HKG | A350-900 | 517 EUR | — | — | 1.5 | 1.6 |
| 10 | Barcelona BCN — Doha DOH | A321neo | 220 EUR | — | — | 4.6 | 2.9 |
| # | Pair | Best type | Breakeven fare | A320neo | 737 MAX 8 | Flights per day needed | Flown now |
|---|---|---|---|---|---|---|---|
| 1 | Bagdogra — Mumbai | A321neo | 113 EUR | 118 EUR | 120 EUR | 4.2 | — |
| 2 | Ahmedabad — Bengaluru | A321neo | 88 EUR | 92 EUR | 93 EUR | 9.0 | — |
| 3 | Ahmedabad — Kolkata | A321neo | 107 EUR | 112 EUR | 114 EUR | 4.5 | — |
| 4 | Delhi — Indore | A321neo | 66 EUR | 69 EUR | 70 EUR | 8.8 | — |
| 5 | Bengaluru — Kozhikode | A321neo | 53 EUR | 55 EUR | 56 EUR | 3.3 | — |
| 6 | Delhi — Varanasi | A321neo | 66 EUR | 69 EUR | 70 EUR | 7.7 | — |
| 7 | Indore — Pune | A321neo | 66 EUR | 69 EUR | 70 EUR | 2.4 | — |
| 8 | Darbhanga — Delhi | A321neo | 75 EUR | 78 EUR | 79 EUR | 2.6 | — |
| 9 | Bengaluru — Nagpur | A321neo | 76 EUR | 80 EUR | 81 EUR | 4.0 | — |
| 10 | Coimbatore — Hyderabad | A321neo | 75 EUR | 78 EUR | 79 EUR | 4.1 | — |
| 11 | Delhi — Rajkot | A321neo | 75 EUR | 79 EUR | 80 EUR | 3.0 | — |
| 12 | Darbhanga — Mumbai | A321neo | 105 EUR | 109 EUR | 111 EUR | 2.1 | — |
| 13 | Bengaluru — Mangalore | A321neo | 53 EUR | 56 EUR | 56 EUR | 6.5 | — |
| 14 | Delhi — Udaipur | A321neo | 60 EUR | 63 EUR | 64 EUR | 5.4 | — |
| 15 | Delhi — Imphal | A321neo | 103 EUR | 108 EUR | 110 EUR | 2.5 | — |
| 16 | Delhi — Mangalore | A321neo | 105 EUR | 110 EUR | 111 EUR | 1.9 | — |
| 17 | Bagdogra — Delhi | A321neo | 82 EUR | 86 EUR | 87 EUR | 9.8 | — |
| 18 | Guwahati — Hyderabad | A321neo | 109 EUR | 114 EUR | 116 EUR | 2.9 | — |
| 19 | Delhi — Patna | A321neo | 73 EUR | 76 EUR | 77 EUR | 11.9 | — |
| 20 | Chennai — Kolkata | A321neo | 99 EUR | 103 EUR | 105 EUR | 8.9 | — |
'Cheapest per passenger' silently assumes we carry all of the pair's passengers. A newcomer on a route where two or three carriers already fly will win a share, and a big aircraft then either flies half-empty or rarely — once a day or less — while frequency itself sells tickets. The rule below: of the types that, at our share, give at least two flights a day in each direction, we take the cheapest per passenger; if none reaches that, the cheapest among the smallest (within 10 % by seats), flagged. With the whole market the answer is almost always the A321neo; with a quarter of the market it is 110–140-seat aircraft on half the European pairs and most Indian ones. This is the argument for why new routes are built up on such aircraft and a big one is brought in once the route has gained passengers: frequency is worth more than 5–10 % extra cost per seat.
Which aircraft of this class is better our calculation decides with a caveat. The E195-E2 comes out 8–10 % cheaper per passenger than the A220-300 — it has a lighter airframe and lower burn — but its burn is an estimate: Embraer does not publish E195-E2 trip fuel, so we transferred to it the correction measured on the E190-E2, which has the same engine and wing (Aircraft Commerce No. 142); a check against Embraer's stated 25 % fuel reduction versus the E195-E1 agrees to within 2 %. On the pairs with Russia this role is played by the SJ-100: 6–8 % dearer per passenger than the Tu-214, but it wins on frequency at a small market share; its burn comes from the SSJ100 flight manual with SaM146 engines (1.7 t/h; agrees with the developer's presentation to within 4 %), its empty weight from the SSJ100 95LR: neither is published for the PD-8 version, so for it this is a lower bound.
flights per daytype = pair passengers per year × share ÷ 365 ÷ 2 ÷ (seatstype × 0.8)
type = argmintype: flights ≥ N breakeven faretype
| Pair | Share | Type | Flights per day | Fare | vs cheapest |
|---|
Breakeven fare — FlightCostApp calculator for July, 80 % load factor, default inputs (lease, crew, maintenance, airport charges, air navigation, regional fuel). '—' — the type cannot operate the pair because of weight, range or runway.
Two researchers kept logs — 493 steps (trace/r1–r2): how routes are evaluated and which data are open. Separate agents opened every source and checked the quotes (verify/): r1 — found verbatim 129, partially 4; r2 — found verbatim 123, partially 1. Corrected after checking: the share of variation explained by the gravity model is 70–76 %, not 'exactly' three quarters.
The pair series were built with bin/eurostat_pairs.py and bin/india_pairs.py: in Europe both countries report a pair — we take the average; in India since 2026 DGCA writes cities with the airport in brackets and has renamed some cities — the names were reconciled, otherwise a pair's growth would be an artefact. DGCA's 2023 series for Goa is double-counted, so we do not use growth versus 2023.