ZZP'er verificeren via de KVK API: zo check je snel of een freelancer écht ingeschreven staat
KVKBase Team

ZZP'er verificeren via de KVK API: zo check je snel of een freelancer écht ingeschreven staat

Werk je met freelancers? Gebruik de KVKBase API om te controleren of een zzp'er actief is ingeschreven bij de KVK, voor je een factuur betaalt of een opdracht start.

kvkapizzpfreelancerverificatiewet-dba

De handhaving van de Wet DBA (Wet Deregulering Beoordeling Arbeidsrelaties) is in 2025 en 2026 serieus aangescherpt. Opdrachtgevers lopen nu een reëel risico als blijkt dat een freelancer bij wie ze opdrachten uitzetten, helemaal niet als zelfstandige is ingeschreven bij de Kamer van Koophandel. Toch laten veel bedrijven dit soort basiscontroles links liggen.

Met de KVKBase API autoriseer je een zzp-controle in een paar regels code. Geen handmatig zoeken op kvk.nl, geen Excel-lijstjes, gewoon een geautomatiseerde check bij elke nieuwe opdrachtnemer.

Waarom KVK-verificatie essentieel is bij freelancers

Als je een factuur betaalt van iemand die niet als ondernemer staat ingeschreven, kan de Belastingdienst dit kwalificeren als een dienstbetrekking. De gevolgen: naheffing loonbelasting, premies werknemersverzekeringen en mogelijk boetes. Dat risico verdwijnt niet door een goed opgesteld opdrachtovereenkomst; de feiten tellen.

Drie concrete situaties waarbij je wil verifiëren:

  1. Nieuwe freelancer, eerste opdracht — is de KVK-inschrijving actief en actueel?
  2. Terugkerende opdrachtnemer, nieuw contract — is de rechtsvorm nog hetzelfde? Staat de onderneming nog actief?
  3. Automatische factuurverwerking — voorkom dat een factuur van een inmiddels uitgeschreven eenmanszaak zomaar wordt goedgekeurd.

Wat je ophaalt via de KVKBase API

Voor zzp-verificatie zijn een paar velden kritisch:

VeldBetekenis
naamHandelsnaam zoals ingeschreven bij de KVK
rechtsvormEenmanszaak, BV, VOF, etc.
actiefIs de onderneming nog actief?
startdatumSinds wanneer ingeschreven
sbiCodeBrancheclassificatie
adresActueel vestigingsadres

Een actieve eenmanszaak (rechtsvorm: "Eenmanszaak", actief: true) is de meest voorkomende vorm voor zzp’ers in Nederland.

Implementatie: freelancer verificatie in Python

import os
import requests

API_KEY = os.environ["KVKBASE_API_KEY"]
BASE_URL = "https://api.kvkbase.nl/api/v1"

def verify_freelancer(kvk_number: str) -> dict:
    """
    Verifieer of een zzp'er actief is ingeschreven bij de KVK.
    Gooit een ValueError als het bedrijf niet gevonden is of niet actief.
    """
    response = requests.get(
        f"{BASE_URL}/kvk/{kvk_number}",
        headers={"x-api-key": API_KEY},
        timeout=10,
    )
    response.raise_for_status()
    data = response.json()

    result = {
        "kvk_number": kvk_number,
        "name": data.get("naam"),
        "legal_form": data.get("rechtsvorm"),
        "active": data.get("actief", False),
        "start_date": data.get("startdatum"),
        "sbi_code": data.get("sbiCode"),
        "verified": False,
        "reason": None,
    }

    if not result["active"]:
        result["reason"] = "Onderneming is uitgeschreven uit het KVK-register"
        return result

    if not result["legal_form"]:
        result["reason"] = "Rechtsvorm onbekend"
        return result

    result["verified"] = True
    return result


# Gebruik
freelancer = verify_freelancer("12345678")

if freelancer["verified"]:
    print(f"✓ {freelancer['name']} ({freelancer['legal_form']}) — ingeschreven, actief")
else:
    print(f"✗ Verificatie mislukt: {freelancer['reason']}")

Controleren op rechtsvorm

Niet elke rechtsvorm is even geschikt voor zzp-opdrachten. Een BV is prima, maar een VOF of Maatschap heeft meerdere vennoten, wat extra vragen kan opwerpen over wie de opdracht uitvoert. Je kunt hier expliciet op filteren:

ACCEPTED_LEGAL_FORMS = {
    "Eenmanszaak",
    "Besloten Vennootschap",
    "BV",
}

def is_valid_zzp_form(freelancer: dict) -> bool:
    return freelancer["legal_form"] in ACCEPTED_LEGAL_FORMS

Pas dit aan op basis van je eigen beleid. Sommige opdrachtgevers accepteren ook VOF’en, andere werken uitsluitend met eenmanszaken of BV’s.

Integratie in je onboarding flow

De verificatie past goed in een onboarding workflow voor nieuwe leveranciers:

def onboard_freelancer(name: str, kvk_number: str, email: str) -> str:
    """
    Onboard een freelancer na KVK-verificatie.
    Geeft een status terug: 'approved', 'manual_review', of 'rejected'.
    """
    try:
        data = verify_freelancer(kvk_number)
    except requests.HTTPError as e:
        if e.response.status_code == 404:
            return "rejected"  # KVK-nummer bestaat niet
        raise

    if not data["verified"]:
        # Log voor handmatige review
        log_manual_review(kvk_number, name, data["reason"])
        return "manual_review"

    if not is_valid_zzp_form(data):
        log_manual_review(kvk_number, name, f"Ongebruikelijke rechtsvorm: {data['legal_form']}")
        return "manual_review"

    # Sla geverifieerde freelancer op
    save_freelancer({
        "name": data["name"],
        "kvk_number": kvk_number,
        "legal_form": data["legal_form"],
        "email": email,
        "verified_at": datetime.utcnow().isoformat(),
    })

    return "approved"

Periodieke hercertificering

Een eenmalige check bij onboarding is niet genoeg. Ondernemingen kunnen op elk moment uitschrijven. Bouw een periodieke hercertificering in voor alle actieve freelancers in je systeem:

from datetime import datetime, timedelta
import time

def recertify_all_freelancers(freelancers: list, max_age_days: int = 90) -> list:
    """
    Controleer voor alle freelancers of de KVK-inschrijving nog actief is.
    Geeft een lijst van freelancers met problemen.
    """
    cutoff = datetime.utcnow() - timedelta(days=max_age_days)
    flagged = []

    for f in freelancers:
        last_verified = datetime.fromisoformat(f.get("verified_at", "2000-01-01"))
        if last_verified > cutoff:
            continue  # Recent gecontroleerd, sla over

        result = verify_freelancer(f["kvk_number"])
        time.sleep(0.2)  # Respecteer rate limits

        if not result["verified"]:
            flagged.append({
                "name": f["name"],
                "kvk_number": f["kvk_number"],
                "issue": result["reason"],
            })

    return flagged

# Dagelijks of wekelijks uitvoeren
problems = recertify_all_freelancers(get_all_active_freelancers())
for p in problems:
    send_alert(f"Freelancer {p['name']} ({p['kvk_number']}): {p['issue']}")

Wet DBA: wat je als opdrachtgever moet weten

Vanaf 2025 handhaaft de Belastingdienst actief op schijnzelfstandigheid. Een KVK-inschrijving is geen garantie dat de arbeidsrelatie correct is gekwalificeerd, maar het is een basisvoorwaarde. Opdrachtgevers die dit niet controleren lopen extra risico.

Combineer de KVK-check met:

  • Een goedgekeurde modelovereenkomst
  • Feitelijke zelfstandigheid in de uitvoering (geen vaste werkplek, geen gezagsverhouding)
  • Meerdere opdrachtgevers aan de kant van de zzp’er

De KVK-verificatie via de KVKBase API is de technische laag; de juridische beoordeling blijft mensenwerk.

Samenvatting

  • Verifieer bij elke nieuwe freelancer of opdrachtnemer het KVK-nummer
  • Check op actief: true en een passende rechtsvorm
  • Bouw periodieke hercertificering in voor bestaande leveranciers
  • Automatiseer dit als onderdeel van je leveranciers-onboarding

Lees ook: KVK-data bij klant-onboarding voor een bredere implementatie van KVK-verificatie in je klantproces, en Bedrijfsstatus monitoren via de KVK API voor real-time updates bij statuswijzigingen.