KVK Data for KYC: How to Verify Business Customers Quickly
How to use KVK data in your KYC process. From business identification to UBO verification and Wwft compliance. Includes API examples.
Businesses that onboard corporate clients are often legally required to identify and verify those clients. The Dutch Anti-Money Laundering and Anti-Terrorist Financing Act (Wwft) applies to accountants, notaries, real estate agents, financial institutions, and increasingly to SaaS platforms and marketplaces. The core question in every business onboarding process is: is this company who it says it is?
KVK data is the starting point for that. The Dutch Trade Register (Handelsregister) is the official source for business identification in the Netherlands. In this article we explain which KVK data fields are relevant for KYC, how to retrieve them efficiently via the API, and what else you need for a complete verification process.
Why KVK Data Is the Foundation of Business KYC
For individuals, you use a passport or driver’s licence. For businesses, it’s the KVK extract. It contains the registered name, the legal address, the legal form, the date of incorporation, and the status of the company. Those are exactly the fields you need to identify a business.
The advantage of API access over manually requesting extracts is speed and scalability. Instead of employees downloading extracts and checking them by hand, you can automate verification as part of your onboarding flow.
{
"kvkNumber": "12345678",
"name": "Example BV",
"legalForm": "BV",
"registeredAt": "2019-04-15",
"status": "active",
"addresses": [
{
"type": "visiting",
"street": "Hoofdstraat",
"houseNumber": "10",
"postalCode": "1234 AB",
"city": "Amsterdam"
}
]
}
With the KVKBase API you retrieve this data in a single API call. No extract needed, no manual input.
The Five KYC Checks You Can Automate with KVK Data
1. Business Identification
The most basic step: does this company exist and does the name match the KVK number? This is a straightforward lookup by KVK number.
import requests
def verify_company(kvk_number):
response = requests.get(
f"https://api.kvkbase.nl/v1/company/{kvk_number}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
data = response.json()
return {
"exists": response.status_code == 200,
"name": data.get("name"),
"legal_form": data.get("legalForm"),
"status": data.get("status"), # 'active', 'dissolved', etc.
}
If the status is not active, or if the KVK number does not exist, that is an immediate red flag.
2. Status Check: Is the Company Active?
A company can be formally registered but also dissolved, bankrupt, or in suspension of payments. For KYC you want to know whether the company is genuinely active.
The KVKBase company status monitor also offers webhooks for status changes, so you get an automated notification when a client company is dissolved. That is useful for ongoing KYC monitoring, not only at onboarding.
3. Address Verification
Does the address the client provided match the registered visiting address in the Trade Register? A discrepancy is not necessarily fraud, but it is something to investigate. Companies with only a PO box address are also a point of attention in KYC processes.
def check_address(kvk_number, provided_postal_code, provided_city):
data = fetch_company_data(kvk_number)
registered_address = next(
(a for a in data["addresses"] if a["type"] == "visiting"),
None
)
if not registered_address:
return {"match": False, "reason": "no visiting address registered"}
postal_match = registered_address["postalCode"].replace(" ", "") == provided_postal_code.replace(" ", "")
city_match = registered_address["city"].lower() == provided_city.lower()
return {
"match": postal_match and city_match,
"registered_postal_code": registered_address["postalCode"],
"registered_city": registered_address["city"]
}
4. Legal Form and UBO Obligation
The legal form partly determines which KYC obligations apply. A sole trader (eenmanszaak) does not require a UBO register entry, because the owner is always the entrepreneur themselves. A BV, NV, or foundation does. The KVK register gives you the legal form, so you can determine which follow-up steps are needed.
| Legal Form | UBO Register Required | Directors Visible via KVK |
|---|---|---|
| Eenmanszaak (sole trader) | No | Yes (owner) |
| VOF (partnership) | No | Yes (partners) |
| BV (private limited) | Yes | Partially (directors) |
| NV (public limited) | Yes | Partially (directors) |
| Stichting (foundation) | Yes | Partially (directors) |
| Cooperative | Yes | Partially |
For BVs and NVs, the KVK register includes directors and authorised representatives. That is a first step, but the ultimate beneficial owners (UBOs) are listed in the separate UBO register. KVK data and the UBO register complement each other.
5. VAT Number Validation
For B2B onboarding in the EU you also want to validate the VAT number. KVKBase offers integrated VIES validation: in a single call you can check the VAT number and confirm it is active in the EU VIES system. That is a required step for correct invoice processing and sometimes also for compliance purposes.
More detail on VAT validation is in our article on validating VAT numbers via VIES.
A Practical KYC Verification Form with Autofill
The most user-friendly approach for business onboarding: let the client enter their KVK number, retrieve the rest automatically, and show a confirmation screen. This way the user gets easy input combined with an automated first check.
async function onKvkInput(kvkNumber) {
if (kvkNumber.length !== 8) return;
const res = await fetch(`/api/verify-company?kvk=${kvkNumber}`);
const data = await res.json();
if (!data.exists || data.status !== 'active') {
showError('Company not found or not active in the Trade Register.');
return;
}
// Populate form
document.getElementById('company-name').value = data.name;
document.getElementById('legal-form').value = data.legalForm;
document.getElementById('address').value = `${data.street} ${data.houseNumber}`;
document.getElementById('postal-code').value = data.postalCode;
document.getElementById('city').value = data.city;
// Show confirmation panel
showConfirmation(data);
}
This pattern also works for checkout forms. The related article on business data autofill for checkout covers the full e-commerce scenario.
Ongoing KYC: Monitoring After Onboarding
KYC is not a one-time check. Companies change: they move, change directors, go bankrupt, or get acquired. Ongoing monitoring via the KVK API alerts you to relevant changes.
Set up a periodic job that checks the status of your client list:
from datetime import datetime
def periodic_kyc_check(client_list):
discrepancies = []
for client in client_list:
current_data = fetch_company_data(client["kvk_number"])
checks = [
("status", client["registered_status"], current_data["status"]),
("name", client["registered_name"], current_data["name"]),
("postal_code", client["registered_postal_code"], current_data["addresses"][0]["postalCode"])
]
for field, old, new in checks:
if old != new:
discrepancies.append({
"client_id": client["id"],
"kvk_number": client["kvk_number"],
"field": field,
"old": old,
"new": new,
"detected_at": datetime.now().isoformat()
})
return discrepancies
Discrepancies can be logged for compliance reporting or forwarded to a compliance officer for manual review.
What KVK Data Does Not Cover
KVK data is a strong foundation, but it is not a complete KYC system. For Wwft compliance you typically also need:
- UBO verification: who are the ultimate beneficial owners? That is in the UBO register, not the Trade Register.
- PEP screening: is a director a politically exposed person? That requires external lists.
- Sanctions screening: is the company or a director on a sanctions list (EU, UN, OFAC)? That requires separate data sources.
- Document verification: for higher-risk profiles you may want additional documents.
For most applications, KVK data is the first layer: fast, reliable, and automated. The additional checks are a second layer applied on a risk basis.
Getting Started
The KVKBase API offers a free tier to test your integration. You can get started immediately with the API documentation and build your own verification flow. For ongoing monitoring, KVKBase offers webhook notifications so you do not need to poll continuously.
Questions about your specific use case? Send a message via kvkbase.nl/contact.