Nationale Vacaturebank Scraper avatar

Nationale Vacaturebank Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Nationale Vacaturebank Scraper

Nationale Vacaturebank Scraper

Scrape 105,000+ listings from Nationale Vacaturebank — the #1 Dutch job board. Structured output: title, company, salary, contract type & full descriptions (HTML, text, Markdown). Deduplication, repost detection & daysOld filtering. No API key required.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Unfenced Group

Unfenced Group

Maintained by Community

Actor stats

1

Bookmarked

29

Total users

9

Monthly active users

a day ago

Last modified

Share

Nationale Vacaturebank Scraper

Extract structured job listings from Nationale Vacaturebank — the largest Dutch job board with 100,000+ active vacancies. Filter by keyword, city, radius, work mode (remote/hybrid/on-site), contract type, education level, career level, salary minimum, and more.

No API key required. No login. Runs entirely in the cloud.


What You Get

Every scraped record contains 35 structured fields:

CategoryFields
Identityid, referenceId, url
Job basicstitle, functionTitle, dcoTitle, categories, industries
Work modeworkingPlace (Werken op afstand / Hybride / Werken op locatie)
Employercompany, companyType, companyWebsite, logoUrl
RecruitercontactName, contactEmail, contactPhone
Locationcity, municipality, zipCode, province, latitude, longitude
Salarysalary (display text), salaryMin, salaryMax, salaryType
Hourshours (display text), hoursMin, hoursMax
ContractcontractType, employmentType, educationLevel, careerLevel
ApplyapplyOption, applyUrl
Descriptiondescription (HTML), descriptionText (plain), descriptionMarkdown
DatespublishDate, expiryDate, scrapedAt
SignalsnumberOfApplies

Sample Output

{
"id": "16c66447-14f9-442c-ba7b-87469b45764e",
"title": "Senior Software Engineer",
"url": "https://www.nationalevacaturebank.nl/vacature/16c66447-.../senior-software-engineer",
"company": "TechCorp BV",
"companyType": "direct_employer",
"companyWebsite": "https://www.techcorp.nl",
"workingPlace": "Hybride",
"city": "Amsterdam",
"municipality": "Amsterdam",
"zipCode": "1014AB",
"province": "Noord-Holland",
"latitude": 52.3794,
"longitude": 4.8975,
"salary": "€4.500 - €6.000",
"salaryMin": 4500,
"salaryMax": 6000,
"salaryType": "monthly",
"contractType": "Vast",
"educationLevel": "HBO",
"careerLevel": "Ervaren",
"applyOption": "internal",
"applyUrl": "https://www.nationalevacaturebank.nl/solliciteer/...",
"numberOfApplies": 14,
"publishDate": "2026-06-08",
"expiryDate": "2026-08-08",
"description": "<p>Wij zoeken een...</p>",
"descriptionText": "Wij zoeken een...",
"descriptionMarkdown": "Wij zoeken een...",
"scrapedAt": "2026-06-10T09:00:00.000Z"
}

Input Parameters

ParameterTypeDefaultDescription
searchQuerystringJob title or keyword, e.g. developer, marketing manager
citystringCity to search in, e.g. Amsterdam, Rotterdam
radiusselect40Search radius around city: 5, 10, 20, 30, 40, 50, 75, 100 km
workingPlaceselectWerken op afstand (remote), Hybride, or Werken op locatie (on-site)
contractTypeselectVast / Tijdelijk / Freelance / ZZP / Bijbaan / Stage / Interim / Vrijwilliger / Vakantiewerk / Leer-werk / Thuiswerk / Franchise
educationLevelselectVMBO / MBO / HBO / WO / VWO / HAVO / LBO / Lagere school / Postdoctoraal
careerLevelselectGeen ervaring / Starter / Ervaren / Leidinggevend / Senior management / Directie
salaryMinintegerMinimum monthly salary in €, e.g. 3000
sortselectrelevancerelevance, date, popularity, or distance
maxResultsinteger5Maximum number of vacancies to return (1–5,000)
daysOldintegerOnly return vacancies posted within this many days
skipRepostsbooleanfalseSkip vacancies already seen in a previous run (for incremental daily feeds)
startUrlsarrayScrape specific vacancy URLs instead of searching

Use Cases

Labour Market Research

Pull vacancies across regions and sectors for salary analysis, education-level segmentation, and occupation-level supply/demand mapping using the dcoTitle canonical job title and categories/industries tags.

Recruitment Intelligence

Track competitor job postings by company. Monitor time-on-market via publishDate vs expiryDate. Gauge demand by numberOfApplies. Filter by workingPlace to compare remote-vs-office trends.

Lead Generation

Every record includes contactEmail, contactPhone, and contactName when the recruiter publishes them. companyWebsite gives you the employer's domain for further enrichment.

Daily Job Alerts

Enable skipReposts: true and schedule the actor to run daily. Only net-new vacancies are emitted on each run. Combine with daysOld: 1 for a clean daily delta.

ATS / Job Board Feeds

The applyOption field tells you whether candidates apply internally (on NVB) or are redirected externally. description, descriptionText, and descriptionMarkdown give you the full job text in whichever format your system requires.


Code Examples

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('unfenced-group/nationale-vacaturebank-scraper').call({
searchQuery: 'developer',
city: 'Amsterdam',
radius: '40',
workingPlace: 'Hybride',
contractType: 'vast',
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Daily Incremental Feed (Apify Scheduler)

await client.schedules().create({
name: 'nvb-daily',
cronExpression: '0 6 * * *',
isEnabled: true,
actions: [{
type: 'RUN_ACTOR',
actorId: 'unfenced-group/nationale-vacaturebank-scraper',
runInput: {
searchQuery: 'software engineer',
city: 'Utrecht',
maxResults: 500,
skipReposts: true,
daysOld: 2,
},
}],
});

Python

from apify_client import ApifyClient
client = ApifyClient(token="YOUR_API_TOKEN")
run = client.actor("unfenced-group/nationale-vacaturebank-scraper").call(run_input={
"searchQuery": "data analyst",
"city": "Rotterdam",
"workingPlace": "Werken op afstand",
"educationLevel": "hbo",
"maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], "|", item["company"], "|", item.get("workingPlace"), "|", item.get("salaryMin"))

Tips for Large-Scale Scraping

Segment by city for national coverage NVB returns up to ~5,000 results per search. For complete national coverage, run parallel searches across: Amsterdam, Rotterdam, Utrecht, Den Haag, Eindhoven, Groningen, Tilburg, Almere, Breda, Nijmegen.

Use daysOld + skipReposts for incremental pipelines Set skipReposts: true and daysOld: 2 on a daily schedule. The actor tracks seen vacancy IDs across runs and only emits new listings.

Filter workingPlace before filtering by city Remote vacancies often list a nominal HQ city but are genuinely national. Filter workingPlace: "Werken op afstand" without a city filter to capture all remote roles across the Netherlands.

Identify direct employers vs. recruitment agencies companyType distinguishes between direct_employer and intermediary (staffing/recruitment agency). Combine with contactEmail to build targeted outreach lists.


Technical Notes

  • Architecture: Direct HTTP requests to the NVB internal JSON API — no browser, no Playwright.
  • Geographic precision: Haversine post-filter cross-checks API distance results using GPS coordinates, with city-name fallback for listings that omit coordinates.
  • Memory: Default 1024 MB.
  • Proxy: Datacenter proxies. NVB does not require residential proxies.
  • Rate limits: The actor uses polite delays between page requests and backs off automatically on 429 responses.

FAQ

Does this require a Nationale Vacaturebank account? No. All scraped data is from publicly accessible listings.

How fresh is the data? The data reflects what is live on the site at the moment of the run. Schedule the actor for up-to-date results.

Why is contactEmail sometimes null? Recruiter contact details are only published when the employer opts in. Many vacancies list only an application URL.

Can I filter by multiple contract types at once? Currently one filter value per run. For multi-filter collection, run parallel actor instances.

Why does salary say null? Salary disclosure is optional on NVB. When the employer doesn't publish a figure, all salary fields are null.


Need a custom scraper?

We build scrapers for any website — delivered as a private Apify Actor, ready to run in minutes.

👉 Request a custom scraper at unfencedgroup.nl

Pay only for results. No subscriptions. No setup costs.