# Nationale Vacaturebank Scraper (Netherlands Jobs) (`studio-amba/nationalevacaturebank-scraper`) Actor

Scrape job listings from Nationale Vacaturebank, the largest Dutch job board. Search by keyword, city, category, contract type and education level. Salary, working hours, location, employer and full description. No login, no API key.

- **URL**: https://apify.com/studio-amba/nationalevacaturebank-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

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

## Nationale Vacaturebank Scraper (Netherlands Jobs)

Scrape job listings from [Nationale Vacaturebank](https://www.nationalevacaturebank.nl), the largest Dutch job board with about 90,000 active vacancies. Search by keyword and filter by city, category, contract type, education level and career level. Every vacancy comes back with title, employer, location, salary range, working hours and the full description. No login and no API key.

### How to scrape Nationale Vacaturebank data

1. Open the actor and press **Try for free**.
2. Type a **Search query** such as `developer`, `monteur` or `verpleegkundige`. Leave it empty to list the newest vacancies.
3. Optionally fill in a **City**, one or more **Categories**, a **Contract type**, an **Education level** or a **Career level**.
4. Set **Max results** and start the run.
5. Download the dataset as JSON, CSV or Excel, or read it through the Apify API.

#### Search and filters

| Input | What it does |
|---|---|
| Search query | Keyword or job title, Dutch or English |
| City | Dutch city, for example `Utrecht` or `Den Haag` |
| Categories | One or more of the 21 site categories, for example `Techniek` or `Medisch/Zorg` |
| Contract type | Vast, Tijdelijk, Freelance, Interim, ZZP, Stage, Bijbaan and more |
| Education level | From Lagere school to Postdoctoraal |
| Career level | Starter or Ervaren |
| Hybrid only | Only vacancies marked as hybrid. Off by default, so every vacancy is returned |
| Include description | Adds the full vacancy text. On by default |

#### Large runs

The site answers at most 10,000 vacancies per search. When **Max results** is above 10,000, the actor splits the search by category, contract type and education level and removes duplicates, so a run of 90,000 vacancies is possible.

### What data does the Nationale Vacaturebank Scraper extract?

| Field | Description |
|---|---|
| `jobId` | Vacancy UUID |
| `url` | Link to the vacancy page |
| `title`, `functionTitle` | Vacancy title and job function |
| `company`, `companyType` | Company name and whether it is an employer or a recruiter |
| `companyWebsite`, `companyLogoUrl` | Company website and logo, when given |
| `city`, `province`, `postalCode` | Work location |
| `latitude`, `longitude` | Work location coordinates |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | Salary range, when the employer discloses it |
| `contractTypes` | Contract types, for example Vast or Tijdelijk |
| `workingHoursMin`, `workingHoursMax` | Hours per week |
| `workingPlace` | Hybride when the vacancy is hybrid |
| `educationLevels`, `careerLevel` | Education level and Starter or Ervaren |
| `categories`, `industries` | Site categories and employer industries |
| `description` | Vacancy text as plain text |
| `applyUrl`, `applyMethod` | Application link and whether it is internal or external |
| `publishedAt`, `expiresAt` | Publication window |
| `scrapedAt` | Time of the scrape |

Names, e-mail addresses and phone numbers of recruiters are not collected.

### Example output

```json
{
  "jobId": "0704ddd9-cf0b-43fb-aebc-03b23e4e0bcb",
  "url": "https://www.nationalevacaturebank.nl/vacature/0704ddd9-cf0b-43fb-aebc-03b23e4e0bcb/ai-builder",
  "title": "AI Builder",
  "company": "Keuze.nl",
  "companyType": "employer",
  "city": "Utrecht",
  "province": "Utrecht",
  "postalCode": "3581CS",
  "salaryMin": null,
  "salaryMax": null,
  "contractTypes": ["Vast"],
  "workingHoursMin": 40,
  "workingHoursMax": 40,
  "educationLevels": ["HBO"],
  "careerLevel": "Ervaren",
  "categories": ["Automatisering/Internet"],
  "publishedAt": "2026-10-17T22:00:00Z",
  "expiresAt": "2026-12-16T23:00:00Z"
}
```

### Input examples

Software vacancies in Utrecht:

```json
{ "searchQuery": "developer", "location": "Utrecht", "maxResults": 200 }
```

All permanent healthcare vacancies for MBO level:

```json
{ "categories": ["Medisch/Zorg"], "contractType": "Vast", "educationLevel": "MBO", "maxResults": 5000 }
```

The newest vacancies in the whole country, without descriptions:

```json
{ "includeDescription": false, "maxResults": 1000 }
```

### Use cases

- Labour market monitoring: vacancy counts per city, category or employer over time.
- Recruitment agencies: find which employers advertise directly and which go through recruiters.
- Salary research: salary ranges by function, region and education level.
- Job aggregators: a daily feed of Dutch vacancies with coordinates and apply links.
- Competitor tracking: see which roles a company hires for.

### How much does it cost?

The actor is billed per result: a small fee per run start and a fee per vacancy returned, as shown on the pricing tab. The most a run can cost in results is the per-result price times **Max results**. A run of 100 vacancies takes a few seconds and uses less than one cent of compute. The usage cost of a run settles after the run has SUCCEEDED, so it does not show on a run that is still in progress.

### Data source and limits

The data comes from the public vacancy search of Nationale Vacaturebank. The actor does not log in and does not collect personal contact details. Salary is empty when the employer does not disclose it. The same vacancy can appear on the site under several recruiters, and each listing is returned as the site shows it. City names must match the site spelling, for example `Den Haag`. The actor capitalises each word for you.

### FAQ

**Does it work without a proxy?** Yes. The site's vacancy search answers plain requests.

**How fresh is the data?** Each run reads the live site, so results are current at the time of the run.

**Can I get every vacancy?** Yes. Set **Max results** to 100,000 and leave the filters empty. The run takes a few minutes per 10,000 vacancies.

**Why is the salary empty for some vacancies?** Many employers do not publish a salary. The field is empty in that case.

**Can I run it on a schedule?** Yes, use Apify schedules and compare runs by `jobId`.

### Support

Questions or a missing field? Open an issue on the actor page and we reply quickly.

# Actor input Schema

## `searchQuery` (type: `string`):

Job title or keyword in Dutch or English, for example 'developer', 'monteur' or 'verpleegkundige'. Leave empty to list the newest vacancies.

## `location` (type: `string`):

Dutch city to filter on, for example 'Utrecht' or 'Den Haag'. Leave empty for the whole Netherlands.

## `categories` (type: `array`):

Only return vacancies in these categories, for example 'Techniek' or 'Medisch/Zorg'. Leave empty for all categories.

## `contractType` (type: `string`):

Only return vacancies with this contract type. Leave empty for all.

## `educationLevel` (type: `string`):

Only return vacancies asking for this education level. Leave empty for all.

## `careerLevel` (type: `string`):

Only return vacancies for this career level. Leave empty for all.

## `hybridOnly` (type: `boolean`):

Only return vacancies marked as hybrid work. Off by default: when off, every vacancy is returned.

## `includeDescription` (type: `boolean`):

Add the full vacancy text as plain text. Turn off for a smaller dataset.

## `maxResults` (type: `integer`):

Maximum number of vacancies to return. The site holds about 90,000 active vacancies. Above 10,000 the actor splits the search by category, contract type and education level so nothing is cut off.

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

Not required. The site's vacancy API answers plain requests. The field is accepted so that saved inputs from other actors keep working.

## Actor input object example

```json
{
  "searchQuery": "developer",
  "hybridOnly": false,
  "includeDescription": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "developer",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/nationalevacaturebank-scraper").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 = {
    "searchQuery": "developer",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/nationalevacaturebank-scraper").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 '{
  "searchQuery": "developer",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/nationalevacaturebank-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/nationalevacaturebank-scraper"
        }
    }
}
```

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/7Kqi3ypRs0niW3hnx/builds/lcbzRFmhKjZ5he7a3/openapi.json
