---
name: eurostat-ingestion
description: "How to get Eurostat API (EU statistics) data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Decode Eurostat JSON-stat 2.0 into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/eurostat
Provider: https://ec.europa.eu/eurostat/web/user-guides/data-browser/api-data-access/api-getting-started/api
Checked against the provider's documentation: 2026-10-30

## Access
- No account or key parameter is documented for the dissemination endpoint.
- Observed 2026-10-30: the filtered request completed without credentials.

## Request
```bash
curl 'https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/une_rt_m?lang=en&format=JSON&s_adj=SA&age=TOTAL&sex=T&unit=PC_ACT&geo=EA21&sinceTimePeriod=2025-01'
```

## Format
JSON-stat 2.0 dataset. id and size define dimension order; dimension categories map codes to positions; value is a sparse object keyed by flattened integer position.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Eurostat monthly euro-area unemployment rate (JSON-stat 2.0) -> pandas -> Parquet."""
import itertools
import requests
import pandas as pd

URL = "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/une_rt_m"
params = {"lang": "en", "format": "JSON", "s_adj": "SA", "age": "TOTAL", "sex": "T",
          "unit": "PC_ACT", "geo": "EA21", "sinceTimePeriod": "2025-01"}
r = requests.get(URL, params=params, timeout=60)
r.raise_for_status()
body = r.json()
dims = body["id"]
labels = body["dimension"]
codes = []
for dim in dims:
    index = labels[dim]["category"]["index"]
    ordered = [None] * len(index)
    for code, position in index.items():
        ordered[position] = code
    codes.append(ordered)
rows = []
for flat_index, combination in enumerate(itertools.product(*codes)):
    value = body.get("value", {}).get(str(flat_index))
    if value is not None:
        rows.append(dict(zip(dims, combination), value=value))
df = pd.DataFrame(rows)
df["time"] = pd.to_datetime(df["time"])
df.to_parquet("eurostat_ea21_unemployment.parquet", index=False)
print(len(df), "monthly rows", df["time"].min().date(), "to", df["time"].max().date(),
      "latest value", df.sort_values("time").iloc[-1]["value"])
```
Run by us on 2026-10-30 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 21 monthly rows 2025-01-01 to 2026-09-01 latest value 6.5

## Limits
- Rate limit: Not stated.
- Response-size limits are not stated on the pages read; filter dimensions and time.

## Quirks
- JSON-stat value is sparse and flattened in the order given by id and size; do not assume tabular records.
- Observed 2026-10-30: the same query with geo=EA20 returned HTTP 200 with an empty value object; EA21 returned values.
- Keep unit, adjustment, age, sex, geography and observation-status dimensions with values. Series can be revised.

## Terms and attribution
- Commercial and non-commercial reuse is generally authorised with source acknowledgment.
- Commercial reuse excludes listed third-party material, external-country data, specified Liechtenstein and Switzerland trade data, and Austrian declaring-country trade data at 8-digit CN detail.
- State translations or modifications and include Eurostat's non-responsibility disclaimer.
- Terms page: https://ec.europa.eu/eurostat/en/help/copyright-notice

## Sources
- https://ec.europa.eu/eurostat/web/user-guides/data-browser/api-data-access/api-getting-started/api: "The first elements of the JSON-stat response are the metadata indicating the type of JSON-stat response, the title of the dataset its source and its last update data."
- https://ec.europa.eu/eurostat/web/user-guides/data-browser/api-data-access/api-getting-started/api: "Any dimension present in the data product can be used as filter parameter"
- https://ec.europa.eu/eurostat/en/help/copyright-notice: "Reuse of statistical data, metadata, publications, and other dissemination tools published on this website for commercial or non-commercial purposes is authorised provided the source is acknowledged."
- https://ec.europa.eu/eurostat/en/help/copyright-notice: "There is no special procedure or requirement for a written licence. Just download the material and use it, unless the material is listed in the exceptions above."

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
