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

Export job listings from nationalevacaturebank.nl, one of the largest Dutch job boards. Search by keyword, location and distance, contract type, education, career level, category, industry, salary and posting date, or paste search, listing and job links. Get employer, recruiter contact, address, salary, hours, description and apply link. No login needed.
Export job listings from nationalevacaturebank.nl, one of the largest job boards in the Netherlands (around 95,000 live vacancies). Search by keyword, city or postcode with a radius, contract type, education and career level, job category, industry, workplace, salary, hours and posting date, or paste search, listing and job links. Every row comes with the employer, the recruiter's name, email and phone where the ad names them, the full address with coordinates, salary, hours, the full description and the apply link. No login, no cookies, and you pay only for the jobs you save.
developer, verpleegkundige, chauffeur), or paste Nationale Vacaturebank links: a search (/vacature/zoeken?query=...), a listing page (/vacatures/functie/developer/in-amsterdam) or single jobs.| Field | What it does |
|---|---|
searchQueries | Search terms, one search each. * lists every job (use filters to narrow it). |
startUrls | Search links (https://www.nationalevacaturebank.nl/vacature/zoeken?query=developer&location=Utrecht&distance=20), listing pages (/vacatures/functie/developer/in-amsterdam, /vacatures/branche/ict, /vacatures/werkgever/<employer>) or job links (/vacature/<job id>/<title>). |
maxResults | Jobs to save in total (default 20, 0 = no limit). |
maxResultsPerSearch | Optional cap for each search term or link. |
location / distanceKm | A Dutch city, postcode or province, and the radius around a city or postcode (only the city, 10 to 100 km, or the whole country). |
contractType | Vast, Tijdelijk, Interim, Stage, Freelance, ZZP, Bijbaan and more. |
educationLevel / careerLevel | MBO, HBO, WO, …; Starter, Ervaren, Leidinggevend, … |
category / industry | The site's job categories (Functiegroep) and industries (Branche). |
workingPlace / companyType / companyName | Hybrid, remote or on site; employers or agencies; one employer. |
postedWithin / salaryMin / workingHoursMin / workingHoursMax | Last 24 hours to last month; €1,500+ to €7,000+ a month; hours per week. |
sortBy | Relevance, newest first, most popular or distance. |
descriptionFormat / descriptionMaxLength / compact / excludeEmptyFields | Make rows smaller: one description format, shorter descriptions, core fields only, no empty fields. |
{
"searchQueries": ["developer", "verpleegkundige"],
"location": "Utrecht",
"distanceKm": "20",
"contractType": ["Vast"],
"postedWithin": "last week",
"maxResults": 100
}
One row per job.
| Field | Description |
|---|---|
jobId, title, url | Job id, job title and the job's page on the site. |
company, companyType, companyWebsite, companyPageUrl, logoUrl | Employer or agency (direct_employer or human_resource_manager), website, its job page on the site and logo. |
contactName, contactEmail, contactPhone, contactStreet, contactPostalCode, contactCity, contactWebsite | The contact person and address named in the ad. |
street, postalCode, city, municipality, province, country, latitude, longitude, workingPlace | Where the job is, and hybrid, remote or on site. |
salaryMin, salaryMax, salaryType, salaryFormatted | Salary range in euros (monthly, hourly, yearly or unspecified). |
workingHoursMin, workingHoursMax, workingHoursFormatted, employmentType | Hours per week; FULL_TIME when 32+ hours are possible, PART_TIME when fewer than 32 are, plus INTERN, TEMPORARY, CONTRACTOR or VOLUNTEER from the contract type. |
contractType, contractTypes, educationLevel, educationLevels, careerLevel | Contract, education and career level as the site shows them. |
categories, industries, functionTitle, dcoTitle, iscoCode | Job category, industry, the site's standard job title and the ISCO occupation code. |
description, descriptionHtml, descriptionMarkdown | The full job ad as plain text, HTML and Markdown. |
publishDate, expiryDate | When the ad was placed and when it expires. |
applyUrl, applyOption, directApply, numberOfApplies | Where to apply, whether you apply on the site itself, and how many applications the site counted. |
extractedEmails, extractedPhones, extractedUrls, socialProfiles | Contacts and links found in the ad text. |
isHighlighted, hasVideo, searchQuery, searchUrl, contentHash, scrapedAt, source | Ad options, which search found the job, a hash of the ad content for change tracking, and when. |
Example row (from a test run; long texts shortened, contact person replaced with a fictional one):
{
"jobId": "92519bcd-28ba-4946-8b36-95e1e9864a9a",
"title": "Backend developer",
"company": "Proland",
"companyType": "direct_employer",
"companyWebsite": "https://www.proland.nl/",
"contactName": "Jan de Vries",
"contactEmail": "jan.devries@example.nl",
"contactPhone": "085 1234567",
"contactStreet": "Keizersgracht 241",
"contactPostalCode": "1016 EA",
"contactCity": "AMSTERDAM",
"city": "Sneek",
"province": "Friesland",
"municipality": "SUDWEST-FRYSLAN",
"postalCode": "8603CL",
"street": "Leeuwarderweg",
"latitude": 53.041327,
"longitude": 5.666939,
"country": "NL",
"workingPlace": "Hybride",
"salaryMin": 3400,
"salaryMax": 4200,
"salaryType": "unspecified",
"salaryFormatted": "€3.400 - €4.200",
"contractType": "Vast",
"employmentType": ["FULL_TIME"],
"educationLevel": "MBO",
"educationLevels": ["MBO", "HBO"],
"careerLevel": "Ervaren",
"workingHoursMin": 32,
"workingHoursMax": 36,
"workingHoursFormatted": "32 - 36 uur",
"categories": ["Automatisering/Internet"],
"industries": ["Internet", "ICT"],
"dcoTitle": "Backend Developer",
"iscoCode": "2431",
"description": "Bouw jij mee aan de toekomst van Proland?\n\nBij Proland combineren we dienstverlening met slimme technologie …",
"publishDate": "2026-10-01T22:00:00Z",
"expiryDate": "2026-11-29T23:00:00Z",
"url": "https://www.nationalevacaturebank.nl/vacature/92519bcd-28ba-4946-8b36-95e1e9864a9a/backend-developer",
"applyUrl": "https://werkenbij.proland.nl/vacatures/backend-developer",
"applyOption": "external",
"directApply": false,
"numberOfApplies": 21,
"searchQuery": "developer",
"scrapedAt": "2026-10-21T21:30:00Z",
"source": "nationalevacaturebank.nl"
}
You pay $1.00 per 1,000 jobs saved ($0.001 per job), with no start fee, plus a small amount of platform usage (compute and proxy traffic), which is not included in the job price. Example: 1,000 jobs ≈ $1.00 in total ($1.00 for the jobs + about $0.006 platform usage, measured on our test runs); 100 jobs ≈ $0.10. Failed links, jobs that are no longer online and rows you filter out are not charged. Set a maximum total charge on the run and the scraper stops cleanly when it is reached.
Is it legal to scrape Nationale Vacaturebank? The scraper only reads job ads that anyone can see without logging in. Contact persons are named in the ads by the employers and agencies themselves. If you store or contact people, follow the GDPR and Dutch marketing rules.
Do I need an account, cookies or a proxy? No account and no cookies. The default datacenter proxy reaches the site fine; if its exits are refused before any job is found, the run switches to Dutch residential exits by itself.
How many jobs can I get? As many as the site lists. One search shows at most 10,000 jobs; set Maximum jobs to 0 and bigger searches are split by province, job category and contract type automatically, with duplicates removed. The site's order shifts slightly between pages, so the scraper re-reads pages when jobs slipped past: in our tests full searches returned 99.9% or more of the total the site reports (for example 18,903 of 18,910 jobs in Zuid-Holland).
Why are some fields empty? Employers fill in different parts of the ad. In our test samples about half of the jobs had a salary, about three in four a contact email and only a few a phone number or logo. Empty means the ad does not show it.
Can I get only new jobs every day?
Yes: schedule the scraper with Posted within: last 24 hours and send the results to your tools through the API, webhooks or integrations. contentHash changes when an ad's content changes.
Can I use it through the API? Yes. Start runs and read results with the Scrapely API or client libraries; every field above is in the JSON.
employmentType is derived from the hours and contract type; the site does not publish a separate full-time/part-time field.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 employer names, one per line, e.g. 'developer', 'verpleegkundige', 'chauffeur', 'accountmanager'. Each term is its own search. Use * to list every job (narrow it down with the filters below).
startUrlsarrayOptionalNationale Vacaturebank links
Optional. Links copied from nationalevacaturebank.nl: search links (/vacature/zoeken?query=...; the filters in the link are kept), listing pages such as /vacatures/functie/developer/in-amsterdam or /vacatures/branche/ict, or job links (/vacature//...). Links can be mixed with search terms.
maxResultsintegerOptionaldefault 20Maximum jobs
How many jobs to save in total across all searches and links. 0 = no limit. One search on the site shows at most 10,000 jobs; bigger searches are split by province, job category and contract type automatically, so every job can be collected.
maxResultsPerSearchintegerOptionalMaximum jobs per search
Optional cap for each search term or link, so one broad search does not use up the whole run. Empty or 0 = no per-search cap.
locationstringOptionalLocation
A Dutch city (e.g. 'Utrecht', 'Den Haag'), a postcode (e.g. '3511 AB') or a province (e.g. 'Noord-Holland'; write 'provincie Utrecht' for the province rather than the city). Jobs in that place, or within the distance below.
distanceKmenumOptionalDistance from the location
Search radius around a city or postcode. Without a value, only jobs in the city itself (as on the site).
contractTypearrayOptionalContract type
Only jobs with these contract types (any of them).
educationLevelarrayOptionalEducation level
Only jobs asking for these education levels (any of them).
careerLevelarrayOptionalCareer level
Only jobs for these career levels (any of them).
categoryarrayOptionalJob category
Only jobs in these job categories (the site's 'Functiegroep').
industryarrayOptionalIndustry
Only jobs in these industries (the site's 'Branche').
workingPlacearrayOptionalWorkplace
Hybrid, remote or on-site jobs only.
companyTypeenumOptionalAdvertiser
Jobs posted by employers themselves, or by recruitment and staffing agencies.
companyNamestringOptionalEmployer name
Only jobs from this employer, written as on the site (e.g. 'Proland').
postedWithinenumOptionalPosted within
Only jobs placed in this period. Run it on a schedule with 'Last 24 hours' to collect each day's new jobs.
salaryMinenumOptionalMinimum monthly salary (€)
Only jobs paying at least this gross monthly salary (the site's salary steps).
workingHoursMinintegerOptionalMinimum hours per week
Only jobs offering at least this many hours a week (1 to 40).
workingHoursMaxintegerOptionalMaximum hours per week
Only jobs with at most this many hours a week (1 to 40).
sortByenumOptionalSort by
Order of the results. Left empty, a run that fits on one page (up to 500 jobs) keeps the site's own order and bigger runs read newest first, the site's most complete order across pages. 'Distance' needs a city or postcode location.
descriptionFormatenumOptionalDescription format
Which description fields to keep: all three (plain text, HTML and Markdown) or only one.
descriptionMaxLengthintegerOptionalDescription length limit
Cut descriptions to this many characters. Empty or 0 = full text.
compactbooleanOptionalCompact rows
Only the core fields (id, title, employer, place, salary, contract, education, hours, dates, description and links). Handy for AI agents and small exports.
excludeEmptyFieldsbooleanOptionalLeave out empty fields
Drop empty values (null, empty text, empty lists) from each row.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter exits are the default and reach the site fine. If the chosen exits are refused before any job was found, the run switches to Dutch residential exits by itself.
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 |
|---|---|---|
| jobId | string | Job id on Nationale Vacaturebank |
| title | string | null | |
| company | string | null | Employer or agency name |
| companyType | string | null | direct_employer or human_resource_manager (agency) |
| companyWebsite | string | null | |
| companyPageUrl | string | null | The employer's job page on the site |
| contactName | string | null | Recruiter or contact person |
| contactEmail | string | null | |
| contactPhone | string | null | |
| contactStreet | string | null | |
| contactPostalCode | string | null | |
| contactCity | string | null | |
| contactWebsite | string | null | |
| city | string | null | |
| province | string | null | |
| municipality | string | null | |
| postalCode | string | null | |
| street | string | null | |
| latitude | number | null | |
| longitude | number | null | |
| country | string | null | |
| workingPlace | string | null | Hybride, Werken op afstand (remote) or Werken op locatie (on site) |
| salaryMin | number | null | |
| salaryMax | number | null | |
| salaryType | string | null | monthly, hourly, yearly or unspecified |
| salaryFormatted | string | null | |
| contractType | string | null | |
| contractTypes | array | null | |
| employmentType | array | null | FULL_TIME (32+ hours possible), PART_TIME (under 32 hours possible), INTERN, TEMPORARY, CONTRACTOR, VOLUNTEER |
| educationLevel | string | null | |
| educationLevels | array | null | |
| careerLevel | string | null | |
| workingHoursMin | number | null | |
| workingHoursMax | number | null | |
| workingHoursFormatted | string | null | |
| categories | array | null | |
| industries | array | null | |
| functionTitle | string | null | |
| dcoTitle | string | null | The site's standard job title |
| iscoCode | string | null | ISCO occupation code |
| description | string | null | Plain text |
| descriptionHtml | string | null | |
| descriptionMarkdown | string | null | |
| publishDate | string | null | |
| expiryDate | string | null | |
| url | string | null | Job page |
| applyUrl | string | null | |
| applyOption | string | null | external, internal or easy |
| directApply | boolean | null | Apply on the site itself |
| numberOfApplies | number | null | |
| logoUrl | string | null | |
| isHighlighted | boolean | null | |
| hasVideo | boolean | null | |
| extractedEmails | array | null | |
| extractedPhones | array | null | |
| extractedUrls | array | null | |
| socialProfiles | object | null | |
| searchQuery | string | null | |
| searchUrl | string | null | |
| scrapedAt | string | null | |
| source | string | null | |
| contentHash | string | null | Changes when the ad's content changes |
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 |
|---|---|---|
| Job | One saved Nationale Vacaturebank job listing. | $0.001 |
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/nationalevacaturebank-scraper').call({
"searchQueries": [
"developer"
],
"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/nationalevacaturebank-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/nationalevacaturebank-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
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.