Cluster Living Database HomeSources › imf

International Monetary Fund

As built

DatasetConsumer Price Index (CPI)
Dataset idimf.cpi
Series4,920
Observations1,155,512
Countries191
Period range1914-01-01 to 2026-07-01
Vintages11
Last fetched2026-09-09 12:04
Poll interval7 days
Archiveimf/cpi/*.xml.gz
LicenceIMF Terms and Conditions
Redistributablewith-attribution
Terms read by a person2026-09-11
AttributionSource: International Monetary Fund

https://www.imf.org/external/terms.htm

What building it taught us

The connector's own docstring, verbatim. It lives beside the code so it cannot drift from it.

IMF connector: monthly Consumer Price Index via the SDMX 2.1 API.

Covers every country the IMF reports (~178) at the all-items level and across the twelve COICOP divisions beneath it, as both an index and a year-over-year rate -- roughly 4,000 series.

Two things about this endpoint are worth knowing before changing anything here.

The legacy dataservices.imf.org host that most IMF examples and client libraries still use is dead -- it refuses connections outright, rather than being merely deprecated. api.imf.org is the live one, and it serves SDMX-ML only: the format=jsondata parameter and JSON Accept headers are both accepted and both ignored.

It also sends no ETag and no Last-Modified, with Cache-Control: no-store, so the conditional-request gate can never fire for this source. The content hash in the driver is what stops an unchanged response from becoming a vintage.

Above all, this API does not report emptiness as an error. A malformed key, a dataflow version that has been superseded, and a dataflow published with no data behind it all return HTTP 200 wrapping a well-formed but empty DataSet. Nothing in the status code or the envelope distinguishes any of them from a real response; only counting Series elements does. (Learned twice: once from a malformed key in 2026-08, once when the IMF republished a vintage dataflow at a new version and the old version went quiet instead of 404ing.)

One request per COICOP division returns every country and both transformations, so the whole dataset is 13 requests rather than thousands.