Dutch Legal Entity Types in KVK Data: BV, VOF and Sole Trader Explained for Developers
KVKBase Team

Dutch Legal Entity Types in KVK Data: BV, VOF and Sole Trader Explained for Developers

Understand how to use the rechtsvorm (legal entity type) field from KVK data in your application. Learn the differences between BV, VOF, sole trader and foundation, and why it matters for invoicing, credit risk and KYC.

kvkapilegal-entitybvvofsole-traderbusiness-data

When you look up a Dutch company number via the KVKBase API, the response includes a field called rechtsvorm — the legal entity type. Most developers store it without using it. That is a missed opportunity: the legal entity type determines how a company should be treated legally and financially in your application.

This guide explains the most common Dutch legal entity types, what they mean for you as a consumer of business data, and how to use them effectively in your integration.

What is a rechtsvorm?

A rechtsvorm (legal form) describes how a business is legally structured: the relationship between owners and the company, liability, and tax treatment. The Dutch Chamber of Commerce (KVK) registers one legal form per company.

The most common legal entity types in the Netherlands:

Legal FormDescription
EenmanszaakSole trader, single owner, fully personally liable
VOFGeneral partnership, multiple partners, jointly liable
BVPrivate limited company, liability limited to capital
NVPublic limited company, publicly tradable shares
StichtingFoundation, no owners, no profit motive
VerenigingMember-based association
MaatschapProfessional partnership (accountants, doctors)
CVLimited partnership, active and silent partners combined

1. Liability and credit risk

A sole trader (eenmanszaak) or general partnership (VOF) means the owner is personally liable. Creditors can pursue private assets if the business fails to pay. From a credit risk perspective, this creates a different risk profile than a BV, where liability is limited to the company’s capital.

Combining the legal entity type with company status monitoring gives you a more complete picture of counterparty risk.

2. Invoicing and VAT

Foundations (stichting) and associations (vereniging) are generally not subject to VAT unless they perform commercial activities. If your platform generates invoices automatically or validates VAT numbers, you may need to handle exceptions based on the legal entity type. Pair this with VAT number validation via the VIES API for a complete check.

3. KYC and due diligence

For KYC workflows, BVs and NVs have different UBO (Ultimate Beneficial Owner) obligations compared to sole traders. A BV must register shareholders with more than 25% ownership in the UBO register. For a sole trader, the owner is always the UBO by definition. The legal entity type is a natural starting point for KYC verification.

4. Signing authority

With a sole trader you can safely assume the owner has full signing authority. With a BV or VOF, authority may be shared between multiple directors or partners. If your application handles digital signatures or power-of-attorney checks, this distinction is important.

The rechtsvorm field is included in the standard API response. Here is a Python example:

import os
import requests

API_KEY=os.get..._URL = "https://api.kvkbase.nl/api/v1"

def get_company_info(kvk_number: str) -> dict:
    response = requests.get(
        f"{BASE_URL}/kvk/{kvk_number}",
        headers={"x-api-key": API_KEY}
    )
    response.raise_for_status()
    return response.json()

company = get_company_info("12345678")
legal_form = company.get("rechtsvorm", "unknown")
print(f"Name: {company['naam']}")
print(f"Legal form: {legal_form}")

In practice you will want to group legal forms for business logic. Here is a practical classification scheme:

LIMITED_LIABILITY = {"BV", "NV", "CV"}
PERSONAL_LIABILITY = {"Eenmanszaak", "VOF", "Maatschap"}
NON_COMMERCIAL = {"Stichting", "Vereniging", "Coöperatie"}

def classify_legal_form(rechtsvorm: str) -> str:
    if rechtsvorm in LIMITED_LIABILITY:
        return "limited_liability"
    elif rechtsvorm in PERSONAL_LIABILITY:
        return "personal_liability"
    elif rechtsvorm in NON_COMMERCIAL:
        return "non_commercial"
    else:
        return "other"

def get_credit_risk_profile(company: dict) -> dict:
    legal_form = company.get("rechtsvorm", "")
    active = company.get("actief", True)
    category = classify_legal_form(legal_form)

    risk = "low"
    if category == "limited_liability" and not active:
        risk = "high"
    elif category == "personal_liability":
        risk = "medium"
    elif category == "non_commercial":
        risk = "n/a"

    return {
        "kvk_number": company.get("kvkNummer"),
        "name": company.get("naam"),
        "legal_form": legal_form,
        "category": category,
        "risk_profile": risk,
    }

Sole traders: what to keep in mind

Sole traders make up the largest group in the Dutch business register. They do not always have a separate VAT number (many qualify for the KOR small business exemption). Sole traders often operate as freelancers (ZZP). If you need to verify freelance status, see our guide on ZZP verification via the KVK API.

Suppose you are building a B2B platform where companies can sign up. After entering a KVK number, you want to tailor the onboarding flow based on the legal entity type:

def onboarding_flow(kvk_number: str) -> dict:
    company = get_company_info(kvk_number)
    legal_form = company.get("rechtsvorm", "")
    category = classify_legal_form(legal_form)

    required_steps = []

    if category == "limited_liability":
        required_steps.append("ubo_verification")
        required_steps.append("director_check")
    elif category == "personal_liability":
        required_steps.append("owner_id_check")
    elif category == "non_commercial":
        required_steps.append("statutes_upload")
        required_steps.append("board_verification")

    return {
        "company": company.get("naam"),
        "legal_form": legal_form,
        "required_steps": required_steps,
    }

result = onboarding_flow("12345678")
print(result)
# {"company": "Example BV", "legal_form": "BV",
#  "required_steps": ["ubo_verification", "director_check"]}

Conclusion

The legal entity type is more than a metadata field. It determines how you handle liability, VAT obligations, KYC requirements and signing authority. By actively using the rechtsvorm from KVK data in your business logic, you build smarter applications and more robust risk management.

Want to do more with Dutch company data? Read our guide on customer onboarding with KVK data or how to use SBI codes for business classification.