← APIs / Eurostat
Verified

Eurostat

Apiosk Basicsby Apiosk Basics · General

Official European statistics from Eurostat, the statistical office of the European Union. Around 8,000 datasets covering GDP and national accounts, inflation and HICP, unemployment and the labour force, population and migration, trade, energy, environment and emissions, transport, health, education, income and living conditions - harmonised across the 27 member states plus EFTA and the candidate countries, at country and at NUTS 1, 2 and 3 regional level. Query a single figure or a whole series in JSON-stat, SDMX-CSV or SDMX-ML, browse the catalogue, or read the code lists behind any dimension. Reuse, including commercial reuse, is permitted with the source indicated as Eurostat.

dataapi
Price per request
$0.01
About

Eurostat is where the official numbers about Europe come from: the same series the European Central Bank, national statistical offices and the financial press quote. This listing carries all four of its public APIs over one host. `statistics/1.0/data` is the one to reach for first - one dataset per call, dimension filters as ordinary query parameters, JSON-stat 2.0 back: `nama_10_gdp` with `geo=NL`, `unit=CP_MEUR`, `na_item=B1GQ` and `time=2023` returns a single labelled observation, and `geoLevel=nuts2` returns every region at once instead. `sdmx/3.0/data` is the current SDMX REST service, taking a dot-separated dimension key with wildcards (`M.RCH_A.CP00.*` is monthly HICP for every country) and returning SDMX-CSV, SDMX-ML or JSON-stat, with component filters that carry operators (`c[TIME_PERIOD]=ge:2025-10`). `sdmx/2.1/data` is the previous generation, still live and still what the R `eurostat` and `restatapi` packages and pandasdmx speak. `sdmx/3.0/structure/dataflow` and `/codelist` answer the questions a caller has to settle before any of that: which dataset is this, what are its dimensions in what order, and what does the code `CP_MEUR` or `B1GQ` or `NL33` actually mean. `catalogue/toc` is the full 8,000-entry table of contents with each dataset's code, coverage window and last update; `catalogue/dcat` is the same catalogue as DCAT-AP RDF; `catalogue/rss` is a feed of what changed. Eurostat updates twice a day, at 11:00 and 23:00 Brussels time, and pushes queries it considers too large onto an async queue, which `1.0/async` polls and collects. Upstream is free and unauthenticated; Apiosk meters and charges per call, so an agent needs no Eurostat integration of its own.

Base URL
https://gateway.apiosk.com/eurostat
Technical Specs
Auth Methodnone
Response FormatJSON
Endpoints10
Endpoints
MethodPathDescriptionCost
GET /1.0/async Collect a Eurostat query that was too large to answer inline. When a data request exceeds what Eurostat will serve synchronously - a whole dataset with no dimension filter, or a caller that has been extracting heavily - it answers with an XML envelope carrying an id instead of the data. Poll status with that id until it reads AVAILABLE, then fetch data to download the result. The statuses are SUBMITTED (queued), PROCESSING, AVAILABLE (ready), EXPIRED (gone, resubmit the original query), UNKNOWN_REQUEST (wrong id) and ERROR. Eurostat asks callers to run one request at a time and not to parallelise; a query filtered down to what is actually needed usually avoids the queue altogether.
$0.01 default
View details
GET /api/hub/search/search Find the Eurostat dataset code for a subject, in plain language. Eurostat itself has no search, and every other endpoint on this listing needs the code first: this is the call that turns "Dutch inflation", "greenhouse gas emissions by sector", "government debt" or "population by age" into prc_hicp_manr, env_air_gge, gov_10dd_ggd, demo_pjan. It searches the EU Open Data Portal index of Eurostat's own catalogue, so the hits are Eurostat datasets and nothing else, each with its English title and its code in identifier[0]. Ranking is full-text rather than semantic, so it can put a niche or discontinued table above the mainstream one - read the titles and pick, rather than taking the first hit. Feed the code straight into statistics/1.0/data or the SDMX endpoints.
$0.01 default
View details
GET /catalogue/dcat/ESTAT The Eurostat catalogue as DCAT-AP RDF - the machine-readable metadata standard the European Data Portal ingests, with a dcat:Dataset record per dataset carrying its title, description, publisher, themes, temporal coverage, update frequency and distribution links. FULL is the entire catalogue; UPDATES is the far smaller list of datasets modified since the previous publication window, which is what a mirror or a change monitor actually wants. Both are returned as a ZIP archive containing the RDF, not as raw RDF over the wire. Eurostat publishes twice a day, at 11:00 and 23:00 Brussels time, and this catalogue syncs daily to data.europa.eu.
$0.01 default
View details
GET /catalogue/rss The Eurostat update feed as RSS 2.0: which datasets and which data structures were republished, most recent first, with the publication timestamp of the run. The way for an agent to notice that a series it depends on has new figures without re-querying the series itself. Eurostat republishes twice a day, at 11:00 and 23:00 Brussels time, so the feed changes at most twice daily. Returns XML, around half a megabyte.
$0.01 default
View details
GET /catalogue/toc The full Eurostat table of contents - every one of the ~8,000 datasets with its code, its title, the theme folder it sits in, the period its data covers, when the data and the table structure were last changed, and how many values it holds. The way to find the dataset code for a subject when only the subject is known: search the titles for unemployment, inflation, greenhouse gas, tourism or household income and read off the code the data endpoints take. txt returns a tab-separated table in one language and is the practical choice for searching; xml returns the same tree multilingual, with per-dataset metadata and download links, and is around 23 MB. Refreshed twice a day, at 11:00 and 23:00 Brussels time.
$0.01 default
View details
GET /sdmx/2.1/data Query a Eurostat dataset through the older SDMX 2.1 REST service - the dialect the R eurostat and restatapi packages and pandasdmx generate. Same positional dot-separated key as SDMX 3.0 but without the agency and version segments: NAMA_10_GDP with key A.CP_MEUR.B1GQ.NL. An empty position is a wildcard (A.CP_MEUR..LU returns every national accounts indicator for Luxembourg) and + joins alternatives (BE+LU). Period filtering uses startPeriod and endPeriod rather than component operators, and detail controls how much comes back: dataonly drops the attributes, serieskeysonly returns just which series exist. Returns SDMX-ML 2.1, SDMX-CSV 1.0, JSON-stat 2.0 or TSV. New integrations should prefer the SDMX 3.0 endpoint; this one exists so existing ones keep working.
$0.02 default
View details
GET /sdmx/3.0/data/dataflow/ESTAT Query any Eurostat dataset through the SDMX 3.0 REST service, addressing observations by a dot-separated dimension key rather than by named parameters. The key follows the dataset's own dimension order and * means every value at that position: M.RCH_A.CP00.NL is the monthly HICP annual rate for the Netherlands, M.RCH_A.CP00.* is the same series for every reporting country in one call. Selecting several values at one position is done with a component filter rather than inside the key, because this service rejects both + and , in a key: A.CP_MEUR.B1GQ.* with c[geo]=BE,LU,NL returns annual GDP for three countries. Returns SDMX-CSV 2.0 (one row per observation, the easiest to parse), SDMX-ML 3.0, or JSON-stat 2.0. Component filters carry operators - c[TIME_PERIOD]=ge:2025-10 keeps only observations from October 2025 on - and lastNObservations trims a long series to its most recent points. Use the structure/dataflow endpoint first to learn a dataset's dimension order; the key is positional and a key in the wrong order silently selects nothing.
$0.02 default
View details
GET /sdmx/3.0/structure/codelist Resolve the codes Eurostat answers in. Every observation comes back as codes - CP_MEUR, B1GQ, NL33, CP00, Y15-64, RCH_A - and this returns the code list behind a dimension with the plain-language label for every value in it. GEO gives every country, aggregate and NUTS region Eurostat reports on; UNIT gives every unit of measure; FREQ gives the time frequencies; NA_ITEM gives the national accounts indicators; COICOP gives the consumption categories behind the inflation figures; AGE, SEX and NACE_R2 give the standard breakdowns. The labels come back in English, French or German. This is the lookup that turns a table of numbers into something a reader can be shown.
$0.01 default
View details
GET /sdmx/3.0/structure/dataflow Describe a Eurostat dataset before querying it: its official title, the data structure definition it follows, its dimensions in the exact order a positional SDMX key must follow, and - with references=descendants - the code lists behind every one of those dimensions. Ask for a single dataflow by id, or pass * as the id to list every dataflow the agency publishes. This is how a caller turns a half-remembered dataset code into a key that actually selects something, and how it discovers that NAMA_10_GDP orders its dimensions freq, unit, na_item, geo before building A.CP_MEUR.B1GQ.NL. Also the place to find a dataflow's current version and its DOI.
$0.01 default
View details
GET /statistics/1.0/data Read official European statistics from one Eurostat dataset as JSON-stat 2.0 - GDP, inflation, unemployment, population, trade, energy, emissions, health, education, income - for one country, one region or every one of them at once. Name the dataset by its Eurostat code (nama_10_gdp for GDP and national accounts, prc_hicp_manr for annual inflation, une_rt_m for monthly unemployment, demo_pjan for population) and narrow it with that dataset's own dimension codes: geo for the country or NUTS region, unit for the unit of measure, na_item, indic, sex, age, coicop or nace_r2 for the indicator, and time, sinceTimePeriod/untilTimePeriod or lastTimePeriod for the period. geoLevel=nuts2 returns every region at that level in one call instead of one country. The response labels every dimension and every code, so the numbers arrive self-describing. Use catalogue/toc or structure/dataflow first if the dataset code is not already known. IMPORTANT: this service validates parameter NAMES against the dataset, not just their values. Every query parameter must be a dimension that THIS dataset actually has, or the call is refused with INVALID_QUERY_DIMENSION and a 400. Sending sex or coicop to nama_10_gdp fails for that reason, while an unknown VALUE for a real dimension is tolerated and simply matches nothing. The response id array names the dataset dimensions, and structure/dataflow gives them before a call is spent. Only dataset, format, lang, geo, geoLevel, time, sinceTimePeriod, untilTimePeriod, lastTimePeriod and freq are safe on every dataset.
$0.02 default
View details
Endpoint documentation
GET/1.0/async
$0.01 default
Description

Collect a Eurostat query that was too large to answer inline. When a data request exceeds what Eurostat will serve synchronously - a whole dataset with no dimension filter, or a caller that has been extracting heavily - it answers with an XML envelope carrying an id instead of the data. Poll status with that id until it reads AVAILABLE, then fetch data to download the result. The statuses are SUBMITTED (queued), PROCESSING, AVAILABLE (ready), EXPIRED (gone, resubmit the original query), UNKNOWN_REQUEST (wrong id) and ERROR. Eurostat asks callers to run one request at a time and not to parallelise; a query filtered down to what is actually needed usually avoids the queue altogether.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "asyncAction": {
      "description": "status to check where the job has got to, data to download the result once status reads AVAILABLE. An unknown id answers 400 on status and 500 on data, so poll status first. Appended as the first path segment.",
      "enum": [
        "status",
        "data"
      ],
      "type": "string",
      "x-parameter-location": "path"
    },
    "asyncId": {
      "description": "The job id Eurostat returned in the XML envelope instead of the data, e.g. 98de05ea-540a-43d3-903b-7c9e14faf808. Appended as the second and last path segment.",
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "asyncAction",
    "asyncId"
  ],
  "type": "object"
}
GET/api/hub/search/search
$0.01 default
Description

Find the Eurostat dataset code for a subject, in plain language. Eurostat itself has no search, and every other endpoint on this listing needs the code first: this is the call that turns "Dutch inflation", "greenhouse gas emissions by sector", "government debt" or "population by age" into prc_hicp_manr, env_air_gge, gov_10dd_ggd, demo_pjan. It searches the EU Open Data Portal index of Eurostat's own catalogue, so the hits are Eurostat datasets and nothing else, each with its English title and its code in identifier[0]. Ranking is full-text rather than semantic, so it can put a niche or discontinued table above the mainstream one - read the titles and pick, rather than taking the first hit. Feed the code straight into statistics/1.0/data or the SDMX endpoints.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "aggregation": {
      "description": "Suppresses the facet-count block, which is 17 KB on every response regardless of how many results are asked for. Send false.",
      "enum": [
        "false"
      ],
      "type": "string"
    },
    "facets": {
      "description": "Restricts results to the Eurostat catalogue. Send this exact value. Without it the search spans every national open-data portal in Europe and the hits carry no Eurostat code.",
      "enum": [
        "{\"catalog\":[\"estat\"]}"
      ],
      "type": "string"
    },
    "filter": {
      "description": "Restricts the index to datasets rather than data services or catalogues. Always send dataset.",
      "enum": [
        "dataset"
      ],
      "type": "string"
    },
    "includes": {
      "description": "Returns only the dataset code and the English title. Send this exact value: the full record is 45 KB per hit, almost all of it label translations.",
      "enum": [
        "identifier,title.en"
      ],
      "type": "string"
    },
    "limit": {
      "description": "How many candidates to return. 5 is a good default: the ranking is not reliable enough to trust a single hit, and the titles are what a caller picks on.",
      "type": "integer"
    },
    "page": {
      "description": "Zero-based page of results, for looking past the first set.",
      "type": "integer"
    },
    "q": {
      "description": "What the caller is looking for, in plain language: inflation, unemployment rate, greenhouse gas emissions, government debt, population by age and sex. English gives the best hits, because the Eurostat titles it searches are English.",
      "type": "string"
    }
  },
  "required": [
    "q",
    "filter",
    "facets",
    "includes",
    "aggregation"
  ],
  "type": "object"
}
Example response
{
  "result": {
    "count": 52,
    "results": [
      {
        "identifier": [
          "tec00118"
        ],
        "index": "dataset",
        "title": {
          "en": "HICP - inflation rate"
        }
      },
      {
        "identifier": [
          "prc_hicp_ctrb"
        ],
        "index": "dataset",
        "title": {
          "en": "HICP - contributions to euro area annual inflation"
        }
      }
    ]
  }
}
GET/catalogue/dcat/ESTAT
$0.01 default
Description

The Eurostat catalogue as DCAT-AP RDF - the machine-readable metadata standard the European Data Portal ingests, with a dcat:Dataset record per dataset carrying its title, description, publisher, themes, temporal coverage, update frequency and distribution links. FULL is the entire catalogue; UPDATES is the far smaller list of datasets modified since the previous publication window, which is what a mirror or a change monitor actually wants. Both are returned as a ZIP archive containing the RDF, not as raw RDF over the wire. Eurostat publishes twice a day, at 11:00 and 23:00 Brussels time, and this catalogue syncs daily to data.europa.eu.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "scope": {
      "description": "UPDATES for the datasets changed since the last publication window - small, and the one to poll. FULL for the entire catalogue, which is large. Appended as the last path segment.",
      "enum": [
        "UPDATES",
        "FULL"
      ],
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "scope"
  ],
  "type": "object"
}
GET/catalogue/rss
$0.01 default
Description

The Eurostat update feed as RSS 2.0: which datasets and which data structures were republished, most recent first, with the publication timestamp of the run. The way for an agent to notice that a series it depends on has new figures without re-querying the series itself. Eurostat republishes twice a day, at 11:00 and 23:00 Brussels time, so the feed changes at most twice daily. Returns XML, around half a megabyte.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "language": {
      "description": "Feed language. Only en, fr and de are published; any other value answers 500. Appended as the first path segment.",
      "enum": [
        "en",
        "fr",
        "de"
      ],
      "type": "string",
      "x-parameter-location": "path"
    },
    "rssFeed": {
      "description": "The feed file. statistics-update.rss is the only one published. Appended as the second and last path segment.",
      "enum": [
        "statistics-update.rss"
      ],
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "language",
    "rssFeed"
  ],
  "type": "object"
}
Example response
"<?xml version='1.0' encoding='UTF-8'?><rss version=\"2.0\"><channel><title>ESTAT - Data and Data Structure updates</title><description>RSS feed about the latest updates to ESTAT Data and Data Structures.</description><language>en</language><pubDate>2026-09-06 11:04:25</pubDate><item>...</item></channel></rss>"
GET/catalogue/toc
$0.01 default
Description

The full Eurostat table of contents - every one of the ~8,000 datasets with its code, its title, the theme folder it sits in, the period its data covers, when the data and the table structure were last changed, and how many values it holds. The way to find the dataset code for a subject when only the subject is known: search the titles for unemployment, inflation, greenhouse gas, tourism or household income and read off the code the data endpoints take. txt returns a tab-separated table in one language and is the practical choice for searching; xml returns the same tree multilingual, with per-dataset metadata and download links, and is around 23 MB. Refreshed twice a day, at 11:00 and 23:00 Brussels time.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "format": {
      "description": "txt for a tab-separated table in the language given by lang - title, code, type, last update of data, last table structure change, data start, data end, values - which is the one to search. xml for the multilingual tree with per-dataset metadata and download links, about 23 MB. Appended as the last path segment.",
      "enum": [
        "txt",
        "xml"
      ],
      "type": "string",
      "x-parameter-location": "path"
    },
    "lang": {
      "description": "Language of the titles, for the txt rendering. Defaults to en when omitted. Only en, fr and de exist: any other value answers 500, not a validation error.",
      "enum": [
        "en",
        "fr",
        "de"
      ],
      "type": "string"
    }
  },
  "required": [
    "format"
  ],
  "type": "object"
}
Example response
"\"title\"\t\"code\"\t\"type\"\t\"last update of data\"\t\"last table structure change\"\t\"data start\"\t\"data end\"\t\"values\"\n\"Database by themes\"\t\"data\"\t\"folder\"\t\" \"\t\" \"\t\" \"\t\" \"\t\n\"    General and regional statistics\"\t\"general\"\t\"folder\"\t\" \"\t\" \"\t\" \"\t\" \"\t\n"
GET/sdmx/2.1/data
$0.02 default
Description

Query a Eurostat dataset through the older SDMX 2.1 REST service - the dialect the R eurostat and restatapi packages and pandasdmx generate. Same positional dot-separated key as SDMX 3.0 but without the agency and version segments: NAMA_10_GDP with key A.CP_MEUR.B1GQ.NL. An empty position is a wildcard (A.CP_MEUR..LU returns every national accounts indicator for Luxembourg) and + joins alternatives (BE+LU). Period filtering uses startPeriod and endPeriod rather than component operators, and detail controls how much comes back: dataonly drops the attributes, serieskeysonly returns just which series exist. Returns SDMX-ML 2.1, SDMX-CSV 1.0, JSON-stat 2.0 or TSV. New integrations should prefer the SDMX 3.0 endpoint; this one exists so existing ones keep working.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "compressed": {
      "description": "Return the response gzipped.",
      "type": "boolean"
    },
    "dataset": {
      "description": "The dataflow id, e.g. NAMA_10_GDP, PRC_HICP_MANR. Appended as the first path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "detail": {
      "description": "How much to return: full is everything, dataonly drops the attributes, nodata returns the structure without observations, serieskeysonly lists which series exist.",
      "enum": [
        "full",
        "dataonly",
        "nodata",
        "serieskeysonly"
      ],
      "type": "string"
    },
    "endPeriod": {
      "description": "Last period to return.",
      "type": "string"
    },
    "firstNObservations": {
      "description": "Keep only the first N observations of each series.",
      "type": "integer"
    },
    "format": {
      "description": "Output format. JSON gives JSON-stat 2.0; SDMX-CSV gives one row per observation; the default is SDMX-ML 2.1 generic.",
      "enum": [
        "JSON",
        "SDMX-CSV",
        "TSV",
        "SDMX_2.1_STRUCTURED"
      ],
      "type": "string"
    },
    "key": {
      "description": "Dot-separated dimension key in the dataset's own dimension order, e.g. A.CP_MEUR.B1GQ.NL. An EMPTY position is the wildcard here (A.CP_MEUR..LU), not *, and + joins alternatives (BE+LU). Appended as the second and last path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "lastNObservations": {
      "description": "Keep only the most recent N observations of each series.",
      "type": "integer"
    },
    "returnData": {
      "description": "TSV and CSV only: ALL includes the flag columns, DATA_ONLY (the default) omits them.",
      "enum": [
        "ALL",
        "DATA_ONLY"
      ],
      "type": "string"
    },
    "startPeriod": {
      "description": "First period to return, e.g. 2020, 2020-Q1 or 2020-01.",
      "type": "string"
    }
  },
  "required": [
    "dataset",
    "key"
  ],
  "type": "object"
}
Example response
{
  "class": "dataset",
  "dimension": {
    "geo": {
      "category": {
        "index": {
          "NL": 0
        },
        "label": {
          "NL": "Netherlands"
        }
      },
      "label": "Geopolitical entity (reporting)"
    },
    "time": {
      "category": {
        "index": {
          "2023": 0
        },
        "label": {
          "2023": "2023"
        }
      },
      "label": "Time"
    }
  },
  "id": [
    "freq",
    "unit",
    "na_item",
    "geo",
    "time"
  ],
  "label": "Gross domestic product (GDP) and main components (output, expenditure and income) - annual data",
  "size": [
    1,
    1,
    1,
    1,
    1
  ],
  "source": "ESTAT",
  "updated": "2026-09-03T23:00:00+0200",
  "value": {
    "0": 1050133.0
  },
  "version": "2.0"
}
GET/sdmx/3.0/data/dataflow/ESTAT
$0.02 default
Description

Query any Eurostat dataset through the SDMX 3.0 REST service, addressing observations by a dot-separated dimension key rather than by named parameters. The key follows the dataset's own dimension order and * means every value at that position: M.RCH_A.CP00.NL is the monthly HICP annual rate for the Netherlands, M.RCH_A.CP00.* is the same series for every reporting country in one call. Selecting several values at one position is done with a component filter rather than inside the key, because this service rejects both + and , in a key: A.CP_MEUR.B1GQ.* with c[geo]=BE,LU,NL returns annual GDP for three countries. Returns SDMX-CSV 2.0 (one row per observation, the easiest to parse), SDMX-ML 3.0, or JSON-stat 2.0. Component filters carry operators - c[TIME_PERIOD]=ge:2025-10 keeps only observations from October 2025 on - and lastNObservations trims a long series to its most recent points. Use the structure/dataflow endpoint first to learn a dataset's dimension order; the key is positional and a key in the wrong order silently selects nothing.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "attributes": {
      "description": "Which attributes to return alongside the observations. none, dsd and all work. The service also advertises series and obs, but both are refused with INVALID_URL_PARAMETER_COMBINATION in every format tested, so do not send them.",
      "enum": [
        "none",
        "dsd",
        "all"
      ],
      "type": "string"
    },
    "c[TIME_PERIOD]": {
      "description": "Period filter with an operator: ge:2025-10 from October 2025 on, le:2025-12 up to December 2025, ge:2020+le:2024 for a window. A period the dataset does not publish is rejected rather than returning nothing.",
      "type": "string"
    },
    "c[freq]": {
      "description": "Select one or more time frequencies, comma-separated, e.g. A,M. Use it together with * at the freq position of the key.",
      "type": "string"
    },
    "c[geo]": {
      "description": "Select several countries or regions at once, comma-separated, e.g. BE,LU,NL. Use it together with * at the geo position of the key. The dimension name is case-insensitive, and the same c[dimension] form works for any other dimension of the dataset.",
      "type": "string"
    },
    "compress": {
      "description": "Set false to disable gzip compression of the response.",
      "type": "boolean"
    },
    "dataset": {
      "description": "The dataflow id, e.g. NAMA_10_GDP, PRC_HICP_MANR, UNE_RT_M. Case-insensitive. Appended as the first path segment after ESTAT.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "datasetVersion": {
      "description": "Dataflow version. Send + for the latest stable version, which is almost always what is wanted; an explicit version such as 1.0 also works. Omitting it or sending latest is rejected with INVALID_URL_PARAMETER_VALUE. Appended as the second path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "firstNObservations": {
      "description": "Keep only the first N observations of each series.",
      "type": "integer"
    },
    "format": {
      "description": "Output format, verified against the live service. csvdata gives SDMX-CSV, one row per observation with the dimensions as columns; json gives JSON-stat 2.0; tsv gives a tab-separated table; dbrjson is the Data Browser rendering. structurespecificdata and genericdata are SDMX-ML and BOTH require formatVersion=2.1 alongside them, otherwise the service answers INVALID_URL_FORMAT. The default, with no format at all, is SDMX-ML 3.0.",
      "enum": [
        "csvdata",
        "json",
        "tsv",
        "dbrjson",
        "structurespecificdata",
        "genericdata"
      ],
      "type": "string"
    },
    "formatVersion": {
      "description": "Version of the chosen format. Required as 2.1 whenever format is structurespecificdata or genericdata. With csvdata it selects the SDMX-CSV dialect (1.0 or 2.0).",
      "enum": [
        "3.0",
        "2.1",
        "2.0",
        "1.0"
      ],
      "type": "string"
    },
    "key": {
      "description": "Dot-separated dimension key in the dataset's own dimension order, e.g. A.CP_MEUR.B1GQ.NL or M.RCH_A.CP00.*. Use * for every value at a position. Do NOT put + or , inside the key to select several values: this service rejects both with INVALID_URL_VALUE. Use the c[...] component filters below instead. Appended as the third and last path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "lastNObservations": {
      "description": "Keep only the most recent N observations of each series - the usual way to ask for the latest figure.",
      "type": "integer"
    },
    "measures": {
      "description": "Which measures to return. all is safe on its own. none is only accepted together with attributes=none; sent alone it is refused as an invalid combination.",
      "enum": [
        "all",
        "none"
      ],
      "type": "string"
    }
  },
  "required": [
    "dataset",
    "datasetVersion",
    "key"
  ],
  "type": "object"
}
Example response
"STRUCTURE,STRUCTURE_ID,freq,unit,na_item,geo,TIME_PERIOD,OBS_VALUE,OBS_FLAG,CONF_STATUS\ndataflow,ESTAT:NAMA_10_GDP(1.0),A,CP_MEUR,B1GQ,NL,2025,1170579.0,,\n"
GET/sdmx/3.0/structure/codelist
$0.01 default
Description

Resolve the codes Eurostat answers in. Every observation comes back as codes - CP_MEUR, B1GQ, NL33, CP00, Y15-64, RCH_A - and this returns the code list behind a dimension with the plain-language label for every value in it. GEO gives every country, aggregate and NUTS region Eurostat reports on; UNIT gives every unit of measure; FREQ gives the time frequencies; NA_ITEM gives the national accounts indicators; COICOP gives the consumption categories behind the inflation figures; AGE, SEX and NACE_R2 give the standard breakdowns. The labels come back in English, French or German. This is the lookup that turns a table of numbers into something a reader can be shown.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "agency": {
      "description": "Maintenance agency of the code list. ESTAT for Eurostat's own lists, SDMX for the cross-agency standard ones. Appended as the first path segment.",
      "enum": [
        "ESTAT",
        "SDMX"
      ],
      "type": "string",
      "x-parameter-location": "path"
    },
    "detail": {
      "description": "How much of each code to return. full includes the annotations that say whether a code is a Eurostat standard code; allstubs gives identification only, which is what a listing with id=* wants.",
      "enum": [
        "full",
        "allstubs",
        "allcompletestubs"
      ],
      "type": "string"
    },
    "format": {
      "description": "json returns a compact code-to-label mapping, which is what a caller resolving codes wants; the default is SDMX-ML 3.0 structure XML.",
      "enum": [
        "json",
        "structure"
      ],
      "type": "string"
    },
    "id": {
      "description": "Code list id, e.g. GEO (countries, aggregates and NUTS regions, about 880 KB), UNIT (units of measure), FREQ (time frequency), NA_ITEM (national accounts indicators), COICOP (consumption purposes), AGE, SEX, NACE_R2. Unlike the dataflow endpoint, * does work here and returns all 717 code lists as stubs. Appended as the second path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "lang": {
      "description": "Language of the code labels. Defaults to en.",
      "enum": [
        "en",
        "fr",
        "de"
      ],
      "type": "string"
    },
    "version": {
      "description": "Code list version. Send + for the latest stable version; an explicit version such as 3.9 also works. The literal latest is rejected. Appended as the third and last path segment.",
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "agency",
    "id",
    "version"
  ],
  "type": "object"
}
Example response
{
  "category": {
    "index": [
      "A",
      "S",
      "Q",
      "M",
      "W",
      "D"
    ],
    "label": {
      "A": "Annual",
      "D": "Daily",
      "M": "Monthly",
      "Q": "Quarterly",
      "S": "Half-yearly, semesterly",
      "W": "Weekly"
    }
  },
  "class": "dimension",
  "extension": {
    "id": "FREQ",
    "lang": "EN",
    "version": "3.9"
  },
  "label": "Time frequency",
  "source": "ESTAT",
  "version": "2.0"
}
GET/sdmx/3.0/structure/dataflow
$0.01 default
Description

Describe a Eurostat dataset before querying it: its official title, the data structure definition it follows, its dimensions in the exact order a positional SDMX key must follow, and - with references=descendants - the code lists behind every one of those dimensions. Ask for a single dataflow by id, or pass * as the id to list every dataflow the agency publishes. This is how a caller turns a half-remembered dataset code into a key that actually selects something, and how it discovers that NAMA_10_GDP orders its dimensions freq, unit, na_item, geo before building A.CP_MEUR.B1GQ.NL. Also the place to find a dataflow's current version and its DOI.

Pricing
$0.01 default
Parameters
{
  "properties": {
    "agency": {
      "description": "Maintenance agency of the artefact. ESTAT for everything Eurostat publishes; SDMX for the cross-agency standard artefacts. Appended as the first path segment.",
      "enum": [
        "ESTAT",
        "SDMX"
      ],
      "type": "string",
      "x-parameter-location": "path"
    },
    "detail": {
      "description": "How much of each artefact to return. full is everything; allstubs gives identification only. referencepartial is defined by the standard but refused here with 400.",
      "enum": [
        "full",
        "allstubs",
        "referencestubs",
        "allcompletestubs",
        "referencecompletestubs"
      ],
      "type": "string"
    },
    "format": {
      "description": "json returns a compact JSON rendering; the default is SDMX-ML 3.0 structure XML. Note that json is refused (406) in combination with references=descendants and detail=allstubs.",
      "enum": [
        "json",
        "structure"
      ],
      "type": "string"
    },
    "id": {
      "description": "Dataflow id, e.g. NAMA_10_GDP, PRC_HICP_MANR, UNE_RT_M. A * wildcard does NOT list every dataflow here: the service answers an empty structure envelope. Use the catalogue/toc endpoint to enumerate datasets. Appended as the second path segment.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "lang": {
      "description": "Language of the labels. Defaults to en.",
      "enum": [
        "en",
        "fr",
        "de"
      ],
      "type": "string"
    },
    "references": {
      "description": "Which related artefacts to include. none returns the dataflow alone (about 5 KB), children adds its data structure definition (about 9 KB), descendants adds the concept scheme and every code list as well and is around 3.5 MB - the one call that answers what all the codes mean, at the cost of the payload. The SDMX standard also defines parents, ancestors, all and referencepartial; this service refuses all four with 400.",
      "enum": [
        "none",
        "children",
        "descendants"
      ],
      "type": "string"
    },
    "version": {
      "description": "Artefact version. Send + for the latest stable version; an explicit version such as 1.0 also works, and * matches any. The literal latest is rejected. Appended as the third and last path segment.",
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "agency",
    "id",
    "version"
  ],
  "type": "object"
}
Example response
{
  "class": "dataset",
  "extension": {
    "agencyId": "ESTAT",
    "annotation": [
      {
        "date": "2014-09-04T14:58:03+0200",
        "type": "CREATED"
      }
    ],
    "datastructure": {
      "agencyId": "ESTAT",
      "id": "NAMA_10_GDP",
      "version": "137.1"
    },
    "id": "NAMA_10_GDP",
    "lang": "EN",
    "version": "1.0"
  },
  "label": "Gross domestic product (GDP) and main components (output, expenditure and income) - annual data",
  "version": "2.0"
}
GET/statistics/1.0/data
$0.02 default
Description

Read official European statistics from one Eurostat dataset as JSON-stat 2.0 - GDP, inflation, unemployment, population, trade, energy, emissions, health, education, income - for one country, one region or every one of them at once. Name the dataset by its Eurostat code (nama_10_gdp for GDP and national accounts, prc_hicp_manr for annual inflation, une_rt_m for monthly unemployment, demo_pjan for population) and narrow it with that dataset's own dimension codes: geo for the country or NUTS region, unit for the unit of measure, na_item, indic, sex, age, coicop or nace_r2 for the indicator, and time, sinceTimePeriod/untilTimePeriod or lastTimePeriod for the period. geoLevel=nuts2 returns every region at that level in one call instead of one country. The response labels every dimension and every code, so the numbers arrive self-describing. Use catalogue/toc or structure/dataflow first if the dataset code is not already known. IMPORTANT: this service validates parameter NAMES against the dataset, not just their values. Every query parameter must be a dimension that THIS dataset actually has, or the call is refused with INVALID_QUERY_DIMENSION and a 400. Sending sex or coicop to nama_10_gdp fails for that reason, while an unknown VALUE for a real dimension is tolerated and simply matches nothing. The response id array names the dataset dimensions, and structure/dataflow gives them before a call is spent. Only dataset, format, lang, geo, geoLevel, time, sinceTimePeriod, untilTimePeriod, lastTimePeriod and freq are safe on every dataset.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "age": {
      "description": "Age class code, e.g. TOTAL, Y15-64, Y_LT15, Y_GE65. ONLY for datasets with an age dimension, such as demo_pjan. Refused with 400 elsewhere.",
      "type": "string"
    },
    "coicop": {
      "description": "COICOP consumption purpose code, e.g. CP00 (all-items HICP), CP01 (food and non-alcoholic beverages). ONLY for the price datasets (prc_hicp_*). Refused with 400 elsewhere.",
      "type": "string"
    },
    "dataset": {
      "description": "The Eurostat dataset code, lowercase, e.g. nama_10_gdp (GDP and main components), prc_hicp_manr (HICP annual rate of change), une_rt_m (monthly unemployment rate), demo_pjan (population on 1 January), tps00001. This is the code the table of contents lists.",
      "type": "string",
      "x-parameter-location": "path"
    },
    "format": {
      "description": "Response format. JSON-stat 2.0 is the only format this service returns; leave unset or send JSON.",
      "enum": [
        "JSON"
      ],
      "type": "string"
    },
    "freq": {
      "description": "Time frequency of the series: A annual, S half-yearly, Q quarterly, M monthly, W weekly, D daily. Safe on every dataset. A frequency the dataset does not publish returns an empty result rather than an error.",
      "enum": [
        "A",
        "S",
        "Q",
        "M",
        "W",
        "D"
      ],
      "type": "string"
    },
    "geo": {
      "description": "Country or region code, e.g. NL, DE, EU27_2020, EA20, or a NUTS code such as NL33. Repeatable upstream; mutually exclusive with geoLevel.",
      "type": "string"
    },
    "geoLevel": {
      "description": "Return every geography at this level instead of naming one. Mutually exclusive with geo: sending both is refused with 400, verified against the live service.",
      "enum": [
        "aggregate",
        "country",
        "nuts1",
        "nuts2",
        "nuts3",
        "city"
      ],
      "type": "string"
    },
    "indic": {
      "description": "Generic indicator code, for the datasets that carry an indic dimension rather than a domain-specific one. Refused with 400 on datasets that do not.",
      "type": "string"
    },
    "lang": {
      "description": "Language of the dimension and category labels. Defaults to EN. Only EN, FR and DE exist; any other value is refused with 400.",
      "enum": [
        "EN",
        "FR",
        "DE"
      ],
      "type": "string"
    },
    "lastTimePeriod": {
      "description": "Return only the last N periods, counting back from the most recent one published, e.g. 5.",
      "type": "integer"
    },
    "na_item": {
      "description": "National accounts indicator, e.g. B1GQ (gross domestic product at market prices), P3 (final consumption expenditure), P6 (exports). ONLY for the national accounts datasets (nama_*, namq_*). Any other dataset refuses it with 400.",
      "type": "string"
    },
    "nace_r2": {
      "description": "NACE Rev. 2 economic activity code, e.g. TOTAL, C (manufacturing), G-I. ONLY for the business and labour datasets that carry a nace_r2 dimension. Refused with 400 elsewhere.",
      "type": "string"
    },
    "sex": {
      "description": "Sex breakdown: T total, M males, F females. ONLY for the demographic and labour datasets that carry a sex dimension, such as demo_pjan or une_rt_a. Refused with 400 elsewhere.",
      "enum": [
        "T",
        "M",
        "F"
      ],
      "type": "string"
    },
    "sinceTimePeriod": {
      "description": "Start of a period window, inclusive. Combine with untilTimePeriod.",
      "type": "string"
    },
    "time": {
      "description": "A single period, e.g. 2023 for annual data, 2025-Q2 for quarterly, 2025-10 for monthly.",
      "type": "string"
    },
    "unit": {
      "description": "Unit of measure code, e.g. CP_MEUR (current prices, million euro), CLV10_MEUR (chain linked volumes), PC (percent), PC_GDP, NR (number), THS_PER (thousand persons), RCH_A (annual rate of change). Present on most datasets but not all - a dataset without a unit dimension refuses this parameter with 400.",
      "type": "string"
    },
    "untilTimePeriod": {
      "description": "End of a period window, inclusive.",
      "type": "string"
    }
  },
  "required": [
    "dataset"
  ],
  "type": "object"
}
Example response
{
  "class": "dataset",
  "dimension": {
    "geo": {
      "category": {
        "index": {
          "NL": 0
        },
        "label": {
          "NL": "Netherlands"
        }
      },
      "label": "Geopolitical entity (reporting)"
    },
    "na_item": {
      "category": {
        "index": {
          "B1GQ": 0
        },
        "label": {
          "B1GQ": "Gross domestic product at market prices"
        }
      },
      "label": "National accounts indicator (ESA 2010)"
    },
    "time": {
      "category": {
        "index": {
          "2023": 0
        },
        "label": {
          "2023": "2023"
        }
      },
      "label": "Time"
    },
    "unit": {
      "category": {
        "index": {
          "CP_MEUR": 0
        },
        "label": {
          "CP_MEUR": "Current prices, million euro"
        }
      },
      "label": "Unit of measure"
    }
  },
  "id": [
    "freq",
    "unit",
    "na_item",
    "geo",
    "time"
  ],
  "label": "Gross domestic product (GDP) and main components (output, expenditure and income) - annual data",
  "size": [
    1,
    1,
    1,
    1,
    1
  ],
  "source": "ESTAT",
  "updated": "2026-09-03T23:00:00+0200",
  "value": {
    "0": 1050133.0
  },
  "version": "2.0"
}