# NL Laadpaal Vergunningen Monitor (`codeclouds/nl-laadpaalvergunningen-monitor`) Actor

Finds Dutch EV charging point (laadpaal) permit applications, decisions and objections published by municipalities and water authorities via the official bekendmakingen register, with address, status and municipality per lead.

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

## Pricing

from $4.00 / 1,000 lead-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 Laadpaal Vergunningen Monitor 🔌🇳🇱

Get **fresh Dutch EV charging point (laadpaal) permit applications and decisions** as structured leads —
the moment a municipality or water authority publishes them.

Every week, Dutch municipalities publish dozens of "laadpaal"/"laadstation"/"oplaadpunt" permit notices on
officielebekendmakingen.nl: someone applied for, received, or was refused permission to install an EV
charging point at a specific address. Each one is an early signal for charge point operators, installers,
and property developers. This actor turns that public stream into a clean, filterable lead feed.

### Who is this for?

- **EV charge point installers & operators** — spot new charging point installations the moment the permit is filed
- **Property developers & facility managers** — track charging infrastructure activity in a region
- **Municipalities & policy researchers** — monitor charging point rollout per municipality
- **Real estate & mobility consultants** — feed EV-infrastructure demand signals into market research
- **AI agents** — structured JSON output, ideal as a tool for agentic workflows (MCP-ready)

### When should an AI agent use this?

Point an AI agent at this actor when a user asks things like:

- "Which new laadpaal permit applications were published this week in the Netherlands?"
- "Find me leads for EV charging point installations in Zwolle and Almelo."
- "Give me the addresses of all laadpaal permits filed nationwide since 1 July 2026."
- "Has anything new been published for charging points since yesterday?" (using incremental mode)
- "Which municipality had the most laadpaal permit filings last month?" (using the run summary)
- "Pull the official publication text and PDF link for a specific laadpaal permit."

### What this Actor does

- Searches the official Dutch government publication register (KOOP SRU API) across the 3 rubrieken where
  laadpaal-related permits and decisions actually appear — `omgevingsvergunning`, `andere vergunning` and
  `andere beschikking` (live-verified: relying on `omgevingsvergunning` alone, as many similar actors do,
  misses roughly two-thirds of the real leads)
- Extracts municipality/water authority, publication date, postal code and address
- **Free coordinates when available**: many publications carry official structured location data
  (`gebiedsmarkering`) straight from the source — this actor uses it when present (~60% of leads in a live
  sample), including exact street+house number+postcode for a smaller subset, falling back to a regex guess
  on the title only when the source has no structured location
- Classifies each lead as `aanvraag` (application/notification), `besluit_verleend` (granted),
  `besluit_geweigerd` (refused) or `onbekend` (unknown — honest fallback when no known phrasing matches)
- Supports incremental mode for daily/weekly scheduled monitoring
- Optional free run summary with counts and trend per municipality/status

### Input

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Free-text terms matched against the title/abstract. Default: `laadpaal`, `laadpalen`, `laadstation`, `laadpunt`, `oplaadpunt`. Must have at least 1 entry |
| `documentTypes` | array | Publication rubrieken to search. Default: `omgevingsvergunning`, `andere vergunning`, `andere beschikking` (the 3 rubrieken where laadpaal leads actually appear) |
| `municipalities` | array | Limit to specific municipalities/water authorities, e.g. `["Amsterdam", "Zwolle"]`. Empty = all of the Netherlands. Lowercase input (e.g. `"amsterdam"`) is automatically corrected |
| `publishedAfter` | string | Only publications from on/after this date (`YYYY-MM-DD`) |
| `maxResults` | integer | Cap the number of results (1–10000, default 100) |
| `incrementalMode` | boolean | Only fetch publications newer than the previous run — ideal for scheduled monitoring |
| `includeSummary` | boolean | Add one free extra dataset item per run with counts per municipality/status, plus (in `incrementalMode`) the trend vs. the previous run |

### Output

```json
{
  "id": "gmb-2025-12060",
  "title": "Gemeente Oegstgeest - Verkeersbesluit aanwijzen parkeerplaats voor het opladen van een elektrisch voertuig",
  "municipality": "Oegstgeest",
  "authorityType": "Gemeente",
  "publishedDate": "2025-01-13",
  "matchedKeywords": [],
  "postalCode": "2343 CE",
  "addressGuess": "Lange Voort 291",
  "lat": 52.1829845420852,
  "lon": 4.48657574002751,
  "locationSource": "gebiedsmarkering",
  "urlHtml": "https://zoek.officielebekendmakingen.nl/gmb-2025-12060.html",
  "urlPdf": null,
  "source": "officielebekendmakingen",
  "status": "onbekend"
}
```

- **`postalCode`, `addressGuess`, `lat`, `lon`** come from the source's own structured location data when
  available (`locationSource: "gebiedsmarkering"`, most reliable, sometimes free coordinates too), otherwise
  from a regex guess on the title (`locationSource: "title"`), otherwise `null`/`"title"` with nothing found
- **`matchedKeywords`** shows which of your input keywords literally appear in this title/abstract — it can
  legitimately be empty even for a genuinely relevant, correctly delivered lead (like the example above): the
  government's underlying full-text search also matches the linked PDF/HTML document body, which isn't part
  of this metadata response. Use `urlHtml`/`urlPdf` to check the full text in that case
- **`status`** is always computed for free from the title's phrasing
- **`urlHtml` / `urlPdf`** link to the full official publication (`urlPdf` is `null` when the source didn't
  attach one)

#### Run summary (`includeSummary`, optional, free)

With `includeSummary: true`, one extra dataset item is pushed at the end of the run — no extra charge:

```json
{
  "type": "trend-samenvatting",
  "totaalLeads": 15,
  "perGemeente": { "Almelo": 3, "Zwolle": 1 },
  "perStatus": { "aanvraag": 9, "onbekend": 6 },
  "perGemeenteTrend": null,
  "perStatusTrend": null
}
```

`perGemeenteTrend`/`perStatusTrend` are only filled in `incrementalMode`, once a previous run's counts are
available (`null` otherwise) — the delta vs. that previous incremental run, per key.

### Use cases

**Daily lead feed for a nationwide charge point installer:**

```json
{
  "incrementalMode": true,
  "includeSummary": true
}
```

Schedule this daily and receive only *new* laadpaal permit publications each morning.

**Monitor a specific region:**

```json
{
  "municipalities": ["Amsterdam", "Haarlem", "Amstelveen"],
  "publishedAfter": "2026-07-01"
}
```

### Scheduling & integrations

Combine this actor with Apify's built-in features:

- **Schedules** — run daily or weekly and get fresh leads automatically
- **Integrations** — push results to Google Sheets, Slack, Zapier, Make, or any webhook
- **API** — fetch the dataset as JSON, CSV or Excel from your own code
- **MCP** — expose this actor as a tool for AI agents (Claude, Cursor, and other MCP clients)

### Pricing

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

- **Actor Start:** $0.00005 (Apify default)
- **`lead-result`:** $0.004 per delivered lead

### Legal

This actor uses the **official public SRU API** of the Dutch government (KOOP / repository.overheid.nl, the
source behind officielebekendmakingen.nl). These are official government publications, published by law and
explicitly intended for public reuse (Dutch open government data policy).

- ✅ No scraping of protected websites — official open data API only
- ✅ No login, no terms-of-service conflicts
- ⚠️ Publications may contain addresses. If you build a marketing database on top of this feed, you are
  responsible for your own GDPR compliance as data controller (e.g. informing recipients, honouring opt-outs)

### FAQ

**How fresh is the data?** Publications appear in the feed the same day the municipality/water authority
publishes them.

**Which municipalities are covered?** All Dutch municipalities and water authorities that publish permit
decisions on officielebekendmakingen.nl.

**Why is `status` sometimes `onbekend`?** The title-based classifier only recognizes common Staatscourant
phrasing (aanvraag/melding, verleend, geweigerd). A title that doesn't use one of those exact patterns (e.g.
a generic "Toestemming voor ...") is honestly reported as `onbekend` rather than guessed.

**Why don't all leads have `lat`/`lon`?** Only publications where the source itself attached structured
location data carry coordinates — not every municipality/water authority does this consistently. No paid
geocoding call is made to fill the gap; `null` is an honest "not available" rather than a guess.

**How do I get only new items?** Enable `incrementalMode` and schedule the actor; it remembers the date of
the previous run in the actor's key-value store.

### Related Actors

Also by this developer — Dutch public-data actors on the same official publication stream:

- **[NL Vergunningen & Bekendmakingen Leadfeed](https://apify.com/codeclouds/nl-vergunningen-leadfeed)** — the
  general-purpose version of this actor, covering all permit types and free-text keywords, not just laadpaal.
- **[NL BESS Vergunningenmonitor](https://apify.com/codeclouds/nl-bess-vergunningenmonitor)** — the
  battery-storage-specific sibling of this actor, same official publication stream.

***

*Zoekwoorden: laadpaal vergunning, laadpaal aanvraag, laadstation vergunning, laadpaal leads, EV laadinfrastructuur Nederland, oplaadpunt bekendmaking, elektrisch laden vergunning gemeente.*

### Keywords

laadpaal, ev-charging, charging-station, netherlands, permits, bekendmakingen, leads, gemeente

### Changelog

#### 0.3.0

- **Fix**: `addressGuess` no longer includes garbage words for two very common title patterns found in a
  second live review — "... aan de Zandenburg nabij perceel 42 ..." previously produced `"Zandenburg nabij
  perceel 42"` instead of a clean address; "... aanwijzen oplaadpunt Antares thv nr 12 ..." (the dominant
  pattern for traffic-decision leads) previously produced `"aanwijzen oplaadpunt Antares 12"` instead of
  `"Antares 12"`. Both are now parsed correctly — "perceel" (a cadastral parcel reference) is labeled as such
  (`"Zandenburg (perceel 42)"`) instead of silently treated as a house number, while "nr"/"nummer" (a real
  house number) is merged cleanly with the street name.

#### 0.2.0

- **Coverage fix**: added `documentTypes` (`andere vergunning`, `andere beschikking` alongside
  `omgevingsvergunning`) — live review found these 2 extra rubrieken carry nearly 2x as many laadpaal leads
  as `omgevingsvergunning` alone. No pricing change; more genuinely relevant leads are now delivered per run.
- **New free fields**: `lat`/`lon`/`locationSource`. The source often includes its own structured location
  data; this actor now uses it (more reliable than the previous title-only regex guess) and surfaces
  coordinates when available, at no extra cost.
- **Fix**: `matchedKeywords` now also checks the publication abstract, not just the title, catching more
  genuine matches; still honestly empty for the residual case where only the linked document body matched.
- **Fix**: municipality names are now case-normalized before querying — the source is case-sensitive and
  previously returned 0 results for e.g. `"amsterdam"` (lowercase) with no error or warning.
- **Fix**: `keywords` now requires at least 1 entry — an empty array previously disabled the topic filter
  entirely, returning all Dutch permit publications nationwide instead of a validation error.

#### 0.1.0

- Initial release. Fetches Dutch laadpaal/laadstation/oplaadpunt permit publications via the official KOOP
  SRU API, with title-based status classification, address/postal code extraction, and an optional free run
  summary with per-municipality/status trend.

# Actor input Schema

## `keywords` (type: `array`):

Free-text terms matched against the publication title/abstract. Default set covers common EV-charging-point phrasing. Must contain at least 1 term — an empty list would disable the topic filter entirely and return all Dutch permit publications nationwide.

## `documentTypes` (type: `array`):

Publication rubrieken to search. Default covers the 3 rubrieken where laadpaal permits/decisions actually appear (live-verified): "omgevingsvergunning" (building-related), "andere vergunning" (public-space installations), and "andere beschikking" (e.g. traffic decisions reserving a charging parking spot).

## `municipalities` (type: `array`):

Municipality/water authority names, e.g. \["Amsterdam", "Utrecht"]. Leave empty for all of the Netherlands.

## `publishedAfter` (type: `string`):

Only publications from on/after this date (YYYY-MM-DD), e.g. "2026-01-01".

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

Maximum number of leads to return (1–10000).

## `incrementalMode` (type: `boolean`):

Only fetch publications newer than the previous run. Ideal for scheduled monitoring. On the very first call (no snapshot yet in the actor's key-value store) this has no effect and behaves like a full fetch; the run date is then saved as the baseline. Uses a shared, persistent key-value store that scheduled monitoring runs also read/write, so an ad-hoc call in between can shift the baseline seen by the next scheduled run.

## `includeSummary` (type: `boolean`):

Adds one extra dataset item per run with counts per municipality/status, plus (in incrementalMode) the trend vs. the previous incremental run. Free, no extra charge.

## Actor input object example

```json
{
  "keywords": [
    "laadpaal",
    "laadpalen",
    "laadstation",
    "laadpunt",
    "oplaadpunt"
  ],
  "documentTypes": [
    "omgevingsvergunning",
    "andere vergunning",
    "andere beschikking"
  ],
  "municipalities": [],
  "publishedAfter": "2026-01-01",
  "maxResults": 100,
  "incrementalMode": false,
  "includeSummary": false
}
```

# 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 = {
    "publishedAfter": "2026-01-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/nl-laadpaalvergunningen-monitor").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 = { "publishedAfter": "2026-01-01" }

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/nl-laadpaalvergunningen-monitor").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 '{
  "publishedAfter": "2026-01-01"
}' |
apify call codeclouds/nl-laadpaalvergunningen-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/bEYMrugv84mI9p5IW/builds/awEzrb4DMt0eQ6yVl/openapi.json
