WOZ Waardeloket — Official Dutch Property Valuations
Pricing
from $1.49 / 1,000 woz results
WOZ Waardeloket — Official Dutch Property Valuations
Retrieve official WOZ property values, full history with CAGR, land area, cadastral parcels and BAG building data for any Dutch address. Bulk-capable. No proxy or API key required.
Pricing
from $1.49 / 1,000 woz results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
WOZ Waardeloket Scraper

Retrieve official Dutch WOZ property valuations from wozwaardeloket.nl — the government database covering every taxable property in the Netherlands. Supply a list of addresses and get back the full WOZ history, compound growth rate, land area, cadastral parcels, and BAG building data in one structured dataset. No API key required. No proxy needed — runs entirely on public government APIs.
Why this scraper?
🏛️ Official government data — not scraped estimates
WOZ values are set by Dutch municipalities and published by Kadaster. This scraper reads from the same authoritative source the government uses. The data includes every assessment year on record (typically 12–15 years), so you see the full price trajectory — not just the current value.
📈 Growth analysis built in — CAGR and year-over-year per entry
Most WOZ tools return a flat list of values. This scraper calculates the compound annual growth rate (wozGrowthCagr) across the full history, and adds a yoyGrowthPct field to each assessment year so you can immediately identify which years saw the sharpest increases — without writing any additional code.
🗺️ Cadastral parcels included — competitor does not provide this
Each result includes the cadastral parcel references (kadastralePercelen) linked to the address — municipality code, section letter, and parcel number. This is the data you need for further Kadaster lookups, mortgage research, or title verification. The only comparable actor on the Apify Store does not return this.
📍 Full neighbourhood context — buurt, wijk, gemeente, provincie
Every record includes the CBS neighbourhood code (buurtcode), district code (wijkcode), municipality, and province — pulled directly from the PDOK register. No post-processing or third-party geocoding required. Use these codes to aggregate WOZ data by neighbourhood or compare growth rates across districts.
🏗️ Building-level data from BAG — units, floor area, build year
The scraper cross-references the BAG building register to return the construction year (bouwjaar), floor area (oppervlakte), permitted use (gebruiksdoel), and the number of units in the building (aantalVerblijfsobjecten). A flat that returns 199 units is an apartment block — that context matters for valuation.
⚡ No browser, no proxy — fast and cost-efficient
The only comparable actor on the Apify Store uses a stealth browser to bypass access controls. This scraper uses the underlying public government APIs directly — no browser overhead, no residential proxy cost. A batch of 100 addresses typically completes in under 30 seconds.
Input parameters
Two input modes are supported. Use whichever fits your workflow.
Single address (flat fields):
| Parameter | Type | Description | Default |
|---|---|---|---|
streetAddress | string | Street name and house number, e.g. "Kloosterlaan 33" | — |
postcode | string | Dutch postcode, e.g. "1216NH" — spaces allowed | — |
city | string | City name, e.g. "Hilversum" — recommended | — |
Bulk lookup (addresses array):
| Parameter | Type | Description | Default |
|---|---|---|---|
addresses | array | List of address objects — each requires streetAddress and postcode | — |
addresses[].streetAddress | string | Street name with house number, e.g. "Kloosterlaan 33" | — |
addresses[].postcode | string | Dutch postcode, e.g. "1216NH" | — |
addresses[].city | string | City name — recommended for disambiguation | — |
addresses[].huisletter | string | House letter suffix, e.g. "A" or "B" | — |
addresses[].toevoeging | string | House number extension, e.g. "hoog" or "bis" | — |
Common options:
| Parameter | Type | Description | Default |
|---|---|---|---|
maxConcurrency | integer | Parallel processing — relevant for bulk runs | 10 |
skipBag | boolean | Skip BAG building lookup — ~40% faster, WOZ values only | false |
Postcode tolerance: if the supplied postcode does not match the BAG register (e.g.
"1016BP"instead of"1016BR"), the scraper automatically falls back to city-based resolution. The corrected postcode appears in the output.
Non-residential objects: government buildings, public infrastructure, and most commercial property have no WOZ registration. These return
wozLatestValue: nullandisResidential: false— this is correct, not an error.
Output schema
{"inputAddress": { "streetAddress": "Kloosterlaan 33", "postcode": "1216NH", "city": "Hilversum" },"address": "Kloosterlaan 33, 1216NH Hilversum","streetAddress": "Kloosterlaan 33","postcode": "1216NH","city": "Hilversum","gemeente": "Hilversum","gemeentecode": "0402","provincie": "Noord-Holland","provinciecode": "PV27","buurt": "Kerkelanden","buurtcode": "BU04020304","wijk": "Zuidwest","wijkcode": "WK040203","lat": 52.22007594,"lon": 5.13386319,"nummeraanduidingId": "0402200001552236","adresseerbaarobjectId": "0402010001552237","pandId": "0402100001486583","isResidential": true,"wozObjectnummer": 40200018608,"wozLatestValue": 450000,"wozLatestYear": 2025,"wozGrowthCagr": 7.1,"wozHistoryYears": 12,"wozValues": [{ "peildatum": "2025-01-01", "peiljaar": 2025, "waarde": 450000, "yoyGrowthPct": 11.9 },{ "peildatum": "2024-01-01", "peiljaar": 2024, "waarde": 402000, "yoyGrowthPct": 4.7 },{ "peildatum": "2023-01-01", "peiljaar": 2023, "waarde": 384000, "yoyGrowthPct": 4.3 },{ "peildatum": "2022-01-01", "peiljaar": 2022, "waarde": 368000, "yoyGrowthPct": 12.3 },{ "peildatum": "2021-01-01", "peiljaar": 2021, "waarde": 328000, "yoyGrowthPct": 11.9 }],"grondoppervlakte": 146,"kadastralePercelen": [{ "gemeente": "HVS00", "sectie": "H", "perceel": "4212" },{ "gemeente": "HVS00", "sectie": "H", "perceel": "3454" }],"locatieomschrijving": null,"building": {"bouwjaar": 1971,"oppervlakte": 143,"oppervlakteMin": 143,"oppervlakteMax": 143,"gebruiksdoel": "woonfunctie","status": "Verblijfsobject in gebruik","pandStatus": "Pand in gebruik","aantalVerblijfsobjecten": 1},"scrapeTimestamp": "2026-05-19T13:30:00.000Z"}
On address resolution failure:
{"inputAddress": { "streetAddress": "Onbestaandestraat 999", "postcode": "9999ZZ" },"address": "Onbestaandestraat 999, 9999ZZ","postcode": "9999ZZ","error": "ADDRESS_NOT_FOUND","scrapeTimestamp": "2026-05-19T13:30:00.000Z"}
Examples
Single address — flat input (simplest):
{"streetAddress": "Kloosterlaan 33","postcode": "1216NH","city": "Hilversum"}
Single address — array input:
{"addresses": [{ "streetAddress": "Kloosterlaan 33", "postcode": "1216NH", "city": "Hilversum" }]}
Bulk residential portfolio — WOZ values only, maximum speed:
{"addresses": [{ "streetAddress": "Nassaukade 5-2", "postcode": "1052CE", "city": "Amsterdam" },{ "streetAddress": "Fahrenheitstraat 10", "postcode": "2561BS", "city": "Den Haag" },{ "streetAddress": "Bergwegplantsoen 100", "postcode": "3037SK", "city": "Rotterdam" },{ "streetAddress": "Vrijheidslaan 22", "postcode": "9726AK", "city": "Groningen" }],"maxConcurrency": 10,"skipBag": true}
Apartment with house letter — includes full building context:
{"addresses": [{ "streetAddress": "Bergweg 100", "postcode": "3036SB", "city": "Rotterdam", "huisletter": "A" }],"skipBag": false}
Large-scale enrichment run — mixed residential and commercial:
{"addresses": [{ "streetAddress": "Herengracht 182", "postcode": "1016BP", "city": "Amsterdam" },{ "streetAddress": "Coolsingel 40", "postcode": "3011AD", "city": "Rotterdam" },{ "streetAddress": "Stationsplein 1", "postcode": "3511ED", "city": "Utrecht" }],"maxConcurrency": 20}
💰 Pricing
$1.49 per 1,000 results — you only pay for successfully retrieved addresses. Failed lookups on invalid addresses are still counted (one result is always written per input address), but no proxy or compute surcharges are added.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.49 |
| 10,000 | ~$14.90 |
| 100,000 | ~$149.00 |
The only comparable actor on the Apify Store charges $8.50 per 1,000 results as a base rate, plus separate per-event charges for BAG data, retries, proxy usage, and debug screenshots. At 10,000 results that actor typically costs $120–$200+ depending on usage. This scraper costs $14.90 for the same volume — with more output fields.
Use the maxConcurrency setting to control throughput. There is no built-in maxResults cap because the input is address-based — you control the volume by the number of addresses you supply.
Performance
| Run size | Time | Notes |
|---|---|---|
| 10 addresses | ~6s | Including BAG lookup |
| 10 addresses | ~3s | skipBag: true |
| 100 addresses | ~30s | Concurrency 10 |
| 1,000 addresses | ~5 min | Concurrency 10 |
| 10,000 addresses | ~50 min | Concurrency 20 |
Comparison with nocodeventure/woz-api-waardeloket-ppe
| Feature | This scraper | nocodeventure |
|---|---|---|
| Base price | $1.49 / 1,000 | $8.50 / 1,000 + events |
| BAG data charge | included | extra per-event charge |
| Proxy surcharge | none | extra per-event charge |
| Retry charge | none | extra per-event charge |
| Proxy required | none | residential (browser) |
kadastralePercelen | ✅ | ❌ |
wozGrowthCagr | ✅ | ❌ |
| Year-over-year % per entry | ✅ | ❌ |
| Buurt / wijk / provincie | ✅ | ❌ |
aantalVerblijfsobjecten | ✅ | ❌ |
isResidential flag | ✅ | ❌ |
huisletter / toevoeging input | ✅ | ❌ |
| Postcode fallback on typos | ✅ | ❌ |
| Speed (100 addresses) | ~30s | ~10–20 min |
Known limitations
- Non-residential objects: WOZ values are only published for objects registered in the Dutch WOZ system — primarily owner-occupied residential property and commercial real estate with a municipality assessment. Government buildings (Binnenhof, ministries), public infrastructure, and many rental properties return
wozLatestValue: null. This is a limitation of the source data, not the scraper. - Rental property: Rental housing is often registered under a housing corporation, not as individual WOZ objects. These addresses may return
wozLatestValue: nulleven for residential buildings. - New construction: Properties built within the last 12–18 months may not yet have a WOZ assessment. They will still resolve correctly with full BAG building data.
- Address format: The BAG register is the reference — addresses that do not exist in the BAG (demolished buildings, future developments) cannot be resolved.
Technical details
- Sources: Dutch government registers — WOZ Waardeloket (Kadaster), PDOK Locatieserver, PDOK BAG WFS
- Method: Direct REST API calls — no browser, no proxy
- Memory: 256 MB
- Retry: Automatic exponential backoff on server errors, up to 3 attempts per request
- Postcode fallback: Automatic retry with city-only resolution when postcode yields no results
- Concurrency: Configurable, default 10, max 20
Additional services
Need a custom actor, additional filters, scheduled runs, or integration support? Send an email to info@unfencedgroup.nl — we build on request.
Built by unfenced-group · Issues? Open a ticket or send a message.