BYTETOOLS

Eurostat API

Free Eurostat dissemination API with no key: HICP inflation, GDP, unemployment and thousands of EU datasets as JSON-stat, filtered by dimension. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Eurostat API?

Eurostat serves its entire statistical database through a free JSON API with no key. A request names a dataset code and filters it by dimension values, returning JSON-stat 2.0 with the observations and their dimension metadata.

This one API covers the whole of Eurostat: HICP inflation, GDP, unemployment, trade, energy, demography — several thousand datasets addressed by short codes like `prc_hicp_manr`. Filtering happens through dimension parameters rather than a query language, so `geo=EA&coicop=CP00&unit=RCH_A` narrows a multi-million-cell dataset to the euro area headline annual rate in one request.

JSON-stat 2.0 is the part that needs a moment. `value` is not an array of observations — it is a **sparse object keyed by a flattened index** into the cross-product of the dimensions listed in `id`, with `size` giving the extent of each. Decoding it means computing that index yourself, and a missing key means a genuinely missing observation rather than a zero. Add `lastTimePeriod` while developing, because an unfiltered dataset request can return an enormous payload.

Quick facts

Base URL
https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data
Authentication
No key or registration. Published under the European Commission's open data policy.
Rate limit
No published per-key limit, but unfiltered requests on large datasets are rejected for size. Filter by dimension.
Pricing
Free.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Eurostat API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Euro area annual HICP inflation, last three months

GET https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/prc_hicp_manr?format=JSON&lang=EN&coicop=CP00&unit=RCH_A&geo=EA&lastTimePeriod=3

curl
curl 'https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/prc_hicp_manr?format=JSON&lang=EN&coicop=CP00&unit=RCH_A&geo=EA&lastTimePeriod=3'
JavaScript (fetch)
const res = await fetch("https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/prc_hicp_manr?format=JSON&lang=EN&coicop=CP00&unit=RCH_A&geo=EA&lastTimePeriod=3");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/prc_hicp_manr?format=JSON&lang=EN&coicop=CP00&unit=RCH_A&geo=EA&lastTimePeriod=3", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "version": "2.0",
  "class": "dataset",
  "label": "HICP - monthly data (annual rate of change)",
  "source": "ESTAT",
  "updated": "2026-02-06T23:00:00+0100",
  "value": {
    "0": 2.1,
    "1": 2.1,
    "2": 2.0
  },
  "id": [
    "freq",
    "unit",
    "coicop",
    "geo",
    "time"
  ],
  "size": [
    1,
    1,
    1,
    1,
    3
  ],
  "dimension": {
    "freq": {
      "label": "Time frequency",
      "category": {
        "index": {
          "M": 0
        },
        "label": {
          "M": "Monthly"
        }
      }
    },
    "unit": {
      "label": "Unit of measure",
      "category": {
        "index": {
          "RCH_A": 0
        },
        "label": {
          "RCH_A": "Annual rate of change"
        }
      }
    },
    "coicop": {
      "label": "Classification of individual consumption by purpose (COICOP)",
      "category": {
        "index": {
          "CP00": 0
        },
        "label": {
          "CP00": "All-items HICP"
        }
      }
    },
    "geo": {
      "label": "Geopolitical entity (reporting)",
      "category": {
        "index": {
          "EA": 0
        },
        "label": {
          "EA": "Euro area (EA11-1999, EA12-2001, EA13-2007, EA15-2008, EA16-2009, EA17-2011, EA18-2014, EA19-2015, EA20-2023, EA21-2026)"
        }
      }
    },
    "time": {
      "label": "Time",
      "category": {
        "index": {
          "2025-10": 0,
          "2025-11": 1,
          "2025-12": 2
        },
        "label": {
          "2025-10": "2025-10",
          "2025-11": "2025-11",
          "2025-12": "2025-12"
        }

Parameters

ParameterTypeRequiredDescription
dataset codepath segmentRequiredEurostat dataset identifier, for example `prc_hicp_manr` for HICP annual rates of change. prc_hicp_manr
formatqueryOptional`JSON` for JSON-stat, `SDMX-CSV` for a flat CSV that is much easier to parse. JSON
geoqueryOptionalGeographic filter — a country code, or `EA` for the euro area and `EU27_2020` for the EU. EA
lastTimePeriodqueryOptionalReturn only the most recent N periods. Essential for keeping responses small. 3
timequeryOptionalSpecific periods instead of the most recent N. 2026-06
unit / coicop / other dimensionsqueryOptionalDataset-specific dimension filters. Each dataset defines its own set. RCH_A

Response fields

labelstring
Human-readable dataset title.
updatedstring
When Eurostat last refreshed this dataset.
idarray
Ordered list of dimension names. The order defines how the flattened index into `value` is computed.
sizearray
Extent of each dimension, in the same order as `id`.
valueobject
Sparse map from flattened index to observation. A missing key means no observation, not zero.
dimension.{name}.category.indexobject
Maps each dimension code to its position, which you need to compute the flattened index.
dimension.{name}.category.labelobject
Human-readable label for each dimension code.
statusobject
Observation flags such as provisional or estimated, keyed the same way as `value`.

What you can build with the Eurostat API

  • Show euro area or national HICP inflation on a dashboard
  • Compare unemployment rates across EU member states
  • Pull GDP or trade series for economic analysis
  • Request SDMX-CSV instead of JSON-stat when you just want a flat table

Common errors and how to fix them

400 with a size complaint

The request would return too many cells.

Fix: Add dimension filters and `lastTimePeriod`. Eurostat refuses very large extractions rather than truncating them.

Empty `value` object

The dimension filter combination matches no data.

Fix: Check codes against `dimension.*.category.index` from a less filtered request; codes are dataset-specific and case-sensitive.

Observations misaligned

The flattened index was computed in the wrong dimension order.

Fix: Use the order given by `id`, not the order you sent parameters in. They are unrelated.

Eurostat API — frequently asked questions

Is the Eurostat API free and key-free?

Yes. The dissemination API requires no key or registration and covers the whole Eurostat database under the Commission's open data policy.

What is JSON-stat and why is value an object?

JSON-stat is a compact statistical format. Observations live in a sparse object keyed by a flattened index into the cross-product of the dimensions listed in `id`, sized by `size`. Missing keys mean missing observations.

Is there an easier format than JSON-stat?

Yes — `format=SDMX-CSV` returns a flat table with one row per observation and named dimension columns. It is larger on the wire but far quicker to work with.

How do I find a dataset code?

Browse the Eurostat data browser and take the code from the dataset URL. `prc_hicp_manr` is HICP annual rates of change; codes follow a themed prefix convention.

Tools that pair with this API

Eurostat is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.