# NL Kinderopvang Vestigingslocatiescan (`codeclouds/nl-kinderopvang-vestigingsscan`) Actor

Combines the Dutch childcare register (LRK), DUO primary-school locations, CBS population (age 0-4) and CBS new-build housing permits into one coverage-ratio signal per municipality, to help childcare entrepreneurs find underserved locations.

- **URL**: https://apify.com/codeclouds/nl-kinderopvang-vestigingsscan.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 $25.00 / 1,000 gebied-vestigingsscans

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 Kinderopvang Vestigingslocatiescan

Find underserved Dutch municipalities for a new childcare location. This Actor combines the official
childcare register (LRK), the DUO primary-school register, CBS population data (children aged 0-4) and
CBS new-build housing permits into one coverage-ratio scan per municipality — no configuration required.

### When should an AI agent use this?

- "Which Dutch municipalities have the fewest childcare places relative to young children?"
- "I'm a childcare entrepreneur — where should I open a new kinderdagverblijf in the Randstad?"
- "Compare childcare coverage in Amsterdam, Utrecht and Rotterdam."
- "Is there new housing construction in \[municipality] that could mean more demand for childcare?"
- "How many primary schools and childcare locations does \[municipality] have?"
- "List all registered childcare locations (KDV/BSO) in \[municipality]."

### What this Actor does

- Downloads and parses the official LRK (Landelijk Register Kinderopvang) bulk dataset: every
  registered kinderdagverblijf (KDV), buitenschoolse opvang (BSO), gastouderbureau (GOB) and individual
  host-parent location (VGO) in the Netherlands, with capacity (`aantal_kindplaatsen`).
- Downloads and parses the DUO Open Onderwijsdata primary-school register.
- Fetches the current CBS population count for children aged 0-4 per municipality (CBS StatLine
  03759NED).
- Fetches the latest quarter's new-build housing permits per municipality (CBS StatLine 83671NED) as a
  simple momentum signal.
- Combines all four into one record per municipality: existing supply, demand proxy, a coverage ratio
  (`kindplaatsenPer100Kinderen0tot4`), a market-fragmentation signal (`aantalUniekeHouders`) and a
  **nationwide** opportunity rank out of all ~342 municipalities — not just the ones in your run, since the
  underlying data is fetched nationwide either way.
- Optionally returns individual childcare-location records for the selected municipalities.
- Degrades gracefully if a CBS source is temporarily unavailable: you still get the LRK/DUO-based supply
  numbers, with the affected fields set to `null` instead of the whole run failing.

### Input

| Field | Type | Description |
|---|---|---|
| `gemeenten` | array of strings | Municipality names (e.g. `"Amsterdam"`) or GM-codes (e.g. `"GM0363"`, `"GM363"` or plain `"363"` all work). Leave empty for all ~342 municipalities. |
| `opnemenLocaties` | boolean | Also output one record per existing childcare location in the selected municipalities. Default `false`. |
| `maxLocatieRecords` | integer | Caps how many location records a run can produce when `opnemenLocaties` is on. Default `1000`, max `5000`. |

### Output

One `gebied-vestigingsscan` record per municipality:

```json
{
  "type": "gebied-vestigingsscan",
  "gemeente": "Utrecht",
  "gemeenteCode": "GM0344",
  "kinderopvang": {
    "kdvAantal": 205,
    "kdvKindplaatsen": 8716,
    "bsoAantal": 185,
    "bsoKindplaatsen": 10596,
    "vgoAantal": 159,
    "vgoKindplaatsen": 925,
    "gobAantal": 4,
    "totaalKindplaatsen0tot4": 9598,
    "aantalUniekeHouders": 229
  },
  "aantalSchoolvestigingenBasisonderwijs": 97,
  "inwoners0tot4Jaar": 19490,
  "inwonersJaar": "2026JJ00",
  "nieuwbouwAantalWoningenLaatsteKwartaal": 356,
  "nieuwbouwPeriode": "2026KW01",
  "kindplaatsenPer100Kinderen0tot4": 49.2,
  "vestigingskansRangLandelijk": 203,
  "totaalGemeentenLandelijk": 342,
  "bronnen": ["Landelijk Register Kinderopvang (LRK)", "..."]
}
```

Optional `kinderopvang-locatie` record (only when `opnemenLocaties: true`):

```json
{
  "type": "kinderopvang-locatie",
  "lrkId": "100248640",
  "typeOko": "KDV",
  "naam": "2 Voices-Parkside",
  "aantalKindplaatsen": 52,
  "adres": "Zocherstraat 68",
  "postcode": "1054MA",
  "woonplaats": "Amsterdam",
  "gemeente": "Amsterdam",
  "gemeenteCode": "GM0363",
  "naamHouder": "2 Voices B.V.",
  "kvkNummerHouder": "55449417"
}
```

### Use cases

- Site selection for a new childcare business: find municipalities with a low childcare-places-per-child
  ratio and recent new-build activity (future demand signal).
- Franchise/investor due diligence: compare coverage across a shortlist of candidate municipalities.
- Market research: existing supply and school density per municipality, updated with each run.

### Pricing

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

- **Actor Start:** $0.00005 (Apify default)
- **`gebied-vestigingsscan`:** $0.025 per municipality
- **`kinderopvang-locatie-record`:** $0.004 per childcare location (only when `opnemenLocaties` is on)

### Legal

Data sources: LRK (Belastingdienst/DUO, CC-0), DUO Open Onderwijsdata (open), CBS StatLine (open,
CC-BY-achtig gebruiksrecht). No personal data of children or parents is processed — LRK's `naam_houder`/
`kvk_nummer_houder` fields are business-level register data (comparable to a KVK registration), not
personal data.

`vestigingskansRangLandelijk` is computed across **all** ~342 municipalities (1 = lowest childcare-places-
per-child ratio nationwide), regardless of which municipalities you actually requested — it is not an
absolute externally-published benchmark (no official national coverage-ratio benchmark could be verified
during development), but it is a genuine nationwide comparison, not just a rank within your own selection.

### FAQ

**Q: Does this include a demand forecast for future years?**
A: No. CBS discontinued its regional age-specific population forecast in 2023/2024 (confirmed live
during development). This Actor uses the current population aged 0-4 as the best available demand proxy
instead, plus recent new-build activity as a forward-looking signal — not a forecast.

**Q: What's the difference between KDV, BSO, GOB and VGO?**
A: KDV = kinderdagverblijf (daycare, ages 0-4), BSO = buitenschoolse opvang (after-school care,
school-age), VGO = an individual registered host-parent location (also serves 0-4), GOB = gastouderbureau
(an intermediary agency, not a physical location — excluded from capacity totals).

**Q: Can I request all municipalities at once?**
A: Yes — leave `gemeenten` empty. Keep `opnemenLocaties` off for a nationwide run unless you also set a
sensible `maxLocatieRecords`, otherwise you'll only get the first locations found before the cap.

**Q: What does `aantalUniekeHouders` tell me?**
A: The number of distinct childcare operators (by KVK number, or by name when no KVK number is
registered) active in that municipality, across all location types. A number close to the total location
count means a fragmented market of many small, independent operators (easier to enter without competing
against an established chain); a number much lower than the location count means a few large chains
dominate (each running several locations under one KVK number).

**Q: What happens if a CBS source is temporarily down?**
A: The run still completes using LRK/DUO. The affected fields (`inwoners0tot4Jaar`, `nieuwbouw*`,
`vestigingskansRangLandelijk`) come back as `null` for that run instead of failing the whole Actor.

### Related Actors

- **[NL New-Build Housing Permits Monitor](https://apify.com/codeclouds/nl-nieuwbouwvergunningen-monitor)**
  — the same CBS 83671NED source with full quarter-range and QoQ/YoY trend options, for deeper new-build
  analysis than the single-quarter signal used here.

***

*Zoekwoorden: kinderopvang, kinderdagverblijf, LRK, vestigingslocatie, buitenschoolse opvang,
gastouderbureau, kinderopvangondernemer.*

### Keywords

netherlands, childcare, kinderopvang, lrk, kinderdagverblijf, site-selection, education, cbs, open-data,
government-data, mcp-tool

### Changelog

#### 0.2.0

- `vestigingskansRang`/`totaalGemeentenInRun` replaced by `vestigingskansRangLandelijk`/
  `totaalGemeentenLandelijk` — the opportunity rank is now computed nationwide (all ~342 municipalities)
  instead of only within the municipalities you requested, at no extra cost (the underlying data is
  already fetched nationwide).
- New `aantalUniekeHouders` field per municipality: a market-fragmentation signal (unique operators vs.
  total locations).
- Fixed: GM-codes without leading zeros (e.g. `"GM363"` or `"363"`) now resolve correctly.
- Fixed: duplicate municipalities in the `gemeenten` input (e.g. a name and its GM-code both listed) no
  longer produce duplicate — and duplicately charged — records.
- The Actor now degrades gracefully instead of failing entirely if a CBS source is temporarily
  unavailable.

#### 0.1.0

- Initial release.

# Actor input Schema

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

Municipality names (e.g. "Amsterdam") or GM-codes (e.g. "GM0363"). Leave empty for all municipalities.

## `opnemenLocaties` (type: `boolean`):

Also output one record per existing childcare location (LRK) in the selected municipalities, capped by 'Max location records' below. Off by default because a nationwide run would otherwise return tens of thousands of location records.

## `maxLocatieRecords` (type: `integer`):

Caps how many individual childcare-location records this run can produce when 'Include individual childcare locations' is on (cost-safety limit).

## Actor input object example

```json
{
  "gemeenten": [],
  "opnemenLocaties": false,
  "maxLocatieRecords": 1000
}
```

# 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-kinderopvang-vestigingsscan").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-kinderopvang-vestigingsscan").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-kinderopvang-vestigingsscan --silent --output-dataset

```

## MCP server setup

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

```

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/vdIiq2Kgcbybdvehx/builds/ko0q33Iys6BYizfcR/openapi.json
