{ "diy" :
Rolling your own against using an API
Short answer
Dutch Business Register data is public and the KVK publishes a free open dataset with basic company data, so rolling your own is a real option, especially for one-off or low volume work. The work is not in the first version, it is in the upkeep: VIES is SOAP and goes offline per member state, addresses need normalising, legal forms need mapping, and a cache has to stay fresh. Scraping the KVK website instead of using the API is also a terms-of-service problem.
# DIY: KVK call, then VIES SOAP,
# then mapping, then caching.
# Or one call:
curl ".../v1/lookup/68750110" \
-H "Authorization: Bearer KEY"
{
"vat": {
"valid": true,
"validatedAt": "2026-08-22"
}
}
Building it yourself is a serious option
This is not a straw man to knock down. Dutch register data is public, the KVK publishes a free open dataset with basic company data, and there is a documented API. For a one-off enrichment of a file, a migration, an analysis or an internal tool, rolling your own is often simply the right call. You do not need anyone selling you a subscription for that.
The picture changes the moment it becomes something that keeps running.
| Piece | Rolling your own | KVKBase |
|---|---|---|
| Fetch a company profile | KVK API or open dataset | one call |
| Merge search, profile and branch | yourself, several calls | in the response |
| Derive the VAT number | yourself, valid for BV and NV only | built in |
| VIES check | yourself, SOAP, retries and cache | live in the response |
| Address normalisation | yourself | structured fields |
| Legal form mapping | yours to maintain | legalForm |
| Cache refresh | your schedule, your problem | 24 hours on active companies |
| Monthly cost | infrastructure plus hours | free, EUR 19 or EUR 49 |
Scraping against the API
Briefly, and without the sermon. The data is public, but the KVK website has terms of use and automated extraction generally falls outside them. There is an API and an open dataset sitting right next to it that serve the same purpose. And if you are weighing it anyway: a scraper is also the weakest of the three technically, because any frontend change breaks your parser and you find out when your data goes quiet.
Using the open dataset is not scraping and does not carry that problem.
Where the hours actually go
Four places, in order of how often they surprise people.
VIES. The VAT number is not in the Business Register. You derive it as NL + KVK number + B01, and that only holds for BV and NV. Then it has to be checked against VIES, which is SOAP. VIES is frequently slow and member states go offline independently of each other. So you need retries, a timeout that does not hang your checkout, and a cache with its own validity window.
The gotcha that most often breaks in production: “invalid” and “VIES was unreachable” are not the same thing. Map both onto a single false and you will block legitimate customers during an outage with no idea why. Keep the reason separately, even if your UI only does one thing with it. The background is in the guide to VAT number validation with VIES.
Addresses. Street, house number and addition do not arrive clean in one field. Additions like A, bis, 2-hoog and zwart have to stay separate from the house number, otherwise your address stops matching anything later. We return houseNumber and houseNumberAddition as separate fields for exactly that reason.
Legal forms. The register notations are not what you want to show in your UI and not what you want in your invoicing logic. You build a mapping table, and that table is never finished.
Refreshing. A copy of the open dataset is a snapshot by definition. Registrations, relocations and name changes keep going. You need an import schedule, a way to know how old your copy is, and a decision about what to do with a KVK number you do not have yet. That is maintenance, not construction.
For the validation rules on the KVK number itself you do not need to invent anything, they are in the post on KVK number validation and the checksum.
Who should roll their own
Build it yourself if it is one-off, if it stays internal, if your volume is low enough that an outage hurts nobody, or if you already have a team maintaining integrations like this. That is not a second-best answer, it is the cheapest solution for that situation.
If you end up with us, it is because this sits in a customer path and has to keep working without anyone looking at it weekly: one call for company plus VAT, or the embeddable widget if you would rather write no backend at all. And if you do build it yourself, at least carry the distinction between invalid and unreachable through. That is the mistake that costs the most money.
Frequently asked
Am I allowed to scrape the KVK website?
Is building it yourself cheaper?
What is the hardest part to build yourself?
When is rolling your own the right call?
Can I just load the open dataset into my database?
Updated:
One call gives you the whole company
KVK data, the derived VAT number and a live VIES check, in a single request. The free plan covers 50 lookups a month and needs no card.
- 50
- free lookups a month
- 1
- request instead of three
- 0
- cards, contracts or sales calls