๐Ÿงฌ IMF SDMX 3.0 Dimensions Reference

May 10, 2026 ยท View on GitHub

Purpose: Canonical reference for the SDMX 3.0 dimensions that appear across IMF dataflows, with codelist conventions, example values, and notes on how each dimension is handled by the native TypeScript client (src/mcp/imf-mcp-client.ts).

๐Ÿ“… Last Updated: 2026-04-24 | ๐Ÿท๏ธ Classification: Public | ๐ŸŒ€ Wave: 4

SDMX (Statistical Data and Metadata eXchange) is an ISO standard for exchanging statistical data. The IMF REST surface is SDMX 3.0 (v2.1 message schema); queries are expressed as a key (slash-separated dimension values) against a dataflow. This document explains each dimension from the EP editorial perspective โ€” for the authoritative spec see sdmx.org.


1. Dimensions Glossary

SDMX 3.0 dimension naming: post-Sept-2025 the IMF Data Portal uses UPPERCASE dimension names on api.imf.org โ€” COUNTRY, INDICATOR, FREQUENCY (not the legacy lowercase / FREQ / REF_AREA shapes that appeared in SDMX 2.1 IFS payloads). The IMFMCPClient matches filter keys case-insensitively so legacy country/indicator/frequency aliases keep working.

DimensionAppears onRequired?Example valuesEP handling
FREQUENCYAllโœ…A / Q / MLast series-level dimension in every editorial DSD; client supplies dataflow-default when omitted
COUNTRYAllโœ…DEU, FRA, EU, EAISO-3 country or IMF aggregate โ€” see eu-country-mapping.md
INDICATORWEO, FM, IFS, FSI, PCPS, SRF, โ€ฆโœ…NGDP_RPCH, GGXWDG_NGDPCanonical SDMX code; see indicator-catalog.md ยง2
COUNTERPART_AREABOP, DOT, CDIS, CPISโœ…W00 (World), USA, CHNBilateral partner for flow data
INSTRUMENTCPISโœ…F1, F2, F3Financial-instrument classification
SECTORFSI, GFS, GFSR, CDISโœ…/optionalS1 (total economy), S11 (non-financial corps), S13 (general govt)ESA 2010 sector codes
UNIT / UNIT_MEASUREGFS, ER, all (obs-level)variesXDC (domestic currency), USD, EUR, PT (percent), IX (index)Required positional dim on GFS; observation-level metadata elsewhere
TYPE_OF_TRANSFORMATIONCPI, ERoptionalIX (index), PCH (% change), LCYWEO ships the change form via INDICATOR suffix; CPI/ER ship transformation as a dimension
INDEX_TYPECPIโœ…CPI, CCPIHeadline vs. core
COICOP_1999CPIโœ…_T (all items)COICOP product breakdown
BOP_ACCOUNTING_ENTRYBOPโœ…C, D, N (credit/debit/net)BPM6 entry side
OBS_STATUSAll (observation-level)โ€”A, F, E, B, PSee indicator-catalog.md ยง4
SCALEAll (observation-level)โ€”0, 3, 6, 9Power-of-10 multiplier for the observation value
METHODOLOGYGFS, BOPoptionalGFSM2014, BPM6Methodological-vintage tag
TIME_PERIODAllโœ… (in query range)2026, 2026-Q1, 2026-03Emitted as startPeriod / endPeriod query params

2. Dimension ordering in the SDMX key

The SDMX key is a dot-separated concatenation of dimension values in the order defined by the dataflow's datastructure. The TypeScript client's imf-fetch-data builds this automatically from the filters map; agents should supply filters by name, not by position.

For "all codes in this dimension" use the SDMX 3.0 wildcard *. The bare empty form (DEU..A) is rejected by api.imf.org and returns 0 series โ€” always emit * when you want a wildcard.

Example for WEO (agency IMF.RES, order COUNTRY.INDICATOR.FREQUENCY):

GET /data/dataflow/IMF.RES/WEO/+/DEU.NGDP_RPCH.A?startPeriod=2020&endPeriod=2030&format=jsondata
                                  โ”‚   โ”‚          โ”‚
                                  โ”‚   โ”‚          โ””โ”€โ”€ FREQUENCY
                                  โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ INDICATOR
                                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ COUNTRY

Example for BOP_AGG (agency IMF.STA, order COUNTRY.INDICATOR.FREQUENCY):

GET /data/dataflow/IMF.STA/BOP_AGG/+/DEU.BFD_BP6_USD.Q?startPeriod=2024
                                     โ”‚   โ”‚            โ”‚
                                     โ”‚   โ”‚            โ””โ”€โ”€ FREQUENCY
                                     โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ INDICATOR
                                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ COUNTRY

Wildcard segments are legal: *.NGDP_RPCH.A means "all countries, WEO GDP growth, annual". Two scope rules apply on data-fetch calls (structure-discovery calls โ€” imf-search-databases / imf-get-parameter-codes โ€” may use wildcards freely):

  1. Empty filter maps are rejected. fetchData requires a non-empty filters object.
  2. At least one non-FREQUENCY dimension must be concrete. Because FREQUENCY auto-injects via the dataflow's default (e.g. A for WEO) and every other unspecified slot resolves to *, a typo'd or unrecognised filter key (e.g. region: ['EU'] against a dataflow that declares COUNTRY instead) would otherwise yield an effectively unbounded key like *.*.A and download the full cross-product. The client refuses such requests and returns the empty IMF_FALLBACK payload with a console warning identifying the rejected filter keys. Single-wildcard intent like DEU.*.A still passes because DEU pins COUNTRY.

3. Codelist discovery

Each dimension's valid values come from an SDMX codelist referenced by the data-structure definition. The client exposes codelists via imf-get-parameter-codes(db, dimension, search?):

// Fetch the list of valid INDICATOR codes for WEO
await client.getParameterCodes('WEO', 'INDICATOR');

// Search within the codelist
await client.getParameterCodes('WEO', 'INDICATOR', 'inflation');

The search is a simple substring match against code_description; the client does not perform fuzzy matching.


4. REF_AREA conventions

  • Countries: ISO-3 (DEU, FRA, ITA) for every EU-27 member.
  • EU aggregates: EU (27 members, current), EA (Euro Area, current membership), EFTA (4 members), SM (single market โ€” EU + EFTA).
  • Global aggregates: WLD (World), G7, G20, ADV (advanced economies), EMDE (emerging/developing).

EA membership drift: Croatia joined the Euro Area on 2023-01-01. WEO EA timeseries use the current membership throughout history โ€” there is no automatic back-splicing. Articles covering pre-2023 timeseries MUST cite "EA current membership" in the chart caption.

For EP-level framing (where WB aggregate codes EUU/EMU are rejected), always use IMF EU or EA.


5. TIME_PERIOD formats

Frequency (FREQ)TIME_PERIOD formatExample
AYYYY2026
SYYYY-S1 / YYYY-S22026-S1
QYYYY-Q1..42026-Q2
MYYYY-MM2026-03
D (rare)YYYY-MM-DD2026-04-24

The client accepts numeric startYear / endYear integers and converts them per the frequency. For sub-annual series the query is expanded to the full year range.


6. Observation attributes (beyond OBS_STATUS)

AttributeMeaningEP handling
OBS_CONFConfidentiality (C = confidential, F = free)Only F observations are ingested; C is filtered by the parser
TIME_FORMATISO-8601 time precision of the observationInformational; not surfaced to articles
COMMENTFree-text annotation from the sourceCaptured in the manifest when present
OBS_PRE_BREAKValue before a structural breakCited in prose when a B status is encountered
UNIT_MULTPower-of-10 multiplierApplied by the parser during normalisation

7. Editorial dimensions (Stage-C review)

editorial review requires that every IMF citation in a policy-required article carries:

  1. INDICATOR code (word-bounded SDMX code from indicator-catalog.md ยง2).
  2. REF_AREA either as an ISO-3 country, EU/EA, or a named EU member state in prose.
  3. Vintage string when OBS_STATUS is F (forecast) โ€” e.g. IMF WEO April 2026 in prose and data-vintage="WEO-April-2026" on the enclosing <section class="economic-context imf-economic-context">.
  4. FREQ is inferred from the cadence and is not gated.

Missing REF_AREA context (e.g. "inflation is 3.2%" with no country or aggregate) fails Stage-C review per .github/prompts/04-article-generation.md ยง5.


8. Client API surface (for reference)

MethodDimensions involvedReturns
listDatabasesโ€”MCPToolResult<DataflowSummary[]>
searchDatabases(keyword)dataflow names & descriptionsMCPToolResult<DataflowSummary[]>
getParameterDefs(databaseId)all dimensions for a dataflowMCPToolResult<DataStructureDefinition>
getParameterCodes(db, dim, search?)codelist for one dimensionMCPToolResult<Codelist>
fetchData({ databaseId, startYear, endYear, filters })all dimensions + TIME_PERIODMCPToolResult<TimeSeries[]>

9. See also