Skip to content
Europe Flight Club
Open data

The data behind the site, as files

Every fare figure on Europe Flight Club is computed from two grids Jon collected himself. Both are downloadable here, with the method, the observation dates, and a license that asks only for credit.

1,037
Round trips in the city grid, 26 US gateways to 41 European cities, disclosed collection interval
46
Airlines in the carrier grid, priced on 10,054 fares for one travel week
2
Files, each as CSV and JSON, each with its own data dictionary
CC BY 4.0
License on both. Attribution is the only condition.

How the fares were collected

The city grid is the cheapest one-week economy round trip from each of 26 US gateway metros to each of 41 European cities, for departures in the August 30, 2026 – February 28, 2027 window, searched on on Google Flights. Each gateway cohort was collected on one Eastern day, every cell twice, keeping the lower reading only after settings and evidence checks. The grid’s actual collection interval is disclosed; fares from gateways observed on different days are context rather than simultaneous quotes.

The carrier grid records returned carrier fares for the same travel week, November 8–14, 2026. Fare differences are within observed airport pairs and cabins; connections and ticket conditions can differ. The route list was fixed before collection as the full cross-product of the same 26 gateways and 51 European airports, and it is collected route by route with every carrier on a route captured in one session. Of 1,326 planned routes, 977 returned an economy fare and 962 a business fare. A pair whose search completed and returned no single-carrier fare for that week is declared unpriced rather than left out, so a collection failure can never read as an empty market — and because that declaration is about one week and one cabin, it is not a claim that nobody flies the route. A further 0 route-cabins have not been searched and 37 did not resolve. Both are recorded separately, included in planned coverage accounting, and excluded from fare rankings and comparisons, because a route nobody searched is not a route with nothing to sell.

Rankings on this site use the median, never the minimum. A minimum is a fact about one airport over the disclosed collection interval; a median is a fact about the city or the airline. That is why published cheapest-city lists disagree with each other and why ours does not move when one gateway gets lucky. The full method, and the second-source check we run against it, is on How we review.

Why the files and the pages cannot disagree

The pages and the files are generated from the same source in the same build. A city page’s median, a carrier page’s rank, and the row in the file that produced them are the same number by construction, not by proofreading. If you ever find them apart, tell us: it is a defect, and it goes on the corrections page with the check that should have caught it.

What is published, and what is not

Two files are open. Three things are deliberately not, and it is better to say which than to let anyone assume the download is everything.

The archive series
Every monthly refresh moves the superseded city grid into an archive. A fare for a past date cannot be re-collected, so that series is the one thing here nobody can reproduce, and it is the basis of the month-over-month analysis this site will publish. Only the current snapshot is distributed.
The raw carrier grid
Thousands of per-carrier, per-route fares power the airline rankings and every head-to-head on the site. The carrier file publishes the aggregates those pages show, one row per airline, and not the fares underneath them.
The collection tooling
How every carrier on a route gets priced for one travel week in one sitting is the operational work behind the grids. The method is documented in full; the tooling is not published.

Versions and refreshes

The files were first published on . The city grid is re-collected monthly as a complete replacement with a disclosed collection interval or not at all, and each refresh replaces the file at the same URL; the filename and every row carry the observation date, so a file downloaded in one month can never be mistaken for the next. The carrier grid is re-aggregated whenever its fares are re-collected. One snapshot is held in the archive today.

Changelog

Every collection, refresh and correction that changed a published figure, newest first. The archive itself is not distributed; this is the record that it exists and is kept.

  1. carrier grid

    Carrier fares refreshed with explicit incomplete coverage

    10,054 accepted fare observations for November 8–14, collected October 12–17. Of 2,652 planned route/cabin cells, 1,939 returned accepted fares, 676 had corroborated no-result evidence and 37 remain unresolved. Unresolved cells contribute no fares or absence claims to rankings or comparisons. The prior snapshot is preserved; the city and arrival-airport datasets retain their own historical dates. This is a partial carrier refresh, not completion of the full fare refresh.

  2. files

    City grid file gained destination_place, because the code is not always the place searched

    destination_code described itself as the IATA code searched. Belfast files under BFS and cannot have been collected there, since BFS returns no fare from any US gateway, so the grid searches the Belfast metro. The new column states the place on every row, destination_code no longer claims to be it, and src/data/city-places.ts declares the unit for all 41 cities.

  3. files

    City grid and carrier aggregates published as CSV and JSON under CC BY 4.0

    The current snapshot in full; the carrier grid as one row per airline. The archive and the per-route carrier fares are held back, and the page says why.

  4. cabin grid

    First economy cabin rows: JetBlue and Delta, scored against economy

    Economy Seat comes from row width and the pitch the carrier publishes, and is withheld where none is published; JetBlue's is. Delta's three airframes are recorded separately because the row width differs.

  5. carrier grid

    Carrier grid completed: all 26 gateways, 47 airports, both cabins

    6,690 fares for one fixed travel week, collected origin by origin with every carrier on a route captured in one session. Rankings dropped the 'origins collected so far' qualifier.

  6. cabin grid

    Sixteen business cabins verified, every ranked carrier now has a product row

    Wifi recorded as paid unless free was independently established. Two carriers checked and deliberately not recorded, flagged instead.

  7. city grid

    City grid collected: 1,037 round trips, 26 gateways, 41 cities, one day

    Every cell priced twice the same day and the lower reading kept. Archived as the first snapshot; a second is due at the end of September.

  8. city grid

    Boston to Milan corrected from $846 to $591

    A bad capture caught by cross-checking the map's per-city labels against the grid. Exact agreement is the norm on that check, so a double-digit gap is a bad row, not price movement.

Common questions

Can I use this data commercially?
Yes. Both files are licensed Creative Commons Attribution 4.0 International (CC BY 4.0). You can republish, analyze, chart, or build a product on them, including a commercial one, as long as you credit Europe Flight Club, link to the dataset page, and state the observation date. The attribution line on each dataset page is the shortest form that satisfies all three.
Are these prices I can book?
No. The city grid records the lowest fare found across a six-month window for each city pair, so each figure is a floor for that window rather than a quote for a date. The carrier grid records fares for one fixed travel week, so its figures are comparisons between airlines on identical dates rather than what any date costs now. Both are benchmarks for judging a fare you are looking at, and neither should be quoted as a bookable price.
Why publish the current snapshot but not the archive?
Because the archive is the one part of this work that cannot be rebuilt. A current snapshot can be reproduced by anyone with a week and a spreadsheet. A series of them, collected the same way every month, cannot be reproduced for any month that has already passed. That series is what the site's month-over-month analysis is built on, and it stays here. Every refresh publishes the new snapshot in full.
Why does the carrier file have one row per airline instead of every fare?
The per-route fares are what power the airline rankings and every head-to-head comparison on the site, and they are held back for the same reason the archive is. The aggregates are the figures those pages actually show: routes priced, median premium over the cheapest carrier on the same route, how often the carrier was cheapest, and its cheapest fare anywhere. Publishing them as one table means the ranking can be checked without scraping several hundred pages.
How do I know which version of a file I have?
The filename carries the observation date, every row of the city grid carries it as observed_on, and the JSON files carry it in their header. When the grids are refreshed, the files at these URLs change and the date changes with them. If two people disagree about a figure from this site, the first thing to compare is the observation date.

Hear when the grids refresh

One email a week on the Europe fares worth acting on. The week a grid is re-collected, it says so, with what moved.

No spam, unsubscribe anytime. By subscribing you agree to our Privacy Policy.

Jon Miksis

Data collected by

Jon Miksis

Jon Miksis has run travel businesses since 2017 and spends 3–6 months a year traveling, two to three of them in Europe. He has taken 250+ flights and booked every one himself, and regularly flies Boston to Europe for under $300 round trip. Every “Flown” review is from his own seat.