Eurostat Statistics API — EU Inflation (HICP) & Trade Data
Pricing
from $0.01 / 1,000 results
Eurostat Statistics API — EU Inflation (HICP) & Trade Data
Get EU inflation (HICP/CPI, with computed YoY and 12-month moving average) and EU import/export trade statistics from Eurostat's public API as clean JSON. No key needed.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
Daniel Posztos
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Eurostat Statistics API — EU inflation (HICP) & trade data as JSON
SEO title: Eurostat Statistics API — EU inflation (HICP) & trade data as JSON SEO description: Get EU inflation (HICP/CPI) with computed year-over-year change and 12-month moving average, or EU import/export trade statistics, straight from Eurostat's public dissemination API as clean JSON. No API key needed — built for research, market analysis, and AI agents.
One actor, two Eurostat datasets, both wrapped in a clean, agent-friendly JSON schema instead of Eurostat's own JSON-stat 2.0 dimension-index format and cell-limited query API:
hicp— Harmonised Index of Consumer Prices (inflation), withyoy_pct(year-over-year % change) andma12_pct(12-month moving average of that) computed automatically. Eurostat's own API does not provide either field — this is the actor's whole value-add.comext— EU international trade in goods (import/export value and quantity, by product/reporter/partner country/period), from the dedicated Comext dissemination endpoint.
No scraping, no anti-bot risk, no login — both datasets are queried from Eurostat's public, unauthenticated dissemination API over HTTPS.
Why this exists
Eurostat's own API is powerful but awkward to use directly:
- Responses are JSON-stat 2.0: values keyed by a flat row-major index, categories as separate code→position maps — not directly usable without a decoder.
- The Comext (trade) endpoint enforces a hard 5,000,000-row extraction limit per query and 413s with
EXTRACTION_TOO_BIGif you ask for too much at once. - Computing inflation's year-over-year change or a moving average yourself means manually fetching extra months of history and aligning them — tedious and easy to get subtly wrong (e.g. off-by-one month, or silently treating a missing value as zero).
This actor does all of that once, correctly, so the output is analysis-ready JSON.
Input
| Field | Type | Default | Used by | Description |
|---|---|---|---|---|
dataset | string | "hicp" | both | "hicp" (inflation) or "comext" (EU trade). |
countries | array of strings | ["HU", "DE"] | hicp | Eurostat geo codes. Note: Eurostat uses "EL" for Greece and "UK" for the United Kingdom (not "GR"/"GB"). |
coicop_codes | array of strings | ["CP00"] | hicp | Consumption category. "CP00" = all-items (headline). Others: "CP01" (food), "NRG" (energy), "SERV" (services), "TOT_X_NRG_FOOD" (core, ex. energy & food). |
hs_codes | array of strings | ["870323"] | comext | Product codes: 2 (HS chapter), 4 (HS heading), 6 (HS subheading), or 8 (full CN8) digits. |
reporter_countries | array of strings | ["HU"] | comext | EU/EFTA declarant countries. Note: Comext uses "GB"/"GR" (not "UK"/"EL") — the opposite convention from the hicp field above; this is Eurostat's own inconsistency between the two APIs, not this actor's. |
partner_countries | array of strings | ["DE"] | comext | Trade partner countries (ISO-3166-1 alpha-2), or "WORLD" for all partners combined. |
flow | string | "import" | comext | "import" or "export". |
period_from / period_to | string ("YYYY-MM") | "2025-01" / "2025-12" | both | Inclusive period range, max 120 months (10 years) per run. For hicp, Eurostat data 23 months before period_from is fetched automatically in the background (see "How yoy_pct/ma12_pct are computed" below) — only rows inside [period_from, period_to] are ever returned. |
Fields not relevant to the selected dataset are simply ignored (logged as informational, never an error) — you can leave them at their defaults.
Worked example — input (HICP)
{"dataset": "hicp","countries": ["HU", "DE"],"coicop_codes": ["CP00"],"period_from": "2024-11","period_to": "2025-12"}
Worked example — output (HICP, real data, 4 of 28 rows)
[{ "dataset": "hicp", "country": "HU", "coicop": "CP00", "period": "2025-01", "index_value": 171.85, "yoy_pct": 5.6758, "ma12_pct": 3.8804 },{ "dataset": "hicp", "country": "HU", "coicop": "CP00", "period": "2025-11", "index_value": 174.66, "yoy_pct": 3.7050, "ma12_pct": 4.5746 },{ "dataset": "hicp", "country": "DE", "coicop": "CP00", "period": "2025-01", "index_value": 129.9, "yoy_pct": 2.7690, "ma12_pct": 2.4645 },{ "dataset": "hicp", "country": "DE", "coicop": "CP00", "period": "2025-11", "index_value": 132.6, "yoy_pct": 2.5522, "ma12_pct": 2.3333 }]
The most recent requested month (2025-12 in this example) came back with every field null — Eurostat hadn't published that month for either country yet at fetch time. This is expected, not a bug: see "Known limitations" below.
Worked example — input (Comext)
{"dataset": "comext","hs_codes": ["870323", "870324"],"reporter_countries": ["HU"],"partner_countries": ["DE"],"flow": "import","period_from": "2024-07","period_to": "2024-12"}
Worked example — output (Comext, real data, 4 of 12 rows)
[{ "dataset": "comext", "hs_code": "870323", "reporter": "HU", "partner": "DE", "period": "2024-07", "flow": "import", "value_eur": 2387357.0, "quantity_kg": 94358.0 },{ "dataset": "comext", "hs_code": "870323", "reporter": "HU", "partner": "DE", "period": "2024-11", "flow": "import", "value_eur": 6831941.0, "quantity_kg": 349791.0 },{ "dataset": "comext", "hs_code": "870323", "reporter": "HU", "partner": "DE", "period": "2024-12", "flow": "import", "value_eur": null, "quantity_kg": null },{ "dataset": "comext", "hs_code": "870324", "reporter": "HU", "partner": "DE", "period": "2024-07", "flow": "import", "value_eur": 2719538.0, "quantity_kg": 50327.0 }]
Again, 2024-12 (the newest requested month) is null for both HS codes — not yet published for this reporter/partner/product at fetch time, consistently represented as a null row rather than a missing one (see below).
Output schema
hicp rows
| Field | Type | Notes |
|---|---|---|
dataset | string | "hicp" |
country | string | Eurostat geo code |
coicop | string | Consumption category code |
period | string | "YYYY-MM" |
index_value | float or null | Raw HICP index, base 2015=100, as published by Eurostat |
yoy_pct | float or null | Computed. (index_value / index_value 12 months earlier - 1) × 100 |
ma12_pct | float or null | Computed. Average of yoy_pct over this period and the 11 preceding ones |
comext rows
| Field | Type | Notes |
|---|---|---|
dataset | string | "comext" |
hs_code | string | Product code as given in hs_codes |
reporter | string | Reporter (declarant) country |
partner | string | Partner country, or "WORLD" |
period | string | "YYYY-MM" |
flow | string | "import" or "export" |
value_eur | float or null | Trade value in euros |
quantity_kg | float or null | Trade quantity in kilograms (converted from Eurostat's native 100kg unit) |
Both modules guarantee exactly one row per requested combination (country×coicop×period for hicp; reporter×partner×hs_code×period for comext) — a period Eurostat hasn't published data for yet comes back as a row with null fields, it never simply disappears from the output. This makes the row count fully predictable ahead of time (and therefore the cost, too — see Pricing).
How yoy_pct / ma12_pct are computed
yoy_pctfor period t needs the index value at t and at t − 12 months.ma12_pctfor period t is the average ofyoy_pctat t, t−1, ..., t−11 — which in turn each need an index value 12 months before THEM, i.e. as far back as t − 23 months.- So the actor automatically fetches 23 months of Eurostat data before your requested
period_fromin the background — you never have to think about this, and only rows inside[period_from, period_to]are ever returned. - If any needed index value is missing (unpublished, withdrawn, or simply older than the country's series start), the computed field is
null— it is never fabricated, and a partial/incomplete 12-month window forma12_pctis treated as fully missing (strict: all 12 trailingyoy_pctvalues must be present) rather than silently averaging fewer than 12.
Pricing (pay-per-event)
| Event | Price | When it's charged |
|---|---|---|
data-row | $0.002 | Once per output row |
dataset-query | $0.05 | Once per run, right after the first upstream Eurostat chunk fetch succeeds. Never charged if every upstream fetch in the run fails. |
Plus Apify's own apify-actor-start synthetic event (first 5 seconds of compute free, platform-managed).
Examples:
- HICP: 2 countries × 1 COICOP × 12 months = 24 rows →
24 × $0.002 + $0.05 = $0.098. - Comext: 1 reporter × 1 partner × 1 HS code × 6 months = 6 rows →
6 × $0.002 + $0.05 = $0.062.
If a run's cost would exceed the Max total charge USD you set for it, the actor stops producing further rows at exactly that point — every delivered row was paid for, and nothing paid-for is ever dropped. It never crashes and never produces unbilled/"free" rows past the limit.
Error messages
- No input at all: explains the minimal valid input for each dataset.
- Unknown
dataset: "'dataset' must be one of ['comext', 'hicp'], got '...'." - Unknown
countriescode (hicp): lists all 45 valid Eurostat geo codes and calls out the"EL"/"UK"naming quirk. - Unknown
reporter_countries/partner_countriescode (comext): lists all valid codes and calls out that Comext uses"GB"/"GR"(opposite of the hicp module's"UK"/"EL"). - Malformed
coicop_codes: Eurostat's full COICOP nomenclature has 468 entries, too many to hardcode as a strict allowlist — this actor validates the code shape (letters/digits/underscore, starting with a letter) rather than membership. A well-formed but nonexistent COICOP code is not a validation error; it comes back as a row withindex_value/yoy_pct/ma12_pctallnull(see "Known limitations"). - Malformed
hs_codes: must be digits only, 2/4/6/8 characters. - Bad
period_from/period_toformat,period_fromafterperiod_to, or span over 120 months: all rejected with the exact rule and an example fix. - 0 rows with otherwise valid input: the run still succeeds, but the log carries an explicit
WARNING: 0 results produced despite valid input (...)line and the run's status message says so — never a silent "nothing happened." In practice, because both modules guarantee one row per requested combination (see above), this only happens when every single upstream chunk fetch failed (e.g. Eurostat is unreachable) — Eurostat genuinely having no data for a period/country/product still producesnull-valued rows, not zero rows.
Known limitations (documented, not hidden)
- HICP index base year is fixed to
unit=I15(2015=100). Eurostat periodically rebases (I05, I96 were also observed live); if/when a newer base becomes the primary one, this actor will need an update — verified 2026-07-06 that I15 is still current. - COICOP codes are shape-validated, not membership-validated (see Error messages) — a typo'd-but-well-formed code silently yields all-null rows rather than a hard error. Common valid codes are listed in the input field description.
- Comext's 5,000,000-row extraction cap is worked around by chunking every fetch to one (reporter country × calendar year) pair, which stays far under the cap for any realistic
hs_codes/partner_countriescombination. In the extraordinarily unlikely case a single chunk is still rejected as too big, that one chunk is skipped with a loud log warning (not a crash) — narrowinghs_codes/partner_countriesor the period range is the fix. - Eurostat's two APIs disagree on a few country codes (
"EL"/"UK"for HICP vs."GB"/"GR"for Comext) — this is Eurostat's own inconsistency between the general Statistics API and the Comext API, called out explicitly in both the input schema and validation error messages so it's never a silent surprise. - A requested period newer than what Eurostat has actually published for a given series is emitted as a null row, not omitted — Eurostat's own JSON-stat response simply drops that month from its time dimension entirely rather than returning an explicit null cell for it; this actor re-inserts the expected row with null fields so the row count is always predictable from the input alone.
Data sources (public, no API key, no scraping)
- Eurostat Statistics API (JSON-stat 2.0):
https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/prc_hicp_midx - Eurostat Comext dissemination API (JSON-stat 2.0):
https://ec.europa.eu/eurostat/api/comext/dissemination/statistics/1.0/data/DS-045409
Both are the same public, unauthenticated endpoints Eurostat's own web tools call — no login, no key, no ToS-risk scraping.