EU Air Passenger Volumes by Country — Eurostat Aviation Data avatar

EU Air Passenger Volumes by Country — Eurostat Aviation Data

Pricing

from $33.50 / 1,000 passenger flow records

Go to Apify Store
EU Air Passenger Volumes by Country — Eurostat Aviation Data

EU Air Passenger Volumes by Country — Eurostat Aviation Data

Official Eurostat air passenger and flight totals by reporting country (avia_paoc): choose passengers carried or on board, or flights, by coverage, schedule and monthly/quarterly/annual period, newest first. Country totals, not routes or fares. Pay per record.

Pricing

from $33.50 / 1,000 passenger flow records

Rating

0.0

(0)

Developer

NexGen Signal

NexGen Signal

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

13 days ago

Last modified

Share

Official source. No API key. Pay per record.

Who this is for and the decision it supports

Aviation analysts, airport and tourism-board planners, and travel-demand modellers who need official European air-passenger volumes without scraping Eurostat by hand.

One record answers: how many passengers/flights moved through a given country for a traffic type and period — a single input to a route-demand, capacity, or market-sizing model.

  • Aviation and airport analysts benchmarking national traffic with Eurostat air passengers carried and on board, month by month.
  • Tourism boards and travel-demand modellers using official country totals as an input to demand and capacity models.
  • Researchers who need the Eurostat series as clean records (country totals, not routes or fares).

Buyers usually search for this as "eurostat air passengers" or "europe airport passenger statistics".

Sample output

Sample output — EU Air Passenger Volumes by Country — Eurostat Aviation Data

Real rows from a live run of this actor (first 5 rows, selected columns).

One full record from the same run, exactly as delivered:

{
"record_id": "A:FLIGHT:CAF_PAS:INTL:NSCHED:DE:2015",
"dataset_code": "avia_paoc",
"indicator": "Air passenger transport by reporting country (overall)",
"freq": "A",
"freq_label": "Annual",
"unit": "FLIGHT",
"unit_label": "Flight",
"tra_meas": "CAF_PAS",
"tra_meas_label": "Commercial passenger air flights",
"tra_cov": "INTL",
"tra_cov_label": "International transport",
"schedule": "NSCHED",
"schedule_label": "Non-scheduled",
"geo": "DE",
"geo_label": "Germany",
"time_period": "2015",
"value": 67893,
"obs_status": null,
"source": "Eurostat",
"source_dataset": "avia_paoc",
"licence": "Eurostat, CC BY 4.0. Reformatted from Eurostat JSON-stat; values unmodified. Third-party content and logos excluded. Commercial-barred geographies removed.",
"attribution": "Source: Eurostat (dataset avia_paoc)",
"caveat": "Passenger and flight measures are counts of carriage/on-board activity, not seat inventories or fares. Values are reproduced verbatim from Eurostat; read national vs. international coverage from the tra_cov code.",
"observed_at": "2026-09-25T17:19:45Z"
}

What one record is

Each record is one Eurostat air-transport observation: country, traffic measure and coverage, schedule type, period, value and unit, with full provenance.

Your first run

Paste this input and run it:

{
"geo": "DE",
"sinceTimePeriod": "2023",
"maxRecords": 10
}

Set geo to a country and get clean per-observation JSON in seconds — no JSON-stat parsing, no Eurostat query builder. Here is a real record from that exact input:

{
"record_id": "A:FLIGHT:CAF_PAS:INTL:NSCHED:DE:2023",
"dataset_code": "avia_paoc",
"indicator": "Air passenger transport by reporting country (overall)",
"freq": "A",
"freq_label": "Annual",
"unit": "FLIGHT",
"unit_label": "Flight",
"tra_meas": "CAF_PAS",
"tra_meas_label": "Commercial passenger air flights",
"tra_cov": "INTL",
"tra_cov_label": "International transport",
"schedule": "NSCHED"
}

What the sample costs: $0.05 per record. The sample above delivers 10 records, so it costs at most $0.50.

Pulling in bulk

Raise Maximum records and widen the period to pull a country's full history, then repeat per country to build the EU panel. A buyer pulls 1,000-10,000 records to assemble a full country x traffic-type x period panel for trend analysis, forecasting, or benchmarking one country against the EU.

To expand from the sample: raise Maximum records, and widen any filters shown in the input. You are billed only for records actually delivered, so a sample stays cheap and a full pull is predictable.

When to run it again

Eurostat republishes avia_paoc as new periods land; re-run with a later sinceTimePeriod to append only the newest observations to a table you keep.

Update schedule: Eurostat releases new periods for this cube on a rolling basis (roughly quarterly as monthly/quarterly data clears). Verified live: the cube returns observations addressable by period; pull the latest period to confirm the current release.

How this is different

This is air-passenger flow specifically.

Limitations (source coverage vs product coverage)

  • This is COUNTRY-level (and EU-aggregate) traffic, not airport-level or route-level. For airport-pair markets use the US Airport-Pair Fare actor.
  • Values are counts of carriage/on-board activity, not seat inventory or load factors.
  • Coverage is Eurostat's reporting countries and periods; a country with no reported data for a period returns no row for it.

FAQ

Is this real-time?

No. It is the official Eurostat cube, refreshed when Eurostat publishes new periods (roughly quarterly). It is not a live flight feed.

Airport or route level?

Country level. One row is a country x traffic-type x period observation.

What does an empty run mean?

The geo/period combination has no Eurostat observation — try a broader period or a different country code.

How much does it cost? You pay $0.05 per passenger flow record delivered to your dataset (less on higher Apify plans). Set the record limit in the input to cap what a run can cost. Records that are not delivered are never charged.

How do I get the data out? Every run saves its records to an Apify dataset. You can download it as JSON, CSV, Excel, XML or HTML from the run page, or read it through the Apify API.

Can I run it on a schedule? Yes. Use Apify Schedules to run it daily, weekly or monthly, with the same input each time.

Can I call it from my own code? Yes. Call nexgensignal/eu-air-passenger-flow-records through the Apify API or the Apify Python and JavaScript clients, pass the same JSON input as the form, and read the dataset when the run finishes.

What happens if the source is down? The run ends with a clear status message, and nothing is charged for records that were not delivered.

Choosing the series (search options)

Pick the series you want before the run, instead of paging through every combination. Codes are Eurostat's own; they are sent to Eurostat as filters (only matching series are read and billed) and checked against the dataset's live code list first, so a wrong code stops the run with the valid codes listed and nothing charged. With no option set the actor sends exactly the request it sent before.

InputEurostat dimensionCodes
measuretra_measOptional but recommended. PAS_BRD Passengers on board; PAS_BRD_ARR Passengers on board (arrivals); PAS_BRD_DEP Passengers on board (departures); PAS_CRD Passengers carried; PAS_CRD_ARR Passengers carried (arrival); PAS_CRD_DEP Passengers carried (departures); CAF_PAS Commercial passenger air flights; CAF_PAS_ARR Commercial passenger air flights (arrivals); CAF_PAS_DEP Commercial passenger air flights (departures). Passenger measures count passengers; CAF_* count flights.
unitunitOptional. PAS Passenger; FLIGHT Flight. Use PAS with a passenger measure and FLIGHT with a flight measure.
coveragetra_covOptional. TOTAL Total transport; NAT National transport; INTL International transport; INTL_IEU27_2020 International transport Intra-EU27 (from 2020); INTL_IEU28 International transport Intra-EU28 (2013-2020); INTL_IEU27_2007 International transport Intra-EU27 (2007-2013); INTL_XEU27_2020 International transport Extra-EU27 (from 2020); INTL_XEU28 International transport Extra-EU28 (2013-2020); INTL_XEU27_2007 International transport Extra-EU27 (2007-2013).
schedulescheduleOptional. TOTAL Total; SCHED Scheduled; NSCHED Non-scheduled; UNK Unknown.
frequencyfreqOptional. Q Quarterly; M Monthly; A Annual.
newestFirsttimeMost recent periods first, before cutting to maxRecords (monthly, quarterly and annual periods are ordered by the date they end).

Example (the Store example):

{
"geo": "DE",
"measure": [
"PAS_CRD"
],
"unit": [
"PAS"
],
"coverage": [
"TOTAL"
],
"schedule": [
"TOTAL"
],
"frequency": [
"M"
],
"sinceTimePeriod": "2025",
"newestFirst": true,
"maxRecords": 10
}

First rows it returned when checked (Sep 2026):

[
{
"geo": "DE",
"time_period": "2026-05",
"value": 18866891,
"tra_meas_label": "Passengers carried",
"unit_label": "Passenger",
"tra_cov_label": "Total transport",
"schedule_label": "Total",
"freq_label": "Monthly"
},
{
"geo": "DE",
"time_period": "2026-04",
"value": 16290067,
"tra_meas_label": "Passengers carried",
"unit_label": "Passenger",
"tra_cov_label": "Total transport",
"schedule_label": "Total",
"freq_label": "Monthly"
},
{
"geo": "DE",
"time_period": "2026-03",
"value": 14735626,
"tra_meas_label": "Passengers carried",
"unit_label": "Passenger",
"tra_cov_label": "Total transport",
"schedule_label": "Total",
"freq_label": "Monthly"
}
]

Pick a passenger measure (PAS_CRD passengers carried, PAS_BRD passengers on board) with unit PAS for passenger counts; CAF_* measures count flights (unit FLIGHT). Without selectors, rows mix passengers and flights and monthly, quarterly and annual periods. Country totals only: not routes, airports or fares.

Input fields

Every input this actor accepts, read from its input schema:

FieldTypeDefaultDescription
sinceTimePeriodstring"2015"Return observations from this period onward. Use a year (2015), a quarter (2015-Q1) or a month (2015-01). Earlier start = more records.
maxRecordsinteger10Maximum records delivered and billed. You are billed only for records actually delivered. Raise it to pull the full set.
geo (required)string"DE"Eurostat geo code to pull (e.g. DE, FR, IT, ES). Required: this cube is too large to return in one request, so it is retrieved one territory at a time.

Default changed on 30 Sep 2026: if you leave maxRecords out, a run now returns up to 10 records (it was 500). Set maxRecords yourself to get more — the maximum is unchanged.

Output fields

Every field in each delivered record, read from its output schema:

FieldTypeMeaning
record_idstringComposite source-native key across all dimensions.
dataset_codestringEurostat dataset code.
indicatorstringIndicator name.
freqstringfreq dimension code, verbatim.
freq_labelstringfreq dimension label, verbatim.
unitstringunit dimension code, verbatim.
unit_labelstringunit dimension label, verbatim.
tra_measstringtra_meas dimension code, verbatim.
tra_meas_labelstringtra_meas dimension label, verbatim.
tra_covstringtra_cov dimension code, verbatim.
tra_cov_labelstringtra_cov dimension label, verbatim.
schedulestringschedule dimension code, verbatim.
schedule_labelstringschedule dimension label, verbatim.
geostringgeo dimension code, verbatim.
geo_labelstringgeo dimension label, verbatim.
time_periodstringTime period, verbatim (e.g. 2024-Q1 or 2024-01).
valuenumberObservation value, reproduced verbatim (published zeros kept).
obs_statusstringEurostat observation status/flag when present, verbatim.
sourcestringData source (Eurostat).
source_datasetstringSource dataset code.
licencestringLicence and reformatting notice.
attributionstringRequired attribution string.
caveatstringInterpretation caveat.
observed_atstringUTC timestamp the record was retrieved.
  • us-airport-pair-fare-records — US airport-pair fare and traffic benchmarks (route level)
  • eu-business-demography-records — EU firm formation and survival
  • eu-regulatory-change-records — EU legal acts affecting the sector

Source, licence and how it is built

Source and licence are carried on every record (source, licence, attribution, observed_at). The actor reads only the official public endpoint, honours the source's robots and licence terms, and emits values unmodified with full provenance. Records are keyed on a stable id so re-runs upsert cleanly into a table you keep. Row delivery and billing are exactly equal: you are charged once per record delivered (push-then-charge), so an empty run costs nothing.

Part of NexGen Signal — official-source data products.