---
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."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

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.
