# NL Kadastrale Perceelgrenzen Lookup per Adres (`codeclouds/nl-kadastrale-perceelgrenzen-lookup`) Actor

Looks up the Dutch cadastral parcel (Kadaster) at any address, postcode, or coordinate — parcel identification, section, and area in m², from the official PDOK Kadastralekaart. No owner data.

- **URL**: https://apify.com/codeclouds/nl-kadastrale-perceelgrenzen-lookup.md
- **Developed by:** [Dennis](https://apify.com/codeclouds) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 locatie-resultaats

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## NL Kadastrale Perceelgrenzen Lookup per Adres

Looks up the Dutch cadastral parcel (Kadaster) that contains a given address, postcode, or
coordinate — parcel identification (gemeente/sectie/nummer), area in m², and validity date —
straight from the official PDOK Kadastralekaart. Deliberately excludes owner data: that requires
the paid BRK ownership-information API and a documented legitimate interest under GDPR, which is
out of scope for this actor.

### When should an AI agent use this?

- "Which cadastral parcel (kadastraal perceel) is this address registered on?"
- "What is the official cadastral area (m²) of this plot?"
- "Get the parcel identification (gemeente/sectie/nummer) for a list of addresses."
- "Check the registered parcel size before a land or property transaction."
- "Add cadastral parcel metadata to a real-estate due-diligence dossier."

### What this Actor does

- Geocodes any Dutch address, postcode, place name, or `"lat,lon"` coordinate via the official PDOK Locatieserver
- Queries the official PDOK Kadastralekaart WFS (Kadaster/PDOK, CC0) for the cadastral parcels near that point
- Determines the parcel that actually **contains** the point via real polygon geometry — not just a bounding-box guess, so a neighboring parcel's overlapping bounding box never gets mistaken for the right one
- Returns the parcel's identification (`gemeente sectie nummer`, e.g. `"RLD00 R 302"`), section, area in m², area-value provenance ("Vastgesteld"/"Berekend"), and validity date
- Returns `null` for the parcel field when the point falls outside any registered parcel (e.g. open water) — not an error
- Processes up to 50 locations per run, with configurable concurrency

### Input

| Field | Type | Description | Example |
|---|---|---|---|
| `locaties` | array of strings | Address, postcode, place name, or `"lat,lon"` per location (1-50) | `["Bathseweg 27, Rilland"]` |
| `concurrency` | integer | How many locations to process in parallel | `3` |

### Output

```json
{
  "invoer": "Bathseweg 27, Rilland",
  "gevonden": true,
  "fout": null,
  "foutcode": null,
  "weergavenaam": "Bathseweg 27, 4411BA Rilland",
  "postcode": "4411BA",
  "gemeente": "Reimerswaal",
  "provincie": "Zeeland",
  "lat": 51.41533763,
  "lon": 4.18586885,
  "geocodingScore": 19.1,
  "geocodingBetrouwbaarheid": "hoog",
  "perceel": {
    "identificatie": "RLD00 R 302",
    "kadastraleGemeenteCode": "830",
    "kadastraleGemeenteNaam": "Rilland",
    "akrGemeenteCode": "RLD00",
    "sectie": "R",
    "perceelnummer": 302,
    "oppervlakteM2": 528,
    "oppervlakteHerkomst": "Vastgesteld",
    "beginGeldigheid": "2006-12-15T10:44:34Z"
  },
  "bron": "PDOK Kadastralekaart WFS (service.pdok.nl/kadaster/kadastralekaart) + PDOK Locatieserver (geocoding)"
}
```

`fout` is a human-readable error message (`null` on success). `foutcode` is a machine-readable
classification for agents/automation, one of:

| Code | Retryable? | Meaning |
|---|---|---|
| `null` | — | No error. |
| `GEEN_GEOCODING_MATCH` | No | PDOK Locatieserver found no match for this input — retrying the same input won't help. |
| `UPSTREAM_ERROR` | Yes | Temporary HTTP/connectivity failure at PDOK Locatieserver or the PDOK Kadastralekaart WFS (after built-in retries) — a later run may succeed. |
| `ONBEKENDE_FOUT` | No | Unexpected error that doesn't fit the categories above. |

### Use cases

- Add cadastral parcel identification and area to a real-estate or land-transaction dossier
- Validate a plot's registered area before a purchase agreement or subdivision
- Batch-check parcel identification for a portfolio of addresses
- Support a neighbor-dispute or boundary-orientation review with the official parcel reference

### Pricing

This Actor uses Apify's Pay-Per-Event (PPE) pricing model.

- **Actor Start:** $0.00005 (Apify default)
- **locatie-resultaat:** $0.006 per location checked

### Legal

Uses only official, open, CC0-licensed government data: the PDOK Kadastralekaart WFS (Kadaster/PDOK)
for parcel geometry/identification, and the PDOK Locatieserver for geocoding. **Deliberately excludes
owner names/ownership data** — that requires the paid BRK ownership-information API and a documented
legitimate interest under GDPR, which is out of scope for this actor. No personal data is processed.

### FAQ

**Q: Does this return who owns the parcel?**
A: No. Owner data (BRK eigendomsinformatie) requires a separate, paid Kadaster API and a documented legitimate interest under GDPR — this actor only returns the public parcel geometry, identification, and area.

**Q: What if the address doesn't fall on a registered parcel?**
A: The `perceel` field is `null` — this happens for locations like open water or unregistered land, and is not treated as an error.

**Q: How is the correct parcel determined when several parcels are nearby?**
A: The actor checks real polygon geometry (point-in-polygon), not just bounding-box overlap — so a neighboring parcel whose bounding box happens to overlap the point is never mistaken for the actual containing parcel.

**Q: What does "oppervlakteHerkomst" mean?**
A: The Kadaster's own qualification of the area value — `"Vastgesteld"` (surveyed/fixed) or `"Berekend"` (calculated) — included as-is from the source.

### Related Actors

- **[NL Bodemrisico Check](https://apify.com/codeclouds/nl-bodemrisico-check)** — same geocoding pattern, checks soil contamination instead of the cadastral parcel.
- **[NL Natura2000 Afstandscheck](https://apify.com/codeclouds/nl-natura2000-afstandscheck)** — same geocoding pattern, checks distance to protected nature areas.
- **[Vastgoed XXL](https://apify.com/codeclouds/vastgoed-xxl)** — combines multiple official Dutch geo-data sources into one property dossier; a natural companion enrichment.

***

*Zoekwoorden: kadastraal perceel opzoeken, perceelgrenzen adres, kadastrale kaart, perceeloppervlakte, kadastrale aanduiding, sectie perceelnummer.*

### Keywords

kadaster, cadastral, perceel, netherlands, pdok, kadastrale-kaart, parcel, land-registry, geocoding

### Changelog

#### 0.1.0

- Initial release.

# Actor input Schema

## `locaties` (type: `array`):

Een of meer NL-adressen, postcodes, plaatsnamen, of coordinaten ("lat,lon") om het kadastrale perceel voor op te zoeken. Bijvoorbeeld: "Bathseweg 27, Rilland", "6811 AA", of "52.09,5.85".

## `concurrency` (type: `integer`):

Hoeveel locaties tegelijk verwerkt worden (geocoding + Kadaster-lookup per locatie). Bijvoorbeeld: 3.

## Actor input object example

```json
{
  "locaties": [
    "Bathseweg 27, Rilland"
  ],
  "concurrency": 3
}
```

# Actor output Schema

## `results` (type: `string`):

Alle resultaten in het default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locaties": [
        "Bathseweg 27, Rilland"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/nl-kadastrale-perceelgrenzen-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locaties": ["Bathseweg 27, Rilland"] }

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/nl-kadastrale-perceelgrenzen-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locaties": [
    "Bathseweg 27, Rilland"
  ]
}' |
apify call codeclouds/nl-kadastrale-perceelgrenzen-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codeclouds/nl-kadastrale-perceelgrenzen-lookup"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Zr35tk6rQR79Ml1qm/builds/dBEFAgJ1FzZi4qqeD/openapi.json
