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.
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 aangaanjoint(gezamenlijk): mag alleen samen met een andere bevoegde handelenlimited(beperkt): bevoegdheid is beperkt tot een bepaald bedrag of rechtshandelingnone: 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.