Eurostat API: Watch & Export EU Statistics by Dataset Code avatar

Eurostat API: Watch & Export EU Statistics by Dataset Code

Pricing

from $1.00 / 1,000 value returneds

Go to Apify Store
Eurostat API: Watch & Export EU Statistics by Dataset Code

Eurostat API: Watch & Export EU Statistics by Dataset Code

Eurostat statistics as flat rows (one per value) for any dataset code and filters, or only values new or revised since your last run; failed and unchanged rows are never charged. Only EU, EFTA and candidate-country values are returned (Eurostat's terms). Not affiliated with or endorsed by Eurostat.

Pricing

from $1.00 / 1,000 value returneds

Rating

0.0

(0)

Developer

COMPASS DEV

COMPASS DEV

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Returns Eurostat statistics as flat rows, one per value, for any dataset code and filters, or only the values that are new or revised since your last run, and is never charged for failed or unchanged rows. Values for countries outside the EU, EFTA and the official EU candidate countries are left out, free: Eurostat's reuse terms do not allow selling them.

Give it Eurostat queries (a dataset code such as une_rt_m, with filters such as geo=FR&sex=T); get one row per value with the dataset, the country or region, the period, the value and its flag, the unit, every other dimension, a link to that value's data and a citation of the dataset's DOI. Built for spreadsheets, dashboards and AI agents that need Eurostat's data without handling JSON-stat. Not affiliated with or endorsed by Eurostat.

What it does

  • Any Eurostat dataset by its code (find codes in the Eurostat Data Browser), with Eurostat's own filters: dimension=code pairs (repeat a dimension for several codes) and the time filters sinceTimePeriod, untilTimePeriod and lastTimePeriod.
  • Export mode: every value, one flat row per value.
  • Watch mode (give a watch list name in stateName): remembers every value and returns only:
    • baseline: the first run of the list;
    • new: a value the list did not have (a new period, for example);
    • changed: Eurostat revised a value or its flag (previousValues gives the old ones);
    • values already seen are free and left out (includeUnchanged: true returns them as free rows).
    • A watch run with nothing new or changed returns exactly one free no_data row that says so.
  • Eurostat's reuse terms, applied for you:
    • values for countries outside the EU, EFTA and the official candidate countries (for example the United States, Japan or China) are left out, free;
    • so is a value whose partner, citizenship, country of birth or other country code is outside that list, totals such as TOTAL, WORLD or EXT_EU27_2020 included (they are not on the list);
    • a dataset that names sources other than Eurostat is refused (one free no_data row);
    • trade datasets (ext_…) are refused.
  • The values as published: never recalculated or rounded. Every row cites Eurostat, the dataset's DOI and the date.
  • You are never charged for failed results: failed, no_data and unchanged rows are free.

Quick start

{ "queries": ["une_rt_m?geo=FR&geo=DE&sex=T&age=TOTAL&unit=PC_ACT&s_adj=SA&lastTimePeriod=3"] }

GDP since 2020 for two countries:

{ "queries": ["nama_10_gdp?geo=FR&geo=DE&unit=CP_MEUR&na_item=B1GQ&sinceTimePeriod=2020"] }

Only new and revised values (schedule it; the first run is the baseline):

{ "queries": ["une_rt_m?geo=FR&geo=DE&sex=T&age=TOTAL&unit=PC_ACT&s_adj=SA&lastTimePeriod=3"], "stateName": "unemployment" }

Input

FieldTypeDefaultDescription
querieslist of strings— (prefilled with two examples)Eurostat queries, one per line: a dataset code, optionally ? and filters. Never a URL
modewatch or export—Empty: watch when stateName is given, otherwise export. An explicit mode wins
stateNamestring— (prefilled example-watchlist)Watch list name. Watch mode without a name uses the list default
includeUnchangedbooleanfalseWatch: also return values already seen (free)
maxItemsinteger 1–100,0001000Most charged values per run; in watch mode the rest come in the next run

Field name from other tools: datasets (→ queries).

Output

{
"status": "ok",
"attempts": 1,
"error": null,
"input": "une_rt_m?geo=FR&sex=T&age=TOTAL&unit=PC_ACT&s_adj=SA&lastTimePeriod=2",
"mode": "export",
"watchList": null,
"dataset": "une_rt_m",
"datasetLabel": "Unemployment by sex and age - monthly data",
"geo": "FR",
"geoLabel": "France",
"period": "2026-08",
"value": 8.2,
"flag": null,
"unit": "PC_ACT",
"unitLabel": "Percentage of population in the labour force",
"dimensions": "{\"freq\":\"M\",\"s_adj\":\"SA\",\"age\":\"TOTAL\",\"unit\":\"PC_ACT\",\"sex\":\"T\"}",
"dimensionLabels": "{\"freq\":\"Monthly\",\"s_adj\":\"Seasonally adjusted data, not calendar adjusted data\",\"age\":\"Total\",\"unit\":\"Percentage of population in the labour force\",\"sex\":\"Total\"}",
"seriesKey": "une_rt_m:M.SA.TOTAL.PC_ACT.T.FR",
"datasetUpdated": "2026-10-01T11:00:00+0200",
"doi": "10.2908/UNE_RT_M",
"changeType": null,
"changedFields": null,
"previousValues": null,
"url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/une_rt_m?freq=M&s_adj=SA&age=TOTAL&unit=PC_ACT&sex=T&geo=FR&time=2026-08",
"source": "Source: Eurostat, https://doi.org/10.2908/UNE_RT_M, accessed 2026-10-02.",
"license": "Eurostat reuse policy: commercial reuse authorised with the source acknowledged; values for countries outside the EU, EFTA and candidate countries are left out",
"licenseUrl": "https://ec.europa.eu/eurostat/help/copyright-notice",
"scrapedAt": "2026-10-02T17:00:00.000Z"
}
StatusMeaningCharged?
okA value returnedExport: yes. Watch: baseline, new and changed yes; unchanged no
no_dataNo value for the filters, every value left out under Eurostat's terms (or a dataset from other sources), or nothing new since the last runNo
failedInvalid query (a URL, a trade dataset, a bad filter), an unknown dataset, a query Eurostat finds too big, or no answer after retries (error says why)No

The key-value store holds RUN_REPORT (counts, charged and free rows, values left out and why, stop reason) and, when something fails, the raw response (SNAPSHOT_*).

Use it from AI agents

One clear main input, queries; every row has status, error, url and scrapedAt. Call it through the Apify API, the Apify MCP server (mouadapi/eurostat-statistics) or x402 agentic payments. Copy-paste call (your Apify token in APIFY_TOKEN):

curl -s -X POST "https://api.apify.com/v2/acts/mouadapi~eurostat-statistics/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["une_rt_m?geo=FR&geo=DE&sex=T&age=TOTAL&unit=PC_ACT&s_adj=SA&lastTimePeriod=3"]}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('mouadapi/eurostat-statistics').call({ queries: ['une_rt_m?geo=FR&sex=T&age=TOTAL&unit=PC_ACT&s_adj=SA&lastTimePeriod=3'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Output fields

FieldTypeDescription
statusstring (or null)ok = a value returned (charged in export mode and for baseline, new and changed rows; free when unchanged); no_data = nothing to return (no value for the filters, every value left out under Eurostat's terms, or nothing new since the last run) (free); failed = invalid query or no answer (free)
attemptsinteger (or null)Requests made for this query (retries included)
errorstring (or null)Why a row is no_data or failed (Eurostat's own message when it gives one); null on ok rows
inputstring (or null)The query as given in the input
modestring (or null)watch or export
watchListstring (or null)Watch list name (watch mode); null in export mode
datasetstring (or null)Eurostat dataset code
datasetLabelstring (or null)The dataset's title at Eurostat
geostring (or null)Eurostat geo code: a country, region (NUTS) or EU or euro-area aggregate; only EU, EFTA and candidate countries are returned (Eurostat's terms); null when the dataset has no geo dimension
geoLabelstring (or null)The geo code's name
periodstring (or null)The period of the value as Eurostat writes it (2023, 2026-08, 2026-Q2 …)
valuenumber (or null)The value as Eurostat publishes it (never modified), in the unit given
flagstring (or null)Eurostat's flag for the value (p provisional, e estimated, b break in series …); null when none
unitstring (or null)The unit dimension's code; null when the dataset has no unit dimension
unitLabelstring (or null)The unit's name
dimensionsstring (or null)Every dimension's code except geo and time, as JSON (one string column)
dimensionLabelsstring (or null)The same dimensions' names, as JSON
seriesKeystring (or null)The dataset and every dimension's code except time: the series the value belongs to
datasetUpdatedstring (or null)When Eurostat last updated the dataset (ISO 8601)
doistring (or null)The dataset's DOI, for citing it
changeTypestring (or null)Watch mode: baseline (first run of the list), new (a value the list did not have), changed (Eurostat revised the value or its flag) or unchanged (free); null in export mode
changedFieldsstring (or null)Watch mode: tracked fields that changed, comma-separated (value, flag)
previousValuesstring (or null)Watch mode: the changed fields' previous values, as JSON
urlstring (or null)The value's own data URL at the Eurostat API (every dimension fixed to its code)
sourcestring (or null)The citation Eurostat's terms ask for: Eurostat, the dataset's DOI and the access date
licensestring (or null)Eurostat's reuse terms, and what is left out under them
licenseUrlstring (or null)Eurostat's copyright notice
scrapedAtstring (or null)When the row was made (ISO 8601)

Pricing

Pay per event: one observation event per returned value (export: every value; watch: baseline, new and changed rows). no_data, failed and unchanged rows are free, and so are the values left out under Eurostat's terms.

PlanPrice per 1,000 values
Free$1.50
Bronze$1.30
Silver$1.15
Gold (and higher)$1.00

Apify also charges its small per-run start event. There are no usage fees on top.

Limits

  • One request per query, one at a time, at most one a second (Eurostat publishes no rate limit, so this is ours). If Eurostat answers HTTP 429, the run pauses 60, 120 and 240 seconds on the same connection, then stops with free failed rows. No other IP or proxy is ever tried.
  • Eurostat answers a costly query (a whole large dataset) as too big, or prepares it asynchronously: the query fails free with Eurostat's message. Filter it (fewer countries, a time filter) and run it again.
  • At most 100 filters and 1,500 characters per query (Eurostat refuses longer addresses), and at most 20,000 values read per query.
  • Only the countries Eurostat's terms allow are returned (the EU, EFTA and the official candidate countries, their regions, and EU, euro-area, EEA and EFTA aggregates). The candidate list follows the EU's; a value for another code is left out, even when Eurostat publishes it.

Known issues

  • None known yet.

FAQ

Why are values for the United States (or Japan, China …) missing? Eurostat's reuse terms do not allow selling data for countries outside the EU, EFTA and the official candidate countries, so this Actor leaves them out, also when the country is a partner, a citizenship or a country of birth. The run report counts them. They are free to use, non-commercially, from Eurostat itself.

Why did a watch run return one no_data row? Nothing was new or revised since the last run of the watch list; the row says how many values were unchanged. It is free.

Where do I find dataset codes and dimension codes? In the Eurostat Data Browser: the code is under each dataset's title, and each dimension's codes are in its filter list.

Data and licence