# NL Risicokaart Afstandscheck per Adres (`codeclouds/nl-risicokaart-afstandscheck`) Actor

"Check voor een NL-adres de afstand tot nabijgelegen risicovolle inrichtingen (BRZO/Seveso, gevaarlijke stoffen) uit het Register Externe Veiligheidsrisico's (REV), plus PR10-5 t/m 10-8-contour- en aandachtsgebiedstatus (brand/explosie/gifwolk)."

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

## Pricing

from $8.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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## NL Risicokaart Afstandscheck per Adres

Check any Dutch address, postcode or coordinate against the official **Register Externe
Veiligheidsrisico's (REV)** — the national register that replaced the classic Risicokaart/RRGS in
2023 — and get the nearest hazardous facilities (BRZO/Seveso, dangerous substances) with exact
distances in meters, plus a clear verdict on whether the location falls inside a
location-specific-risk contour (PR10⁻⁵ to 10⁻⁸) or an attention area (fire, explosion, toxic cloud).

Built for due-diligence teams, real-estate developers, permit consultants and insurers who need a
fast, cheap red-flag check *before* commissioning a full external-safety assessment.

### When should an AI agent use this?

- "Is this address near a BRZO or Seveso company?"
- "What is the distance from this building site to the nearest hazardous-substance facility?"
- "Does this location fall inside a PR-contour or an attention area?"
- "Screen these 20 candidate sites for external-safety risk."
- "Check whether a new school or care home can be built near this industrial estate."
- "Give me a risk summary for this property acquisition."

### What this Actor does

- **Geocodes** any Dutch address, postcode, place name or `lat,lon` coordinate via the official
  PDOK Locatieserver (with a match-confidence score).
- **Queries the REV WFS** (`rev-portaal.nl/geoserver`) — the official External Safety Risk Register —
  for hazardous facilities within your search radius.
- **Calculates exact distances** in meters from your location to the parcel boundary of each
  nearest facility (point-to-polygon, not point-to-point centroids).
- **Classifies each facility** by risk group: `seveso-brzo` (Seveso/BRZO — flagged in the register
  itself), `vergunningplicht` (permit-required activities with fixed or calculated safety distances),
  `licht` (external-safety risk but no permit requirement) or `overig` (other registered risk).
- **Checks contour layers** for PR10⁻⁵, PR10⁻⁶, PR10⁻⁷ and PR10⁻⁸ location-specific-risk contours, the new Environmental Act attention areas (fire / explosion / toxic cloud), and the safety zones (vulnerable / limited-vulnerable / highly-vulnerable), reporting a simple inside/outside verdict per contour type.
- **One record per location** with machine-readable error codes (`GEEN_GEOCODING_MATCH`,
  `UPSTREAM_ERROR`, `ONBEKENDE_FOUT`) so agent loops can react programmatically.

### Input

| Field | Type | Description |
|---|---|---|
| `locaties` | string\[] | Addresses, postcodes, place names or `lat,lon` coordinates to check (1-50). |
| `zoekstraalMeter` | number | Search radius in meters (default 2000, min 500, max 50000). |
| `maxInrichtingen` | number | Maximum number of nearest facilities returned per location (default 5, max 20). |
| `includeContouren` | boolean | Also check PR-contours, attention areas and safety zones (default `true`). |
| `concurrency` | number | How many locations to process in parallel (default 3, max 10). |

### Output

One JSON record per location:

```json
{
  "invoer": "Bathseweg 27, Rilland",
  "gevonden": true,
  "fout": null,
  "foutcode": null,
  "weergavenaam": "Bathseweg 27, 4351 SC Rilland-Bath",
  "postcode": "4351SC",
  "gemeente": "Reimerswaal",
  "provincie": "Zeeland",
  "lat": 51.3867,
  "lon": 4.1531,
  "geocodingScore": 19.2,
  "geocodingBetrouwbaarheid": "hoog",
  "inrichtingen": [
    {
      "bedrijfsnaam": "Tankstation Rilland B.V.",
      "adres": "Bathseweg 25, 4351 SC Rilland-Bath",
      "activiteit": "Tanken LPG",
      "revCategorie": "VII-A1a",
      "risicogroep": "licht",
      "afstandMeter": 120,
      "ligtBinnen": false
    }
  ],
  "dichtstbijzijndeInrichting": { "bedrijfsnaam": "Tankstation Rilland B.V.", "afstandMeter": 120 },
  "ligtBinnenContour": false,
  "contouren": [
    { "type": "PR10-5", "ligtBinnen": false },
    { "type": "PR10-6", "ligtBinnen": false },
    { "type": "PR10-7", "ligtBinnen": false },
    { "type": "PR10-8", "ligtBinnen": false },
    { "type": "BRANDAANDACHTSGEBIED", "ligtBinnen": false },
    { "type": "EXPLOSIEAANDACHTSGEBIED", "ligtBinnen": false },
    { "type": "GIFWOLKAANDACHTSGEBIED", "ligtBinnen": false },
    { "type": "VEILIGHEIDSZONE_KWETSBAAR", "ligtBinnen": false },
    { "type": "VEILIGHEIDSZONE_BEPERKTKWETSBAAR", "ligtBinnen": false },
    { "type": "VEILIGHEIDSZONE_ZEERKWETSBAAR", "ligtBinnen": false }
  ],
  "zoekstraalToegepast": 2000,
  "bron": "REV WFS (rev-portaal.nl/geoserver, Register Externe Veiligheidsrisico's) + PDOK Locatieserver (geocoding)"
}
```

### Use cases

- **Real-estate due diligence** — quick red flag before buying or developing a property near
  hazardous industry.
- **Permit preparation** — external safety is a mandatory part of the omgevingsvergunning
  assessment next to noise, nitrogen and soil; this check tells you early whether it applies.
- **Insurance underwriting** — distance-to-hazard is a standard input for industrial and
  commercial property pricing.
- **Portfolio screening** — batch-check a shortlist of candidate sites and rank by distance to the
  nearest Seveso/BRZO facility.
- **Change monitoring** — schedule periodic runs to detect newly registered facilities near your
  assets.

### Pricing

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

- **Actor Start:** $0.00005 (Apify default)
- **Location result:** $0.008 per address/postcode/coordinate successfully checked
- **Inside-contour signal:** $0.015 per location found inside a PR-contour or attention area

You are only charged for locations that geocode successfully and complete the REV check — failed
lookups are free.

### Legal

- Data source: **Register Externe Veiligheidsrisico's (REV)**, maintained on behalf of the
  Ministry of Infrastructure and Water Management by municipalities, provinces and environmental
  services. Public government data, explicitly published for reuse via a public geoserver without
  authentication. Geocoding via the PDOK Locatieserver (also public government data).
- **This actor is a screening tool, not an advisory tool.** It reports factual distances and
  contour membership from a public register. It does **not** replace a formal external-safety
  assessment (external veiligheidstoets) required for a permit application, and it does **not**
  judge whether a location is "safe enough" to live or build in.
- Distances are calculated from the facility's parcel boundary using an equirectangular projection
  — accurate to well within a metre at these search radii, but indicative rather than survey-grade.
- The REV reflects registrations as provided by the mandated data bronhouders and is updated
  continuously; absence of a facility from the results does not guarantee absence of risk.

### FAQ

**Q: What is the difference between this and the old Risicokaart?**
A: The classic risicokaart.nl map was migrated into the national Register Externe Veiligheidsrisico's
(REV) on 2023-01-01. This actor queries the current, authoritative REV source — which covers both
the old hazard categories and the new Environmental Act attention areas.

**Q: What does the "risicogroep" field mean?**
A: A classification derived from the REV's category code (`rev_categorie`, referencing Annex VII of
the Environmental Activities Decree / Environmental Quality Decree): `seveso-brzo` = the register
explicitly marks the facility as a Seveso (formerly BRZO) establishment; `vergunnanplicht` = external
safety risk with permit requirement and fixed or calculated safety distances; `licht` = external
safety risk without permit requirement (e.g. LPG filling stations); `overig` = other registered
risk activities (e.g. pipelines).

**Q: Why is the distance measured to the parcel boundary and not to the facility centroid?**
A: Because the REV stores each facility as a polygon (its parcel), the actor can compute the true
minimum distance from your location to the site boundary — a much more meaningful number for
screening than a centroid distance.

**Q: What happens if the REV service is temporarily unavailable?**
A: The actor retries transient errors (HTTP 429/5xx) up to three times. If the service remains
unreachable, the record still returns — with `foutcode: "UPSTREAM_ERROR"` and a human-readable
message — so your run completes and you can retry later.

**Q: How often is the data updated?**
A: The REV is updated continuously by the mandated data bronhouders (municipalities, provinces,
environmental services). Because this actor queries the live WFS at run time, you always get the
current state.

### Related Actors

- **[NL Natura2000 Afstandscheck](https://apify.com/codeclouds/nl-natura2000-afstandscheck)** —
  the nitrogen/Natura2000 sibling check for the same addresses; run both for a complete
  omgevingsvergunning pre-screen (external safety + nitrogen).

***

*Zoekwoorden: risicokaart, BRZO, Seveso, gevaarlijke stoffen, externe veiligheid, REV, register
externe veiligheidsrisico's, plaatsgebonden risico, PR-contour, veiligheidszone, omgevingsvergunning,
due diligence, location risk, Bedrijveninventarisatie Risicogevallen.*

### Keywords

netherlands, risicokaart, brzo, seveso, hazardous substances, external safety, rev, location risk,
due diligence, real estate, permit screening, open data, pdok

### Changelog

#### 0.1.0

- Initial release: REV-based facility proximity check with risk grouping, PR-contour and
  attention-area status, PDOK geocoding with confidence scoring.

# Actor input Schema

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

Adressen, postcodes, plaatsnamen of coördinaten ('lat,lon') om te checken.

## `zoekstraalMeter` (type: `number`):

Straal rond elke locatie waarin naar risicovolle inrichtingen en contouren wordt gezocht.

## `maxInrichtingen` (type: `number`):

Maximaal aantal nabijgelegen inrichtingen dat per locatie wordt geretourneerd.

## `includeContouren` (type: `boolean`):

Of ook plaatsgebonden-risicocontouren (PR10⁻⁵ t/m 10⁻⁸) en aandachtsgebieden moeten worden gecheckt.

## `concurrency` (type: `number`):

Hoeveel locaties tegelijk worden verwerkt.

## Actor input object example

```json
{
  "zoekstraalMeter": 2000,
  "maxInrichtingen": 5,
  "includeContouren": true,
  "concurrency": 3
}
```

# Actor output Schema

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

Resultaten in de standaarddataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/nl-risicokaart-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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codeclouds/nl-risicokaart-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/nAq5h2DhBjbJtPf9c/builds/WLL5eKelCEBxIqxQb/openapi.json
