# NL Adres Geocoding & Buurtdata — PDOK + CBS (`codeclouds/pdok-locatieserver`) Actor

Geocode Nederlandse adressen via PDOK en verrijk ze direct met CBS-buurtstatistieken (inkomen, inwoners, stedelijkheid) — bulk-verwerking, één call, geen losse databronnen combineren.

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

## Pricing

from $1.50 / 1,000 geocode-results

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/platform/actors/running/actors-in-store#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 Adres Geocoding & Buurtdata — PDOK + CBS

Nederlandse adressen omzetten naar coördinaten kan al met de PDOK-API zelf. Wat je er niet bij krijgt: weten wat voor buurt dat adres eigenlijk is. Deze actor combineert **PDOK Locatieserver** (geocoding) en **CBS Kerncijfers Wijken en Buurten** (demografie) in één call — met bulk-verwerking, retries en foutafhandeling die klaar zijn voor productiegebruik.

Ideaal voor marktonderzoek, vestigingslocatie-analyse, CRM-opschoning, leadgeneratie en vastgoedanalyse.

### Wanneer gebruikt een AI-agent dit?

- "Geef me de coördinaten en buurtgegevens van Damrak 1 Amsterdam."
- "Ik heb een lijst van 500 klantadressen in een CRM-bestand — welke gemiddelde inkomens en inwonersaantallen horen bij hun buurten?"
- "Welk adres hoort bij de coördinaten 52.3789,4.8952?"
- "Analyseer deze lijst met leadadressen op stedelijkheid en aantal huishoudens per buurt, voor een vestigingslocatie-onderzoek."
- "Zet deze postcodes en huisnummers om naar RD-coördinaten (EPSG:28992) voor gebruik in mijn GIS-systeem."
- "Verrijk de adressen uit dit Apify-dataset met CBS-kerncijfers voor marktonderzoek."

### Wat deze actor doet

- **Forward geocoding** — adres, postcode+huisnummer of plaatsnaam → coördinaten en gestructureerde adresgegevens.
- **Reverse geocoding** — coördinaat (`lat,lon`) → dichtstbijzijnde adressen, wegen of percelen, met optionele zoekstraal.
- **Lookup** — één specifiek object exact ophalen op basis van een PDOK object-ID.
- **Automatische modusdetectie** — herkent zelf of je input een coördinaat, object-ID of vrije zoektekst is.
- **Bulk-verwerking** — honderden adressen in één run via een lijst (`queries`) of een gekoppeld Apify-dataset, met instelbare concurrency.
- **CBS-buurtverrijking** (optioneel) — elk resultaat kan verrijkt worden met kerncijfers zoals aantal inwoners, gemiddeld inkomen, aantal huishoudens en stedelijkheid, automatisch gekoppeld via de buurt-, wijk- of gemeentecode.
- **Fail-safe per item** — één ongeldig adres in een batch stopt de run niet; de fout wordt per record genoteerd, de rest wordt gewoon verwerkt.
- **Automatische retries** bij tijdelijke rate-limits of serverfouten.
- **Schone, uniforme output** ongeacht welk PDOK-endpoint is aangeroepen — straat, huisnummer, postcode, plaats, buurt, wijk, gemeente, provincie, lat/lon (WGS84), RD-coördinaten (EPSG:28992) en BAG-ID's.

### Input

| Veld | Type | Beschrijving |
|---|---|---|
| `mode` | string | `auto` (default), `forward`, `reverse`, `lookup` |
| `query` | string | Eén zoekopdracht. Voor reverse: `"lat,lon"`. Voor lookup: object-ID |
| `queries` | array | Bulk: lijst van zoekopdrachten (strings of `{query, lookupId, mode}`-objecten) |
| `datasetId` | string | ID/naam van een gekoppeld Apify-dataset om uit te lezen (velden `query`/`address`/`adres`) |
| `lookupId` | string | PDOK object-ID voor lookup-modus |
| `concurrency` | integer | Gelijktijdige requests bij bulk (1-20, default 5) |
| `maxResults` | integer | Aantal resultaten per zoekopdracht (1-100, default 5) |
| `typeFilter` | string | Beperk tot `adres`, `postcode`, `woonplaats`, `gemeente`, `weg`, `perceel`, `wijk` of `buurt` |
| `distance` | integer | Zoekstraal in meters (alleen reverse) |
| `enrichWithCbs` | boolean | Verrijk elk resultaat met CBS-buurtstatistieken (default: false) |
| `cbsTableId` | string | CBS StatLine tabel-ID (default `86165NED`) |
| `cbsFields` | array | Zoektermen voor gewenste CBS-kerncijfers, bv. `["aantal inwoners", "gemiddeld inkomen per inwoner"]` |
| `cbsHistoricalTables` | object | Extra CBS-jaargangen naast `cbsTableId`, als `{ "jaarlabel": "tabel-ID" }`, bv. `{ "2024": "85984NED" }`. Alleen relevant als `enrichWithCbs` ook aanstaat. Zoek zelf het juiste tabel-ID op via opendata.cbs.nl — CBS-tabel-ID's per jaargang volgen geen voorspelbaar patroon |
| `addSummaryRecord` | boolean | Voeg als laatste dataset-item een gratis samenvattingsrecord toe (aantal succesvol/mislukt, gemiddeld inkomen/inwoneraantal, stedelijkheid-verdeling, unieke gemeentes/buurten) (default: false) |

### Output

Elk resultaat bevat onder meer: `weergavenaam, type, straatnaam, huisnummer, postcode, woonplaats, buurtcode, buurtnaam, wijkcode, wijknaam, gemeentecode, gemeente, provincie, lat, lon, rd_x, rd_y, score, match_kwaliteit, bag_adresseerbaarobject_id, bag_nummeraanduiding_id, afstand_meter`. Met `enrichWithCbs: true` komt daar een `cbs`-object bij met de gevraagde kerncijfers en een `_bron`-veld.

#### Historische CBS-jaargangen (`cbsHistoricalTables`, optioneel, apart geprijsd)

Met `cbsHistoricalTables` ingesteld (bv. `{ "2024": "85984NED", "2023": "84799NED" }`) komt er een
`cbs_historisch`-object bij, met per jaarlabel dezelfde `cbsFields`-kerncijfers uit die tabel voor dezelfde
buurt-/wijk-/gemeentecode:

```json
{
  "cbs": { "aantal inwoners": 932000, "_bron": "CBS StatLine 86165NED (CC-BY, cbs.nl)" },
  "cbs_historisch": {
    "2024": { "aantal inwoners": 931298, "_bron": "CBS StatLine 85984NED (CC-BY, cbs.nl)" },
    "2023": null
  }
}
```

Een jaartal wordt `null` als die tabel geen rij heeft voor deze regiocode (bv. een buurt die pas later een eigen
buurtcode kreeg) — geen gok, gewoon een eerlijke "niet gevonden". Alleen relevant met `enrichWithCbs: true`.
Charged als `cbs-historisch-jaar`, alleen per jaartal met daadwerkelijk gevonden data.

**Belangrijk:** CBS-tabel-ID's per jaargang volgen geen voorspelbaar nummerpatroon — deze actor verzint ze niet
zelf, jij zoekt het juiste tabel-ID op via [opendata.cbs.nl](https://opendata.cbs.nl) (zoek op "Kerncijfers
wijken en buurten \<jaar>") en geeft het door.

**`match_kwaliteit`** (`"hoog"` / `"middel"` / `"laag"` / `"onbekend"`) is een eerlijke, best-effort inschatting op basis van PDOK's eigen relevantiescore (`score`) — **geen garantie**. PDOK's `/free`-endpoint matcht fuzzy/best-effort en kan ook voor een onzinnig adres nog een irrelevante treffer geven; `"laag"` betekent "controleer dit resultaat handmatig", niet "dit adres bestaat niet". Handig om bij bulk-verwerking snel te filteren op welke matches een menselijke check verdienen.

### Voorbeelden

```json
// Eén adres, met buurtverrijking
{
  "query": "Damrak 1 Amsterdam",
  "enrichWithCbs": true
}
```

```json
// Reverse geocoding
{ "mode": "reverse", "query": "52.3789,4.8952", "distance": 500 }
```

```json
// Bulk-verwerking
{
  "queries": [
    "Damrak 1 Amsterdam",
    "52.3789,4.8952",
    "Utrecht"
  ],
  "concurrency": 5,
  "maxResults": 5,
  "enrichWithCbs": true
}
```

```json
// Bulk via gekoppeld dataset
{
  "datasetId": "mijn-adressen-dataset",
  "concurrency": 5
}
```

### 💰 Pricing

This Actor uses Apify's modern **Pay-Per-Event (PPE)** pricing model. You only pay for the actual data you extract, making it highly cost-effective for both small batches and large-scale runs.

- **Actor Start:** $0.00005 (one-time minimal compute fee per run)
- **`geocode-result`:** **$1.50 per 1,000 results** ($0.0015 per enriched address) — same price as before, now
  billed as an explicit event instead of the platform's older implicit per-result billing
- **`cbs-historisch-jaar`:** $0.0008 per result-year, only with `cbsHistoricalTables` set and only for years
  where data was actually found for that region code

#### Why choose this Actor?

Unlike basic alternatives, this scraper delivers **fully enriched data** (combining both PDOK/BAG registry and CBS statistics) in a single run. There are no hidden costs for proxies or external APIs.

### Bronnen en gebruiksvoorwaarden

Deze actor gebruikt uitsluitend open overheidsdata:

- **PDOK Locatieserver** (Kadaster/BZK) — CC0/CC-BY-4.0, vrij commercieel herbruikbaar.
- **CBS Kerncijfers Wijken en Buurten** — CC-BY, bronvermelding aan het CBS verplicht bij hergebruik van de cijfers.

Deze actor is niet gelieerd aan, onderschreven door, of verbonden met PDOK, BAG, Kadaster, CBS of de Nederlandse overheid.

### FAQ

**Werkt dit ook voor adressen buiten Nederland?**
Nee. PDOK Locatieserver en CBS Kerncijfers Wijken en Buurten dekken uitsluitend Nederlandse adressen, postcodes, wijken en buurten.

**Wat kost het om 1.000 adressen te verwerken?**
Bij het Pay-Per-Event-model betaal je $0.00005 eenmalig per run plus $1.50 per 1.000 resultaten ($0.0015 per verrijkt adres) — dus circa $1.50 voor 1.000 adressen, ongeacht of je CBS-verrijking gebruikt.

**Wat gebeurt er als één adres in mijn batch ongeldig is?**
De run stopt niet: de fout wordt per record genoteerd en de rest van de batch wordt gewoon verwerkt (fail-safe per item).

**Kan ik ook vanaf coördinaten naar een adres zoeken?**
Ja, via `mode: "reverse"` met `query` als `"lat,lon"` en optioneel een zoekstraal (`distance` in meters) vind je de dichtstbijzijnde adressen, wegen of percelen.

**Welke CBS-kerncijfers kan ik opvragen?**
Elk kerncijfer uit CBS-tabel `86165NED` (Kerncijfers Wijken en Buurten), zoals aantal inwoners, gemiddeld inkomen, aantal huishoudens en stedelijkheid — je geeft de gewenste zoektermen op via `cbsFields`.

**Moet ik zelf een lijst met adressen aanleveren, of kan de actor ook uit een dataset lezen?**
Beide kan: gebruik `queries` voor een losse lijst, of `datasetId` om adressen automatisch uit te lezen uit een gekoppeld Apify-dataset (velden `query`/`address`/`adres`).

### Als geocoding-backend voor andere actors

Deze actor is ook direct aanroepbaar vanuit een andere Apify-actor via `Actor.call('codeclouds/pdok-locatieserver', input)`
(Apify SDK) — een alternatief voor het opnieuw implementeren van PDOK-geocoding in elke actor die adressen moet
opzoeken. Enkele andere actors in dit portfolio (`nl-vergunningen-leadfeed`, `nl-bodemrisico-check`,
`nl-netcongestie-monitor`) doen momenteel hun eigen, minimale PDOK-aanroep intern i.p.v. deze actor aan te roepen —
dat blijft voorlopig zo (geen refactor in deze ronde), maar voor nieuwe actors die geocoding nodig hebben is
`Actor.call()` naar deze actor de aanbevolen route in plaats van een zoveelste eigen implementatie. De aanroepende
actor betaalt in dat geval zelf voor de resultaten van deze actor — er verandert niets aan de pricing van deze
actor zelf.

### Gerelateerde actors

Ook door deze ontwikkelaar — Nederlandse/EU open-data-actors die goed combineren met deze:

- **[NL Vergunningen & Bekendmakingen Leadfeed](https://apify.com/codeclouds/nl-vergunningen-leadfeed)** — vergunningsleads met een ruwe `addressGuess`/`postalCode`; gebruik deze actor om die te verrijken tot volledige coördinaten, BAG-ID's en CBS-buurtstatistieken.
- **[NL & EU Government Tenders Scraper](https://apify.com/codeclouds/nl-eu-tenders-scraper)** — overheidsaanbestedingen als gestructureerde leads.
- **[NL CAO Wijzigingen Database](https://apify.com/codeclouds/nl-cao-wijzigingen-database)** — cao-wijzigingen per sector, uit dezelfde officiële-publicaties-familie.
- **[NL BESS Vergunningenmonitor](https://apify.com/codeclouds/nl-bess-vergunningenmonitor)** — vergunningsleads met een ruwe `addressGuess`/`postalCode` voor batterijopslag-projecten; gebruik deze actor om die te verrijken tot volledige coördinaten.
- **[NL Bodemrisico Check](https://apify.com/codeclouds/nl-bodemrisico-check)** — gebruikt dezelfde PDOK Locatieserver intern voor geocoding, nuttig als je bodemrisico wilt combineren met bredere adres-/CBS-buurtdata-opzoekingen.

### Keywords

pdok, geocoding, netherlands, cbs, bag, adres, buurtdata, address-lookup, kadaster, rd-coordinaten

### Changelog

#### 0.4.0 - Historische CBS-jaargangen + PPE-migratie

- Migrated from the platform's legacy implicit "pay per result" billing to explicit Pay-Per-Event: every
  delivered result is now charged via `Actor.charge({ eventName: 'geocode-result' })` at the **same $0.0015
  price as before** — no price change, only the billing mechanism.
- Added `cbsHistoricalTables` — extra CBS StatLine tables for prior years (user-supplied `{ jaarlabel:
  tabelId }` map, since CBS table IDs per vintage follow no predictable pattern), exposed as `cbs_historisch`
  per result. New `cbs-historisch-jaar` event ($0.0008 per result-year), only charged when data was actually
  found for that region code in that year's table. Only relevant together with `enrichWithCbs`.
- Investigated PC6-level CBS "Kerncijfers per postcode" enrichment (the other open point from this round): CBS
  only distributes this as downloadable GeoPackage/Excel files, not via the StatLine OData API this actor uses
  elsewhere — building it would require a materially different architecture (bulk file download + local
  indexing instead of a live per-item API call). Deferred, not built this round.

#### 2026-07-16 - Bugfix + verbeteringen

- Fixed `typeFilter` in `.actor/input_schema.json` missing `wijk`/`buurt` — the README and code already
  supported these values, but the Apify Console UI didn't expose them. Same bug class as the CBS-fields fix
  below.
- Added `addSummaryRecord`: an optional, free extra dataset item at the end of a batch run (success/failure
  counts, average income/population, urbanization spread, unique municipalities/neighborhoods). No pricing
  change — pure aggregation of data already fetched.
- The CBS column-matching (`cbsFieldMap`) is now cached in a named key-value store (3-day TTL) instead of
  being re-fetched every run — cuts one CBS DataProperties call per scheduled run with the same
  `cbsTableId`/`cbsFields`. No pricing change.
- Documented this actor as a callable geocoding backend for other actors via `Actor.call()`.

#### 2026-07-14

- Added `match_kwaliteit` (hoog/middel/laag/onbekend), an honest geocoding-confidence classification based
  on PDOK's own relevance score. No pricing change — enrichment of the existing per-result output.

#### 2026-07-12 - Documentatie-update

- Pricing-tekst gecorrigeerd naar "$1.50 per 1,000 results" (was zelf-tegensprekend geformuleerd als "$0.0015 per 1,000 results" naast "$0.0015 per enriched address" — geen prijswijziging, alleen tekstcorrectie).
- "Gerelateerde actors"-sectie toegevoegd met kruisverwijzingen naar andere actors van deze ontwikkelaar.

#### 0.4 - zie .actor/actor.json versie

- Huidige versie zoals vastgelegd in `.actor/actor.json` (forward/reverse/lookup-geocoding, bulk-verwerking, optionele CBS-buurtverrijking).

# Actor input Schema

## `mode` (type: `string`):

Welke API-modus gebruiken. 'auto' detecteert op basis van input: coördinaten → reverse, lookupId → lookup, anders → forward.

## `query` (type: `string`):

Vrije zoektekst voor één forward/reverse/lookup. Voor bulk: gebruik 'queries' (array) of koppel een dataset. Voor reverse: 'lat,lon' (bv. '52.3789,4.8952'). Voor lookup: object-ID.

## `queries` (type: `array`):

Array van zoekopdrachten voor bulk-verwerking (meerdere adressen/coördinaten/lookup-ID's in één run). Voor een los verzoek: gebruik in plaats hiervan het 'query'-veld, niet dit veld met één element. Elk element is óf een plain string (bv. 'Damrak 1 Amsterdam', of 'lat,lon' voor reverse) óf een object met de vorm {"query": string, "lookupId": string, "mode": "auto"|"forward"|"reverse"|"lookup"} — meng beide vormen niet door elkaar in één array. Wordt genegeerd als leeg — dan valt de actor terug op 'query' of een gekoppeld dataset.

## `lookupId` (type: `string`):

PDOK object-ID (bv. 'adr-8f4d573be765b4c80dd635ba73747903') om een specifiek object op te halen. Wordt genegeerd tenzij mode='lookup' of auto-detectie.

## `datasetId` (type: `string`):

ID of naam van een bestaand Apify dataset waaruit items gelezen worden (velden 'query'/'address'/'adres', optioneel 'lookupId' en 'mode'), bv. 'jXxQ3RWG9G2Y8hUJT'. Wordt alleen gebruikt als 'query' en 'queries' beide leeg zijn. Laat leeg om deze feature niet te gebruiken.

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

Aantal items dat tegelijk wordt verwerkt bij bulk-input. Hoger = sneller, maar meer load op PDOK. Max 20.

## `maxResults` (type: `integer`):

Maximum aantal resultaten (1-100, API-limiet).

## `typeFilter` (type: `string`):

Beperk zoekopdracht tot een specifiek objecttype.

## `distance` (type: `integer`):

Alleen bij reverse geocoding: maximale afstand in meters rond het opgegeven punt, bv. 50.

## `enrichWithCbs` (type: `boolean`):

Voeg CBS Kerncijfers Wijken en Buurten (inwoners, inkomen, huishoudens, stedelijkheid) toe aan elk resultaat op basis van de gevonden buurt-/wijk-/gemeentecode. Kost geen extra PPE-kosten bovenop de bestaande prijs per resultaat (geocode-result).

## `cbsTableId` (type: `string`):

CBS StatLine-tabel om te gebruiken voor de buurtverrijking (alleen relevant als 'Verrijken met CBS-buurtdata' aanstaat). Standaard de meest recente 'Kerncijfers Wijken en Buurten'-tabel.

## `cbsFields` (type: `array`):

Zoektermen die dynamisch tegen de kolomtitels van de gekozen CBS-tabel gematcht worden (alleen relevant als 'Verrijken met CBS-buurtdata' aanstaat). CBS wijzigt kolomcodes per jaargang, dus matching gebeurt op zoekterm i.p.v. hardcoded kolomcode.

## `cbsHistoricalTables` (type: `object`):

Extra CBS StatLine-tabellen voor eerdere jaargangen, als { "jaarlabel": "tabel-ID" }, bv. { "2024": "85984NED" }. Alleen relevant als 'Verrijken met CBS-buurtdata' ook aanstaat (hergebruikt dezelfde regiocode en dezelfde CBS-velden). Zoek zelf het juiste tabel-ID op via opendata.cbs.nl — CBS-tabel-ID's per jaargang volgen geen voorspelbaar patroon. Nieuw event cbs-historisch-jaar ($0.0008), alleen gecharged per resultaat-jaar met daadwerkelijk gevonden data.

## `addSummaryRecord` (type: `boolean`):

Voeg als laatste dataset-item een extra samenvattingsrecord (\_type: 'batch\_summary') toe met aggregaten over de hele batch: aantal succesvol/mislukt, gemiddeld inkomen/inwoneraantal, verdeling stedelijkheid en aantal unieke gemeentes/buurten. Kost geen extra PPE — pure aggregatie van al opgehaalde data.

## Actor input object example

```json
{
  "mode": "auto",
  "query": "Damrak 1 Amsterdam",
  "queries": [
    "Damrak 1 Amsterdam",
    "52.3789,4.8952",
    "Utrecht"
  ],
  "concurrency": 5,
  "maxResults": 5,
  "typeFilter": "",
  "distance": 50,
  "enrichWithCbs": false,
  "cbsTableId": "86165NED",
  "cbsFields": [
    "aantal inwoners",
    "gemiddeld inkomen per inwoner",
    "huishoudens totaal",
    "stedelijkheid"
  ],
  "cbsHistoricalTables": {},
  "addSummaryRecord": false
}
```

# Actor output Schema

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

Alle geocoding-resultaten in het default dataset. Bevat input-metadata, gevonden adressen met coördinaten, en optionele CBS-verrijking.

# 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 = {
    "query": "Damrak 1 Amsterdam",
    "queries": [
        "Damrak 1 Amsterdam",
        "52.3789,4.8952",
        "Utrecht"
    ],
    "distance": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/pdok-locatieserver").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 = {
    "query": "Damrak 1 Amsterdam",
    "queries": [
        "Damrak 1 Amsterdam",
        "52.3789,4.8952",
        "Utrecht",
    ],
    "distance": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/pdok-locatieserver").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "query": "Damrak 1 Amsterdam",
  "queries": [
    "Damrak 1 Amsterdam",
    "52.3789,4.8952",
    "Utrecht"
  ],
  "distance": 50
}' |
apify call codeclouds/pdok-locatieserver --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=codeclouds/pdok-locatieserver",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ztC76xhJXDdnNIsNm/builds/4wgs76CmU8CnuECLf/openapi.json
