Job listing cards connected by copper wire on a cork board in a Dutch office, with a miniature windmill figurine and warm amber light.

How do you build a vacancy aggregator for the Dutch market?

Idzard Silvius ·

Building a vacancy aggregator for the Dutch job market means collecting job listings from multiple sources, deduplicating them, indexing the data, and presenting it through a fast, relevant search interface. The core technical stack typically combines web crawling, structured data parsing, a search engine like Solr or Elasticsearch, and a scalable cloud infrastructure. This article walks through each layer of that process, from data sourcing to legal compliance to search experience design.

What data sources do Dutch vacancy aggregators rely on?

Dutch vacancy aggregators typically draw from three categories of sources: direct employer career pages, major job boards such as Indeed NL, LinkedIn, Nationale Vacaturebank, and Monsterboard, and XML or JSON job feeds that recruiters and staffing agencies publish. Combining all three gives the broadest coverage of the Dutch job market.

Employer career pages are often the most valuable source because they carry original postings before they syndicate elsewhere. However, they require individual crawl configurations since each site structures its HTML differently. Job boards offer high volume but may restrict automated access through their terms of service, making feed agreements a safer and more sustainable route. Many Dutch recruitment agencies and large corporations publish structured job feeds in formats like HR-XML or JSON-LD, which are far easier to parse reliably than raw HTML. Government job portals such as Werken voor Nederland also expose structured data, making the public sector a relatively straightforward source to integrate.

How does web crawling work for collecting Dutch job listings?

Web crawling for job listings works by sending automated HTTP requests to target URLs, parsing the returned HTML or API responses, extracting structured vacancy data, and storing it for indexing. A crawler follows links across paginated job listing pages and individual vacancy detail pages, applying extraction rules to pull fields like job title, location, employer, salary, and posting date.

For Dutch job aggregation specifically, crawlers need to handle several practical challenges. Many modern career sites load content dynamically via JavaScript, which means a simple HTTP request returns an empty shell rather than actual listings. Headless browser tools like Playwright or Puppeteer solve this by rendering pages the way a real browser would before extracting content. Crawl scheduling matters too: vacancies have a short shelf life, so crawlers typically run on cycles ranging from a few hours to once per day depending on how frequently a source updates. Polite crawling, meaning respecting robots.txt directives and setting reasonable request intervals, keeps your crawler from being blocked and reflects responsible scraping practice.

How do you handle duplicate vacancies from multiple sources?

Duplicate vacancy detection works by generating a fingerprint for each listing based on a combination of fields such as job title, employer name, location, and a normalized version of the job description text. When a new vacancy arrives, its fingerprint is compared against the existing index, and near matches are merged or suppressed rather than stored as separate records.

The challenge is that the same vacancy rarely looks identical across sources. One source may truncate the description, another may add recruiter branding, and a third may use a slightly different job title. Fuzzy matching algorithms, such as cosine similarity on tokenized text or Jaccard similarity on word sets, handle these variations better than exact string comparison. A practical approach is to define a canonical record, typically the one sourced directly from the employer, and treat third-party board versions as secondary signals. This keeps your index clean and prevents the same role from appearing five times in search results, which degrades the user experience significantly.

What are the legal rules for scraping vacancies in the Netherlands?

In the Netherlands, scraping publicly accessible vacancy data is generally permissible under Dutch and EU law, provided you respect the source website’s terms of service, do not scrape personal data without a lawful basis under the GDPR, and do not reproduce copyrighted content wholesale. The legal landscape is shaped by three overlapping frameworks: copyright law, database rights under the Database Directive, and the GDPR.

Copyright applies to the creative expression in a job description, not to factual information like job title or salary. If you reproduce full descriptions verbatim and at scale, you risk infringing the rights of the original publisher. Database rights are more relevant for job aggregation: if a job board has invested substantially in building and maintaining its database, Dutch law may protect that database against systematic extraction even if individual records are not copyrightable. The safest approach is to extract structured fields rather than copy full text, link back to the original source, and where possible secure a data-sharing agreement with major publishers. On the GDPR side, vacancy data is generally not personal data unless it contains contact details for named individuals, but any applicant-side data you collect must be handled with a clear legal basis and appropriate retention limits.

How do you build a search experience on top of aggregated vacancy data?

Building a search experience on aggregated vacancy data requires indexing structured records into a search engine, defining relevance rules, and exposing the index through a fast query interface with filters for location, job category, salary, contract type, and posting date. Apache Solr and Elasticsearch are the most widely used engines for this use case because both handle full-text search, faceted filtering, and geospatial queries natively.

Relevance tuning is where most of the product value lives. A raw keyword match on job title returns poor results because users search with natural language while job titles vary widely across employers. Boosting exact title matches, applying synonym expansion for Dutch occupational terms, and using field weighting to prioritize title over description all improve result quality meaningfully. Location search deserves particular attention in the Dutch context: users expect to filter by city or province and see results within a commutable radius, which requires geocoding each vacancy at index time and running geo-distance queries at search time. Adding autocomplete on job titles and employer names, built from the indexed data itself, significantly reduces zero-result searches.

What infrastructure does a vacancy aggregator need to scale?

A vacancy aggregator needs a distributed crawling layer, a message queue to buffer incoming data, a search index cluster, and a caching layer in front of the query API. At small scale these can run on a single server, but handling millions of listings and thousands of concurrent users requires each component to scale independently.

The crawling layer benefits from horizontal scaling: running multiple crawler workers in parallel across different source domains reduces total collection time without overloading any single source. A message queue such as Apache Kafka or RabbitMQ decouples crawling from indexing, ensuring that a spike in new listings does not overwhelm the indexer. The search cluster itself, whether Solr or Elasticsearch, should run with at least three nodes in production to support replication and avoid single points of failure. For a Dutch job board serving regional traffic, a cloud deployment in a European data center satisfies both latency requirements and GDPR data residency expectations. Incremental indexing, where only changed or new records are reprocessed rather than the full dataset, keeps indexing costs manageable as the vacancy database grows.

How Openindex helps you build a vacancy aggregator

We have built crawling, indexing, and search infrastructure for data-intensive applications across e-commerce, real estate, and recruitment. For vacancy aggregation specifically, we offer the full stack of capabilities needed to get from raw source data to a production-ready search experience:

  • Crawling as a Service: We handle the full crawl pipeline, including JavaScript rendering, scheduling, and source monitoring, and deliver clean, structured vacancy data as a feed or direct integration.
  • Deduplication and data normalization: We apply field-level normalization and fuzzy matching to produce a clean, merged vacancy index free of duplicates.
  • Search engine implementation: We implement and tune Solr or Elasticsearch clusters with Dutch-language analysis, faceted filtering, geospatial search, and relevance models tailored to job search behavior.
  • Scalable infrastructure: We design and manage cloud infrastructure that grows with your data volume and user traffic, with European hosting to meet GDPR requirements.
  • Legal and ethical compliance: We build data collection pipelines that respect robots.txt, terms of service, and GDPR obligations from the start.

If you are planning to build a job aggregator for the Dutch market or need to improve an existing one, contact us to discuss your requirements.

Frequently Asked Questions

How long does it typically take to build a working Dutch vacancy aggregator from scratch?

A basic aggregator covering a handful of sources can be operational within a few weeks if you use existing crawling frameworks and a managed search engine like Elasticsearch. A production-ready system with deduplication, relevance tuning, and scalable infrastructure realistically takes two to four months depending on the number of sources and the complexity of your search experience.

What is the biggest mistake teams make when building a job aggregator?

The most common mistake is underestimating deduplication — launching without a solid fingerprinting strategy leads to the same vacancy appearing multiple times in search results, which quickly erodes user trust. A close second is ignoring crawl maintenance: sources change their HTML structure regularly, so extraction rules break silently and data quality degrades without a monitoring layer in place.

Do I need a data-sharing agreement with Dutch job boards before I can aggregate their listings?

Not always, but it is strongly recommended for major boards. Scraping publicly visible listings may be technically permissible, but job boards like Nationale Vacaturebank or Monsterboard often prohibit automated access in their terms of service. A formal feed or data-sharing agreement removes legal ambiguity, ensures data quality, and typically gives you access to structured feeds that are far easier to process than scraped HTML.

Can I use AI or LLMs to improve vacancy categorization and search relevance?

Yes, and it adds meaningful value. LLMs can normalize inconsistent job titles into standard occupational categories, extract implicit skills from unstructured descriptions, and power semantic search so users find relevant roles even when their search terms do not exactly match the job title. The practical approach is to run these enrichment steps at index time so the overhead does not affect query response speed.

Related Articles