Procurement radar: who wins public contracts?
See per quarter which companies win Dutch public contracts, in which sector and for what amount, with their company number, LEI and parent company.
geef_project("aanbestedingsradar")geef_bron("ted-aanbestedingen")geef_bron("tenderned")geef_bron("gleif-lei")
I have the project, the tested calls and the pitfalls. I'll build a dashboard with TED, European public procurement, TenderNed public procurement and GLEIF, global register of LEI codes. This is how it could look:
You build this yourself. Copy the prompt into Claude, ChatGPT or Cursor, with the MCP server on, or follow the steps below.
By sector CPV · count · value
79Business services431€4.9 bn77Green spaces and horticulture174€160 m45Construction work168€4.7 bn72IT services145€1.4 bn71Architects and engineers134€312 m90Waste, sewage and environment124€441 m
Chosen most often # = notices
| KvK | Supplier | # | Value* | LEI |
|---|---|---|---|---|
| 06073970 | Cloudwisemostly education buyers | 24 | €2.1 m | — |
| 05086034 | Poelsema Landschapsonderhoud en HandelStaatsbosbeheer, token €1 | 23 | €0 | — |
| 56515154 | Haskoning Nederland B.V.LEI 724500JGY5BCHI34ZY08↳ parent: Koninklijke Haskoning Groep B.V. | 15 | €11.5 m | ✓ |
| 06042440 | Heutink B.V. | 14 | €6.2 m | — |
| 29021830 | Antea Nederland B.V. | 11 | €1.6 m | — |
| 34045532 | Canon Nederland N.V. | 10 | €15.2 m | ✓ |
This is a mockup, not a working version, with the figures from our test run on 16 October 2026 (TED and TenderNed for July to September 2026, GLEIF from that day). Turn the MCP server on with the address on For AI.
Who it's for
Investigative journalists following money, businesses that want to know their competitors, procurement officers doing market research, and researchers of public procurement.
What you get
A dashboard with, per quarter, the contract awards of Dutch contracting authorities: number and amount per sector (CPV division), the suppliers who win most often, and per supplier the company (KvK) number, the LEI and the parent company. Next to it the total number of publications in TenderNed, including below the European thresholds.
Test run on 16 October 2026 for July to September 2026: 2,243 award notices in TED from Dutch contracting authorities, 2,000 with a winner, together 15,941 million euros in stated value (framework agreements count with their maximum). Business services (CPV 79) had the most notices (431, 4,928 million), followed by landscaping and horticulture (174) and construction (168, 4,728 million). Chosen most often: Cloudwise (24 times, mostly via education purchasing), Poelsema Landschapsonderhoud (23, all for Staatsbosbeheer, with a symbolic amount of 1 euro) and Haskoning Nederland (15). Haskoning and Canon Nederland have a LEI (parents: Koninklijke Haskoning Groep and キヤノン株式会社, Canon Inc.), the other four do not. TenderNed counted 6,790 publications in the same quarter.
TED notices from Dutch contracting authorities: 22,755 notices in 2025, 68% more than in 2017
TED notices from Dutch contracting authorities, 2017 – 2025, in notices. That is the highest point in the series.
How you could start6 steps
- 1
Fetch the contract awards from TED
TED (Tenders Electronic Daily) is the European procurement journal: everything above the European thresholds. The search API is POST, without a key. form-type=result are the awards; buyer-country=NLD the Dutch contracting authorities. In fields you choose the fields: winner-identifier (usually the KvK number), organisation-name-tenderer (the names, per language), total-value and main-classification-proc (CPV code). Not every award has a winner: the first one below does not.
curl -X POST "https://api.ted.europa.eu/v3/notices/search" \ -H 'Content-Type: application/json' -d '{"query":"buyer-country=NLD AND form-type=result AND publication-date>=20260701 AND publication-date<=20260930","fields":["publication-number","publication-date","buyer-name","winner-identifier","organisation-name-tenderer","total-value","total-value-cur","main-classification-proc"],"limit":2,"page":1,"paginationMode":"PAGE_NUMBER"}'{"notices":[ {"publication-number":"449383-2026","publication-date":"2026-07-01+02:00","buyer-name":{"nld":["LOGOS, Stichting voor Protestants Christelijk Onderwijs"]},"main-classification-proc":["39100000"], "links":{…}}, {"winner-identifier":["17239940"],"publication-number":"449418-2026","publication-date":"2026-07-01+02:00","buyer-name":{"nld":["Stichting Fioretti Teylingen"]}, "total-value-cur":["EUR"],"main-classification-proc":["30200000"],"organisation-name-tenderer":{"nld":["Bechtle B.V."]},"total-value":3300000, "links":{…}}], "totalNoticeCount":2243,"iterationNextToken":null,"timedOut":false} - 2
Paginate, and read numbers and names in the same order
limit at most 250, page × limit at most 15,000; 2,243 awards are 9 pages. In a framework agreement with several winners, winner-identifier is a list and the names in organisation-name-tenderer come in the same order (in our quarter that held for 1,998 of the 2,000). winner-name then gives only one name: do not use that field. Almost always the number is an 8-digit KvK number (2,731 times), sometimes a VAT or foreign number (268 times).
curl -X POST "https://api.ted.europa.eu/v3/notices/search" \ -H 'Content-Type: application/json' -d '{"query":"buyer-country=NLD AND form-type=result AND publication-date>=20261001","fields":["publication-number","total-value","total-value-cur","winner-identifier","winner-name","organisation-identifier-tenderer","organisation-name-tenderer"],"limit":2,"paginationMode":"PAGE_NUMBER"}'{"notices":[{"winner-identifier":["39050726","88307085","34346504"], "organisation-identifier-tenderer":["39050726","88307085","34346504"], "publication-number":"674647-2026","total-value-cur":["EUR"], "organisation-name-tenderer":{"nld":["International Security Partners B.V.","Otentica B.V.","Validata Group B.V."]}, "links":{…},"winner-name":{"nld":["International Security Partners B.V."]},"total-value":3900000}, {"publication-number":"674737-2026","total-value-cur":["EUR"],"links":{…},"total-value":512000}], "totalNoticeCount":350,"iterationNextToken":null,"timedOut":false} - 3
Look at all tenders in TenderNed
TenderNed also has the national tenders. The publication web service returns the total in totalElements with size=1; typeOpdracht picks supplies (L), services (D) or works (W). From July to September 2026: 6,790 publications, 866 of them works. Other filters (typePublicatie, europees) are silently ignored, and before 2022 the web service is incomplete.
https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties?page=0&size=1&publicatieDatumVanaf=2026-07-01&publicatieDatumTot=2026-09-30&typeOpdracht=W
{"content":[{"publicatieId":"442341","publicatieDatum":"2026-09-30","typePublicatie":{"code":"MAC","omschrijving":"Marktconsultatie"}, "aanbestedingNaam":"Nieuwe energiecentrale in Den Helder","opdrachtgeverNaam":"Rijksvastgoedbedrijf", … "typeOpdracht":{"code":"W","omschrijving":"Werken"},"digitaal":true,"europees":false, …}], "first":true,"last":false,"totalElements":866,"totalPages":866,"size":1,"numberOfElements":1,"number":0} - 4
TenderNed does not name the winner
Even an award publication (AGO, formType result) only has isGegund, the CPV codes and the contracting authority in the web service, no contractor or amount. For winners use TED (above the thresholds) or TenderNed's annual files (OCDS JSON, 58 to 116 MB per year, with awards and suppliers; mind the personal data of contact persons).
https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties/444576
{"publicatieId":444576,"kenmerk":618608,"aanbestedingNaam":"Point of Sale, Banqueting en App eten & drinken HvA-UvA", "opdrachtgeverNaam":"Universiteit van Amsterdam", … "typePublicatie":"Aankondiging gegunde opdracht - algemene richtlijn, standaardregeling", "publicatieCode":"EF29", … "cpvCodes":[…,{"isHoofdOpdracht":true,"code":"48110000-2","omschrijving":"Software voor verkooppunten"}], … "isGegund":true, … "aankondigingCode":{"code":"AGO","omschrijving":"Aankondiging gegunde opdracht"}, … "formType":"result", …} - 5
From KvK number to LEI
GLEIF (CC0, no key) searches on entity.registeredAs, the KvK number; registration authority RA000463 is the Chamber of Commerce. Leading zeros are part of it ('05086034'). Many small businesses have no LEI; often only the holding has one. Use curl -g because of the square brackets.
https://api.gleif.org/api/v1/lei-records?filter[entity.registeredAs]=56515154&filter[entity.legalAddress.country]=NL
{"meta":{"goldenCopy":{"publishDate":"2026-10-16T08:00:00Z"},"pagination":{"currentPage":1,"perPage":15,"from":1,"to":1,"total":1,"lastPage":1}}, "links":{…},"data":[{"type":"lei-records","id":"724500JGY5BCHI34ZY08","attributes":{"lei":"724500JGY5BCHI34ZY08", "entity":{"legalName":{"name":"Haskoning Nederland B.V.","language":"nl"}, "otherNames":[{"name":"HaskoningDHV Nederland B.V.","language":"nl","type":"PREVIOUS_LEGAL_NAME"}], … "registeredAt":{"id":"RA000463","other":null},"registeredAs":"56515154","jurisdiction":"NL", …}, "registration":{… "status":"ISSUED", …}}, …}]} - 6
Follow the group upwards
ultimate-parent gives the top of the group, if it has a LEI itself and the relationship was reported. That way you see that Canon Nederland belongs to Canon Inc. in Japan (name in Japanese) and Haskoning Nederland to Koninklijke Haskoning Groep.
https://api.gleif.org/api/v1/lei-records/724500JGY5BCHI34ZY08/ultimate-parent
{"meta":{"goldenCopy":{"publishDate":"2026-10-16T08:00:00Z"}},"data":{"type":"lei-records","id":"724500HYZARZBIG4VP03", "attributes":{"lei":"724500HYZARZBIG4VP03","entity":{"legalName":{"name":"Koninklijke Haskoning Groep B.V.","language":"nl"}, "otherNames":[{"name":"Koninklijke HaskoningDHV Groep B.V.","language":"nl","type":"PREVIOUS_LEGAL_NAME"}], … "legalAddress":{… "city":"Amersfoort", … "country":"NL","postalCode":"3818EX"}, …
How the sources fit together
- TED, European public procurementGLEIF, global register of LEI codesvia
winner-identifier (KvK-nummer, 8 cijfers) = entity.registeredAsFor Dutch winners TED almost always gives the KvK number. In GLEIF that is the registeredAs field (registration authority RA000463). That gets you the official name, the LEI status and the parent company. VAT numbers (NL…B01) and foreign numbers do not link this way.
- TED, European public procurementTenderNed public procurementvia
geen gedeelde sleutel; opdrachtgever, titel en datumEuropean tenders appear in both (TenderNed forwards them to TED). TenderNed also has the national ones, but without the winner in the web service. Use TED for the winners and TenderNed for the total volume per contract type.
Let AI build it
Paste this prompt into Claude, ChatGPT, Cursor or Lovable. It names the real endpoints, the join keys and the pitfalls, so the assistant writes working code straight away. Always check the result against the source itself.
Build a dashboard (Python with pandas and Streamlit, or Next.js) that shows per quarter which companies win Dutch public contracts, in which sector and for how much.
Source 1, TED (no key): POST https://api.ted.europa.eu/v3/notices/search with JSON
{"query":"buyer-country=NLD AND form-type=result AND publication-date>=20260701 AND publication-date<=20260930","fields":["publication-number","publication-date","buyer-name","winner-identifier","organisation-name-tenderer","total-value","total-value-cur","main-classification-proc"],"limit":250,"page":1,"paginationMode":"PAGE_NUMBER"}
- limit at most 250, page × limit at most 15,000. Need more: paginationMode ITERATION with iterationNextToken. The total is in totalNoticeCount.
- Dates as YYYYMMDD in the query. The search index starts in October 2016; since late 2023 they are eForms (different fields than before).
- winner-identifier is a list (framework agreement = several winners), usually 8-digit KvK numbers. organisation-name-tenderer is an object per language ({"nld":[…]}) with the names in the same order. Do not use winner-name: it gives one name, even with three winners.
- total-value is the amount of the whole notice, for framework agreements often the maximum. Do not split it over winners; show "amount as sole winner" separately.
- Many authorities enter 1 euro when the amount is confidential (Staatsbosbeheer, Gasunie, Defence): count amounts below 1,000 euros as unknown. Only add up EUR.
- Awards without winner-identifier were not awarded or the winner was not published.
- Sector: the first two digits of main-classification-proc (CPV division), for example 45 construction, 72 IT services, 79 business services.
Source 2, GLEIF (CC0, no key): https://api.gleif.org/api/v1/lei-records?filter[entity.registeredAs]=<KvK>&filter[entity.legalAddress.country]=NL and /lei-records/<LEI>/ultimate-parent
- Leading zeros are part of the KvK number. Many companies have no LEI (often only the holding): show "no LEI", not an error.
- Go easy: one request at a time, cache responses.
Source 3, TenderNed (no key): https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties?page=0&size=1&publicatieDatumVanaf=2026-07-01&publicatieDatumTot=2026-09-30&typeOpdracht=W
- totalElements is the count. typeOpdracht L, D or W. Unknown filters are ignored. No winners in this web service.
Output: pick a quarter; cards with number of awards, number with a winner and stated value; a bar chart per CPV division; a table of suppliers (KvK, name, number won, amount as sole winner, LEI, parent) with a search box; and next to TED the TenderNed total per contract type. Put "stated value, framework agreements at their maximum" next to every amount.
Try it yourself
The core of the project in a small script. Needs: Node 20 of nieuwer (ingebouwde fetch); draai met: node aanbestedingsradar.mjs (ruim een halve minuut). Tested on 2026-10-16; below is the real output of that run.
// Aanbestedingsradar: wie wint Nederlandse overheidsopdrachten, in welke sector, voor hoeveel?
// Bronnen: TED (EU-aanbestedingen, POST-zoek-API), TenderNed (publicatie-webservice) en GLEIF (LEI-register). Geen sleutels. Node 20+.
const UA = { "User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)" };
const VAN = "2026-07-01", TOT = "2026-09-30";
const CPV = { "03": "Landbouwproducten", "09": "Brandstof en energie", 15: "Voeding", 22: "Drukwerk", 30: "Kantoor- en computeruitrusting",
31: "Elektrische apparatuur", 32: "Telecomapparatuur", 33: "Medische apparatuur en medicijnen", 34: "Vervoermiddelen", 35: "Veiligheid en defensie",
38: "Laboratoriumapparatuur", 39: "Meubilair en schoonmaak", 42: "Industriële machines", 44: "Bouwmaterialen", 45: "Bouwwerkzaamheden",
48: "Software", 50: "Reparatie en onderhoud", 51: "Installatie", 55: "Horeca", 60: "Vervoer", 63: "Ondersteunend vervoer", 64: "Post en telecom",
65: "Nutsvoorzieningen", 66: "Financiële diensten", 70: "Vastgoed", 71: "Architecten en ingenieurs", 72: "IT-diensten", 73: "Onderzoek",
75: "Overheidsdiensten", 77: "Groen en tuinbouw", 79: "Zakelijke diensten", 80: "Onderwijs", 85: "Zorg en welzijn", 90: "Afval, riool en milieu",
92: "Recreatie en cultuur", 98: "Overige diensten" };
// 1. TED: alle gunningen (form-type=result) van Nederlandse aanbesteders. Max 250 per pagina, page x limit max 15.000.
const ted = [];
for (let page = 1; ; page++) {
const r = await fetch("https://api.ted.europa.eu/v3/notices/search", { method: "POST", headers: { ...UA, "Content-Type": "application/json" },
body: JSON.stringify({ query: `buyer-country=NLD AND form-type=result AND publication-date>=${VAN.replaceAll("-", "")} AND publication-date<=${TOT.replaceAll("-", "")}`,
fields: ["publication-number", "total-value", "total-value-cur", "winner-identifier", "organisation-name-tenderer", "main-classification-proc"],
limit: 250, page, paginationMode: "PAGE_NUMBER" }) });
const j = await r.json();
ted.push(...j.notices);
if (j.notices.length < 250) break;
}
// winner-identifier is meestal het KvK-nummer (8 cijfers), soms een btw-nummer. Namen staan per taal in organisation-name-tenderer,
// in dezelfde volgorde als de nummers. Bij meer winnaars (raamovereenkomst) is total-value het bedrag van de hele aankondiging.
const winnaar = {}, sector = {};
let metWinnaar = 0, waarde = 0, zonderBedrag = 0;
for (const n of ted) {
const ids = n["winner-identifier"] ?? [];
// Bedrag: alleen EUR. Veel aanbesteders vullen 1 euro in als het bedrag vertrouwelijk is (Staatsbosbeheer 106 keer):
// tel alles onder 1.000 euro als 'geen bedrag'.
const eur = n["total-value-cur"]?.[0] === "EUR" && n["total-value"] >= 1000 ? n["total-value"] : 0;
if (!eur) zonderBedrag++;
const cpv = (n["main-classification-proc"]?.[0] ?? "??").slice(0, 2);
(sector[cpv] ??= { n: 0, eur: 0 }).n++; sector[cpv].eur += eur;
if (!ids.length) continue; // geen winnaar: niet gegund of geheim
metWinnaar++; waarde += eur;
const namen = Object.values(n["organisation-name-tenderer"] ?? {})[0] ?? [];
ids.forEach((id, i) => { const w = (winnaar[id] ??= { naam: namen[i] ?? "?", n: 0, eur: 0, alleen: 0 }); w.n++; w.eur += eur; if (ids.length === 1) w.alleen += eur; });
}
const mln = (x) => (x / 1e6).toLocaleString("nl-NL", { maximumFractionDigits: 1 });
console.log(`TED, ${VAN} t/m ${TOT}: ${ted.length} gunningsaankondigingen van Nederlandse aanbesteders, ${metWinnaar} met winnaar, samen ${mln(waarde)} mln euro`);
console.log(` (${zonderBedrag} aankondigingen zonder bruikbaar bedrag: leeg, andere munt of symbolisch 1 euro)`);
console.log("\nSectoren (CPV-hoofdgroep), meeste aankondigingen:");
for (const [c, s] of Object.entries(sector).sort((a, b) => b[1].n - a[1].n).slice(0, 6))
console.log(` ${c} ${(CPV[c] ?? "?").padEnd(28)} ${String(s.n).padStart(4)} ${mln(s.eur).padStart(7)} mln`);
const top = Object.entries(winnaar).sort((a, b) => b[1].n - a[1].n).slice(0, 6);
console.log("\nVaakst gekozen leveranciers (aantal aankondigingen; bedrag als enige winnaar):");
for (const [id, w] of top) console.log(` ${id.padEnd(9)} ${w.naam.slice(0, 38).padEnd(38)} ${String(w.n).padStart(3)} ${mln(w.alleen).padStart(6)} mln`);
// 2. GLEIF: KvK-nummer -> LEI, officiële naam en moedermaatschappij (alleen als het bedrijf een LEI heeft).
console.log("\nIn het LEI-register (GLEIF):");
for (const [id] of top.filter(([id]) => /^\d{8}$/.test(id))) {
const q = new URLSearchParams({ "filter[entity.registeredAs]": id, "filter[entity.legalAddress.country]": "NL" });
const g = await (await fetch(`https://api.gleif.org/api/v1/lei-records?${q}`, { headers: UA })).json();
const rec = g.data[0];
if (!rec) { console.log(` ${id} geen LEI`); continue; }
const p = await fetch(`https://api.gleif.org/api/v1/lei-records/${rec.id}/ultimate-parent`, { headers: UA });
const moeder = p.ok ? (await p.json()).data?.attributes.entity.legalName.name : null;
console.log(` ${id} ${rec.id} ${rec.attributes.entity.legalName.name} (${rec.attributes.registration.status})${moeder ? `, moeder: ${moeder}` : ""}`);
}
// 3. TenderNed: alle publicaties in dezelfde periode, ook onder de Europese drempels. size=1: alleen het totaal.
const tn = async (extra) => (await (await fetch("https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties?" + new URLSearchParams({
page: 0, size: 1, publicatieDatumVanaf: VAN, publicatieDatumTot: TOT, ...extra }), { headers: UA })).json()).totalElements;
const [alles, L, D, W] = await Promise.all([tn({}), tn({ typeOpdracht: "L" }), tn({ typeOpdracht: "D" }), tn({ typeOpdracht: "W" })]);
console.log(`\nTenderNed, zelfde periode: ${alles} publicaties (leveringen ${L}, diensten ${D}, werken ${W}), van vooraankondiging tot gunning`);
TED, 2026-07-01 t/m 2026-09-30: 2243 gunningsaankondigingen van Nederlandse aanbesteders, 2000 met winnaar, samen 15.941,2 mln euro (496 aankondigingen zonder bruikbaar bedrag: leeg, andere munt of symbolisch 1 euro) Sectoren (CPV-hoofdgroep), meeste aankondigingen: 79 Zakelijke diensten 431 4.928,3 mln 77 Groen en tuinbouw 174 160,1 mln 45 Bouwwerkzaamheden 168 4.727,5 mln 72 IT-diensten 145 1.396,6 mln 71 Architecten en ingenieurs 134 311,6 mln 90 Afval, riool en milieu 124 441,1 mln Vaakst gekozen leveranciers (aantal aankondigingen; bedrag als enige winnaar): 06073970 Cloudwise 24 2,1 mln 05086034 Poelsema Landschapsonderhoud en Handel 23 0 mln 56515154 Haskoning Nederland B.V. 15 11,5 mln 06042440 Heutink B.V. 14 6,2 mln 29021830 Antea Nederland B.V. 11 1,6 mln 34045532 Canon Nederland N.V. 10 15,2 mln In het LEI-register (GLEIF): 06073970 geen LEI 05086034 geen LEI 56515154 724500JGY5BCHI34ZY08 Haskoning Nederland B.V. (ISSUED), moeder: Koninklijke Haskoning Groep B.V. 06042440 geen LEI 29021830 geen LEI 34045532 89450091HV57JX3WQE27 Canon Nederland N.V. (ISSUED), moeder: キヤノン株式会社 TenderNed, zelfde periode: 6790 publicaties (leveringen 1828, diensten 4127, werken 866), van vooraankondiging tot gunning
Where it goes wrong
- A symbolic amount is not an amount: 321 of the 2,243 awards in the third quarter of 2026 had a total-value of 1 euro or less (Staatsbosbeheer 106 times, Gemeente Rotterdam 17, Gasunie 14). Count amounts below 1,000 euros as unknown, otherwise a supplier with 23 contracts appears to earn nothing.
- total-value belongs to the whole notice. In a framework agreement with three winners you do not know who gets what, and it is often a maximum that is never reached. Do not add the amount to every winner; show 'as sole winner' and 'together with others' separately.
- winner-name gives one name, even when winner-identifier has three numbers. Use organisation-name-tenderer: those names come in the same order as the numbers. And it is an object per language ({"nld": […]} or {"eng": […]}).
- TED only has contracts above the European thresholds. TenderNed's web service also has the smaller ones, but no winners: for who wins national contracts you need TenderNed's annual files (OCDS, up to 116 MB per year, with personal data of contact persons).
- No LEI does not mean the company does not exist. Of the six suppliers chosen most often, four had no LEI; for Heutink and Poelsema only a holding has one (under a different KvK number). Search by name only as a check, never as an automatic link.
- One tender produces several notices (prior information, contract notice, award, modification). To count awards, filter on form-type=result; to count tenders, merge notices from the same procedure.
Take it further
- Follow one contracting authority: put the buyer in the query and show from which suppliers a municipality or ministry buys most, per year since 2024.
- Make a group overview: group winners by their ultimate parent from GLEIF and see which international groups win contracts through Dutch subsidiaries.
- Read a TenderNed annual file (streaming, OCDS) and also count national awards per supplier. Compare with TED to see how much purchasing stays below the thresholds.
- Send a notification for new awards in your sector: run the TED query every day with main-classification-proc and yesterday's publication-date.
More with this data
TenderNed publications by type of contract: most services (15,390 publications), then supplies and works
TenderNed publications by type of contract, 2025, in publications. Total: 25,797; the largest 3 of 3 categories are shown. Services is 60% of the total. A publication can belong to more than one type: together 25,935, against 25,797 publications.
The sources3

TED, European public procurement
TED (Tenders Electronic Daily) is the EU's procurement journal. Every public body buying above the European thresholds must report here: prior information, contract notice, award and modification, with CPV code, contracting authority and often the winner and value. The search API works without a key. In 2025 Dutch contracting authorities published 22,755 notices, over 183,000 since October 2016.

TenderNed public procurement
TenderNed is the government's procurement platform. Every publication (notice, award, correction, market consultation …) is in it with buyer, type of contract, procedure and CPV code. Open are the annual files (JSON in the Open Contracting standard, CC0) and a publication web service; on 16 October 2026 that service held 146,513 publications, 25,797 of them from 2025.

GLEIF, global register of LEI codes
A LEI (Legal Entity Identifier) is a twenty-character code every legal entity needs to trade on financial markets. The Global LEI Foundation (GLEIF) publishes the whole register openly: name, address, legal form, Chamber of Commerce number, status and who the direct and ultimate parent is. On 16 October 2026, 198,915 LEIs had a legal address in the Netherlands, out of more than 3.4 million worldwide.
More to build
Municipal budget explorer: what does my municipality spend money on?Tool
Monitor for inflation, mortgage rates and savings ratesDashboard
The Netherlands next to Europe: a comparison tool for any indicatorTool
National budget tracker: budgeted against spentDashboard
Healthcare cost comparer per municipalityTool