# ZorgkaartNederland Provider Scraper (`mrdoe/zorgkaartnederland-provider-scraper-nl`) Actor

Extract healthcare provider profiles from ZorgkaartNederland.nl, including provider name, profession, address, phone, website, ratings, and profile URLs. Useful for Dutch healthcare directories, market research, lead generation, and location analysis

- **URL**: https://apify.com/mrdoe/zorgkaartnederland-provider-scraper-nl.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

![ZorgkaartNederland Provider Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/zorgkaartnederland-provider-scraper-nl--hero.png)

**Turn ZorgkaartNederland healthcare provider profiles into structured data in minutes** - no coding, no manual copy-pasting. Get profession, practice address, phone, website, and patient ratings from ZorgkaartNederland.nl, the Dutch national healthcare review platform.

### What does ZorgkaartNederland Provider Scraper do?

ZorgkaartNederland Provider Scraper collects healthcare provider profiles from [ZorgkaartNederland.nl](https://www.zorgkaartnederland.nl), the Patiëntenfederatie Nederland's platform for rating GPs, dentists, physiotherapists, and other healthcare professionals. Give it a profession + city listing URL (or a direct provider URL), and it pages through every matching provider, then visits each one's own page for gender, rating history, and recent reviews, and their practice's page for address, phone, and website.

### Why use ZorgkaartNederland Provider Scraper?

- **Healthcare directory building** - compile a structured directory of providers by profession and region.
- **Reputation monitoring** - track a practice's or a specific provider's rating and recent patient reviews over time.
- **Market research** - map provider and practice density, contact details, and patient satisfaction by region.

### How to use ZorgkaartNederland Provider Scraper

![How ZorgkaartNederland Provider Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/zorgkaartnederland-provider-scraper-nl--how-it-works.png)

1. In the Input tab, set **Start URLs** to a ZorgkaartNederland profession + city URL (e.g. `zorgkaartnederland.nl/huisarts/aalsmeer`) or a direct provider URL.
2. Leave **Enrich with detail pages** on to collect full details per provider (recommended), or turn it off for a faster listing-only run.
3. Set **Max items** / **Max pages** if you want to cap the run, or leave empty to collect everything the listing returns.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab to preview, filter, and export your results.

### Input

![ZorgkaartNederland Provider Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/zorgkaartnederland-provider-scraper-nl--input.png)

| Field                | Type    | Description                                                                           |
| -------------------- | ------- | ------------------------------------------------------------------------------------- |
| `startUrls`          | Array   | ZorgkaartNederland profession/city listing URLs, or direct provider URLs.             |
| `includeDetails`     | Boolean | Visit each provider's and their practice's own pages for full data (default: `true`). |
| `maxItems`           | Integer | Maximum providers to collect (default: unlimited).                                    |
| `maxPages`           | Integer | Safety cap on result pages per start URL (default: unlimited).                        |
| `useCache`           | Boolean | Skip providers already collected by a previous run (default: `true`).                 |
| `proxyConfiguration` | Object  | Proxy settings.                                                                       |

Example input:

```json
{
    "startUrls": [{ "url": "https://www.zorgkaartnederland.nl/huisarts/aalsmeer" }],
    "maxItems": 200
}
```

### Output

![ZorgkaartNederland Provider Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/zorgkaartnederland-provider-scraper-nl--output.png)

![ZorgkaartNederland Provider Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/zorgkaartnederland-provider-scraper-nl--fields.png)

Each provider is saved as one item in the dataset, for example:

```json
{
    "providerId": "316476",
    "name": "Borg, M.A.J.P.",
    "profession": "Huisarts",
    "gender": "Man",
    "practiceName": "Gezondheidscentrum Aalsmeer Oost",
    "address": "Poldermeesterplein 18",
    "postalCode": "1432 JZ",
    "city": "Aalsmeer",
    "phone": "0297-500810",
    "website": "http://www.gcaalsmeeroost.nl",
    "rating": 9.6,
    "reviewCount": 1,
    "url": "https://www.zorgkaartnederland.nl/zorgverlener/huisarts-borg-m-a-j-p-316476",
    "source": "zorgkaartnederland.nl",
    "scrapedAt": "2026-08-21T00:00:00.000Z"
}
```

#### Field reference

| Field                                                    | Description                                                                                       |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| `providerId`                                             | ZorgkaartNederland's internal provider ID                                                         |
| `name`, `profession`, `gender`                           | Provider name, profession/specialism, and gender as published                                     |
| `practiceName`, `practiceUrl`                            | The practice or institution the provider works at                                                 |
| `address`, `postalCode`, `city`, `latitude`, `longitude` | The practice's location                                                                           |
| `phone`, `website`                                       | The practice's published contact details                                                          |
| `rating`, `reviewCount`                                  | Overall patient rating (0-10 scale) and number of ratings                                         |
| `ratingsByYear`                                          | Array of `{ year, score, count }` - the rating history breakdown shown on the provider's page     |
| `recentReviews`                                          | Array of `{ title, url, dateAndAuthor, text, score }` - the most recent published patient reviews |
| `url`, `canonicalUrl`                                    | The provider's own page on ZorgkaartNederland                                                     |

Fields with no public data for a given provider are returned as `null` (or `[]`/`{}` for arrays/objects) - never fabricated or guessed.

### Detail enrichment

Listing pages only carry the provider's name, profession, practice name/city, and rating summary. With **Enrich with detail pages** on (default), the Actor visits each provider's own page for gender, rating history, and recent reviews, then visits their practice's page for the full address, phone number, and website. Providers who share a practice (common at group practices) only trigger one practice-page request per run - the result is reused for every provider at that practice.

### Pagination

The Actor pages through results (20 providers per page) until it reaches the last page (based on ZorgkaartNederland's own result count), `maxPages`, or `maxItems` - whichever comes first.

### Cache behavior

With `useCache` on (default), every successfully collected provider's ID is stored permanently in the Actor's key-value store - no expiration, no TTL. Re-running the Actor with the same or overlapping listing will skip providers already collected and only return new ones. Disable `useCache` to re-collect everything.

### Cost / performance

Listing, provider, and practice pages are all plain server-rendered HTML - no browser is required, keeping cost per result low. Practice-page requests are deduplicated within each run, so providers sharing a practice don't multiply the request count. Combined with the permanent cache, repeated runs over the same listing only pay for genuinely new providers.

### Troubleshooting

**A run returns 0 providers.** Check that the start URL follows ZorgkaartNederland's `/{profession}/{city}` pattern (e.g. `/huisarts/aalsmeer`) - a profession alone (e.g. `/huisarts`) lists cities, not providers.

**Address, phone, or website is missing.** Some practices don't publish full contact details on ZorgkaartNederland, or a provider works independently without a listed practice - these fields are left `null` rather than guessed.

### FAQ / Disclaimer

**Is this legal?** This Actor only collects publicly visible provider and practice data. You are responsible for using the data in accordance with ZorgkaartNederland's Terms of Service and applicable law in your jurisdiction.

**Found a bug or have a feature request?** Please use the Issues tab on this Actor's page - feedback directly shapes future updates.

# Actor input Schema

## `startUrls` (type: `array`):

ZorgkaartNederland profession/city listing URLs (e.g. <code>zorgkaartnederland.nl/huisarts/aalsmeer</code>), or direct provider URLs (<code>zorgkaartnederland.nl/zorgverlener/...</code>).

## `includeDetails` (type: `boolean`):

Visit each provider's own page for gender, rating history, and recent reviews, then visit their practice's page for address, phone, and website. Turn off for a faster, cheaper run that only returns listing-page data.

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

Maximum number of providers to scrape across all start URLs. Leave empty to collect every provider the listing URLs return.

## `maxPages` (type: `integer`):

Safety cap on how many result pages to page through per start URL (20 providers per page). Leave empty to page through all results.

## `useCache` (type: `boolean`):

Skip providers already collected by a previous run of this Actor (matched by ZorgkaartNederland's provider ID). The cache is stored permanently and never expires. Disable to re-collect everything.

## `proxyConfiguration` (type: `object`):

Proxy settings.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.zorgkaartnederland.nl/huisarts/aalsmeer"
    }
  ],
  "includeDetails": true,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.zorgkaartnederland.nl/huisarts/aalsmeer"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/zorgkaartnederland-provider-scraper-nl").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 = {
    "startUrls": [{ "url": "https://www.zorgkaartnederland.nl/huisarts/aalsmeer" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/zorgkaartnederland-provider-scraper-nl").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 '{
  "startUrls": [
    {
      "url": "https://www.zorgkaartnederland.nl/huisarts/aalsmeer"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mrdoe/zorgkaartnederland-provider-scraper-nl --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/zorgkaartnederland-provider-scraper-nl"
        }
    }
}

```

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/LljHe2KJVkGDxI3jO/builds/eK6QH4v9XS7aa8ggO/openapi.json
