Werkzoeken.nl Scraper
Pricing
from $1.20 / 1,000 results
Werkzoeken.nl Scraper
Scrape job listings from Werkzoeken.nl — a comprehensive Dutch job aggregator. Filter by keyword, location, contract type and working hours. Full job descriptions in HTML, text and Markdown. Repost detection and daysOld filtering. No API key required.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
2
Bookmarked
14
Total users
7
Monthly active users
4 days ago
Last modified
Categories
Share

Extract job listings from werkzoeken.nl at scale, in a clean, consistent structure ready for analysis, job boards, recruiting tools and market research. No API key required.
Why this scraper?
🎯 Built for the Netherlands
A dedicated Dutch scraper, not a global tool with a country dropdown. Search, locations and currency (EUR) are tuned for werkzoeken.nl.
📄 Complete job data
Full job title and description, direct listing URL and publish date for every record.
💶 Salary data
Salary information parsed from the listing where the employer publishes it, in EUR. Missing salaries are returned as null, never guessed.
🏢 Company details
Hiring company name plus the profile details the source publishes, such as logo and company page.
📍 Location
City, region and country for every listing, with radius filtering around a chosen location.
🔁 Repost & change detection
Every record carries isRepost and changeStatus, so daily feeds return genuinely new jobs instead of reposted duplicates.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "developer" | Job title, keyword, or profession — e.g. developer, chauffeur, verpleegkundige. |
location | string | (empty) | City or region — e.g. Amsterdam, Rotterdam, Den Haag. |
radius | string | (empty) | Search radius around location in kilometres — e.g. 10, 25, 50. |
contractType | string | "Loondienst (vast)" | Filter by contract type — e.g. fulltime, parttime, freelance, temporary. |
hoursPerWeek | string | (empty) | Filter by working hours per week — e.g. 32, 40. |
educationLevel | string | (empty) | Required education level — e.g. MBO, HBO, WO. |
employerType | string | (empty) | Filter by employer type — e.g. direct, uitzendbureau. |
minSalary | string | (empty) | Minimum monthly salary filter — e.g. 2500, 3000. |
daysOld | string | (empty) | Only return jobs posted within this many days — e.g. 7 for this week, 1 for today. |
sortBy | string | (empty) | Sort order for results. |
fetchDetails | boolean | false | Visit each listing page to get the full job description (HTML, plain text, Markdown). Slower but yields much richer output. |
skipReposts | boolean | false | Exclude listings detected as reposts of previously seen jobs (same fingerprint). |
incrementalMode | boolean | false | Only emit NEW, UPDATED, and REAPPEARED jobs compared to the previous run. Run on a schedule to get a daily feed of changes without reprocessing the full dataset. |
stateKey | string | (empty) | Optional stable identifier for the tracked search. Leave empty to auto-derive from your search inputs — different keyword/location combinations get isolated state automatically. |
compact | boolean | false | Return core fields only (id, title, company, city, contractType, salary, url, changeStatus). Reduces payload size for AI-agent and MCP pipelines. |
descriptionFormat | string | "all" | Choose which description representation to include. all keeps HTML + plain text + Markdown; the others drop the variants you don't need. |
descriptionMaxLength | integer | 0 | Truncate description fields to this many characters. 0 = no truncation. Useful for LLM context limits. |
excludeEmptyFields | boolean | false | Drop null, empty-string, and empty-array fields from each record before saving. Produces smaller, cleaner payloads for AI agents and dashboards. |
telegramToken | string | (empty) | Telegram bot token from @BotFather. Required for Telegram notifications. |
telegramChatId | string | (empty) | Telegram chat or channel ID where alerts are sent — e.g. -100123456789 for a private group or @yourchannel. |
discordWebhookUrl | string | (empty) | Discord incoming webhook URL. Get one from Server Settings → Integrations → Webhooks. |
slackWebhookUrl | string | (empty) | Slack incoming webhook URL. Create at api.slack.com/messaging/webhooks. |
webhookUrl | string | (empty) | Receives a POST with { jobs: [...], meta: { total, searchQuery, location } }. Works with n8n, Make, Zapier, or any custom backend. |
webhookHeaders | object | (empty) | Optional headers sent with the webhook POST — e.g. {"Authorization": "Bearer xyz"}. |
notificationLimit | integer | 5 | Maximum jobs included in each notification message (1–20). Extra jobs stay in the dataset; the notification shows a summary line. |
notifyOnlyChanges | boolean | false | When incremental mode is on, only send notifications for NEW, UPDATED, and REAPPEARED jobs. Has no effect outside incremental mode. |
maxItems | integer | 100 | Maximum number of results to return. Set to 0 for unlimited. |
Output schema
Every field below is present on every record. Fields the source does not publish for a given job are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
id | string | Unique job ID (wznl prefix + vacancy ID) |
vacancyId | string | Raw vacancy ID from werkzoeken.nl |
title | string | Job title |
url | string | Direct link to the listing |
company | string | Hiring company or recruiter name |
companyType | string | Employer type (e.g. direct, uitzendbureau) |
city | string | City or region |
contractType | string | Contract type (e.g. fulltime, parttime) |
hoursType | string | Working hours type |
experience | array | Required experience levels |
education | string | Required education level |
salaryMin | number | Minimum monthly salary (€) |
salaryMax | string | Maximum monthly salary (€) |
salaryType | string | Salary period — always monthly |
publishDate | string | ISO date the listing was published |
ageLabel | string | Original age label from the site (e.g. vandaag, 3 dagen geleden) |
fingerprint | string | Cross-run dedup hash (from site's data-hash attribute) |
description | string | Full job description as HTML |
descriptionText | string | Full job description as plain text |
descriptionMarkdown | string | Full job description as Markdown |
isRepost | boolean | Whether this listing has been seen before under the same fingerprint |
originalPublishDate | string | Publication date of the first-seen version (reposts only) |
originalUrl | string | URL of the first-seen version (reposts only) |
changeStatus | string | NEW, UPDATED, UNCHANGED, or REAPPEARED (only with incrementalMode) |
contentHash | string | MD5 of title + company + salary + location — stable content identifier |
scrapedAt | string | ISO 8601 timestamp of when this record was scraped |
source | string | Always werkzoeken.nl |
Example record
{"id": "wznl15660615","vacancyId": "15660615","title": "Verpleegkundige team flexpool Harderwijk en omgeving","url": "https://www.werkzoeken.nl/vacature/15660615-verpleegkundige-team-flexpool-harderwijk-en-omgeving/","company": "Zorggroep Noordwest- Veluwe","companyType": "Directe werkgever","city": "Harderwijk","contractType": "Loondienst (vast)","hoursType": "33 - 40 uur","experience": ["Ervaren","Expert","Starter"],"education": "MBO","salaryMin": 3157,"salaryMax": null,"salaryType": "monthly","publishDate": "2026-06-12","ageLabel": "21 dagen geleden","fingerprint": "a97491cd3cfa6d9c0d32b3a1964131f90ca1a9105d748da9a298cd0f7a987a4f","description": null,"descriptionText": null,"descriptionMarkdown": null,"isRepost": false,"originalPublishDate": null,"originalUrl": null,"changeStatus": null,"contentHash": "a97491cd3cfa6d9c0d32b3a1964131f90ca1a9105d748da9a298cd0f7a987a4f","scrapedAt": "2026-07-03T17:26:53.373Z","source": "werkzoeken.nl"}
Examples
Search for schoonmaker roles in Amsterdam:
{"searchQuery": "schoonmaker","location": "Amsterdam","maxItems": 100}
Filter by contract type:
{"searchQuery": "schoonmaker","location": "Amsterdam","maxItems": 100,"contractType": "Loondienst (vast)"}
Larger run with a hard cap:
{"searchQuery": "schoonmaker","location": "Amsterdam","maxItems": 500}
Daily feed (run on a schedule):
{"searchQuery": "schoonmaker","daysOld": 1,"skipReposts": true,"maxItems": 500}
Schedule this input to run once a day in the Apify Scheduler — each run returns only jobs posted in the last 24 hours.
💰 Pricing
$1.49 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.49 |
| 10,000 | ~$14.90 |
| 100,000 | ~$149 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.90 per 1,000 at the highest tier. Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |
Known limitations
- Salary is only returned when the employer publishes it — many listings carry
nullsalary fields. - Company details vary per listing; the scraper returns what the source publishes and never invents data.
- Very large result sets are bounded by the source's own paging limits.
- Listings can be removed by the source at any time, so a small share of URLs may expire shortly after scraping.
Technical details
- Source: werkzoeken.nl — the Netherlands job listings
- Coverage: everything the public search exposes, filterable via the input parameters above
- Retry: automatic retry on network errors with exponential backoff
Rate this actor
If this scraper does its job, a short review on the Reviews tab helps other users find it. Something not working? Open an issue on the Issues tab instead — issues get fixed.
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl