# European Airport Flights Tracker (EUROCONTROL data) (`open_skies_data/european-airport-flights`) Actor

Returns monthly commercial flights for each European airport (EU, EFTA and EU candidate countries): flights, flights per day, rank in country and % change vs previous month, previous year and 2019. Data up to last month. Filter by country or airport. Source: Eurostat, EUROCONTROL data.

- **URL**: https://apify.com/open\_skies\_data/european-airport-flights.md
- **Developed by:** [Jofre Masip](https://apify.com/open_skies_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🛫 European Airport Flights Tracker — Latest Monthly Traffic (EUROCONTROL data)

**How busy was each European airport last month? Get the number of flights, flights per day, the change versus last month, last year and 2019, and each airport's rank in its country, in one clean table.**

Most free airport statistics arrive months or years late. This Actor uses the monthly airport traffic data that Eurostat publishes from **EUROCONTROL** records, released at the end of every month, so you work with **last month's figures**, not last year's.

- ⏱️ **Fresh data**: the latest month is usually published within weeks
- ✈️ **Flights and flights per day** for every reporting airport in Europe
- 📈 **Three comparisons ready-made**: vs last month, vs same month last year, vs same month in 2019 (pre-pandemic)
- 🏆 **Rank in country**: see at a glance which airports lead each market
- 🗓️ **Monthly history from January 2019**
- ✅ **Official, verifiable source**: Eurostat, free to reuse commercially with attribution. Every row links to the original dataset
- 💸 **Pay only for the rows you get**: a whole country for a full year usually costs less than $1

### What can you use it for?

| You are… | Use it to… |
|---|---|
| ✈️ **Airline or network planner** | Spot which airports and markets are growing right now |
| 🏢 **Airport or tourism board** | Benchmark your monthly traffic against competitors as soon as it's published |
| 🛠️ **Ground handling, MRO or aviation supplier** | Find the busiest and fastest-growing airports to target |
| 💼 **Investor or equity analyst** | Track monthly activity at airports run by listed operators |
| 📊 **Consultant or researcher** | Measure recovery versus 2019 and seasonal patterns |
| 📰 **Journalist** | Publish "busiest airports last month" rankings in minutes |

### How to use it

1. Click **Try for free**.
2. Choose the **countries** (for example `ES` for Spain) or specific **airports**.
3. Tick **Latest month only** for a quick ranking, or set a **From month** for history.
4. Press **Start** and export the results to Excel, CSV, JSON or Google Sheets.

💡 **Tip:** schedule it for the first days of each month and send the results automatically to Google Sheets, Slack or your database with Apify integrations. Your monthly airport report builds itself.

### Input examples

**Latest month, all Spanish airports (monthly ranking)**

```json
{ "countries": ["ES"], "latestMonthOnly": true }
```

**Madrid, Barcelona and Paris CDG since January 2024**

```json
{ "airports": ["MAD", "BCN", "CDG"], "fromPeriod": "2024-01" }
```

**Large airports only in Germany, France and Italy (10,000+ flights a month), last 12 months**

```json
{ "countries": ["DE", "FR", "IT"], "minFlights": 10000 }
```

Airports can be written as IATA codes (`MAD`), ICAO codes (`LEMD`) or Eurostat codes (`ES_LEMD`).

### Output

Results are grouped by airport, busiest airports first, with months in order. Example with real August 2026 figures for Madrid-Barajas:

| Airport | ICAO | Country | Month | Flights | Flights per day | Rank in country | vs last month (%) | vs last year (%) | vs 2019 (%) |
|---|---|---|---|---|---|---|---|---|---|
| Adolfo Suarez Madrid-Barajas | LEMD | Spain | 2026-08 | 39,062 | 1,260.1 | 1 | -1.8 | 6.4 | 6.3 |

Each row in JSON:

```json
{
  "airport": "Adolfo Suarez Madrid-Barajas",
  "icaoCode": "LEMD",
  "iataCode": "MAD",
  "municipality": "Madrid",
  "country": "Spain",
  "countryCode": "ES",
  "month": "2026-08",
  "flightType": "All flights",
  "flights": 39062,
  "flightsPerDay": 1260.1,
  "rankInCountry": 1,
  "changeVsPreviousMonthPct": -1.8,
  "changeVsPreviousYearPct": 6.4,
  "changeVsSameMonth2019Pct": 6.3,
  "source": "Eurostat, based on EUROCONTROL data",
  "sourceDataset": "avia_tf_airpm",
  "sourceUrl": "https://ec.europa.eu/eurostat/databrowser/view/avia_tf_airpm/default/table",
  "eurostatLastUpdate": "2026-09-14"
}
```

| Field | Meaning |
|---|---|
| `airport`, `icaoCode` | Airport name and four-letter ICAO code |
| `iataCode`, `municipality` | Three-letter IATA code and municipality where the airport is located |
| `country`, `countryCode` | Country name and Eurostat country code |
| `month` | Month, as YYYY-MM |
| `flightType` | All flights, Scheduled or Non-scheduled |
| `flights` | Commercial flights that month (arrivals + departures) |
| `flightsPerDay` | Average flights per day that month |
| `rankInCountry` | Position among the airports of the same country that month (1 = busiest). Empty when you ask for specific airports only |
| `changeVsPreviousMonthPct` | Change versus the previous month, in % |
| `changeVsPreviousYearPct` | Change versus the same month last year, in % |
| `changeVsSameMonth2019Pct` | Change versus the same month in 2019, in % |
| `source`, `sourceDataset` | Data provider and Eurostat dataset code |
| `sourceUrl` | Link to the original dataset on Eurostat, to check any figure |
| `eurostatLastUpdate` | Date Eurostat last updated the dataset |

### How much does it cost?

You pay **$1 per 1,000 rows**. One row is one airport and one month.

| What you ask for | Cost |
|---|---|
| One airport, 12 months | about $0.01 |
| One country, latest month | a few cents |
| One country, 12 months | usually under $1 |

Use **Maximum rows** to cap the cost of any run.

### 🤖 Use it with AI agents

This Actor works as a tool for AI assistants and agents (ChatGPT, Claude, Cursor and others) through the [Apify MCP server](https://docs.apify.com/integrations/mcp). Once connected, your assistant can answer questions like:

- *"Which were the 10 busiest airports in Europe last month?"*
- *"How many flights did Madrid-Barajas have last month compared with 2019?"*
- *"Which Spanish airports grew the most versus last year?"*

Why it works well for agents:

- ⚡ **Fast:** a typical run finishes in under 30 seconds, well within agent time limits.
- 📦 **Compact output:** clean rows with plain field names, no HTML or nested objects. Ask for only the fields you need to keep answers short.
- 🔓 **No login or API keys needed:** it reads official open data.
- 🧾 **Verifiable:** every row includes a link to the original Eurostat dataset, so the agent can cite its source.
- 💸 **Pay per row:** agents only pay for the data they actually use.

Example agent call: `{ "countries": ["ES"], "latestMonthOnly": true }`

To connect it, add the Apify MCP server to your AI tool and include this Actor (`european-airport-flights`) among its tools. See the [Apify MCP documentation](https://docs.apify.com/integrations/mcp) for setup.

### FAQ

**Where does the data come from?**
From Eurostat's dataset `avia_tf_airpm` (airport traffic data by reporting airport, monthly), which is built from EUROCONTROL flight data.

**How recent is it?**
Eurostat releases it at the end of each month, so the previous month is usually available within weeks. Every run returns the latest version published.

**What counts as a flight?**
Commercial flights (passengers, cargo and mail, scheduled and non-scheduled) operated under instrument flight rules. Each arrival and each departure counts as one flight.

**Does it include passenger numbers?**
No, this Actor counts flights, which is what is available with a short delay. For monthly passengers and cargo tonnes per airport, see our **European Airport Traffic Data: Passengers & Air Cargo** Actor.

**Can I use the data commercially?**
Yes. Eurostat allows free reuse of its data, including commercially, as long as Eurostat is credited as the source and any changes are indicated (see its [reuse policy](https://ec.europa.eu/eurostat/about-us/policies/copyright)). Every row includes the source and a link to the original dataset. In line with that policy, this Actor only returns data for EU, EFTA and EU candidate countries.

**Something missing?**
Open an issue on the **Issues** tab. Feature requests are welcome.

### Data source, reliability and changes

- **Source:** Eurostat, the statistical office of the European Union, dataset [`avia_tf_airpm`](https://ec.europa.eu/eurostat/databrowser/view/avia_tf_airpm/default/table) (airport traffic data by reporting airport, monthly).
- **Who produces the figures:** EUROCONTROL, the European organisation for the safety of air navigation, from the flight data it collects every day; Eurostat publishes them monthly.
- **What this Actor changes:** it tidies airport and country names, puts the flight count and Eurostat's percentage changes on the same row, and calculates flights per day and each airport's rank in its country. The flight counts and percentage changes are passed through as Eurostat publishes them.
- **Airport codes and municipalities:** IATA codes and municipalities come from [OurAirports](https://ourairports.com/data/) (public domain).
- **Coverage:** EU, EFTA and EU candidate countries, in line with Eurostat's reuse policy.

*Source: Eurostat, based on EUROCONTROL data. Data modified as described above; Eurostat has no responsibility for these changes. This Actor is independent and not affiliated with or endorsed by Eurostat, EUROCONTROL or any airport operator.*

# Actor input Schema

## `countries` (type: `array`):

Two-letter Eurostat country codes to include, e.g. ES (Spain), FR, DE, IT, PT, PL, EL or GR (Greece). Leave empty for all countries. Default: all countries.

## `airports` (type: `array`):

Optional list of airports. Accepts IATA codes (MAD, BCN, IST), ICAO codes (LEMD, LEBL, LTFM) or Eurostat codes (ES\_LEMD). When set, rankInCountry is left empty. Default: all airports.

## `latestMonthOnly` (type: `boolean`):

If true, return only the most recent month published (about one month ago). Best for questions like 'which were the busiest airports last month'. Default: false.

## `fromPeriod` (type: `string`):

First month to return, format YYYY-MM, e.g. 2024-01. Data starts at 2019-01. Ignored when latestMonthOnly is true. Default: 12 months ago.

## `toPeriod` (type: `string`):

Last month to return, format YYYY-MM. Default: latest month published.

## `flightType` (type: `string`):

TOTAL (all commercial flights), SCHED (scheduled only) or NSCHED (non-scheduled and charter only). Default: TOTAL.

## `minFlights` (type: `integer`):

Only return airport-months with at least this many flights, e.g. 10000 to keep large airports only. Default: no minimum.

## `maxItems` (type: `integer`):

Maximum number of rows to return. Use it to limit output size and cost. Default: no limit.

## Actor input object example

```json
{
  "countries": [
    "ES"
  ],
  "latestMonthOnly": false,
  "flightType": "TOTAL"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "countries": [
        "ES"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("open_skies_data/european-airport-flights").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "countries": ["ES"] }

# Run the Actor and wait for it to finish
run = client.actor("open_skies_data/european-airport-flights").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "countries": [
    "ES"
  ]
}' |
apify call open_skies_data/european-airport-flights --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,open_skies_data/european-airport-flights"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sjnOZxsf8XaapkVCV/builds/Uw7yFc2SeMnFc9Odv/openapi.json
