# Werk.nl Scraper: Netherlands UWV Government Jobs & Vacatures (`santamaria-automations/werk-nl-scraper`) Actor

Extract job listings from werk.nl, the Netherlands' national government employment service (UWV Werkbedrijf). Returns title, company, location, province, employment type, salary, full description and contact details. Covers all 12 Dutch provinces.

- **URL**: https://apify.com/santamaria-automations/werk-nl-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job serp results

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

## Werk.nl Scraper: Netherlands UWV Government Jobs

Extract job listings from **werk.nl**, the Netherlands' national government employment service operated by UWV (Uitvoeringsinstituut Werknemersverzekeringen). Covers all **12 Dutch provinces** and returns rich structured data including salary, employment type, full description, and contact details.

### What you get

Each job listing includes:

| Field | Description |
|-------|-------------|
| `id` | UWV reference number |
| `title` | Job title |
| `company_name` | Employer name |
| `company_website` | Employer website (when available) |
| `location` | City name |
| `country` | Always `NL` |
| `region` | Dutch province (Noord-Holland, Zuid-Holland, Utrecht, etc.) |
| `employment_type` | permanent, temporary, internship, volunteer, secondment |
| `workplace_type` | on-site, hybrid, or remote |
| `min_hours` / `max_hours` | Weekly hours range |
| `study_level` | Required education level (MBO, HBO/bachelor, WO/master) |
| `salary_min` / `salary_max` | Parsed EUR amounts |
| `salary_period` | month, year, week, hour |
| `salary_text` | Raw salary text as advertised |
| `description` | 500-character snippet |
| `description_full` | Full plain-text description |
| `apply_url` | Direct application link |
| `contact_emails` / `contact_phones` | Contact details |
| `posted_at_datetime` | ISO 8601 publication date |
| `search_query` | The query that matched this listing |

### Sample output

```json
{
  "_type": "job",
  "id": "70659580",
  "title": ".NET Software Engineer",
  "company_name": "Noir",
  "location": "Amsterdam",
  "country": "NL",
  "region": "Noord-Holland",
  "employment_type": "temporary",
  "salary_min": 5400,
  "salary_currency": "EUR",
  "salary_period": "month",
  "salary_text": "EUR 5400 per month",
  "min_hours": null,
  "max_hours": null,
  "study_level": "HBO/bachelor",
  "description": "Location: Amsterdam, Netherlands. Rate: EUR 5000-6000 per month + Bonus. Type: Permanent. Global Fitness Movement needs a .NET Software Engineer...",
  "description_full": "Job Highlights\nLocation: Amsterdam, Netherlands\nRate: EUR 5000-6000 per month\nType: Permanent\n...",
  "apply_url": "https://careers4a.com/search/jobs/5553514/NET-Software-Engineer.html",
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": ["https://careers4a.com/..."],
  "posted_at_text": "26 August 2026",
  "posted_at_datetime": "2026-08-26T00:00:00Z",
  "job_url": "https://www.werk.nl/nl/vacatures/70659580",
  "source_platform": "werk.nl",
  "scraped_at": "2026-08-25T07:00:00Z"
}
```

### Input configuration

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string\[] | - | Keywords in Dutch or English. Each runs as a separate search. |
| `location` | string | - | City or region filter (Amsterdam, Rotterdam, Utrecht, etc.) |
| `searchUrls` | string\[] | - | Direct werk.nl search URLs |
| `maxResults` | integer | 100 | Global cap across all queries |
| `maxResultsPerQuery` | integer | 100 | Per-query cap |
| `includeJobDetails` | boolean | true | Fetch full description, salary and contact details per listing |
| `includeCompanyDetails` | boolean | false | Include company website (implies includeJobDetails) |
| `maxConcurrency` | integer | 5 | Max concurrent detail requests |

### Netherlands employment types

werk.nl uses Dutch contract terminology mapped to English:

| Dutch | English |
|-------|---------|
| Vast | permanent |
| Tijdelijk | temporary |
| Stage | internship |
| Vrijwilligerswerk | volunteer |
| Detachering | secondment |
| Leerbaan | apprenticeship |

### 12 Dutch provinces

The `region` field maps city names to provinces: Noord-Holland, Zuid-Holland, Utrecht, Noord-Brabant, Gelderland, Overijssel, Flevoland, Friesland, Groningen, Drenthe, Zeeland, Limburg.

### Pricing

This actor uses Pay Per Event (PPE) billing:

| Event | Price | Description |
|-------|-------|-------------|
| `actor-start` | $0.001 | Charged once per run |
| `job-serp-result` | $0.003 | Job listing from search results (SERP only) |
| `job-detail-result` | $0.005 | Full job with description, salary and contacts |

**Example costs:**

- 1,000 jobs (SERP only): ~$3.00 + $0.001 start
- 1,000 jobs (with details): ~$5.00 + $0.001 start

New Apify accounts get a $5 free monthly credit to test actors at no cost.

### Technical notes

The scraper uses a two-step anonymous session bootstrap with werk.nl's public vacancy API (no account required). All data is fetched via JSON API calls. The actor uses 128 MB RAM and requires no browser.

### Related actors

- [job-feed](https://apify.com/nanoscrape/job-feed) - Aggregate jobs from 20+ platforms
- [career-site-jobs-scraper](https://apify.com/nanoscrape/career-site-jobs-scraper) - Extract from company career pages
- [website-job-extractor](https://apify.com/nanoscrape/website-job-extractor) - Jobs from any website
- [indeed-scraper](https://apify.com/nanoscrape/indeed-scraper) - Indeed Netherlands jobs
- [vdab-be-scraper](https://apify.com/nanoscrape/vdab-be-scraper) - Belgium Flanders jobs
- [forem-be-scraper](https://apify.com/nanoscrape/forem-be-scraper) - Belgium Wallonia jobs

### Support

Questions? Open an [issue](../../issues) or email contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more keyword queries in Dutch or English (for example 'software engineer', 'verpleegkundige', 'chauffeur', 'accountant'). Each runs as a separate search. Results are deduplicated.

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

Dutch city or region to filter by (for example 'Amsterdam', 'Rotterdam', 'Utrecht', 'Eindhoven', 'Den Haag'). Applied to all keyword searches.

## `searchUrls` (type: `array`):

Paste one or more werk.nl search URLs. Go to werk.nl, run a search, and copy the URL.

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

Total cap across all queries and URLs.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per search URL or keyword.

## `includeJobDetails` (type: `boolean`):

When true, fetches each job detail for salary, full description and contact details. Returns richer data at a slightly higher cost.

## `includeCompanyDetails` (type: `boolean`):

Also attempt to extract company website from the job detail. Implies includeJobDetails=true.

## `maxConcurrency` (type: `integer`):

Maximum concurrent detail requests. Only used when Fetch job detail pages is on.

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "location": "Amsterdam",
  "maxResults": 10,
  "maxResultsPerQuery": 10,
  "includeJobDetails": true,
  "includeCompanyDetails": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of Dutch job listings from werk.nl. Each row has: id, title, company\_name, company\_website, location, country (NL), region (province), salary\_min, salary\_max, salary\_currency, salary\_period, salary\_text, employment\_type, workplace\_type, min\_hours, max\_hours, study\_level, description, description\_full, description\_html, job\_url, apply\_url, contact\_emails, contact\_phones, contact\_urls, posted\_at\_text, posted\_at\_datetime, search\_query, scraped\_at.

# 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 = {
    "searchQueries": [
        "software engineer"
    ],
    "location": "Amsterdam",
    "maxResults": 10,
    "maxResultsPerQuery": 10,
    "includeJobDetails": false,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/werk-nl-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 = {
    "searchQueries": ["software engineer"],
    "location": "Amsterdam",
    "maxResults": 10,
    "maxResultsPerQuery": 10,
    "includeJobDetails": False,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/werk-nl-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 '{
  "searchQueries": [
    "software engineer"
  ],
  "location": "Amsterdam",
  "maxResults": 10,
  "maxResultsPerQuery": 10,
  "includeJobDetails": false,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/werk-nl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/werk-nl-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/SaAQbAtN41dxwniTz/builds/4RbnDfbpLdGz6cZOn/openapi.json
