# NL Natura2000 Afstandscheck per Adres (`codeclouds/nl-natura2000-afstandscheck`) Actor

Check of een NL-adres, postcode of coördinaat binnen of nabij een Natura2000-gebied ligt — vóór een stikstoftoetsing/AERIUS-vergunningaanvraag (Wnb-check; EN: nitrogen/Natura2000 proximity check). Bespaart 2 API's (PDOK geocoding + Natura2000 WFS) + geometrieberekening. Vanaf $0,006/adres, PPE.

- **URL**: https://apify.com/codeclouds/nl-natura2000-afstandscheck.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 Natura2000 Afstandscheck per Adres

Checks a Dutch address, postcode, or coordinate against the official national Natura2000
boundaries and reports the nearest protected nature area(s) — with the exact distance in meters
and whether the location falls inside one. Built for the pre-screening step before a full
stikstofberekening/AERIUS assessment, not as a replacement for it.

### When should an AI agent use this?

- "Is this construction address within a Natura2000 area or nearby?"
- "How far is this address from the nearest protected nature reserve?"
- "Check a list of addresses for stikstof/nitrogen permit risk before we file a Wnb/Wabo application."
- "Does this farm/livestock expansion site fall inside a nitrogen-sensitive zone?"
- "Which Natura2000 area is closest to this property, and what's its protection type (Vogelrichtlijn/Habitatrichtlijn)?"
- "Screen a batch of development sites for Natura2000 proximity before commissioning an AERIUS calculation."

### What this Actor does

- Geocodes any Dutch address, postcode, place name, or `"lat,lon"` coordinate via the official PDOK Locatieserver
- Queries the official PDOK Natura2000 WFS (RVO/PDOK, CC0) for the boundaries of all 162 Dutch Natura2000 areas
- Computes the real distance (in meters) from the location to the nearest area boundary — not just a bounding-box guess
- Flags explicitly whether the location falls **inside** a Natura2000 area
- Returns up to N nearest areas per location (configurable), each with name, protection type (Vogelrichtlijn/Habitatrichtlijn), official status, and distance
- Automatically widens the search radius once if nothing is found nearby (large parts of the Netherlands are >15 km from the nearest area)
- 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` |
| `zoekstraalMeter` | integer | Search radius in meters (1,000-50,000) around the point | `25000` |
| `maxGebieden` | integer | Max. number of nearest areas returned per location (1-10) | `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",
  "ligtBinnenGebied": false,
  "dichtstbijzijndeGebied": {
    "naam": "Westerschelde & Saeftinghe",
    "sitecodeVogelrichtlijn": "NL9803061",
    "sitecodeHabitatrichtlijn": "NL9803061",
    "beschermingstype": "Vogel- en Habitatrichtlijn",
    "status": "Natura 2000-besluit 2010, wijzigingsbesluit 2012",
    "afstandMeter": 797,
    "ligtBinnen": false
  },
  "gebieden": [ "..." ],
  "zoekstraalToegepast": 25000,
  "bron": "PDOK Natura2000 WFS (service.pdok.nl/rvo/natura2000) + 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 Natura2000 WFS (after built-in retries) — a later run may succeed. |
| `ONBEKENDE_FOUT` | No | Unexpected error that doesn't fit the categories above. |

### Use cases

- Pre-screen a construction or renovation site before deciding whether a full AERIUS/stikstofberekening is needed
- Batch-check a portfolio of agricultural/livestock sites for nitrogen-sensitive-zone proximity before a farm expansion application
- Add a Natura2000-distance field to a real-estate or land-development due-diligence dossier
- Feed a permit-advisory workflow with an early, automated red flag before commissioning expensive external studies

### Pricing

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

- **Actor Start:** $0.00005 (Apify default)
- **locatie-resultaat:** $0.006 per location that resolves and is checked against the Natura2000 boundaries (locations where geocoding fails are not charged)
- **binnen-stikstofgevoelig-gebied-signaal:** $0.01 extra per location that actually falls inside a Natura2000 area (a rarer, more actionable result)

### Legal

Uses only official, open, CC0-licensed government data: the PDOK Natura2000 WFS (RVO/PDOK) for
area boundaries, and the PDOK Locatieserver for geocoding. No personal data is processed. This
Actor provides an **indicative pre-screening result only** — it is not a substitute for an
official AERIUS/stikstofberekening or a formal Wet natuurbescherming (Wnb) assessment, and
distances are computed with a local approximation (accurate to a few meters), not an official
survey-grade calculation.

### FAQ

**Q: Is this a replacement for an AERIUS calculation?**
A: No. This is an indicative distance/proximity screening to help decide whether a full AERIUS/stikstofberekening is worth commissioning — it does not calculate nitrogen deposition.

**Q: How accurate is the distance?**
A: The area boundaries come directly from the official PDOK Natura2000 WFS; the distance is computed locally against the real polygon geometry (not a bounding-box estimate), accurate to within a few meters for the purpose of a screening check.

**Q: What if my location is far from any Natura2000 area?**
A: The Actor automatically widens its search radius once (up to 100 km) if nothing is found within the configured radius, so you always get the true nearest area(s), not an empty result.

**Q: Does this cover all of the Netherlands?**
A: Yes — the PDOK Natura2000 WFS contains all 162 Dutch Natura2000 areas, including the three marine areas in the North Sea EEZ.

### Related Actors

- **[NL Bodemrisico Check](https://apify.com/codeclouds/nl-bodemrisico-check)** — same geocoding pattern, checks the same address against known soil contamination (Bodemloket) instead of Natura2000 boundaries; often relevant for the same due-diligence dossier.
- **[Vastgoed XXL](https://apify.com/codeclouds/vastgoed-xxl)** — combines multiple official Dutch geo-data sources (CBS, RWS, RVO) into one property dossier; a natural companion enrichment.

***

*Zoekwoorden: Natura2000, stikstoftoetsing, AERIUS, stikstofgevoelig gebied, Wet natuurbescherming, Wnb-check, natuurvergunning, omgevingsvergunning stikstof, Vogelrichtlijn, Habitatrichtlijn.*

### Keywords

natura2000, nitrogen, stikstof, netherlands, pdok, environmental-permit, wnb, aerius, protected-area, geocoding

### Changelog

#### 0.2.1

- Renamed output fields `liggtBinnen` → `ligtBinnen` and `liggtBinnenGebied` → `ligtBinnenGebied`
  (Dutch spelling fix; no external consumers existed at the time of the rename).
- `locatie-resultaat` is now only charged for locations that resolve and are successfully checked
  against the Natura2000 boundaries — records that fail anywhere along the way (geocoding miss or
  upstream/WFS error) deliver no boundary data and are not billed.

#### 0.2.0

- Added a machine-readable `foutcode` field next to `fout` (agent-readiness improvement) —
  `GEEN_GEOCODING_MATCH` / `UPSTREAM_ERROR` (retryable) / `ONBEKENDE_FOUT`. No changes to the
  underlying geocoding/Natura2000-distance logic.
- Rewrote the Store description to lead with the task, add explicit NL/EN synonyms, an explicit
  decision-advantage sentence, and a price indication.

#### 0.1.0

- Initial release.

# Actor input Schema

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

Een of meer NL-adressen, postcodes, plaatsnamen, of coordinaten ("lat,lon") om te controleren op afstand tot het dichtstbijzijnde Natura2000-gebied. Bijvoorbeeld: "Bathseweg 27, Rilland", "6811 AA", of "52.09,5.85".

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

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

## `zoekstraalMeter` (type: `integer`):

Straal rond het punt waarin naar Natura2000-gebieden gezocht wordt. Als er binnen deze straal niets gevonden wordt, vergroot de actor de zoekstraal automatisch eenmalig (tot max. 100.000 m). Bijvoorbeeld: 25000.

## `maxGebieden` (type: `integer`):

Maximaal aantal dichtstbijzijnde Natura2000-gebieden dat per locatie geretourneerd wordt, gesorteerd op afstand. Bijvoorbeeld: 3.

## Actor input object example

```json
{
  "locaties": [
    "Bathseweg 27, Rilland"
  ],
  "concurrency": 3,
  "zoekstraalMeter": 25000,
  "maxGebieden": 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-natura2000-afstandscheck").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-natura2000-afstandscheck").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-natura2000-afstandscheck --silent --output-dataset

```

## MCP server setup

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

```

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/sHHSkE3AryVEbT1Dr/builds/IheTAUJuaqT2lLgyf/openapi.json
