
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Export vacancies from werk.nl, the job site of the Dutch public employment service UWV. Search by keyword, place and radius, contract type, education level, working hours, occupation and date, or paste vacancy links. Get employer, place, hours, salary, description, requirements, contact person and apply link. No login needed.
Export vacancies from werk.nl, the job site of UWV, the Dutch public employment service, with more than 260,000 open vacancies across every sector and region. Search by keyword, place and radius, contract type, education level, working hours, occupation and date, or paste vacancy links, and get clean rows with employer, place, hours, salary, description, requirements, the contact person and the apply link. No login and no werk.nl account needed.
verpleegkundige, chauffeur), or paste vacancy links or reference numbers.| Field | What it does |
|---|---|
searchQueries | Job titles, skills or company names, one search each. A reference number reads that vacancy; * lists every vacancy (newest first). |
startUrls | werk.nl vacancy links (https://www.werk.nl/nl/vacatures/71735353) or reference numbers. |
maxResults | How many vacancies to save in total (0 = no limit, up to 100,000). |
location, radiusKm | Dutch place or postcode and the distance around it (default 25 km). |
contractTypes | permanent, possibly-permanent, temporary. |
educationLevels | basisonderwijs, vmbo, havo-vwo, mbo, hbo, wo, not-specified. |
workingHours | office or varying. |
occupation | werk.nl occupation name, e.g. Verpleegkundige. |
postedWithinDays | Only vacancies posted or updated in the last N days. |
sortBy | newest (default) or distance (needs a location). |
includeDetails | Read each vacancy's detail record (on by default). |
incrementalMode | Save only new and updated vacancies on repeat runs. |
{
"searchQueries": ["verpleegkundige"],
"location": "Utrecht",
"radiusKm": 25,
"contractTypes": ["permanent"],
"maxResults": 50
}
| Field | Example | Notes |
|---|---|---|
referenceNumber | 66482564 | werk.nl vacancy number |
title | Toekomstig Verpleegkundig Specialist GGZ | |
companyName, companyWebsite, companyAddress | GGzE, http://www.werkenbijggze.nl | employer |
profession, functionName | Verpleegkundige psychiatrie | werk.nl occupation |
location, postcode, workLocationType | Beek LB, 6191NA, Vaste werklocatie | where the work is |
distanceKm | 2.7 | from your location (location searches) |
contractType | Vast, Tijdelijk, Mogelijk vast | |
minHours, maxHours, workTimes | 36, 36, Kantoortijden | hours per week |
startDate, endDate | 2026-12-31 | contract dates when given |
salary, salaryMin, salaryMax, salaryPeriod, salarySource, salaryText | EUR 4,320 gross per month, werk.nl | werk.nl's salary indication, or the salary stated in the ad text (salarySource: "ad text", with the sentence in salaryText) |
requiredEducation | Hbo/bachelor | |
requiredLanguages, driversLicenses, requiredExperience, otherRequirements | [{"language": "Nederlands", "spoken": "Goed", "written": "Goed"}] | requirements |
description, descriptionTruncated | ad text; see FAQ | |
contactName, contactEmail, contactPhone | the recruiter, when shown | |
applyUrl, applicationMethods | ["online", "email"] | how to apply |
postedDate, modifiedDate, expirationDate | 2026-10-21 | |
isInternship, isLearningPosition | false | stageplaats / leerbaan |
sourceChannel, externalId, postedByEmployerDirectly | DGR | where werk.nl got the vacancy |
extractedEmails, extractedPhones, extractedUrls, socialProfiles | contacts found in the ad text | |
portalUrl | https://www.werk.nl/nl/vacatures/66482564 | |
contentHash, scrapedAt, changeType | change tracking |
Example (from a real run, contact person replaced by a fictional one, description shortened):
{
"referenceNumber": 66482564,
"title": "Toekomstig Verpleegkundig Specialist GGZ",
"companyName": "GGzE",
"companyWebsite": "http://www.werkenbijggze.nl",
"companyAddress": "Boschdijk 771, 5626AB Eindhoven",
"profession": "Verpleegkundige psychiatrie",
"location": "Beek LB",
"postcode": "6191NA",
"countryCode": "NL",
"workLocationType": "Vaste werklocatie",
"contractType": "Tijdelijk",
"startDate": "2026-12-31",
"minHours": 36,
"maxHours": 36,
"workTimes": "Kantoortijden",
"requiredEducation": "Hbo/bachelor",
"salary": "EUR 4,320 gross per month",
"salaryMin": 4320,
"salaryMax": 4320,
"salaryCurrency": "EUR",
"salaryPeriod": "month",
"salarySource": "werk.nl",
"description": "Verpleegkundig Specialist GGZ | Start per januari 2027\nMaak hier de eerste stappen in jouw loopbaan. ...",
"descriptionTruncated": true,
"requiredExperience": [{"profession": "Verpleegkundige psychiatrie", "months": 12, "description": null}],
"contactName": "Sanne de Vries",
"contactEmail": "sanne.devries@example.nl",
"contactPhone": "+31600000000",
"applyUrl": "https://www.werkenbijggze.nl/opleidingsplek/opleidingsplaats-tot-verpleegkundig-specialist-ggz-3968",
"applicationMethods": ["phone", "email", "online"],
"postedDate": "2025-10-05",
"modifiedDate": "2026-10-21",
"expirationDate": "2026-11-20",
"postedByEmployerDirectly": true,
"sourceChannel": "DGR",
"portalUrl": "https://www.werk.nl/nl/vacatures/66482564",
"searchQuery": "verpleegkundige",
"detailsFetched": true
}
You pay $0.85 per 1,000 vacancies ($0.00085 per saved vacancy), with the vacancy details included. There is no start fee and no charge for searches that find nothing.
Platform usage (compute and proxy traffic) is billed on top and is small: we measured about $0.008 per 1,000 vacancies on keyword searches and about $0.011 per 1,000 when listing every vacancy with *.
Set a maximum charge per run and the actor stops cleanly when it is reached; you never pay for more vacancies than were saved.
Is it legal to scrape werk.nl? The actor reads only public vacancy pages that anyone can open without an account. Vacancies can include a recruiter's name, email and phone number; handle that personal data in line with the GDPR and use it only for purposes the recruiter can reasonably expect, such as replying to the vacancy.
Do I need a werk.nl account or a proxy? No account. Datacenter proxies are the default and work for this site; if werk.nl refuses them, the run switches to Dutch residential exits on its own.
How many vacancies can I get? Up to 100,000 per run. werk.nl itself shows at most about 200,000 vacancies per search, more than the whole site holds today.
Why is a field empty? werk.nl only shows what the employer entered. Contact person, start date, languages and driving licences are optional on werk.nl, so they are often empty. When werk.nl's salary field is empty, the actor looks for a salary in the ad text.
Why does the description end with "..."?
For vacancies UWV collects from other job sites, werk.nl itself shows only an excerpt of about 2,000 characters; descriptionTruncated is true and applyUrl links to the full ad. Vacancies posted directly on werk.nl come with their full text.
Can I schedule it or use the API? Yes. Schedule the actor, turn on "Only new and updated vacancies" for daily alerts, and read results through the API or webhooks.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch terms
Job titles, skills or company names, one per line, e.g. 'verpleegkundige', 'chauffeur', 'developer'. Each term is its own search. A vacancy reference number (e.g. 71735353) reads that vacancy. Enter * to list every vacancy (newest first), narrowed by the location and filters below.
startUrlsarrayOptionalVacancy links or reference numbers
Optional. werk.nl vacancy links (https://www.werk.nl/nl/vacatures/71735353) or bare reference numbers, one per line.
maxResultsintegerOptionaldefault 20Maximum vacancies
How many vacancies to save in total across all searches and links. 0 = no limit (up to 100,000).
maxResultsPerSearchintegerOptionalMaximum vacancies per search
Optional cap for each search term and location, so many searches in one run each get their share. 0 = no cap per search (only Maximum vacancies applies).
locationstringOptionalLocation
Dutch city, town or postcode, e.g. 'Amsterdam', 'Utrecht', '1012WZ'. Separate several places with ';'. Leave empty to search all of the Netherlands.
radiusKmintegerOptionaldefault 25Radius around the location (km)
Only vacancies within this distance of the location. The site offers 5, 10, 25, 50, 75, 100, 125, 150 and 300 km; other values are rounded to the nearest of these. 0 = no distance limit (results are still sorted by distance when you choose that sort order).
contractTypesarrayOptionalContract type
Only these contract types. Leave empty for all.
educationLevelsarrayOptionalEducation level
Only vacancies asking for one of these education levels. Leave empty for all.
workingHoursenumOptionalWorking hours
Office hours or varying hours (shifts, evenings, weekends).
occupationstringOptionalOccupation
Only vacancies in this occupation as werk.nl names it, e.g. 'Verpleegkundige', 'Vrachtwagenchauffeur', 'Software developer'. Matched against the occupations of each search (case and accents ignored).
postedWithinDaysintegerOptionalChanged within (days)
Only vacancies posted or updated in the last N days. 0 or empty = any time.
sortByenumOptionaldefault "newest"Sort by
Newest first (the site's default) or nearest first (needs a location).
includeDetailsbooleanOptionaldefault trueInclude vacancy details
Read each vacancy's detail record too: description, salary, start and end date, requirements, languages, driving licences, contact person (name, email, phone), apply link and employer address. Turn off for a faster run with the search data only (title, employer, place, hours, contract, education, date).
compactbooleanOptionaldefault falseCompact output
Save only the key fields (reference number, title, employer, place, contract, hours, salary, education, dates, links). Handy for AI agents and dashboards.
descriptionMaxLengthintegerOptionaldefault 0Description max length
Cut the description to this many characters (0 = full text).
incrementalModebooleanOptionaldefault falseOnly new and updated vacancies
Remember the vacancies of this search between runs and save only vacancies that are new or were updated since the last run (changeType NEW or UPDATED). Ideal for scheduled runs. The first run saves everything it finds.
emitUnchangedbooleanOptionaldefault falseAlso save unchanged vacancies
With 'Only new and updated vacancies' on, also save vacancies that did not change (changeType UNCHANGED).
stateKeystringOptionalMemory name
Optional name for the remembered vacancy list. Leave empty to use one per search setup; set the same name in several tasks to share one memory.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for this site. If they are refused, the run switches to Dutch residential exits automatically.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| referenceNumber | number | null | werk.nl vacancy reference number |
| title | string | null | |
| companyName | string | null | |
| location | string | null | |
| contractType | string | null | |
| minHours | number | null | |
| maxHours | number | null | |
| salary | string | null | |
| salaryMin | number | null | |
| salaryMax | number | null | |
| description | string | null | |
| modifiedDate | string | null | |
| portalUrl | string | null | |
| applyUrl | string | null | |
| contactEmail | string | null | |
| contactPhone | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Vacancy | One saved werk.nl vacancy (vacancy details included). | $0.00085 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/werk-nl-scraper').call({
"searchQueries": [
"verpleegkundige"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/werk-nl-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/werk-nl-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Search term 'chauffeur', Utrecht with the default 25 km radius, permanent contracts only, with details and contacts.
Search term 'verkoper' within 10 km of Rotterdam, MBO education level, nearest first.
Occupation 'Wijkverpleegkundige' from the search list only (no detail reads), for a fast overview.
Every werk.nl vacancy (*) posted or updated in the last 7 days, newest first, with only the key fields.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.