KVK-bestuurders en functionarissen opzoeken via de API
KVKBase Team

KVK-bestuurders en functionarissen opzoeken via de API

Hoe haal je bestuurders, directeuren en functionarissen op uit het Handelsregister via de KVK API? Praktische gids met codevoorbeelden voor compliance, KYC en due diligence.

kvkapibestuurderscompliancekycdue diligence

Bij zakelijke KYC en due diligence is het niet genoeg om alleen het bedrijf te verifiëren. Je wilt ook weten wie er achter het bedrijf zit: de directeuren, bestuurders en andere functionarissen die bevoegd zijn om namens de onderneming te handelen. Het Handelsregister van de KVK bevat precies die informatie, en via de API kun je die data programmatisch ophalen.

In dit artikel leggen we uit hoe je bestuurders en functionarissen opvraagt via de KVK API, welke gegevens beschikbaar zijn, en hoe je dit integreert in je compliance- of onboarding-workflow.

Wat staat er in het Handelsregister over bestuurders?

Het Handelsregister registreert voor elke rechtspersoon (BV, NV, stichting, vereniging) de personen die bevoegd zijn om namens het bedrijf te handelen. Dat omvat doorgaans:

  • Directeuren/bestuurders: de personen die het dagelijks bestuur voeren
  • Commissarissen: leden van de raad van commissarissen bij grotere BV’s
  • Volmachthouders: personen met een handelsvolmacht
  • Functionarissen: overige geregistreerde bevoegden

Per functionaris bevat het Handelsregister naam, geboortedatum (deels), functietitel en de aard van de bevoegdheid (alleen of samen, beperkt of onbeperkt).

Bestuurders ophalen via de KVKBase API

Met de KVKBase API haal je functionarisgegevens op als onderdeel van de bedrijfsdata. De gegevens zitten in het officers veld van het company-object:

import requests

API_KEY = "jouw_api_sleutel"

def haal_functionarissen_op(kvk_nummer: str) -> list:
    response = requests.get(
        f"https://api.kvkbase.nl/v1/company/{kvk_nummer}",
        headers={"Authorization": f"Bearer {API_KEY}"}
    )
    response.raise_for_status()
    data = response.json()

    return data.get("officers", [])

# Voorbeeld gebruik
functionarissen = haal_functionarissen_op("12345678")
for f in functionarissen:
    print(f"{f['name']} - {f['title']} ({f['authorityType']})")

Een typische response ziet er zo uit:

{
  "officers": [
    {
      "name": "J. de Vries",
      "title": "Directeur",
      "authorityType": "sole",
      "dateOfBirth": "1980-04",
      "startDate": "2019-04-15",
      "endDate": null
    },
    {
      "name": "M. Jansen",
      "title": "Commissaris",
      "authorityType": "none",
      "dateOfBirth": "1965-11",
      "startDate": "2021-01-01",
      "endDate": null
    }
  ]
}

Let op: de KVK publiceert geboortedatum altijd zonder dag, alleen jaar en maand. Dit is een privacymaatregel in het Handelsregister.

Bevoegdheidstype: sole vs. joint

Het veld authorityType geeft aan hoe de functionaris bevoegd is:

  • sole (alleen): mag zelfstandig tekenen en verplichtingen aangaan
  • joint (gezamenlijk): mag alleen samen met een andere bevoegde handelen
  • limited (beperkt): bevoegdheid is beperkt tot een bepaald bedrag of rechtshandeling
  • none: geen tekenbevoegdheid (bijv. commissaris)

Dit is relevant als je contracten of overeenkomsten sluit. Bij joint bevoegdheid moet een contract door twee bestuurders worden ondertekend om rechtsgeldig te zijn.

def controleer_tekenbevoegdheid(kvk_nummer: str, naam: str) -> dict:
    functionarissen = haal_functionarissen_op(kvk_nummer)

    for f in functionarissen:
        if naam.lower() in f["name"].lower() and f["endDate"] is None:
            return {
                "gevonden": True,
                "naam": f["name"],
                "functie": f["title"],
                "bevoegdheid": f["authorityType"],
                "mag_alleen_tekenen": f["authorityType"] == "sole"
            }

    return {"gevonden": False}

Historische functionarissen

Het Handelsregister bevat ook historische inschrijvingen: voormalige bestuurders die zijn uitgeschreven. In de API herken je die aan een ingevuld endDate veld. Voor due diligence is dit relevant: een voormalige directeur die is uitgetreden vóór een juridisch geschil, of een recentelijk gewijzigd bestuur, kunnen aanleiding zijn voor extra onderzoek.

def scheids_actief_en_historisch(functionarissen: list) -> dict:
    actief = [f for f in functionarissen if f.get("endDate") is None]
    historisch = [f for f in functionarissen if f.get("endDate") is not None]

    return {
        "actief": actief,
        "historisch": historisch,
        "recent_gewijzigd": any(
            f.get("startDate", "") >= "2026-01-01" or
            f.get("endDate", "") >= "2026-01-01"
            for f in functionarissen
        )
    }

Integreren in een KYC-workflow

In een zakelijke onboarding-flow kun je functionarisdata combineren met andere KVK-checks. Een compleet verificatieproces ziet er zo uit:

def kyc_bedrijf(kvk_nummer: str, opgegeven_bestuurder: str) -> dict:
    # 1. Basisdata bedrijf
    company_data = haal_bedrijfsdata(kvk_nummer)

    # 2. Controleer bedrijfsstatus
    if company_data.get("status") != "active":
        return {"goedgekeurd": False, "reden": "Bedrijf niet actief"}

    # 3. Haal functionarissen op
    functionarissen = company_data.get("officers", [])
    actieve_namen = [
        f["name"].lower() for f in functionarissen
        if f.get("endDate") is None
    ]

    # 4. Controleer of opgegeven bestuurder klopt
    naam_match = any(
        opgegeven_bestuurder.lower() in naam
        for naam in actieve_namen
    )

    if not naam_match:
        return {
            "goedgekeurd": False,
            "reden": f"{opgegeven_bestuurder} is geen actieve bestuurder"
        }

    # 5. Controleer tekenbevoegdheid
    bevoegdheid = controleer_tekenbevoegdheid(kvk_nummer, opgegeven_bestuurder)

    return {
        "goedgekeurd": True,
        "bedrijf": company_data.get("name"),
        "bestuurder_geverifieerd": True,
        "mag_alleen_tekenen": bevoegdheid.get("mag_alleen_tekenen", False),
        "aantal_actieve_bestuurders": len([f for f in functionarissen if f.get("endDate") is None])
    }

UBO en aanvullende due diligence

De KVK registreert ook UBO’s (Ultimate Beneficial Owners) via het UBO-register voor bepaalde rechtspersonen. Dit is een apart register dat niet volledig openbaar is, maar gedeeltelijk via API-integraties toegankelijk is.

Voor een volledig KYC-proces combineer je KVK-data doorgaans met:

  • UBO-register: wie zijn de uiteindelijke eigenaren (aandeelhouders >25%)?
  • Sanctielijsten: screenings op EU/OFAC-sancties
  • PEP-lijsten: politiek prominente personen

De KYC compliance gids gaat dieper in op hoe je een compleet verificatieproces opzet.

Bestuurders in bulk ophalen

Als je meerdere bedrijven wilt verifiëren, gebruik je batch-verwerking. Houd rekening met de rate limits van de API en voeg retries toe voor tijdelijke fouten:

import time

def batch_functionarissen(kvk_nummers: list, vertraging: float = 0.1) -> dict:
    resultaten = {}

    for kvk in kvk_nummers:
        try:
            resultaten[kvk] = haal_functionarissen_op(kvk)
            time.sleep(vertraging)
        except requests.HTTPError as e:
            if e.response.status_code == 429:
                time.sleep(5)
                resultaten[kvk] = haal_functionarissen_op(kvk)
            else:
                resultaten[kvk] = {"fout": str(e)}

    return resultaten

Zie de batch enrichment gids voor meer patronen bij grootschalige dataverzameling.

Conclusie

Functionarisgegevens uit het Handelsregister zijn waardevol voor compliance, KYC en contractbeheer. Via de KVKBase API haal je deze data op als onderdeel van de gewone bedrijfslookup, zonder aparte integratie. De combinatie van bedrijfsstatus, actieve bestuurders en bevoegdheidstype geeft je een solide fundament voor geautomatiseerde zakelijke verificatie.

Wil je zelf aan de slag? Maak een gratis account aan op KVKBase en probeer de API met je eigen KVK-nummers.