Open data · Park & Keep
Open airport parking index for Europe
October 2026 edition. Every record carries its verification date; every price carries its source, date and collection method.
- airports
- 46
- airports
- countries
- 8
- countries
- car parks listed
- 521
- car parks listed
- of records report a shuttle
- 70%
- of records report a shuttle
- of records report a valet service
- 46%
- of records report a valet service
- dated public prices
- 212
- dated public prices
- price collection date
- 12 October 2026
- price collection date
CC BY 4.0 licence: free reuse, including commercial, with attribution.
Aggregates by airport
This table shows only aggregates (minimum, median, maximum) for each length of stay with at least 3 sourced and dated prices in a single currency, as on the airport pages; the detail for each car park is in the JSON and CSV files. 13 airports have collected prices so far.
Prices: median in bold, then minimum – maximum and number of prices, in the currency shown by the operators.
| Airport | Country | Car parks | Shuttle | Valet | Median distance | 3 days | 7 days | 14 days |
|---|---|---|---|---|---|---|---|---|
| Vienna-SchwechatVIE | Austria | 12 | 75% | 17% | 3.8 km | — | — | — |
| Brussels-ZaventemBRU | Belgium | 16 | 100% | 38% | 4.2 km | €33€22.46 – €43 · 9 prices | €46€32.91 – €75 · 9 prices | €87€61.71 – €125 · 9 prices |
| Charleroi Brussels SouthCRL | Belgium | 14 | 86% | 21% | 2.9 km | €36€26 – €49 · 7 prices | €50€30 – €65 · 8 prices | €66€64 – €90 · 5 prices |
| GenevaGVA | Switzerland | 11 | 82% | 55% | 2.5 km | CHF 62CHF 30 – CHF 115 · 5 prices | CHF 108.1CHF 70 – CHF 195 · 5 prices | CHF 180CHF 140 – CHF 335 · 5 prices |
| ZurichZRH | Switzerland | 11 | 55% | 36% | 4.4 km | CHF 100CHF 80 – CHF 109 · 5 prices | CHF 156CHF 120 – CHF 159 · 5 prices | CHF 245CHF 180 – CHF 268 · 4 prices |
| Berlin-BrandenburgBER | Germany | 10 | 80% | 10% | 4.8 km | — | — | — |
| DüsseldorfDUS | Germany | 13 | 62% | 85% | 3.1 km | — | — | — |
| FrankfurtFRA | Germany | 12 | 67% | 83% | 9.4 km | — | — | — |
| HamburgHAM | Germany | 11 | 91% | 45% | 3 km | — | — | — |
| HanoverHAJ | Germany | 11 | 82% | 36% | 3 km | — | — | — |
| Karlsruhe/Baden-BadenFKB | Germany | 9 | 33% | 33% | 0.9 km | — | — | — |
| Cologne-BonnCGN | Germany | 11 | 73% | 45% | 7.2 km | — | — | — |
| Leipzig/HalleLEJ | Germany | 10 | 70% | 20% | 3 km | — | — | — |
| MunichMUC | Germany | 16 | 94% | 50% | 4.1 km | — | — | — |
| NurembergNUE | Germany | 9 | 56% | 0% | 3.4 km | €49€49 – €64 · 3 prices | €49€49 – €79 · 3 prices | €78€78 – €149 · 3 prices |
| StuttgartSTR | Germany | 15 | 73% | 67% | 3.8 km | €63€38 – €83 · 4 prices | €77.5€54 – €90 · 4 prices | €117.5€82 – €155 · 4 prices |
| Alicante-ElcheALC | Spain | 15 | 80% | 60% | 1.6 km | — | — | — |
| BarcelonaBCN | Spain | 13 | 62% | 77% | 4.2 km | — | — | — |
| Madrid-BarajasMAD | Spain | 14 | 71% | 71% | 5.6 km | — | — | — |
| MalagaAGP | Spain | 19 | 79% | 37% | 2.1 km | €36.5€31 – €59 · 6 prices | €64.5€40.5 – €89 · 6 prices | €72€65 – €132.5 · 5 prices |
| Palma de MallorcaPMI | Spain | 8 | 88% | 50% | 2 km | €25.95€22 – €31 · 5 prices | €40.45€34 – €56 · 5 prices | €73.56€46 – €93 · 4 prices |
| SevilleSVQ | Spain | 8 | 38% | 38% | 9.8 km | — | — | — |
| ValenciaVLC | Spain | 9 | 67% | 56% | 1.6 km | — | — | — |
| Bordeaux-MérignacBOD | France | 9 | 56% | 67% | 2.4 km | €28€27 – €62 · 4 prices | €45.5€42 – €82 · 6 prices | €72.94€69 – €112 · 5 prices |
| Lyon-Saint-ExupéryLYS | France | 9 | 78% | 44% | 4.3 km | — | — | — |
| Marseille-ProvenceMRS | France | 11 | 55% | 55% | 2.3 km | — | — | — |
| Nantes-AtlantiqueNTE | France | 15 | 67% | 33% | 1.8 km | — | — | — |
| Nice-Côte d'AzurNCE | France | 8 | 13% | 50% | 1.1 km | — | — | — |
| Paris-BeauvaisBVA | France | 8 | 63% | 0% | 2.4 km | — | — | — |
| Paris-Charles-de-GaulleCDG | France | 13 | 69% | 77% | 5.9 km | — | — | — |
| Paris-OrlyORY | France | 10 | 40% | 60% | 3.1 km | €51€34 – €70 · 4 prices | €69€51 – €90 · 5 prices | €105€82 – €125 · 5 prices |
| Toulouse-BlagnacTLS | France | 8 | 63% | 38% | 1.2 km | — | — | — |
| BariBRI | Italy | 10 | 80% | 50% | 4.8 km | — | — | — |
| Bergamo-Orio al SerioBGY | Italy | 13 | 69% | 23% | 1.7 km | — | — | — |
| BolognaBLQ | Italy | 14 | 71% | 43% | 1.3 km | €41€26.9 – €50 · 7 prices | €66€46.9 – €79 · 7 prices | €117.5€81.9 – €149 · 5 prices |
| CataniaCTA | Italy | 10 | 100% | 50% | 1.9 km | — | — | — |
| Milan-LinateLIN | Italy | 10 | 70% | 20% | 2.5 km | — | — | — |
| Milan-MalpensaMXP | Italy | 15 | 87% | 27% | 3.7 km | — | — | — |
| Naples-CapodichinoNAP | Italy | 10 | 70% | 80% | 1.5 km | — | — | — |
| PisaPSA | Italy | 9 | 44% | 44% | 1.7 km | — | — | — |
| Rome-FiumicinoFCO | Italy | 14 | 86% | 71% | 4.9 km | — | — | — |
| Turin-CaselleTRN | Italy | 9 | 67% | 22% | 2.2 km | — | — | — |
| Venice-Marco PoloVCE | Italy | 11 | 82% | 36% | 2 km | — | — | — |
| Amsterdam-SchipholAMS | Netherlands | 12 | 75% | 42% | 4.4 km | €54.48€42.95 – €112.49 · 6 prices | €87.48€51.99 – €137.49 · 6 prices | €150.99€86.99 – €177.49 · 6 prices |
| EindhovenEIN | Netherlands | 8 | 25% | 50% | 1.8 km | €74.75€59.99 – €89.95 · 4 prices | €95.75€73 – €109.95 · 4 prices | €134.22€104 – €171.5 · 4 prices |
| Rotterdam-The HagueRTM | Netherlands | 8 | 13% | 63% | 1 km | — | — | — |
Browse car parks by airport
Each airport has its own page: every listed car park, ranked by distance, with its attributes.
Licence and attribution
The dataset is published under the Creative Commons Attribution 4.0 International licence (CC BY 4.0). You may copy, redistribute and adapt it, including for commercial purposes, provided you credit the source.
Attribution to copy
Source: Park & Keep — Open airport parking index for Europe (October 2026), CC BY 4.0, https://parkandkeep.com/en/data/airport-parking-index
Suggested citation
Park & Keep (2026). Open airport parking index for Europe, October 2026 edition [dataset]. CC BY 4.0 licence. https://parkandkeep.com/en/data/airport-parking-index
Use this data in Claude or any MCP client
Add this MCP server to your client to query the index (car parks, attributes, price aggregates):
https://parkandkeep-mcp.vercel.app/mcp
Methodology
Scope
The file covers the public, unclaimed records of the Park & Keep directory (status “listed”) attached to the comparator's active airport hubs. Attributes, addresses and distances come from public sources; each record states the date it was last verified.
Price collection
Prices are read on the operator's own website, never on a comparison site or a third-party booking platform: a record whose website is an aggregator, or redirects to one, is left out. The crawler follows robots.txt (RFC 9309), sends at most one request every 2 seconds per host, gives up on a page after 20 seconds and identifies itself with a declared user agent. It reads the home page and then at most three “rates” links on the same domain.
Checking each price
A price read on a rates page is kept only if its amount and the matching length of stay appear word for word in the page excerpt stored with the collection. For a quote, the amount appears word for word in the excerpt and the stay dates and times are checked in the form as redisplayed by the site; without that check, the quote is left out. The total kept is what the customer pays for that stay, mandatory fees included (pick-up, airport access fee, booking fee); a total shown excluding VAT is left out, never converted. Some sites count calendar days (“8 days” for a Monday-to-Monday stay): the stay measured is the same. No price is extrapolated: a daily rate is never multiplied to produce a stay price. “From” prices (dès, ab, from…) are not stay prices: they are left out.
Quotes from the operator's form
When the operator publishes a booking form, the collection requests a quote with a headless Chromium browser that identifies itself with the same declared user agent and blocks advertising and analytics trackers. robots.txt is checked before every page, every form action and every API call; at most one action every 2 seconds across all quote engines. Reference stay: by default, the first Monday at least 30 days after the collection date, at 10:00, for 3, 7 and 14 days (exact date published in price.stay_start, method in price.method). The crawler reads the total shown on the results page, never clicks “book” or “pay” and never enters any identity details. A captcha or a login page ends the quote and stops that engine for the rest of the collection.
Quote engines covered
HelloApp, ParkingPro (MyParking), Aena (parking.aena.es), eParkingWeb, Car Park Booking System, the EazzyPark and Euro-Parking booking module, Ciao Park, BibiPark, ParkStar, ParkinGO, FastParking, Grupo LowCost Parking, and the own forms of five operators in Geneva and Charleroi.
Export and automatic guard
Never exported: affiliate links and networks, claim data, phone numbers, Google Maps ratings and reviews, raw sources. An automatic check (--check) blocks publication if any of these fields or a Google Maps URL appears, if the header is incomplete or if the record counts of the JSON and CSV differ.
Aggregates
Per airport and per length of stay: minimum, median and maximum, published from 3 sourced and dated prices in a single currency. The comparator's airport pages show only these aggregates.
Corrections and removal
An operator can ask for its data to be corrected or removed by writing to contact@parkandkeep.com.
Reading the data
- Prices are those publicly displayed on the stated date; the rate you pay depends on your dates and options.
- The price collection covers the airports shown with values in the table; for the others, the file provides attributes, distances and verification dates.
- A null field means “not stated in the source”.
- Currencies are published as displayed (EUR, CHF), without conversion.
- In the CSV, nested fields are flattened: airport.iata becomes airport_iata, attributes.shuttle becomes shuttle, price.d3 becomes price_d3.
Field dictionary
Record (listings[])
| Field | Description |
|---|---|
| id | Stable record identifier. |
| airport.iata | IATA code of the airport. |
| airport.city | Airport name (city). |
| airport.country | Airport country (ISO 3166-1 alpha-2 code). |
| airport.vertical | Hub category (AIRPORT). |
| name | Public name of the car park. |
| city | Town of the car park. |
| postal_code | Postcode of the car park. |
| lat | Latitude (WGS 84). |
| lng | Longitude (WGS 84). |
| distance_km | Distance to the airport, in kilometres. |
| attributes.shuttle | Shuttle to the airport (true / false / null = not stated in the source). |
| attributes.valet | Valet service. |
| attributes.covered | Covered spaces. |
| attributes.open_24h | 24-hour access. |
| attributes.keys_kept | Keys kept by the operator. |
| attributes.ev_charging | Electric vehicle charging. |
| attributes.online_booking | Online booking. |
| attributes.online_payment | Online payment. |
| website | Operator's official website. |
| last_verified | Date the record was last verified (most recent date among its sources, otherwise date of last update). |
| price.d3 | Public price collected for a 3-day stay. |
| price.d7 | Public price collected for a 7-day stay. |
| price.d14 | Public price collected for a 14-day stay. |
| price.currency | Currency of the price, as displayed (no conversion). |
| price.source_url | URL of the operator's page where the price was read. |
| price.checked_at | Date the price was collected. |
| price.stay_start | Start of the reference stay when the price comes from a quote (local date and time). |
| price.method | Collection method: html_text:* (rates page), quote:* (quote from the operator's public booking form), “-” when no price. |
Airport (airports[])
| Field | Description |
|---|---|
| iata | IATA code of the airport. |
| city | Airport city. |
| country | Country (ISO 3166-1 alpha-2 code). |
| vertical | Hub category (AIRPORT). |
| parkings | Number of records for the airport. |
| share_shuttle | Share of records with a confirmed shuttle (0 to 1). |
| share_valet | Share of records with a confirmed valet service (0 to 1). |
| share_covered | Share of records with confirmed covered spaces (0 to 1). |
| distance_km_median | Median distance to the airport (km). |
| distance_km_min | Shortest distance to the airport (km). |
| prices_collected | Number of records with at least one collected price. |
| prices | Aggregates per length of stay (d3, d7, d14): min, median, max, n; null below 3 prices. |
File header
| Field | Description |
|---|---|
| generated_at | Date and time the file was generated (UTC, ISO 8601). |
| license | Licence of the dataset. |
| attribution | Attribution statement to reuse. |
| method_url | Page describing how Park & Keep ranks car parks. |
| count | Number of records in `listings`. |