# NL Omgevingsvergunning Permit Leads — geocoded (CC0) (`arthursbuisness/nl-omgevingsvergunningen-permits`) Actor

- **URL**: https://apify.com/arthursbuisness/nl-omgevingsvergunningen-permits.md
- **Developed by:** [Arthur](https://apify.com/arthursbuisness) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 permits

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

## Dutch Permit Leads — omgevingsvergunning, sloop, kap, asbest, horeca (geocoded, CC0)

Turn Dutch official permit notices into **structured, geocoded, filterable lead records**. Every day, all 340+ municipalities publish building- and environment-permit notices (*omgevingsvergunningen*) in the official gazette. A fresh permit is a **warm lead**: someone is about to build, renovate, demolish, remove asbestos, fell trees, or open a business. This Actor parses those notices into clean rows you can drop straight into a CRM, a map, or a spreadsheet.

No HTML scraping: the Actor queries the official KOOP open-data repository (SRU, **CC0 licence**) directly — fast, reliable and legally clean — and enriches each record with WGS84 coordinates.

### What you get

One dataset row per permit notice:

| field | description |
|---|---|
| `date` | publication date |
| `gemeente` | municipality that published the notice |
| `permit_type` | derived class: `omgevingsvergunning`, `bouw`, `sloop`, `kap`, `asbest`, `evenement`, `horeca`, `uitweg`, `terras`, `standplaats`, `ligplaats`, `overig` |
| `status` | derived stage: `aanvraag`, `verleend`, `geweigerd`, `verlengd`, `ingetrokken`, `kennisgeving`, `melding`, `ontwerpbesluit`, `overig` |
| `address` | street + house number, parsed from the notice |
| `postcode` | Dutch postcode (`1017 EA`) when present |
| `city` | city / place name |
| `lat`, `lon` | WGS84 coordinates (from the notice, or geocoded from the postcode) |
| `geocoded` | `true` when coordinates are filled |
| `url` | link to the official publication |
| `title` | the full original notice text |

Download as JSON, CSV or Excel, or push to Make/Zapier/Google Sheets/HubSpot via Apify integrations.

### Who buys this

- **Solar & insulation installers** — new `bouw`/`omgevingsvergunning` permits = roofs and facades about to be opened up.
- **Construction subcontractors** (roofing, scaffolding, groundwork) — target `verleend` permits by region.
- **Demolition & asbestos firms** — filter `permit_type = sloop` or `asbest`.
- **Architects & structural engineers** — catch `aanvraag`/`ontwerpbesluit` early, before the job is awarded.
- **Kitchen, flooring, window & interior companies** — a renovation permit means a buyer within months.
- **Tree surgeons / hoveniers** — `kap` (tree-felling) permits.
- **Monitoring buyers** — neighbours, lawyers and municipalities watching a street, postcode or objection window.

### How to use (2 minutes)

1. Click **Try for free**.
2. Set the input: municipalities (e.g. `Amsterdam`, `Utrecht`; empty = whole country), permit types (e.g. `bouw`, `sloop`; empty = all), optional keywords (`dakkapel OR uitbouw`, `zonnepanelen`), days back (1–90), max items, and geocoding on/off.
3. Click **Start**. Rows appear in the dataset within seconds. **Schedule** the Actor daily or weekly to receive fresh leads automatically.

#### Example input

```json
{ "gemeenten": ["Amsterdam"], "permitTypes": ["bouw"], "keywords": "omgevingsvergunning", "daysBack": 14, "maxItems": 500, "geocode": true }
```

#### Example output

```json
{ "date": "2026-08-26", "gemeente": "Dalfsen", "permit_type": "bouw", "status": "verleend",
  "address": "Doevelersteeg 13", "postcode": "7722 JW", "city": "Dalfsen",
  "lat": 52.4695144, "lon": 6.2362221, "geocoded": true,
  "url": "https://zoek.officielebekendmakingen.nl/gmb-2026-...html",
  "title": "Verleende omgevingsvergunning, het wijzigen van het plaatsen van de carport ... Doevelersteeg 13 7722JW Dalfsen" }
```

### Pricing

Pay per result: you are billed **only for permit records actually delivered to your dataset** — a failed run stores and bills nothing. A weekly regional export of 200 permits is a few tens of cents. Geocoding is included (free PDOK Locatieserver).

### FAQ

**How fresh is the data?** The repository updates continuously; notices usually appear the same day the municipality publishes them.

**Why is an address or postcode sometimes empty?** Municipalities word notices differently — some omit a house number or postcode (e.g. cadastral-only descriptions). The `title` always contains the full original text, so nothing is lost.

**How accurate are the coordinates?** When the notice itself carries a coordinate, that exact point is used. Otherwise the postcode is geocoded to its centroid — accurate to the street/block. Records with neither are left with `null` coordinates.

**Is this legal?** Yes. The source is the official Dutch government open-data service under a **CC0** licence, and the data is redistributable. The Actor exports only what the authority already publishes in the public notice.

**Can I automate it?** Yes — schedule it in Apify, call it via API, or connect it to Make/Zapier/Google Sheets/your CRM.

### Support

Feature requests welcome (extra permit classes, per-street watch lists, activity/type enrichment).

# Actor input Schema

## `gemeenten` (type: `array`):

Filter on the publishing municipality (e.g. Amsterdam, Utrecht, Rotterdam). Applied server-side. Empty = whole country.

## `permitTypes` (type: `array`):

Keep only these derived permit types. Options: omgevingsvergunning, bouw, sloop, kap, asbest, evenement, horeca, uitweg, terras, standplaats, ligplaats, overig. Empty = all types.

## `keywords` (type: `string`):

Extra CQL 'any' terms matched in the notice title, e.g. 'dakkapel OR uitbouw' or 'zonnepanelen'. Empty defaults to 'omgevingsvergunning' so you always get permit notices.

## `daysBack` (type: `integer`):

Look back N days from today (1–90). Notices usually appear the same day the municipality publishes them.

## `maxItems` (type: `integer`):

Maximum number of permit records to return (1–20000).

## `geocode` (type: `boolean`):

Add WGS84 coordinates. Coordinates published in the notice are always used; when only a postcode is available, it is geocoded via the free PDOK Locatieserver (results cached per postcode). Never blocks output.

## Actor input object example

```json
{
  "gemeenten": [],
  "permitTypes": [],
  "keywords": "omgevingsvergunning",
  "daysBack": 14,
  "maxItems": 500,
  "geocode": true
}
```

# Actor output Schema

## `permits` (type: `string`):

JSON items of all exported permit leads

## `permitsCsv` (type: `string`):

Same dataset as CSV — open in Excel/Sheets or import into a CRM

# 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 = {
    "gemeenten": [],
    "permitTypes": [],
    "keywords": "omgevingsvergunning",
    "daysBack": 14,
    "maxItems": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("arthursbuisness/nl-omgevingsvergunningen-permits").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 = {
    "gemeenten": [],
    "permitTypes": [],
    "keywords": "omgevingsvergunning",
    "daysBack": 14,
    "maxItems": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("arthursbuisness/nl-omgevingsvergunningen-permits").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 '{
  "gemeenten": [],
  "permitTypes": [],
  "keywords": "omgevingsvergunning",
  "daysBack": 14,
  "maxItems": 500
}' |
apify call arthursbuisness/nl-omgevingsvergunningen-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arthursbuisness/nl-omgevingsvergunningen-permits"
        }
    }
}

```

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/Ep6rx8L0nJgqWRKNg/builds/ekQO3EuOanZQvoIwE/openapi.json
