| Dataset | Harmonised Index of Consumer Prices |
|---|---|
| Dataset id | eurostat.hicp |
| Series | 7,951 |
| Observations | 1,542,797 |
| Countries | 4 |
| Period range | 1996-01-01 to 2026-08-01 |
| Vintages | 2 |
| Last fetched | 2026-09-10 11:22 |
| Poll interval | 7 days |
| Archive | eurostat/hicp/*.json.gz |
| Licence | CC-BY-4.0 |
| Redistributable | with-attribution |
| Terms read by a person | 2026-09-11 |
| Attribution | Source: Eurostat |
The connector's own docstring, verbatim. It lives beside the code so it cannot drift from it.
Eurostat connector: the HICP, Europe's harmonised consumer prices.
The first source here that is neither a national office nor a global aggregator. It matters because of where the gap is: the IMF publishes no COICOP breakdown at all for France, Spain, the Netherlands and most of Europe -- four series each, a headline and two rates -- while Eurostat publishes 555 categories for every one of them, monthly, back to 1996. One API and one shape covers every large European economy.
ONE DATASET, THREE QUANTITIES. prc_hicp_minr carries the index and both rates over one classification, selected by unit:
I25 the index, 2025=100 RCH_M the monthly rate of change RCH_A the annual rate of change
That is what makes this connector checkable rather than trusted: the rates are not derived here, they are the source's own, and validate_eurostat.py recomputes each of them from the index and compares.
Five things worth knowing before changing anything here.
Do not use prc_hicp_midx, _mmor or _manr. They were taken first and they are retired: Eurostat's own catalogue titles them "(1996-2025)", they stop at 2025-12, and their last update was 2026-02-06. They are the ECOICOP ver.1 vintage, frozen when the HICP moved to ver.2. Three different endpoints agreed they were stale, which made it look like a fact about Eurostat -- it was a fact about the dataset code, and unemployment on the same API was current throughout. catalog.EUROSTAT_DATASET names the live one and the catalogue TOC is how to check.
The classification dimension is coicop18, not coicop. ECOICOP ver.2 is the 2018 revision and the dimension is named for it. Asking for coicop is an HTTP error, not an empty answer, which is the good failure.
The all-items aggregate is TOTAL. It was CP00 under ver.1. Filing it as anything but COICOP's _T would leave these countries with no headline that the rest of the system can find.
Five units are offered and three are taken. I15 is the same series as I25 on an older reference, and RCH_MV12MAVR is a moving twelve-month average -- a fourth quantity, not one of the three being collected.
JSON-stat is a flat array with the shape in the header. value is keyed by a single integer index into the cartesian product of the dimensions listed in id, with lengths in size. Sparse: absent cells are simply missing keys, which is what makes an off-by-one in the stride arithmetic silent -- it does not fail, it files Germany's rice under Spain's bread. _cells() is the only place that arithmetic happens and test_eurostat.py pins it against a fixture whose every cell is distinguishable.