Gemeentebegroting-verkenner: waar geeft mijn gemeente geld aan uit?
Kies een gemeente en zie de begroting per taakveld, in euro's per inwoner, en hoe één taakveld zich verhoudt tot alle 342 andere gemeenten.
geef_project("gemeentebegroting-verkenner")geef_bron("iv3-gemeentefinancien")geef_bron("cbs-bevolking-maand")
Ik heb het project, de geteste aanroepen en de valkuilen. Ik bouw een tool met Iv3, begrotingen en jaarrekeningen van gemeenten en Bevolkingsontwikkeling per maand. Zo kan het eruitzien:
Dit bouw je zelf. Kopieer de prompt naar Claude, ChatGPT of Cursor, met de MCP-server aan, of volg de stappen hieronder.
Dit is een mockup, geen werkende versie, met de cijfers uit onze proefdraai van 16 oktober 2026 (begroting 2026, CBS-tabel 45078NED). De MCP-server zet je aan met het adres op Voor AI.
Voor wie
Raadsleden en fractiemedewerkers die de begroting willen doorgronden, lokale journalisten, inwoners die willen weten waar hun gemeente geld aan uitgeeft, en ambtenaren die zich willen vergelijken met vergelijkbare gemeenten.
Wat je krijgt
Een verkenner waarin je een gemeente kiest en per hoofdtaakveld (bestuur, veiligheid, verkeer, onderwijs, sociaal domein …) de lasten in de begroting ziet, in miljoenen en in euro's per inwoner. Daaronder één taakveld als ranglijst van alle gemeenten, met de mediaan en de plek van jouw gemeente.
Proefdraai op 16 oktober 2026 met de begroting 2026 (CBS-tabel 45078NED): Utrecht begroot 2.094,4 miljoen euro aan lasten, 5.539 euro per inwoner (378.121 inwoners op 1 januari 2026). Het sociaal domein is het grootst: 726,5 miljoen, 1.921 euro per inwoner. Voor inkomensregelingen (taakveld 6.3, vooral bijstand) begroot Utrecht 585 euro per inwoner: plaats 64 van 342, tegen een mediaan van 353 euro. Amsterdam (1.123), Rotterdam (1.113) en Den Haag (1.072) staan bovenaan, Rozendaal (95) onderaan.
Begrote algemene uitkering uit het gemeentefonds per inwoner: het hoogst in Schiermonnikoog (4.844 euro), het laagst in Bloemendaal (1.481 euro)
Begrote algemene uitkering uit het gemeentefonds per inwoner per gemeente, begroting 2026, in euro per inwoner. Heel Nederland: 2.590. 342 gemeenten met een cijfer.
Zo zou je kunnen starten5 stappen
- 1
Vind de nieuwste jaartabel
Iv3-data staan op dataderden.cbs.nl, één tabel per jaar en per soort overheid. De catalogus geeft ze allemaal; de titel noemt het jaar. Op 16 oktober 2026 was 45078NED (Gemeenten 2026) de nieuwste, met de begroting 2026 van alle 342 gemeenten.
https://dataderden.cbs.nl/ODataCatalog/Tables?$filter=Catalog eq 'IV3' and startswith(Title,'Gemeenten')&$select=Identifier,Title,Modified&$format=json
{"odata.metadata":"https://dataderden.cbs.nl/ODataCatalogDerden/$metadata#Tables&$select=Identifier,Title,Modified","value":[ {"Identifier":"45078NED","Title":"Gemeenten 2026 onbewerkte Iv3-data","Modified":"2026-08-31T02:00:00"}, {"Identifier":"45071NED","Title":"Gemeenten 2025 onbewerkte Iv3-data","Modified":"2026-09-22T02:00:00"}, {"Identifier":"45067NED","Title":"Gemeenten 2024 onbewerkte Iv3-data","Modified":"2025-09-22T02:00:00"}, … - 2
Haal de lasten van één gemeente op, met opgevulde sleutels
Vier dimensies: Gemeenten, TaakveldBalanspost, Categorie en Verslagsoort. Sleutels zijn met spaties opgevuld en de lengte verschilt: gemeente 9 tekens ('GM0344 '), taakveld 6 ('6.3 '), categorie 8. Verslagsoort 2026X000 is de begroting, 2026X005 de jaarrekening. Categorieën die met L beginnen zijn lasten, met B baten. Bedragen in 1.000 euro. Zonder de spaties krijg je een lege lijst, geen fout.
https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$filter=Gemeenten eq 'GM0344 ' and Verslagsoort eq '2026X000' and TaakveldBalanspost eq '6.3 ' and startswith(Categorie,'L')&$format=json
{"odata.metadata":"https://dataderden.cbs.nl/ODataApi/OData/45078NED/$metadata#Cbs.OData.WebAPI.TypedDataSet","value":[ {"ID":6243870,"TaakveldBalanspost":"6.3 ","Categorie":"L1.1 ","Gemeenten":"GM0344 ","Verslagsoort":"2026X000","k_1ePlaatsing_1":0.0,"k_2ePlaatsing_2":0.0}, … {"ID":6260286,"TaakveldBalanspost":"6.3 ","Categorie":"L4.1.1 ","Gemeenten":"GM0344 ","Verslagsoort":"2026X000","k_1ePlaatsing_1":190551.0,"k_2ePlaatsing_2":190551.0}, … - 3
Blijf onder de 10.000 rijen
De tabel is een volledige kubus: elke combinatie staat erin, ook met 0. Eén taakveld voor alle gemeenten is 342 x 37 lastencategorieën = 12.654 rijen, en dan weigert de API met HTTP 500 en een tekstmelding (geen JSON). $skip werkt hier niet ('only on the ODataFeed endpoint') en 'not' wordt genegeerd. Splits daarom op categorie: alleen L4 geeft 7.524 rijen, L1, L2, L3, L5, L6 en L7 samen 5.130.
https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$filter=TaakveldBalanspost eq '6.3 ' and Verslagsoort eq '2026X000' and startswith(Categorie,'L')&$format=json
Error getting TypedDataSet for '45078NED': The given query is not allowed on this table. Please redefine your query so that it returns less than 10000 records.
- 4
Dezelfde vraag in twee delen
Met $select houd je het antwoord klein. Tel per gemeente de bedragen van alle lastencategorieën op; boekingen verschillen per gemeente, dus vergelijk nooit één losse categorie.
https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$filter=TaakveldBalanspost eq '6.3 ' and Verslagsoort eq '2026X000' and startswith(Categorie,'L4')&$select=Gemeenten,Categorie,k_2ePlaatsing_2&$format=json
{"odata.metadata":"https://dataderden.cbs.nl/ODataApi/OData/45078NED/$metadata#Cbs.OData.WebAPI.TypedDataSet&$select=Gemeenten,Categorie,k_2ePlaatsing_2","value":[ {"Gemeenten":"GM1680 ","Categorie":"L4.1.1 ","k_2ePlaatsing_2":5909.0}, {"Gemeenten":"GM0358 ","Categorie":"L4.1.1 ","k_2ePlaatsing_2":6606.0}, … (7.524 rijen) - 5
Inwoners op 1 januari als noemer
CBS-tabel 37230ned heeft de bevolking per gemeente per maand. De nieuwe OData v4 op datasets.cbs.nl werkt met maatcodes (M000098 = bevolking aan het begin van de periode) en sleutels zonder spaties ('GM0344'). Opgeheven gemeenten staan erin met Value null; Value zelf is niet filterbaar, dus filter in je code. Utrecht: 378.121 op 1 januari 2026.
https://datasets.cbs.nl/odata/v1/CBS/37230ned/Observations?$filter=Perioden eq '2026MM01' and Measure eq 'M000098' and startswith(RegioS,'GM')&$select=RegioS,Value
{"@odata.context":"https://datasets.cbs.nl/odata/v1/CBS/37230ned/$metadata#Observations(RegioS,Value)","value":[ {"Value":26062.0,"RegioS":"GM1680"},{"Value":null,"RegioS":"GM0738"},{"Value":33459.0,"RegioS":"GM0358"}, {"Value":27608.0,"RegioS":"GM0197"},{"Value":null,"RegioS":"GM0480"}, …
Hoe de bronnen samenkomen
- Iv3, begrotingen en jaarrekeningen van gemeentenBevolkingsontwikkeling per maandvia
gemeentecode: Iv3 'GM0344 ' (9 tekens), OData v4 'GM0344', OData v3 37230ned 'GM0344'Dezelfde gemeentecode, maar elke tabel vult hem anders op: in Iv3 met spaties tot 9 tekens, in de Kerncijfers wijken en buurten tot 10, in 37230ned (v3 en v4) helemaal niet. Haal spaties weg (trim) voor je koppelt. Neem de bevolking op 1 januari van het begrotingsjaar (Perioden '2026MM01').
Laat AI het bouwen
Plak deze prompt in Claude, ChatGPT, Cursor of Lovable. Hij noemt de echte endpoints, de koppelsleutels en de valkuilen, zodat de assistent meteen werkende code schrijft. Controleer de uitkomst altijd met de bron zelf.
Bouw een webapp (React of één HTML-bestand met JavaScript) waarin ik een gemeente kies en zie waar die gemeente geld aan uitgeeft: lasten per hoofdtaakveld, in miljoenen en per inwoner, plus een ranglijst van alle gemeenten voor één taakveld dat ik kies.
Data, geen sleutel:
1. Catalogus: https://dataderden.cbs.nl/ODataCatalog/Tables?$filter=Catalog eq 'IV3' and startswith(Title,'Gemeenten')&$format=json. Kies de tabel met het hoogste jaar in de titel ('Gemeenten 2026 onbewerkte Iv3-data' = 45078NED).
2. Data: https://dataderden.cbs.nl/ODataApi/OData/45078NED/TypedDataSet?$filter=…&$select=Gemeenten,TaakveldBalanspost,Categorie,k_2ePlaatsing_2&$format=json
Dimensielijsten met namen: /Gemeenten, /TaakveldBalanspost, /Categorie, /Verslagsoort onder dezelfde basis.
3. Inwoners: https://datasets.cbs.nl/odata/v1/CBS/37230ned/Observations?$filter=Perioden eq '2026MM01' and Measure eq 'M000098' and startswith(RegioS,'GM')&$select=RegioS,Value
Wat je moet weten:
- Sleutels in Iv3 zijn met spaties opgevuld en de lengte verschilt per dimensie: Gemeenten 9 tekens ('GM0344 '), TaakveldBalanspost 6 ('6.3 '), Categorie 8 ('L4.1.1 '). Verslagsoort zonder spaties: '2026X000' begroting, '2026X001' tot en met '2026X004' kwartalen, '2026X005' jaarrekening. Zonder juiste spaties: lege lijst, geen fout.
- Bedragen (k_1ePlaatsing_1, k_2ePlaatsing_2) zijn in 1.000 euro. Gebruik k_2ePlaatsing_2 (tweede plaatsing, met correcties).
- Categorie L… = lasten, B… = baten. Taakvelden 0.1 tot en met 8.3 zijn programma's; 0.10 (mutaties reserves), 0.11 (resultaat) en alles wat met een letter begint (A…, P…) zijn balansposten: weglaten.
- Hoofdtaakvelden: 0 Bestuur en ondersteuning, 1 Veiligheid, 2 Verkeer, vervoer en waterstaat, 3 Economie, 4 Onderwijs, 5 Sport, cultuur en recreatie, 6 Sociaal domein, 7 Volksgezondheid en milieu, 8 Ruimte en wonen.
- De tabel is een volledige kubus (ook nullen). Meer dan 10.000 rijen = HTTP 500 met een tekstmelding. $skip werkt niet en 'not' wordt genegeerd. Eén gemeente, één verslagsoort, alle L-categorieën = 5.365 rijen: past. Eén taakveld voor alle gemeenten = 12.654: splits in startswith(Categorie,'L4') en (startswith(Categorie,'L1') or … 'L2' … 'L3' … 'L5' … 'L6' … 'L7').
- Gemeenten boeken verschillend (Amsterdam zet OZB op een andere categorie dan de meeste). Tel altijd alle lastencategorieën van een taakveld op; vergelijk geen losse categorie.
- Kleine gemeenten leveren geen kwartaalcijfers ('.' of null): behandel null als ontbrekend, niet als 0, en vergelijk alleen begroting of jaarrekening.
- Inwoners (v4): sleutel zonder spaties ('GM0344'); opgeheven gemeenten staan erin met Value null. Koppel op de getrimde code.
- Taakveld 0 bevat overhead, treasury en de algemene uitkering: niet geschikt om gemeenten mee te vergelijken. Begin met 1 tot en met 8.
- De data zijn onbewerkt en door het CBS niet gecontroleerd: een opvallend bedrag kan een boekingsfout zijn. Zeg dat in de interface.
Uitkomst: bovenaan de gekozen gemeente met totaal en inwoners; een horizontale staafgrafiek per hoofdtaakveld in euro per inwoner; daaronder een keuzelijst met taakvelden (namen uit /TaakveldBalanspost) en een ranglijst van alle gemeenten in euro per inwoner, met de mediaan als lijn en de gekozen gemeente gemarkeerd. Cache de antwoorden een dag; het CBS ververst deze tabel hooguit een paar keer per jaar.
Probeer het zelf
De kern van het project in een klein script. Nodig: Node 20 of nieuwer (ingebouwde fetch); draai met: node gemeentebegroting.mjs [GM-code] [taakveld]. Getest op 2026-10-16; hieronder de echte uitvoer van die proefdraai.
// Gemeentebegroting-verkenner: lasten per taakveld en per inwoner, en één taakveld vergeleken met alle gemeenten.
// Bronnen: Iv3 via dataderden.cbs.nl (OData v3) en CBS 37230ned (bevolking) via datasets.cbs.nl (OData v4). Node 20+.
const UA = { "User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)" };
const GEMEENTE = process.argv[2] ?? "GM0344"; // Utrecht
const TAAKVELD = process.argv[3] ?? "6.3"; // Inkomensregelingen (bijstand)
const HOOFD = { 0: "Bestuur en ondersteuning", 1: "Veiligheid", 2: "Verkeer, vervoer en waterstaat", 3: "Economie",
4: "Onderwijs", 5: "Sport, cultuur en recreatie", 6: "Sociaal domein", 7: "Volksgezondheid en milieu", 8: "Ruimte en wonen" };
const json = async (url) => { const r = await fetch(url, { headers: UA }); const t = await r.text();
try { return JSON.parse(t); } catch { throw new Error(`${r.status}: ${t.slice(0, 150)}`); } }; // >10.000 rijen = HTTP 500 met tekst
const pad = (s, n) => s.padEnd(n); // Iv3-sleutels: gemeente 9 tekens, taakveld 6, categorie 8
// 1. Nieuwste jaartabel 'Gemeenten <jaar> onbewerkte Iv3-data' uit de catalogus.
const cat = await json("https://dataderden.cbs.nl/ODataCatalog/Tables?" + new URLSearchParams({
$filter: "Catalog eq 'IV3' and startswith(Title,'Gemeenten')", $select: "Identifier,Title", $format: "json" }));
const [tabel] = cat.value.map((t) => ({ id: t.Identifier, jaar: +t.Title.match(/\d{4}/)[0] })).sort((a, b) => b.jaar - a.jaar);
const BEGROTING = `${tabel.jaar}X000`; // X000 = begroting, X005 = jaarrekening
const iv3 = async (filter) => (await json(`https://dataderden.cbs.nl/ODataApi/OData/${tabel.id}/TypedDataSet?` +
new URLSearchParams({ $filter: filter, $select: "Gemeenten,TaakveldBalanspost,Categorie,k_2ePlaatsing_2", $format: "json" }))).value;
// Namen: 'Utrecht (gemeente)' -> 'Utrecht'.
const namen = Object.fromEntries((await json(`https://dataderden.cbs.nl/ODataApi/OData/${tabel.id}/Gemeenten?$format=json`)).value
.map((g) => [g.Key.trim(), g.Title.replace(/ \(gemeente\)$/, "")]));
const mln = (k) => (k / 1000).toLocaleString("nl-NL", { minimumFractionDigits: 1, maximumFractionDigits: 1 });
const eur = (x) => Math.round(x).toLocaleString("nl-NL");
// 2. Inwoners op 1 januari van het begrotingsjaar, alle gemeenten (oude gemeenten staan erin met Value null).
const bev = await json("https://datasets.cbs.nl/odata/v1/CBS/37230ned/Observations?" + new URLSearchParams({
$filter: `Perioden eq '${tabel.jaar}MM01' and Measure eq 'M000098' and startswith(RegioS,'GM')`, $select: "RegioS,Value" }));
const inwoners = Object.fromEntries(bev.value.filter((r) => r.Value).map((r) => [r.RegioS, r.Value])); // Value is niet filterbaar
// 3. Alle lasten (categorieën L…) van één gemeente: 145 taakvelden x 37 categorieën = 5.365 rijen, past in één keer.
const rijen = await iv3(`Gemeenten eq '${pad(GEMEENTE, 9)}' and Verslagsoort eq '${BEGROTING}' and startswith(Categorie,'L')`);
const per = {};
for (const r of rijen) {
const tv = r.TaakveldBalanspost.trim();
if (!/^[0-8]\.\d+$/.test(tv) || tv === "0.10" || tv === "0.11") continue; // balansposten, reserves en resultaat eruit
per[tv[0]] = (per[tv[0]] ?? 0) + (r.k_2ePlaatsing_2 ?? 0); // 1.000 euro
}
const n = inwoners[GEMEENTE];
console.log(`${namen[GEMEENTE]} (${GEMEENTE}), begroting ${tabel.jaar} (tabel ${tabel.id}), ${n.toLocaleString("nl-NL")} inwoners op 1 januari ${tabel.jaar}`);
console.log("hoofdtaakveld lasten (mln euro) per inwoner");
let totaal = 0;
for (const [h, k] of Object.entries(per)) {
totaal += k;
console.log(` ${h} ${pad(HOOFD[h], 32)} ${mln(k).padStart(8)} ${eur((k * 1000) / n).padStart(10)}`);
}
console.log(` totaal ${mln(totaal).padStart(8)} ${eur((totaal * 1000) / n).padStart(10)}`);
// 4. Eén taakveld bij alle 342 gemeenten: 342 x 37 = 12.654 rijen is te veel (max 10.000, en $skip werkt hier niet).
// Daarom in twee delen: categorie L4 (22 soorten) en de rest.
const f = `TaakveldBalanspost eq '${pad(TAAKVELD, 6)}' and Verslagsoort eq '${BEGROTING}'`;
const delen = await Promise.all([
iv3(`${f} and startswith(Categorie,'L4')`),
iv3(`${f} and (startswith(Categorie,'L1') or startswith(Categorie,'L2') or startswith(Categorie,'L3') or startswith(Categorie,'L5') or startswith(Categorie,'L6') or startswith(Categorie,'L7'))`),
]);
const lasten = {};
for (const r of delen.flat()) lasten[r.Gemeenten.trim()] = (lasten[r.Gemeenten.trim()] ?? 0) + (r.k_2ePlaatsing_2 ?? 0);
const rij = Object.entries(lasten).filter(([g]) => inwoners[g]).map(([g, k]) => ({ g, pi: (k * 1000) / inwoners[g] })).sort((a, b) => b.pi - a.pi);
const mediaan = rij[Math.floor(rij.length / 2)].pi;
const plek = rij.findIndex((x) => x.g === GEMEENTE) + 1;
console.log(`\nTaakveld ${TAAKVELD}, lasten per inwoner, ${rij.length} gemeenten: mediaan ${eur(mediaan)} euro`);
console.log(` ${namen[GEMEENTE]}: ${eur(rij[plek - 1].pi)} euro, plaats ${plek} van ${rij.length} (1 = hoogst)`);
console.log(" hoogst:", rij.slice(0, 3).map((x) => `${namen[x.g]} ${eur(x.pi)}`).join(", "));
console.log(" laagst:", rij.slice(-3).map((x) => `${namen[x.g]} ${eur(x.pi)}`).join(", "));
Utrecht (GM0344), begroting 2026 (tabel 45078NED), 378.121 inwoners op 1 januari 2026 hoofdtaakveld lasten (mln euro) per inwoner 0 Bestuur en ondersteuning 510,6 1.350 1 Veiligheid 53,1 140 2 Verkeer, vervoer en waterstaat 138,7 367 3 Economie 38,4 101 4 Onderwijs 110,7 293 5 Sport, cultuur en recreatie 177,6 470 6 Sociaal domein 726,5 1.921 7 Volksgezondheid en milieu 128,9 341 8 Ruimte en wonen 209,8 555 totaal 2.094,4 5.539 Taakveld 6.3, lasten per inwoner, 342 gemeenten: mediaan 353 euro Utrecht: 585 euro, plaats 64 van 342 (1 = hoogst) hoogst: Amsterdam 1.123, Rotterdam 1.113, 's-Gravenhage 1.072 laagst: Terschelling 114, Ameland 98, Rozendaal 95
Waar het misgaat
- Sleutels hebben per dimensie én per tabel een andere lengte: Iv3-gemeente 9 tekens ('GM0344 '), Kerncijfers wijken en buurten 10, bevolkingstabel 37230ned zonder spaties ('GM0344'). Een verkeerde lengte geeft een lege lijst zonder foutmelding. Lees de sleutels altijd uit de dimensielijst (/Gemeenten).
- Meer dan 10.000 rijen geeft HTTP 500 met een platte tekst; JSON.parse faalt dan. $skip werkt niet op ODataApi en 'not startswith(…)' wordt genegeerd. Splits je vraag op categorie of gemeente. Het ODataFeed-adres ondersteunt wel $skip, maar past volgens onze eerdere metingen alleen het eerste filterpredicaat toe.
- Taakveld 0 (bestuur en ondersteuning) bevat overhead, treasury en financiering: bij Utrecht 510,6 miljoen in de begroting 2026. Dat zegt weinig over beleid. Vergelijk gemeenten op de taakvelden 1 tot en met 8 en laat 0.10 (mutaties reserves) en 0.11 (resultaat) altijd weg, anders tel je geld dubbel.
- Een begroting is een plan. Voor wat er echt is uitgegeven heb je de jaarrekening nodig (Verslagsoort <jaar>X005); die komt pas in het jaar erna, in een andere jaartabel (2025: 45071NED).
- Per inwoner zegt niet alles: grote steden hebben centrumtaken (opvang, bijstand voor de regio) en betalen die deels uit doeluitkeringen. Een hoge plaats is geen oordeel. Vergelijk liever met gemeenten van dezelfde grootte.
- Op 16 oktober 2026 gaf opendata.cbs.nl een tijd lang HTTP 503 ('Service Unavailable'), ook op de catalogus, terwijl dataderden.cbs.nl en datasets.cbs.nl gewoon antwoordden. Bouw een nieuwe poging met wachttijd in en cache de antwoorden.
Verder bouwen
- Zet begroting en jaarrekening naast elkaar: haal dezelfde gemeente uit 45071NED met Verslagsoort 2025X000 en 2025X005 en laat per taakveld zien waar de gemeente meer of minder uitgaf dan gepland.
- Maak een kaart: koppel de euro's per inwoner aan de gemeentegrenzen van PDOK (CBS-gebiedsindelingen, statcode = GM-code) en kleur alle 342 gemeenten voor het gekozen taakveld.
- Laat ook de inkomsten zien: tel de B-categorieën op voor OZB (taakvelden 0.61 en 0.62 samen) en de algemene uitkering (0.7, categorie B4.3.1) en zet ze naast de lasten.
- Vergelijk met gemeenten van dezelfde grootte: groepeer op inwoneraantal (bijvoorbeeld 50.000 tot 100.000) en toon de mediaan van die groep in plaats van die van heel Nederland.
Meer met deze data
Begrote opbrengst van de OZB per inwoner: het hoogst in Schiermonnikoog (874 euro), het laagst in Ooststellingwerf (134 euro)
Begrote opbrengst van de OZB per inwoner per gemeente, begroting 2026, in euro per inwoner. Heel Nederland: 350. 342 gemeenten met een cijfer.
De bronnen2

Iv3, begrotingen en jaarrekeningen van gemeenten
Gemeenten leveren hun begroting, vier kwartaalcijfers en de jaarrekening aan bij het CBS, in een vaste indeling: Informatie voor derden (Iv3). Het CBS zet die cijfers onbewerkt open, per gemeente, per taakveld (van bestuur tot jeugdhulp en afval) en per soort baten of lasten. Er is één tabel per verslagjaar, ook voor provincies, waterschappen en gemeenschappelijke regelingen.

Bevolkingsontwikkeling per maand
Per gemeente en per maand: hoeveel mensen er geboren werden, overleden, kwamen wonen of vertrokken.
Meer om te bouwen
Aanbestedingsradar: wie krijgt de overheidsopdrachten?Dashboard
Dashboard asielopvang: landelijk en per gemeenteDashboard
Monitor voor inflatie, hypotheekrente en spaarrenteDashboard
Raadsbesluiten-alert: een seintje als je gemeente iets besluitAlert
Rijksbegroting-tracker: begroot tegen uitgegevenDashboard
Stemgedrag-tracker: hoe stemde elke partij?App