{ "vat" :
Can you derive a Dutch VAT number from a KVK number?
Short answer
You cannot. The numeric block of a Dutch VAT number is the RSIN, which is nine digits, while a KVK number is eight. They are separate identifiers and neither follows from the other. For a BV or NV you can build a candidate from the RSIN as NL{RSIN}B01, but even that is a heuristic that fiscal unities and second subnumbers break, so validate against VIES before invoicing.
# Derived, then checked on VIES
curl ".../v1/lookup/68750110?enrich=true" \
-H "Authorization: Bearer KEY"
"vat": {
"number": "NL850123458B01",
"valid": true,
"validatedAt": "2026-08-22"
}
The pattern, and why it is only a pattern
A Dutch VAT number looks like NL followed by nine digits, then B, then two digits. The nine digit block is formally the RSIN, the tax identification number of the legal entity. The two digit suffix is a subnumber, usually 01.
Because both numbers are issued by the Chamber of Commerce and look similar in length, people assume the RSIN is just the KVK number with a leading zero. It is not, and building a VAT number that way produces a string the tax authority never issued:
KVK number 68750110 (8 digits)
RSIN 850123458 (9 digits)
VAT number NL850123458B01
The KVK number identifies the registration. The RSIN identifies the legal entity for tax purposes. One entity has both, and there is no formula between them. The important framing for anyone integrating from abroad: the VAT number is not encoded in the company number the way it is in some other member states, so a lookup is the only route.
Once you do have the RSIN, NL{RSIN}B01 is a reasonable candidate for a BV or NV, and that is the point where verification starts rather than ends.
Where it breaks
| Situation | What happens |
|---|---|
| Fiscal unity (fiscale eenheid) | Subsidiaries file under the parent’s VAT number. The subsidiary may have no own number, so the derived candidate is invalid on VIES. |
| Second subnumber | The suffix is B02 or higher. B01 returns invalid even though the company is VAT registered. |
| Sole trader (eenmanszaak) | The VAT identification number is randomly issued and unrelated to the KVK number. Nothing to derive. |
| Partnerships (VOF, CV, maatschap) | Registered for VAT as the partnership, with a number that does not track the KVK number. |
| Not VAT registered | Small exempt entities, some foundations and associations, and companies under the small business scheme. |
| Legal form conversion | An entity that converted from an NV to a BV keeps its old numeric block. |
The fiscal unity case is the one that generates support tickets, because the company is real, active, solvent and perfectly able to receive an invoice. It just does not answer on the number you calculated.
What the API does
Our lookup attempts the derivation only for the legal forms where it is worth attempting: codes 41 (BV), 42 (NV), 73 (BV in formation) and 74 (NV in formation). For every other legal form there is no vat block, because a guess would be worse than nothing.
When it does attempt it, it does not stop at the candidate. It sends the number to VIES, the European Commission’s VAT information exchange system, and reports what VIES said:
"vat": {
"number": "NL850123458B01",
"valid": true,
"validatedAt": "2026-08-22T09:14:00Z"
}
valid: false means the derivation produced a number that VIES does not recognise. It does not mean the company has no VAT number. In practice that distinction matters: you should show the user “we could not confirm a VAT number, please enter it” rather than “this company is not VAT registered”.
If you already have a VAT number from the customer, skip the derivation entirely and validate what they gave you:
curl "https://api.kvkbase.nl/v1/validate/vat/NL850123458B01" \
-H "Authorization: Bearer YOUR_API_KEY"
The mechanics of VIES, including its rate behaviour and what the response actually guarantees, are covered in the VAT number validation guide.
The production gotcha: caching a false
The failure mode we see most is caching the negative. A team derives a VAT number, VIES says invalid, and they persist vat_valid = false on the customer record forever. Three weeks later the customer registers for VAT, or leaves the fiscal unity, or the derivation was wrong all along, and the invoice still goes out with domestic VAT on a cross border sale.
Cache the positive result with its validatedAt timestamp and treat a negative as a prompt rather than a fact. If you invoice under the reverse charge, revalidate at invoice time, not at signup time. The number you are legally relying on is the one that was valid on the invoice date.
One last detail for non Dutch teams: VIES validates format and existence, not ownership. A syntactically valid, VIES confirmed VAT number tells you the number is live. It does not tell you it belongs to the company whose KVK number you started from. If that link matters for your risk model, compare the name VIES returns against statutoryName from the enriched lookup, and expect punctuation differences around “B.V.” to make exact string matching useless.
Frequently asked
Is NL + KVK number + B01 always the VAT number?
What breaks the pattern?
Can I derive a VAT number for a sole trader?
What does the API do when VIES is down?
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