# OECD Data Explorer

Over 1,500 OECD tables on work, income, taxes, education, health, housing and the environment. Measured the same way for every member country, so good for comparing the Netherlands with countries outside Europe, such as the United States, Japan or Canada.

- Publisher: Organisatie voor Economische Samenwerking en Ontwikkeling
- Area: World · Finest detail: country (sometimes region)
- Period: verschilt per tabel, bv. werkuren 1970 – 2025 · Refreshed: monthly
- Access: Open · Licence: OESO-voorwaarden (vrij hergebruik met bronvermelding)
- Join keys: landcode (NLD), dataflow-id (DSD_…@DF_…)
- Status: warn (2026-08-01) · werkloosheid NL 4 % (2026-08), maandcijfers OESO
- URL: https://data-explorer.oecd.org

## What can you do with it?
- **Do we really work so little?.** A worker in the Netherlands worked an average of 1,436 hours in 2025, against 1,332 in Germany, 1,586 in Belgium and 1,800 in the United States (OECD, actual hours worked per worker per year). In 1970 it was still 1,809 hours in the Netherlands.
- **Monthly unemployment next to the neighbours.** In August 2026 unemployment in the Netherlands was 4.0 percent, the same as Germany. Belgium was at 5.9 and the OECD average at 5.0 percent (seasonally adjusted, aged 15 and over).
- **Tax burden on wages.** The OECD calculates for each country how much tax and social contributions an employee and employer pay. Compare the Netherlands with countries outside the EU, which Eurostat does not cover.
- **One URL per chart.** Build a fixed API call with lastNObservations and let a chart update itself as soon as the OECD publishes a new month.

## How to process it
1. **Find the table in the Data Explorer.** Pick a table, set the filters and open 'Developer API'. It shows the SDMX call that fetches exactly your selection.
2. **Or search the list of all tables.** One call returns all 1,550 tables (dataflows) with id, version and issuing directorate (15 Oct 2026, 10 MB).
   `https://sdmx.oecd.org/public/rest/dataflow/all`
3. **Read which dimensions exist.** The key in the URL has one position per dimension, separated by dots. Empty = everything. Request the structure with references=all to see the order and the codes.
   `https://sdmx.oecd.org/public/rest/dataflow/OECD.ELS.SAE/DSD_HW@DF_AVG_ANN_HRS_WKD/1.0?references=all`
4. **Fetch data as CSV.** With format=csvfilewithlabels you get codes and names. Separate several countries with a plus: NLD+DEU+BEL.
   `https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_LFS@DF_IALFS_UNE_M,1.0/NLD+DEU+BEL+OECD.UNE_LF_M.PT_LF_SUB._Z.Y._T.Y_GE15._Z.M?lastNObservations=1&dimensionAtObservation=AllDimensions&format=csvfilewithlabels`

## Interesting combinations
- Why does the OECD figure differ from CBS? → [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md) via jaar of maand. Dutch figures come from CBS, but the OECD harmonises definitions. Put both series side by side and look for the difference in definition.

## Similar sources
- [eurostat](https://www.opendataindex.nl/en/bron/eurostat.md): Europe only, but much more regional detail (NUTS).
- [worldbank](https://www.opendataindex.nl/en/bron/worldbank.md): All countries in the world, less depth per topic.
- [our-world-in-data](https://www.opendataindex.nl/en/bron/our-world-in-data.md): Curated series with explanations and charts, partly based on OECD figures.

## What to watch out for
- **Wrong code = 404, not an empty list.** A key without results returns HTTP 404 with the text NoResultsFound. The default view in the metadata even named code UNE_M for monthly unemployment, while the data use code UNE_LF_M (15 Oct 2026). Start with just the country, then fill in the other dimensions.
- **Choose every dimension deliberately.** If you leave a dimension empty you get all variants mixed: for hours worked, e.g., all workers (_T) and employees only (ICSE93_1). For the Netherlands these differ by more than 80 hours a year (2025).
- **Rows come unsorted.** The CSV is not sorted by country or year. Sort it yourself before plotting a series.
- **Website refuses scripts.** On 15 October 2026 www.oecd.org (including the API guide and the terms) returned HTTP 403 to our honest user agent. The API on sdmx.oecd.org did work. The manual is available as a PDF on gitlab.algobank.oecd.org.

## API (SDMX 2.1 REST (ook SDMX REST 2.0))

- Base: https://sdmx.oecd.org/public/rest
- Access: No key or account needed (tested)
- Formats: csv, json, xml
- Size: 1550 dataflows (tables) in dataflow/all (16 Oct 2026) (tested)
- Filtering: Series key in the path: codes in dimension order, dots between, + for several codes, empty for all. Time with startPeriod/endPeriod or lastNObservations.; ., +, ge:, le:

### Endpoints
- `GET /data/{agency},{dataflow},{versie}/{sleutel}`: Data (SDMX API 1). Key: one position per dimension (without time), dots between, + for several codes, empty = all. Example: OECD.SDD.TPS,DSD_LFS@DF_IALFS_UNE_M,1.0/NLD+DEU.UNE_LF_M.PT_LF_SUB._Z.Y._T.Y_GE15._Z.M
- `GET /v2/data/dataflow/{agency}/{dataflow}/{versie}/{sleutel}`: Data (SDMX API 2): one code per dimension, * as wildcard, time with c[TIME_PERIOD]=ge:2018+le:2024. Version + = latest.
- `GET /dataflow/all`: All 1,550 dataflows with id, agency, version and name (10 MB as JSON with Accept application/vnd.sdmx.structure+json).
- `GET /dataflow/{agency}/{dataflow}/{versie}?references=all`: One dataflow with data structure, code lists and concepts: the order of the dimensions and all codes.
- `GET /availableconstraint/{agency},{dataflow},{versie}/{sleutel}/all/{dimensie}`: Which codes of one dimension have data for this key, plus the number of observations (obs_count). Handy to find the right MEASURE code.
- `GET /codelist/{agency}/{codelijst}`: Code list with names, e.g. /codelist/OECD/CL_AREA (countries and areas, 576 kB JSON).

### Parameters
- `startPeriod`: Start (inclusive): 2015, 2015-Q1, 2015-01 or 2015-M01, 2015-01-01. (tested)
- `endPeriod`: End (inclusive), same notation. (tested)
- `lastNObservations`: At most N observations per series, from the latest. lastNObservations=1 = latest month only. (tested)
- `dimensionAtObservation`: AllDimensions = flat list (handy for JSON); default grouped per time series. (from the description)
- `format`: csvfile (CSV file), csvfilewithlabels (codes and names), csv, jsondata, genericdata, structurespecificdata. Without format: SDMX-ML generic. (tested)
- `detail`: Full (default), DataOnly, SeriesKeysOnly, NoData. (tested)
- `updatedAfter`: Only observations added, changed or deleted since this moment (with time zone, e.g. 2026-10-01T00:00:00+02:00). (from the description)
- `firstNObservations`: At most N observations per series, from the oldest. (tested)
- `includeHistory, asOf`: Listed among the allowed parameters the API returns for an unknown parameter; not tested further. (tested)
- `references`: For structure queries: all (everything that belongs to it), with detail=referencepartial. (from the description)

### Columns in format=csvfile (monthly unemployment) (9)
`DATAFLOW` tekst, `REF_AREA` code, `MEASURE` code, `UNIT_MEASURE` code, `ADJUSTMENT` code, `TIME_PERIOD` periode, `OBS_VALUE` getal, `OBS_STATUS` code, `UNIT_MULT` getal

### Limits and pitfalls
- Calls in quick succession get a 429. Back off (15, 30, 45 s) and rather ask for several countries at once with +. (experience)
- The OECD announced a limit on data downloads in November 2024 (page 'API best practices'; search results mention 60 per hour). That page on www.oecd.org returned 403 to us, so we did not read the number ourselves. (experience)
- No key needed. Send Accept-Encoding: gzip; dataflow/all is 10 MB. (tested)
- No result = HTTP 404 with the plain text NoResultsFound, not an empty list. (tested)
- An unknown parameter (e.g. lang=en) returns 403 with the list of allowed parameters: startPeriod, endPeriod, updatedAfter, firstNObservations, lastNObservations, dimensionAtObservation, detail, includeHistory, asOf (format also works). (tested)
- Wrong number of dimensions in the key: availableconstraint returns 403 'Not enough key values in query, expecting 9 got 11'; data just returned NoResultsFound. Count the dots. (tested)
- Codes in the default view do not always match the data: the metadata named UNE_M, the data use UNE_LF_M. Ask availableconstraint for the MEASURE dimension. (tested)
- Accept-Language: * (the Node fetch default) returns HTTP 500 'Internal server error', on structure and data queries (measured with curl: without that header 200, with it 500; a response already in the OECD cache does get through). Set Accept-Language: en yourself. According to the manual the SDMX-CSV separator also depends on Accept-Language (sometimes ;). (tested)
- If you leave a dimension empty you get all variants mixed (for hours worked: all workers and employees only). Choose every dimension deliberately. (experience)
- CSV rows are not sorted by country or period. csvfilewithlabels has a different header (STRUCTURE, STRUCTURE_ID, with a name column next to every code). (tested)
- Dataflows sometimes point to an older structure version; without a version in the path (SDMX API 1) or with + (API 2) you get the latest, which is not always backwards compatible. (from the description)
- The Data Explorer has a 'Developer API' button per table with exactly the call for your selection. (from the description)

### Example
```
https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_LFS@DF_IALFS_UNE_M,1.0/NLD+DEU+BEL.UNE_LF_M.PT_LF_SUB._Z.Y._T.Y_GE15._Z.M?lastNObservations=2&format=csvfile
```

## How to fetch it

### curl
```bash
curl "https://sdmx.oecd.org/public/rest/data/OECD.ELS.SAE,DSD_HW@DF_AVG_ANN_HRS_WKD,1.0/NLD+DEU+BEL+USA........_T....?startPeriod=2025&format=csvfilewithlabels"
```

### python
```python
import io, pandas as pd, requests

url = ("https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_LFS@DF_IALFS_UNE_M,1.0/"
       "NLD+DEU+BEL.UNE_LF_M.PT_LF_SUB._Z.Y._T.Y_GE15._Z.M")
r = requests.get(url, params={"startPeriod": "2025-01", "format": "csvfile"})
df = pd.read_csv(io.StringIO(r.text)).sort_values(["REF_AREA", "TIME_PERIOD"])
print(df[["REF_AREA", "TIME_PERIOD", "OBS_VALUE"]].tail())   # werkloosheid in procent
```

## What you can build with it
- [The Netherlands next to Europe: a comparison tool for any indicator](https://www.opendataindex.nl/en/bouwen/nederland-naast-europa.md): Pick a figure (unemployment, hours worked, life expectancy, CO2) and see at once where the Netherlands ranks among the 27 EU countries, with four international sources behind one button.


## What is in it: 1,550 dataflows

All dataflows in the OECD Data Explorer, in the OECD's own topic structure, fetched every night. A dataflow can sit under several topics. Every dataflow has its own page with the SDMX call for the latest Dutch observation, the number of observations and the period.

- Kinds: dataflow 1,550
- Last changed: 2026-10-16 (339 in the past 30 days)
- With an API call on the dataset page: 1,550
- Search: https://www.opendataindex.nl/api/catalogus/oecd?q=… or the MCP function zoek_datasets with herkomst=oecd
- Every row has its own page: https://www.opendataindex.nl/en/dataset/oecd/<key>

### Folders
- Agriculture and fisheries (37): Agricultural policy monitoring (13), Agricultural trade and markets (6), Agriculture and environmental sustainability (11), Fisheries and aquaculture (7)
- Development (80): Africa (44), Key indicators of informality (KIIbIH) (5), Official Development Assistance (ODA) (23)
- Economy (307): Corporate sector (51), Economic outlook (7), External sector (16), Leading indicators and tendency surveys (4), National accounts (158), Prices (31), Productivity (4), Short-term economic statistics (54) …
- Education and skills (119): Education attainment (6), Education resources (6), Students (33), Subnational education indicators (9), Teachers (45), Youth and the labour market (24)
- Employment (69): Benefits, earnings and wages (21), Employment indicators (37), Employment protection (1), Unemployment indicators (19)
- Environment and climate change (71): Air and climate (15), Biodiversity, water and ecosystems (13), Energy (8), Environmental policy (11), Green growth (2), Land and forest (3), Plastics (11), Resource efficiency and circular economy (6) …
- Finance and investment (40): Foreign direct investment (FDI) (15), Pensions and insurance (20)
- Health (86): Health expenditure and financing (5), Health status (16), Healthcare coverage (1), Healthcare human resources (16), Healthcare provider resources (6), Healthcare quality and outcomes (14), Healthcare use (10), Long-term care (4) …
- Industry, business and entrepreneurship (87): Industry dynamics and globalisation (74), Industry sector analysis (1), Industry, business and entrepreneurship policy (2), SMEs and entrepreneurship (51), Tourism (7)
- Public governance (53): Anti-corruption and integrity (2), Openness, innovation and digital government (3), Public employment and management (7), Public finance and budgets (22), Public policymaking (3), Public procurement and infrastructure (9), Regulation (3), Trust, public services and prosperity (4)
- Regional, rural and urban development (181): Cities and functional urban areas (33), Municipalities and local areas (19), Regions (107), Subnational government finance and employment (22)
- Science, technology and innovation (48): Bibliometric indicators (4), Information and communication technology (ICT) (4), Innovation and R&D policy (14), Intellectual property (8), Research and development (R&D) (21)
- Society (51): Demography (2), Gender equality (3), Inclusion and equality (2), Migration (6), Social policy (12), Well-being and beyond GDP (26)
- Taxation (208): Corporate tax (24), Global tax revenues (162), Personal and property tax (14), Tax and environment (7)
- Trade (88): Digital trade (4), Global value and supply chains (10), Trade in goods and services (30), Trade policy (59)
- Transport (22): Annual transport trends (6), Infrastructure investment and maintenance spending (1), Short term transport indicators (7), Transport performance indicators (8)
- Zonder onderwerp (164)
