# Iv3, municipal budgets and accounts

Municipalities submit their budget, four quarterly reports and annual accounts to CBS in a fixed format: Information for third parties (Iv3). CBS publishes these figures unprocessed, per municipality, per policy area (from administration to youth care and waste) and per type of income or expense. There is one table per reporting year, also for provinces, water boards and joint arrangements.

- Publisher: Centraal Bureau voor de Statistiek
- Area: Netherlands · Finest detail: municipality and policy area
- Period: 2010 – 2026 · Refreshed: quarterly
- Access: Open · Licence: CC BY 4.0
- Join keys: gemeentecode (GM), taakveld, categorie
- Status: ok (2026-09-22) · 45073NED: Gemeenschappelijke regelingen 2025 onbewerkte Iv3-data
- URL: https://iv3statline.cbs.nl/portal.html?_la=nl&_catalog=IV3&tableId=45071NED

## What can you do with it?
- **How much property tax does your municipality raise?.** Add up income on policy areas 0.61 (property tax on homes) and 0.62 (non-residential). Amsterdam budgeted 172.7 million euros of income on 0.61 for 2025. Divide by residents and compare with neighbouring municipalities.
- **Budget versus reality.** Put the budget next to the annual accounts for the same year. On which policy areas does your municipality keep spending more than budgeted?
- **Who hires the most external staff?.** Category L3.5.1 (hired staff) against L1.1 (salaries and social charges) shows per municipality how much it relies on hired staff.
- **Follow the reserves.** Balance items P111 (general reserve) and P112 (earmarked reserves) with categories Primo and Ultimo show how a municipality's savings change over the year.

## How to process it
1. **Find the table for the right year.** Each reporting year has its own table: 45071NED is Municipalities 2025, 45078NED Municipalities 2026, 45067NED Municipalities 2024. The catalogue lists them all.
   `https://dataderden.cbs.nl/ODataCatalog/Tables?$format=json&$filter=Catalog%20eq%20'IV3'&$select=Identifier,Title,Modified`
2. **Look at the codes.** Four dimensions: TaakveldBalanspost (145 codes), Categorie (78), Gemeenten (342) and Verslagsoort (6: budget, quarters 1 to 4, annual accounts).
   `https://dataderden.cbs.nl/ODataApi/OData/45071NED/Verslagsoort`
3. **Filter by municipality, report type and policy area.** Pad keys with spaces: municipality to 9 characters ('GM0363   '), policy area to 6 ('0.61  '), category to 8 ('B2.2.1  '). Without the spaces you get an empty list.
   `https://dataderden.cbs.nl/ODataApi/OData/45071NED/TypedDataSet?$filter=Gemeenten%20eq%20'GM0363%20%20%20'%20and%20Verslagsoort%20eq%20'2025X000'%20and%20TaakveldBalanspost%20eq%20'0.61%20%20'`
4. **Use the second release.** Each report type is released twice. The second release contains corrections municipalities sent in. Amounts are in thousands of euros.
5. **Or use the processed tables.** CBS also builds processed tables, but only per region and size class: 83641NED (budgets) and 84413NED (accounts). Levies are available per municipality in 83642NED.
   `https://opendata.cbs.nl/ODataApi/OData/83642NED/DataProperties`

## Interesting combinations
- How much does your municipality spend per resident on youth care? → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via gemeentecode (GM). Take the number of residents (or young people) from the key figures and divide the expenses on the youth policy areas by it (including 6.751 to 6.763, 6.792 youth personal budgets, 6.821 and 6.822).
- Do municipalities with a lot of nuisance spend more on public order? → [politie-overlast](https://www.opendataindex.nl/en/bron/politie-overlast.md) via gemeentecode (GM). Put expenses on policy area 1.2 (public order and safety) per resident next to registered nuisance per 1,000 residents.

## Similar sources
- [waarstaatjegemeente](https://www.opendataindex.nl/en/bron/waarstaatjegemeente.md): The municipal finance and BBV dashboards show the same kind of figures already processed, as charts and per resident.
- [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md): Processed CBS tables on municipal finances, aggregated per region and size class and checked by CBS.

## What to watch out for
- **Unprocessed, so unchecked.** CBS takes no responsibility for the quality of these figures and its own publications need not match them one to one. A striking amount may be a booking error.
- **Municipalities book differently.** Amsterdam books property tax on homes under B2.2.1 (taxes on producers), not B2.2.2. Add up all income or expense categories of a policy area before comparing municipalities.
- **Quarterly figures are often missing.** Municipalities under 20,000 residents don't have to submit quarterly figures. Anything not submitted shows as '.' (missing).
- **Policy areas only from 2017.** The policy-area classification applies from 2017. Older years use a different classification (functions), see the discontinued CBS tables up to 2016. A long series takes extra work.
- **API pitfalls.** Keys are padded with spaces, and the length differs per dimension. At most 10,000 rows per request. A year table for all municipalities has 23.2 million rows: always filter by municipality or policy area.

## API (OData v3)

- Base: https://dataderden.cbs.nl/ODataApi/OData/45071NED
- Access: No key or account; the description and our call work anonymously. (tested)
- Formats: JSON, Atom/XML
- Size: 23208120 rows (cells) in TypedDataSet (tested)
- Filtering: OData expressions in $filter, keys in single quotes; eq, ne, gt, ge, lt, le, and, or, substringof(), startswith()

### Endpoints
- `GET /TableInfos`: title, summary, period and modification date of the table
- `GET /UntypedDataSet`: the figures, all values as text
- `GET /TypedDataSet`: the figures, with numbers as numbers
- `GET /DataProperties`: all columns: dimensions and topics with unit
- `GET /CategoryGroups`: grouping of categories
- `GET /TaakveldBalanspost`: codes and names of dimension TaakveldBalanspost
- `GET /Categorie`: codes and names of dimension Categorie
- `GET /Gemeenten`: codes and names of dimension Gemeenten
- `GET /Verslagsoort`: codes and names of dimension Verslagsoort

### Parameters
- `$filter`: select rows, e.g. WijkenEnBuurten eq 'GM0363    ' (platform)
- `$select`: only these columns (platform)
- `$top / $skip`: paging (platform)
- `$orderby`: sorting (platform)
- `$format`: json or atom (platform)
- `$count`: after a path: count only (platform)

### Dimensions
- `TaakveldBalanspost` (145 codes): '0.1   ' = 0.1 Bestuur; '0.2   ' = 0.2 Burgerzaken; '0.3   ' = 0.3 Beheer overige gebouwen en gronden
- `Categorie` (78 codes): 'L1.1    ' = L1.1 Salarissen en sociale lasten; 'L2.1    ' = L2.1 Belastingen; 'L3.1    ' = L3.1 Grond
- `Gemeenten` (342 codes): 'GM1680   ' = Aa en Hunze; 'GM0358   ' = Aalsmeer; 'GM0197   ' = Aalten
- `Verslagsoort` (6 codes): '2025X000' = Begroting; '2025X001' = 1e kwartaal; '2025X002' = 2e kwartaal

### Fields (2)
`k_1ePlaatsing_1` double, `k_2ePlaatsing_2` double

### Limits and pitfalls
- At most 10,000 rows per request; page with $skip. The Municipalities 2025 table has 23,208,120 rows (15 Oct 2026). (tested)
- Keys are padded with spaces and the length differs per dimension: Gemeenten 9 characters ('GM0363   '), TaakveldBalanspost 6 ('0.61  '), Categorie 8 ('B2.2.1  '). Note: in other CBS tables the municipality code is 10 characters. (tested)
- One table per reporting year and type of government (45071NED = Municipalities 2025). Find new years in the catalogue with $filter=Catalog eq 'IV3'. (tested)
- Two measures: k_1ePlaatsing_1 and k_2ePlaatsing_2 (1st and 2nd release), in 1,000 euros. The second release includes corrections from municipalities. (from the description)
- Report-type codes contain the year (2025X000 budget, 2025X001 to 2025X004 the quarters, 2025X005 annual accounts). (tested)
- robots.txt on opendata.cbs.nl and iv3statline.cbs.nl disallows /ODataAPI/OData/* (capital API) with Noindex; dataderden.cbs.nl has no robots.txt (404). (tested)

### Example
```
https://dataderden.cbs.nl/ODataApi/OData/45071NED/TypedDataSet?$filter=Gemeenten%20eq%20'GM0363%20%20%20'%20and%20Verslagsoort%20eq%20'2025X000'%20and%20TaakveldBalanspost%20eq%20'0.61%20%20'%20and%20Categorie%20eq%20'B2.2.1%20%20'
```

## How to fetch it

### curl
```bash
curl "https://dataderden.cbs.nl/ODataApi/OData/45071NED/TypedDataSet?\$filter=Gemeenten%20eq%20'GM0363%20%20%20'%20and%20Verslagsoort%20eq%20'2025X000'%20and%20TaakveldBalanspost%20eq%20'0.61%20%20'"
```

### python
```python
import requests

url = "https://dataderden.cbs.nl/ODataApi/OData/45071NED/TypedDataSet"
# let op: sleutels zijn met spaties aangevuld (gemeente 9 tekens, taakveld 6)
f = "Gemeenten eq 'GM0363   ' and Verslagsoort eq '2025X000' and TaakveldBalanspost eq '0.61  '"
rijen = requests.get(url, params={"$filter": f}).json()["value"]
baten = sum(r["k_2ePlaatsing_2"] or 0 for r in rijen if r["Categorie"].startswith("B"))
print(round(baten / 1000, 1), "mln euro OZB woningen, begroting 2025")  # bedragen in 1.000 euro
```

## Who uses it
- [Waarstaatjegemeente.nl](https://www.waarstaatjegemeente.nl/mosaic/dashboard/besluit-begroting-en-verantwoording--bbv-): Dashboard with BBV indicators per municipality

## What you can build with it
- [Municipal budget explorer: what does my municipality spend money on?](https://www.opendataindex.nl/en/bouwen/gemeentebegroting-verkenner.md): Pick a municipality and see its budget per policy area, in euros per resident, and how one policy area compares with all 342 municipalities.


## Examples with real figures (2)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Budgeted general grant from the Municipalities Fund per resident: highest in Schiermonnikoog (4,844 euros), lowest in Bloemendaal (1,481 euros)** (begroting 2026). Table 45078NED. [Example](https://www.opendataindex.nl/en/voorbeeld/iv3-algemene-uitkering-per-inwoner)
  - `https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$format=json&$filter=(TaakveldBalanspost%20eq%20'0.7%20%20%20')%20and%20Verslagsoort%20eq%20'2026X000'%20and%20(Categorie%20eq%20'B4.3.1%20%20')&$select=Gemeenten,Categorie,k_1ePlaatsing_1,k_2ePlaatsing_2`
  - `https://opendata.cbs.nl/ODataApi/OData/37230ned/TypedDataSet?$format=json&$filter=substringof('GM'%2CRegioS)%20and%20Perioden%20eq%20'2026MM01'&$select=RegioS,BevolkingAanHetBeginVanDePeriode_1`
- **Budgeted property tax revenue per resident: highest in Schiermonnikoog (874 euros), lowest in Ooststellingwerf (134 euros)** (begroting 2026). Table 45078NED. [Example](https://www.opendataindex.nl/en/voorbeeld/iv3-ozb-per-inwoner)
  - `https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$format=json&$filter=(TaakveldBalanspost%20eq%20'0.61%20%20'%20or%20TaakveldBalanspost%20eq%20'0.62%20%20')%20and%20Verslagsoort%20eq%20'2026X000'%20and%20(Categorie%20eq%20'B2.2.1%20%20'%20or%20Categorie%20eq%20'B2.2.2%20%20')&$select=Gemeenten,Categorie,k_1ePlaatsing_1,k_2ePlaatsing_2`
  - `https://opendata.cbs.nl/ODataApi/OData/37230ned/TypedDataSet?$format=json&$filter=substringof('GM'%2CRegioS)%20and%20Perioden%20eq%20'2026MM01'&$select=RegioS,BevolkingAanHetBeginVanDePeriode_1`
