Nationale Vacaturebank Scraper
Pricing
from $1.50 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
29
Total users
9
Monthly active users
a day ago
Last modified
Categories
Share

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:
| Category | Fields |
|---|---|
| Identity | id, referenceId, url |
| Job basics | title, functionTitle, dcoTitle, categories, industries |
| Work mode | workingPlace (Werken op afstand / Hybride / Werken op locatie) |
| Employer | company, companyType, companyWebsite, logoUrl |
| Recruiter | contactName, contactEmail, contactPhone |
| Location | city, municipality, zipCode, province, latitude, longitude |
| Salary | salary (display text), salaryMin, salaryMax, salaryType |
| Hours | hours (display text), hoursMin, hoursMax |
| Contract | contractType, employmentType, educationLevel, careerLevel |
| Apply | applyOption, applyUrl |
| Description | description (HTML), descriptionText (plain), descriptionMarkdown |
| Dates | publishDate, expiryDate, scrapedAt |
| Signals | numberOfApplies |
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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | — | Job title or keyword, e.g. developer, marketing manager |
city | string | — | City to search in, e.g. Amsterdam, Rotterdam |
radius | select | 40 | Search radius around city: 5, 10, 20, 30, 40, 50, 75, 100 km |
workingPlace | select | — | Werken op afstand (remote), Hybride, or Werken op locatie (on-site) |
contractType | select | — | Vast / Tijdelijk / Freelance / ZZP / Bijbaan / Stage / Interim / Vrijwilliger / Vakantiewerk / Leer-werk / Thuiswerk / Franchise |
educationLevel | select | — | VMBO / MBO / HBO / WO / VWO / HAVO / LBO / Lagere school / Postdoctoraal |
careerLevel | select | — | Geen ervaring / Starter / Ervaren / Leidinggevend / Senior management / Directie |
salaryMin | integer | — | Minimum monthly salary in €, e.g. 3000 |
sort | select | relevance | relevance, date, popularity, or distance |
maxResults | integer | 5 | Maximum number of vacancies to return (1–5,000) |
daysOld | integer | — | Only return vacancies posted within this many days |
skipReposts | boolean | false | Skip vacancies already seen in a previous run (for incremental daily feeds) |
startUrls | array | — | Scrape 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 ApifyClientclient = 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.