KvK Handelsregister Scraper
Pricing
$4.00/month + usage
KvK Handelsregister Scraper
An Apify Actor for scraping data from the Dutch Chamber of Commerce (Kamer van Koophandel / KVK).
Pricing
$4.00/month + usage
Rating
0.0
(0)
Developer
No-Code Venture
Actor stats
0
Bookmarked
33
Total users
4
Monthly active users
7 days ago
Last modified
Categories
Share
An Apify Actor that scrapes the Dutch Chamber of Commerce (Kamer van Koophandel / KVK) Handelsregister (Trade Register). Search by company name or look up specific KVK numbers, with full control over filters, result source, and rate limiting.
What it does
- Search for companies by name or other identifiers
- Look up one or more KVK numbers directly (batch mode)
- Filter by registration status, vestiging type, and trade name type
- Choose between all results, Handelsregister only, or Advies & Inspiratie only
- Handles pagination automatically
- Rate-limited by default to avoid IP blocks — works without a proxy for moderate volumes
Input
Search fields
| Field | Type | Description | Default |
|---|---|---|---|
searchQuery | string | Search by company name or other identifier. Leave empty when using kvkNumbers. | — |
kvkNumbers | string[] | List of 8-digit KVK numbers to look up directly. Leave empty when using searchQuery. | [] |
maxPages | integer | Maximum result pages to fetch per query (0 = unlimited). | 0 |
pageSize | integer | Results per page (max 100). | 10 |
Filters
| Field | Type | Options | Default |
|---|---|---|---|
site | string | kvk2014 = All results, handelsregister = Handelsregister only, corporate = Advies & Inspiratie only | kvk2014 |
inschrijvingsstatus | string[] | ingeschreven (active), uitgeschreven (deregistered) | ["ingeschreven"] |
vestigingType | string[] | hoofdvestigingen, nevenvestigingen, rechtspersonen, overig | [] (all) |
handelsnamen | string[] | bestaandeHandelsnamen, vervallenHandelsnamen | [] (all) |
language | string | nl or en | nl |
Important:
inschrijvingsstatus,vestigingType, andhandelsnamenare Handelsregister-specific filters. Whensiteis set tocorporate(Advies & Inspiratie only), these filters have no effect and will return empty results if set. Leave them at their defaults or clear them when usingcorporate.
Performance
| Field | Type | Description | Default |
|---|---|---|---|
maxConcurrency | integer | Maximum parallel requests (max 5). | 5 |
maxRequestsPerMinute | integer | Rate limit cap. Lower if getting 429 errors without a proxy. | 120 |
proxyConfiguration | object | Apify proxy settings. Recommended for large scrapes to avoid IP rate-limiting. | disabled |
Example — search by company name
{"searchQuery": "Software","maxPages": 2,"pageSize": 20}
Example — direct KVK number lookup (batch)
{"kvkNumbers": ["42009680", "82871612"],"inschrijvingsstatus": ["ingeschreven"],"site": "handelsregister"}
Example — include deregistered companies too
{"searchQuery": "Bakkerij","inschrijvingsstatus": ["ingeschreven", "uitgeschreven"],"vestigingType": ["hoofdvestigingen", "rechtspersonen"]}
Example — Advies & Inspiratie only (corporate)
Use only Search, Result source, Language, page size, and performance options. Leave Handelsregister filters empty / default.
{"searchQuery": "KPN","site": "corporate","language": "nl","pageSize": 10,"maxPages": 1}
See Output → Advies & Inspiratie for the dataset JSON shape.
Example — full Handelsregister filter set
{"kvkNumbers": ["42009680"],"pageSize": 10,"language": "nl","site": "kvk2014","inschrijvingsstatus": ["ingeschreven", "uitgeschreven"],"vestigingType": ["hoofdvestigingen", "nevenvestigingen", "rechtspersonen", "overig"],"handelsnamen": ["bestaandeHandelsnamen"],"maxRequestsPerMinute": 120}
Output
The dataset stores one JSON object per search hit. The shape depends on whether the hit is from the Handelsregister or from Advies & Inspiratie (KVK website articles). With site set to All results (kvk2014), you may get both shapes in the same run.
Handelsregister record
No resultType field — normalized company / establishment data:
{"id": "e027319e-bddf-4982-ac35-ed5cd4a96222","kvkNumber": "82871612","establishmentNumber": "000049081160","name": "Software Buddy","legalFormCode": "EMZ","legalForm": "Eenmanszaak","isActive": true,"isEstablishment": true,"registrationType": "Hoofdvestiging","visitingAddress": {"street": "Kloosterlaan","houseNumber": "33","houseNumberAddition": null,"postalCode": "1216NH","city": "Hilversum"},"postalAddress": {"street": null,"houseNumber": null,"houseNumberAddition": null,"postalCode": null,"city": null},"activityDescription": "Ontwikkelen, produceren en uitgeven van software...","currentTradeNames": ["Software Buddy", "Maxtrada"],"formerTradeNames": ["Codemap NL"],"statutoryName": null,"source": "Actueel"}
Advies & Inspiratie (site: corporate, or mixed under kvk2014)
When KVK’s search returns Advies & Inspiratie hits (crawler-public), each row looks like this (excerpt — full content can be very long):
{"resultType": "advies-en-inspiratie","id": "4d4ee662-5cda-4b78-8545-52649a21c610","title": "Zo help je een werknemer met geldzorgen | KVK","url": "https://www.kvk.nl/personeel/zo-help-je-een-werknemer-met-geldzorgen/","description": "Vermoed je dat je werknemers geldzorgen hebben of vragen ze om een voorschot van salaris? Weet wat je als werkgever kunt doen om je werknemers te ondersteunen.","content": "Zo help je een werknemer met geldzorgen Esther Riphagen ...","language": "nl"}
| Field | Meaning |
|---|---|
resultType | Always advies-en-inspiratie for this shape |
id | Unique identifier from KVK |
title | Page title |
url | Article URL on kvk.nl |
description | Short teaser text |
content | Full article body from the source (often very long) |
language | Language code of the article |
Note on multiple records per KVK number
A single KVK number can return more than one record. For example, a company may have both a Rechtspersoon (legal entity) and one or more Vestiging (establishment) entries — each as a separate dataset item sharing the same kvkNumber but with a different id and establishmentNumber.
Rate limiting
Without a proxy, all requests go through the same IP. The default of 120 requests/minute is safe for most use cases. If you hit 429 errors:
- Lower
maxRequestsPerMinute(try 60) - Enable a proxy via
proxyConfiguration
With a proxy, session rotation automatically handles rate-limited requests by switching IP.
Pay Per Event Billing
This Actor uses Apify's Pay Per Event pricing — you only pay for what actually runs.
| Event | Charged by | Description |
|---|---|---|
apify-actor-start | Apify (auto) | Once per run start |
apify-default-dataset-item | Apify (auto) | Once per result record pushed |
kvk-search | Custom | Once per search or pagination page the scraper runs |
retry-event | Custom | Once per retry on a failed request |
event-proxy | Custom | Once per run when using Apify Proxy (no group) |
event-proxy-group | Custom | Once per run when using a proxy group (e.g. RESIDENTIAL) |
You can cap total spend in the Apify Console when starting a run via Max total charge (USD) or Max paid dataset items.
Disclaimer
This Actor is provided for educational and informational purposes only. By using it you agree to:
- Comply with KVK's Terms of Service
- Use the data responsibly and in accordance with applicable laws
- Not overload KVK servers with excessive requests
This Actor is not affiliated with or endorsed by KVK (Kamer van Koophandel).


