WOZ Waardeloket — Official Dutch Property Valuations avatar

WOZ Waardeloket — Official Dutch Property Valuations

Pricing

from $1.49 / 1,000 woz results

Go to Apify Store
WOZ Waardeloket — Official Dutch Property Valuations

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

Unfenced Group

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

WOZ Waardeloket Scraper

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):

ParameterTypeDescriptionDefault
streetAddressstringStreet name and house number, e.g. "Kloosterlaan 33"
postcodestringDutch postcode, e.g. "1216NH" — spaces allowed
citystringCity name, e.g. "Hilversum" — recommended

Bulk lookup (addresses array):

ParameterTypeDescriptionDefault
addressesarrayList of address objects — each requires streetAddress and postcode
addresses[].streetAddressstringStreet name with house number, e.g. "Kloosterlaan 33"
addresses[].postcodestringDutch postcode, e.g. "1216NH"
addresses[].citystringCity name — recommended for disambiguation
addresses[].huisletterstringHouse letter suffix, e.g. "A" or "B"
addresses[].toevoegingstringHouse number extension, e.g. "hoog" or "bis"

Common options:

ParameterTypeDescriptionDefault
maxConcurrencyintegerParallel processing — relevant for bulk runs10
skipBagbooleanSkip BAG building lookup — ~40% faster, WOZ values onlyfalse

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: null and isResidential: 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.

ResultsCost
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 sizeTimeNotes
10 addresses~6sIncluding BAG lookup
10 addresses~3sskipBag: true
100 addresses~30sConcurrency 10
1,000 addresses~5 minConcurrency 10
10,000 addresses~50 minConcurrency 20

Comparison with nocodeventure/woz-api-waardeloket-ppe

FeatureThis scrapernocodeventure
Base price$1.49 / 1,000$8.50 / 1,000 + events
BAG data chargeincludedextra per-event charge
Proxy surchargenoneextra per-event charge
Retry chargenoneextra per-event charge
Proxy requirednoneresidential (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: null even 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.