How to Look Up Dutch Company Data from Outside the Netherlands
A complete guide to accessing KVK (Chamber of Commerce) data, validating Dutch VAT numbers, and integrating Dutch business data into your international application.
How to Look Up Dutch Company Data from Outside the Netherlands
If you are building an application that does business with Dutch companies, you will need to verify and retrieve their registration data at some point. The Netherlands maintains a centralized business registry through the KVK (Kamer van Koophandel, or Chamber of Commerce), and every registered company has a unique 8-digit KVK number.
Getting access to this data from outside the country used to be painful. This guide covers your options and shows you how to integrate Dutch company lookups into your application, wherever you are based.
What Is the KVK and Why Does It Matter?
The KVK is the Dutch equivalent of Companies House in the UK or the Secretary of State in the US. Every business operating in the Netherlands — whether it is a one-person freelance operation or a multinational corporation — must register with the KVK.
The registry stores key information about each company:
- Legal name and trade names — the official registered name and any commercial names the company operates under
- KVK number — a unique 8-digit identifier
- RSIN — a 9-digit identification number used for government and tax interactions
- Registered address — the official address on file
- Legal form — BV (private limited), NV (public limited), eenmanszaak (sole proprietorship), VOF (partnership), and others
- SBI codes — industry classification codes that describe the company’s activities
- Active status — whether the company is currently active or has been dissolved
This data is used across invoicing, compliance, onboarding, and due diligence workflows throughout Europe.
The Challenge for International Developers
If you are based outside the Netherlands, you will run into a few hurdles when trying to access KVK data:
- The official KVK API requires a Dutch PKIoverheid certificate for authentication. Obtaining one as a foreign entity is impractical for most teams.
- The KVK website is primarily in Dutch. Navigating it and parsing the results programmatically is unreliable.
- VIES (VAT Information Exchange System) can validate Dutch VAT numbers, but it does not return the full company profile you typically need.
These barriers are exactly why third-party APIs like KVKBase exist. They provide a clean REST interface to the same underlying data, authenticated with a simple API key.
Looking Up a Company by KVK Number
The most direct lookup is by KVK number. If a Dutch customer gives you their KVK number during onboarding, you can pull their full company profile in one request:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.kvkbase.nl/api/v1/lookup/12345678"
The response includes the company’s legal name, trade names, address, legal form, SBI codes, and active status. Here is what a typical response looks like:
{
"kvkNumber": "12345678",
"tradeName": "Voorbeeld BV",
"legalForm": "Besloten Vennootschap",
"address": {
"street": "Herengracht",
"houseNumber": "500",
"postalCode": "1017CB",
"city": "Amsterdam"
},
"sbiCodes": [
{ "code": "6201", "description": "Ontwikkelen en produceren van software" }
],
"isActive": true
}
Searching by Company Name
When you do not have the KVK number, you can search by name. This is useful for autocomplete fields where a user starts typing a company name:
const response = await fetch(
'https://api.kvkbase.nl/api/v1/search?q=bol.com&limit=5',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const results = await response.json();
The search endpoint returns a list of matching companies with their KVK numbers, so the user can pick the right one and you can then do a full lookup.
Validating Dutch VAT Numbers
Dutch VAT numbers (BTW-nummers) follow the format NL + 9 digits + B + 2 digits (for example, NL123456789B01). If you need to verify that a VAT number is valid and currently active, you can use the VIES system or the KVKBase API:
import requests
api_key = "YOUR_API_KEY"
vat_number = "NL123456789B01"
response = requests.get(
f"https://api.kvkbase.nl/api/v1/vat/{vat_number}",
headers={"Authorization": f"Bearer {api_key}"}
)
data = response.json()
print(f"Valid: {data['valid']}")
print(f"Company: {data['tradeName']}")
This is particularly useful for invoicing workflows where EU regulations require you to verify the VAT status of your business customers.
KVKBase API vs. Direct KVK API Access
Here is a practical comparison:
| KVKBase API | Official KVK API | |
|---|---|---|
| Authentication | API key | PKIoverheid certificate |
| Access from abroad | Yes, standard HTTPS | Requires Dutch certificate |
| Response format | Clean JSON | Varies by endpoint |
| Search by name | Yes | Limited |
| Rate limits | Generous, plan-based | Strict |
| VAT validation | Included | Separate system |
| Pricing | Pay-per-use plans | Free but complex setup |
For most international teams, the KVKBase API is the faster path to production. You sign up, get an API key, and start making requests within minutes.
Integration Tips
A few things to keep in mind when integrating Dutch company data:
- Cache aggressively. Company registration data changes infrequently. A 24-hour TTL on cached results will save you API calls and improve response times.
- Handle inactive companies. The
isActivefield tells you whether a company is still operating. Depending on your use case, you may want to flag or reject inactive companies. - Normalize addresses. Dutch postal codes follow a strict
1234ABformat (four digits, two letters, no space). Some systems insert a space. Normalize before storing. - Store the KVK number as a string. Leading zeros are significant. The KVK number
01234567is not the same as1234567.
Getting Started
Sign up for a free KVKBase account at kvkbase.nl to get your API key. The free tier gives you enough requests to build and test your integration. When you are ready for production, upgrade to a plan that matches your volume.
The API documentation covers every endpoint, parameter, and response field in detail.