AENA Airport Stats Scraper (Traffic JSON) avatar

AENA Airport Stats Scraper (Traffic JSON)

Pricing

from $1.00 / 1,000 airport record delivereds

Go to Apify Store
AENA Airport Stats Scraper (Traffic JSON)

AENA Airport Stats Scraper (Traffic JSON)

Returns monthly passenger, operations and cargo statistics for every airport in the AENA Spanish airport network as JSON from AENA official XLS reports. One validated record per airport and month; a repeat run of the same month emits nothing.

Pricing

from $1.00 / 1,000 airport record delivereds

Rating

0.0

(0)

Developer

Steadfetch

Steadfetch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Security

Limited permissions

Share

AENA Airport Statistics Scraper (Spanish Airport Traffic Data)

Monthly passenger, operations and cargo statistics for every airport in AENA's Spanish network, extracted from AENA's official monthly XLS reports.

  • Source: AENA monthly statistical reports (public, no login, no CAPTCHA on these routes).
  • One record per airport and month.
  • No personal data: only aggregated airport traffic figures.

What it does

A run does two things:

  1. Reads AENA's monthly reports listing (?anio=YYYY) and picks the requested month -- or the latest published month when no period is given.
  2. Downloads that month's XLSX and joins its three side-by-side tables (passengers, operations and cargo) by airport name, emitting one validated record per airport.

Airports are matched across the three tables after normalising accents, case and repeated spaces. When an airport is missing from one of the tables, the corresponding fields are null -- values are never inferred or invented. Total ... rows are excluded in v1 (they can be derived by summing the airports).

Example output

{
"airport": "ADOLFO SU\u00c1REZ MADRID-BARAJAS",
"period": "2026-01",
"passengers": 5379569,
"passengersYoYPct": 3.49,
"operations": 34658,
"operationsYoYPct": 2.51,
"cargoKg": 62538434,
"cargoYoYPct": 6.27,
"provisional": true,
"url": "https://www.aena.es/sites/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1576873282373&ssbinary=true",
"fileUrl": "https://www.aena.es/sites/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1576873282373&ssbinary=true",
"scrapedAt": "2026-10-21T03:00:00.000Z"
}
  • passengers, operations, cargoKg are the monthly totals published by AENA.
  • *YoYPct is the year-over-year variation in percent, rounded to 2 decimals (AENA publishes the fraction; this Actor multiplies by 100).
  • provisional is true when AENA marks the report as provisional data.
  • url (common Steadfetch envelope) and fileUrl point to the same official XLSX report; the record is never built from any other page.

Input

{ "period": "2026-01" }
FieldTypeRequiredDescription
periodstringnoReport month as YYYY-MM. Omit it to extract the latest month published in AENA's listing.

The Actor only requests the reports listing and the selected XLSX file. It never calls /consultas-personalizadas or infovuelos (both are behind reCAPTCHA), and it uses no browser and no proxy.

Pay-per-event pricing

EventWhen it firesPrice
apify-actor-startonce per run (synthetic, automatic)0.00005 USD
apify-default-dataset-itemone validated airport/period record saved to the dataset (synthetic, automatic)0.001 USD per record = 1.00 USD per 1,000 records

Only validated records are pushed to the dataset. Downloads, total rows and repeat runs of an already delivered month are never charged: there is no custom per-item event, so a record can never be billed twice.

Cost per 1,000 results (measured locally)

MeasurementValue
January 2026 XLSX55,558 bytes, 117 rows, 66 airport records
Parse + join + schema validation22.6 ms, 9 MB JS heap (84 MB process RSS)
Network1 listing page (~84 KB) + 1 XLSX (~56 KB)
Run memory ceiling256 MB (Actor minimum)

At 256 MB and roughly 1-2 s per run (two or three HTTP requests dominate), a run costs about 0.0001 GB-hour. At 0.30 USD/GB-hour that is well below 0.01 USD per 1,000 records. The platform figure has not been billed yet: no platform run has been spent on this Actor, because the Apify account has a hard 85 USD/month team credit cap. It will be updated here after the first minimal platform run.

Dedupe and reruns

Delivered (airport, period) keys are stored in the named key-value store aena-monthly-state. Running the same period again emits 0 new records and charges nothing. The following month emits the new month's records.

This makes the Actor safe to run on a schedule: a daily run only pays for a new month once.

Development

npm install --include=dev
npm test # lint + typecheck + 58 tests (no network, no credit)
npm run demo:fixtures # offline pipeline on the real Jan-2026 fixture
npm run publish:check
npm run build && npm run verify:build

npm run demo:fixtures reads test/fixtures/informes-mensuales-2026.html and test/fixtures/informe-2026-01.xlsx, runs the same parsing pipeline and prints the validated records. It needs no APIFY_TOKEN.

Data notes

  • AENA publishes these reports as provisional data (DATOS PROVISIONALES); the source can revise them later. The provisional flag tells you when the snapshot is provisional.
  • The January 2026 workbook contains airline-network airports plus international subsidiaries (BOAB, ANB, London-Luton) exactly as AENA publishes them. Totals (Total Aeropuertos Espanoles, Total BOAB, Total ANB, Total Aeropuertos Brasilenos, TOTAL RED AENA) are excluded from v1.
  • Values are copied as published. Cargo is in kilograms, exactly as in the report.

FAQ

How fresh is the data? Each run downloads the official XLSX of the selected month from AENA. No cached third-party copy is used.

Can I get several years? Yes: run once per period (YYYY-MM). Every month from 2004 onward is listed on AENA's site.

Why is a field null? That airport is not present in the corresponding table of that report. The Actor never guesses or interpolates.

Does it need a proxy or a browser? No. Plain HTTP requests and a local XLSX reader.

What happens on a bot challenge or a 403? The run aborts with a clear error. Steadfetch never solves CAPTCHAs or tries to bypass access controls.

Maintenance

This Actor is tested daily: automated runs keep the source reachable and the output schema valid, and failures open an issue in this repository. The daily QA entry is registered in the Steadfetch QA catalogue and is enabled once the Actor is published on Apify. Schema changes are announced through repository releases.

Only public, aggregated data published by AENA is read. The Actor honours robots.txt, sends an honest User-Agent with contact information and makes two HTTP requests per run when period is set (three at most in default mode, when a second-year listing is needed). See docs/legal-gate.md for the reviewed evidence. Source: AENA (public statistics). Steadfetch is not affiliated with AENA.