Skip to main content

Data Sources

The Netherlands uses a single official registry — the KVK (Kamer van Koophandel / Chamber of Commerce) — accessed through multiple channels. Data retrieval follows a two-phase model: basic structured data from the KVK Search API, and detailed data (legal representatives, shareholders, capital, RSIN) from the HTML trade register extract via AI parsing.
  • KVK Search API (web-api.kvk.nl/zoeken) — Provides basic company data in structured JSON: legal name, legal form, status, address, activity description, and trade names. This is a free, fast API that returns data immediately. Used for search results and base company profile data.
  • KVK Trade Register Extract (Uittreksel Handelsregister) — The official HTML extract from the KVK online trade register. Contains detailed data including legal representatives (Bestuurders, Gevolmachtigden), shareholders (Aandeelhouders, Vennoten), SBI activity codes, RSIN, share capital, and employee count. This HTML is AI-parsed to extract structured data.
Two-phase data retrieval: Basic company data comes from the KVK Search API (fast, structured JSON). Detailed data (legal representatives, shareholders, capital, RSIN, SBI codes) requires fetching and AI-parsing the HTML trade register extract, which takes longer but provides comprehensive information. The trade register HTML is fetched once and reused by multiple data sources (company enrichment, legal representatives, shareholders) via document factorization.

Company Identifiers

Query Identifiers

Company TypeSourceFormatExampleNotes
All entitiesKVK8 digits (KVK number)53781066Kamer van Koophandel number — the universal Dutch business identifier
KVK Number Format: The KVK number is always exactly 8 digits. The system validates this with the regex pattern ^\d{8}$. There is no prefix, no check digit algorithm exposed to the API consumer — just 8 numeric characters.

Identifiers in API Response

Once you retrieve company data, the identifiers object contains all available identifiers for that entity:
Identifier TypeFormatExampleFound In
KVK8 digits53781066All entities (from Search API)
RSIN9 digits123456789Tax/fiscal identification number (from trade register extract, AI-parsed)
Identifier Casing: The system uses consistent uppercase KVK for the identifier key — not kvk or KvK. Always reference identifiers using this casing in API requests and responses.

Search Capabilities

Search TypePatternExampleMatch TypeExpected Results
By KVK Number8 digits53781066ExactSingle company (1 result)
By NameText string"Philips"FuzzyMultiple results
Search Performance: Use KVK number searches for exact matching and best performance. Name searches query the KVK Search API and return multiple results. Both search types have built-in retry handling for reliability. Name search results are filtered to main establishments only (Hoofdvestiging).

Quirks & Gotchas

QuirkDetails
Two-phase data retrievalBasic company data comes from the KVK Search API (fast, free); detailed data (legal reps, shareholders, capital) requires fetching and AI-parsing the HTML trade register extract. Legal reps and shareholders take longer to return.
KVK website accessKVK website access requires automated session handling. Search and establishment number retrieval are performed against the KVK website.
Legal form is deterministicUnlike most countries, Dutch legal form mapping uses a fully pre-computed lookup table (25 entries) with no AI involvement.
No UBO dataUltimate beneficial owner information is not available from the KVK API or trade register extract. The UBO register in the Netherlands is not publicly accessible.
Null ownership percentagesOwnership percentages are only extracted when explicitly stated in the trade register extract. null means “not stated”, not “0%”. The system never infers or calculates percentages.
Null nationalityNationality is always null unless explicitly stated in the document. The system does not assume Dutch nationality for shareholders of Dutch companies.
SBI codes via AISBI activity codes are AI-extracted from the trade register extract HTML, not from a structured API field. Quality depends on AI parsing accuracy.
Establishment number requiredDocument listing and fetching requires the vestigingsnummer (establishment number), which is obtained automatically before documents can be listed.
Partial document failuresThe three document listing calls (extract, financials, statutes) run in parallel. If one fails, partial results are returned. Only if all three fail is an error thrown.
KVK identifier casingThe system uses consistent KVK casing (uppercase) for identifiers, not kvk or KvK.
Statutes filteringOnly statutes with tapedForAvg === true are included in the document list. This filters out draft or internal documents.
Document delivery via emailFinancial statements and statutes are ordered from KVK, delivered via email, then downloaded. This adds latency (~30 sec). Trade register extracts use a direct online flow.
AI model for legal repsLegal representative parsing uses GPT-5.1 exclusively (no model racing). The AI extracts birth dates, start dates, roles, and authorization scope.
Company self-filteringAI parsing sometimes includes the main company itself as a legal representative or shareholder. The system automatically filters these out by matching on KVK number.

Company Status

Company status is determined deterministically from the KVK actief boolean field. No AI inference is involved in status determination.
Local StatusEnglishStandardized StatusNotes
IngeschrevenRegisteredActiveactief = true
UitgeschrevenDeregisteredClosedactief = false
The KVK provides only a binary active/inactive status. There are no detailed closure reasons (bankruptcy, liquidation, etc.) or insolvency statuses available from the structured API. More detailed status information may occasionally be available in the trade register extract via AI parsing, but it is not systematically extracted.
The Netherlands uses a pre-computed mapping of 25 legal forms from the KVK rechtsvormOmschrijving field to standardized categories and ISO 20275 codes. This mapping is fully deterministic — no AI inference is involved.

Key Business Forms

Dutch NameAbbr.EnglishStandardizedISO 20275
Besloten VennootschapBVPrivate Limited CompanyLimited Liability Company54M6
Naamloze VennootschapNVPublic Limited CompanyCorporationB5PM
EenmanszaakSole ProprietorshipSole Proprietorship4QXM
Vennootschap Onder FirmaVOFGeneral PartnershipPartnership62Y3
Commanditaire VennootschapCVLimited PartnershipPartnershipCODH
MaatschapPartnershipPartnership9AAK

Cooperatives & Non-Profits

Dutch NameEnglishStandardizedISO 20275
CooperatieCooperativeCooperativeNFFH
Onderlinge Waarborg MaatschappijMutual Guarantee CompanyCooperativeDEO1
VerenigingAssociationNonprofit Organization33MN
StichtingFoundationNonprofit OrganizationV44D
KerkgenootschapReligious Society or ChurchNonprofit OrganizationL7HX

European & Foreign Forms

Dutch NameEnglishStandardizedISO 20275
Europese naamloze vennootschap (SE)European Public Limited-Liability Company (SE)CorporationBBEB
Europees economisch samenwerkingsverbandEuropean Economic Interest GroupingOther5WU6
Europese cooperatieve vennootschap (SCE)European Cooperative Society (SCE)CooperativeBBEB
Kapitaalvennootschap binnen EERCapital company within the EEACorporationBBEB
Kapitaalvennootschap buiten EERCapital company outside the EEACorporationBBEB
Buitenlandse RechtsvormForeign Legal FormOtherM1IZ
Overige buitenlandse rechtspersoon of vennootschapOther foreign legal entity or companyOtherM1IZ

Other Forms

Dutch NameEnglishStandardizedISO 20275
Publiekrechtelijke RechtspersoonPublic Law Legal EntityGovernment-Owned EntityA0W7
RederijShipping CompanyCorporationUNJ2
Eenmanszaak met Meerdere EigenarenSole Proprietorship with Multiple OwnersOther4QXM
Rechtspersoon in oprichtingLegal entity in formationOtherEZQW
Vereniging van EigenaarsOwners’ AssociationOtherGNXT
Overige Privaatrechtelijke RechtspersoonOther Private Law Legal EntityOtherM1IZ
The Dutch legal form mapping is fully deterministic with pre-computed mappings for all 25 legal forms. Unlike many other countries, no AI enrichment is needed for legal form classification. If an unknown legal form appears from the KVK API, it is returned with only the localName field populated and no standardized mapping.
Legal representatives are extracted from the KVK trade register extract HTML via AI parsing. The HTML content is fetched from the KVK website, converted to Markdown (stripping scripts, styles, navigation, and images), and then processed by GPT-5.1 (exclusively, no model racing) to identify legal representatives.

Common Roles

Dutch RoleEnglish TranslationTypical Classification
BestuurderDirector / ManagerLegal Representative
DirecteurDirectorLegal Representative
Enig aandeelhouder/directeurSole Shareholder / DirectorLegal Representative
Bestuurder - Alleen/zelfstandig bevoegdDirector - Sole/Independent AuthorityLegal Representative
Bestuurder - Gezamenlijk bevoegdDirector - Jointly AuthorizedLegal Representative
Dutch RoleEnglish TranslationTypical Classification
GevolmachtigdeAuthorized RepresentativeLegal Representative
Gevolmachtigde - Beperkte volmachtAuthorized Representative - Limited Power of AttorneyLegal Representative
Gevolmachtigde - Onbeperkte volmachtAuthorized Representative - Unlimited Power of AttorneyLegal Representative
Dutch RoleEnglish TranslationTypical Classification
VennootPartnerLegal Representative
Beherend vennootManaging PartnerLegal Representative
Commanditaire vennootLimited PartnerOther Key Person

AI Parsing Details

The AI extracts the following fields for each legal representative:
FieldDutch Source TermDescription
Birth dateGeboortedatumDate of birth
Start dateDatum in functieDate the person started in the role
Role(Section header / context)Role title (Bestuurder, Gevolmachtigde, etc.)
Name title(Mr., Mrs., Dr., etc.)Honorific prefix only
AI Parsing Behavior: The system does not extract authorityDetails or scope of authorization fields for legal representatives. Title extraction is limited to honorifics (Mr., Mrs., Dr.) as part of individual.name.title — role information is captured separately. The AI is instructed to only include explicitly mentioned legal representatives and to exclude the main company itself from the results.

Other Key Persons

Other key persons are not systematically extracted as a separate category for the Netherlands. The AI parsing classifies all extracted persons from the trade register extract as either legal representatives or shareholders based on context. There is no separate “other key persons” data source.

Shareholders

Shareholders are extracted from the KVK trade register extract HTML via AI parsing, using the same HTML document as legal representatives (fetched once via document factorization).

Dutch Terms for Shareholders

Dutch TermEnglishEntity TypeFound In
AandeelhoudersShareholdersBV, NV companiesCapital companies
VennotenPartnersVOF, CV partnershipsPartnerships
EigenaarOwnerEenmanszaak (sole proprietorship)Sole proprietorships

Extraction Logic

SourceWhen UsedData Extracted
Trade Register Extract HTMLAlways (AI-parsed)Partners, Shareholders, Owners with names and optional share percentages

Ownership Fields

FieldDescriptionSource
sharePercentageOwnership percentageOnly if explicitly stated in document (null if not stated)
typeIndividual or CompanyDetermined from AI parsing context
nationalityNationalityOnly if explicitly stated (null by default — never assumes Dutch)
Critical: Ownership PercentagesShare percentages are only extracted when explicitly stated in the trade register extract (e.g., “50%”, “33,33%”). The system does not infer or calculate percentages. If no percentage is mentioned, sharePercentage is null. Do not assign 100% to each shareholder. Nationality is also null unless explicitly stated — the system does not assume Dutch nationality.
Shareholder data is available for BV/NV companies, VOF/CV partnerships (as partners), and Eenmanszaak (as owner). Stichtingen (foundations) and Verenigingen (associations) do not have shareholders.

Activity Code Mapping

The Netherlands uses the SBI (Standaard Bedrijfsindeling) classification, which is the Dutch implementation of NACE Rev. 2. SBI codes are extracted from the trade register extract via AI parsing. When only an activity description is available (from the Search API), the system enriches it to NACE/ISIC codes via AI.
SBI (Dutch) -> NACE Rev. 2 (European) -> ISIC Rev. 4 (International)
ClassificationSourceExampleAI Inferred?
SBITrade register extract (AI-parsed)6201Partially (AI-extracted from HTML)
NACEDerived from SBI or AI-enriched from description6201Sometimes
ISICDerived from NACE or AI-enriched6201Sometimes

Activity Codes by Source

SourceClassifications ReturnedNotes
Trade Register ExtractSBI + NACE + ISICAll SBI codes from document (AI-parsed). Multiple codes extracted.
KVK Search API (fallback)NACE + ISIC (AI-enriched from activiteitomschrijving)When trade register extract is not available (e.g., onboarding profile)
AI Enrichment: SBI codes are AI-extracted from the trade register extract HTML. When the search API provides only an activiteitomschrijving (activity description text), the system enriches this to NACE/ISIC codes via AI. Every activity item includes an isAIInferred flag to distinguish official vs. AI-derived codes.

Data Availability Matrix

Data TypeBV/NVVOF/CVEenmanszaakStichting/VerenigingNotes
Company Profile✅ Async✅ Async✅ Async✅ AsyncBasic data from Search API + AI enrichment from trade register
Legal RepresentativesAI-parsed from trade register extract HTML
Shareholders✅ (as partners)✅ (as owner)AI-parsed; VOF/CV show partners, EMZ shows owner
Ultimate Beneficial OwnersNot available from KVK (UBO register not publicly accessible)
EstablishmentsNot yet implemented
Activity Codes⚠️ AI-inferred⚠️ AI-inferred⚠️ AI-inferred⚠️ AI-inferredSBI codes from trade register extract + AI enrichment
Legend: ✅ Available | ❌ Not Available | ⚠️ Conditionally Available | Async = Asynchronous processing

Documents by Company Type

All Companies

Document TypeAPI CategoryFormatSKUAvailabilityNotes
Uittreksel Handelsregister (Trade Register Extract)tradeRegisterExtractPDFNLD_REGISTER_EXTRACT✅ When availableOnline extract from KVK (~30 sec, 24h cache)
Jaarrekening (Financial Statements)financialStatements[]PDFNLD_FINANCIAL_STATEMENTS✅ When filedAnnual accounts from KVK (delivered via email, 99-year cache)
Statuten (Articles of Association)articlesOfAssociation[]PDFNLD_STATUS✅ When filedCorporate statutes from KVK (delivered via email, filtered by tapedForAvg, 99-year cache)
Trade Register Extract: The Uittreksel is an HTML document fetched from the KVK website and converted to PDF for delivery. The HTML content is AI-parsed to extract structured data.
Document Delivery Methods: The trade register extract uses a direct online flow (fast, ~30 sec). Financial statements and statutes use a mail flow: the document is ordered from KVK, delivered via email, then downloaded and saved. This adds latency but is the only retrieval method available for these document types.
Document Listing: Documents are listed via three parallel KVK API calls: (1) trade register extract availability, (2) financial statements, (3) statutes. If one source fails, partial results are still returned. Only if all three fail is an error thrown.

Example API Responses

All examples use placeholder data. Query: POST /company with { "id": "<id>", "countryCode": "NL", "dataPoints": ["companyProfile"] }
{
  "company": {
    "id": "12345678",
    "countryCode": "NL",
    "identifiers": { "KVK": "12345678", "RSIN": "123456789" },
    "legalName": "Voorbeeld Tech B.V.",
    "activityDescription": "Ontwikkeling van software en IT-diensten.",
    "status": { "localName": "Ingeschreven", "active": true, "statusDetailsBeta": { "status": "ACTIVE" } },
    "legalForm": { "localName": "Besloten Vennootschap", "englishTranslation": "Private Limited Company", "standardized": "Limited Liability Company", "iso20275Code": "54M6" },
    "capital": { "amount": 100000, "currency": "EUR" },
    "activities": {
      "SBI": [{ "code": "6201", "description": "Ontwikkeling en productie van software", "isAIInferred": true }],
      "NACE": [{ "code": "6201", "description": "Computer programming activities", "isAIInferred": true }],
      "ISIC": [{ "code": "6201", "description": "Computer programming activities", "isAIInferred": true }]
    },
    "legalAddress": { "addressLine1": "Herengracht 100", "city": "Amsterdam", "postalCode": "1015 AA", "countryCode": "NL" }
  },
  "legalRepresentatives": [
    { "type": "individual", "role": { "localName": "Bestuurder", "standardized": "Director" }, "individual": { "name": { "fullName": "Jan de Vries" }, "birthDate": { "year": 1980, "month": 5, "day": 15 } } },
    { "type": "individual", "role": { "localName": "Gevolmachtigde", "standardized": "Authorized Representative" }, "individual": { "name": { "fullName": "Anna Bakker" }, "birthDate": { "year": 1985, "month": 9 } } }
  ],
  "shareholders": [
    { "type": "individual", "sharePercentage": null, "individual": { "name": { "fullName": "Jan de Vries" } } },
    { "type": "company", "sharePercentage": 60, "company": { "legalName": "Holding Groep B.V.", "id": "87654321" } }
  ]
}
{
  "company": {
    "id": "98765432",
    "countryCode": "NL",
    "identifiers": { "KVK": "98765432" },
    "legalName": "Oude Fabriek N.V.",
    "activityDescription": "Vervaardiging van textielproducten.",
    "status": { "localName": "Uitgeschreven", "active": false, "statusDetailsBeta": { "status": "CLOSED" } },
    "legalForm": { "localName": "Naamloze Vennootschap", "englishTranslation": "Public Limited Company", "standardized": "Corporation", "iso20275Code": "B5PM" },
    "activities": {
      "SBI": [{ "code": "1320", "description": "Weven van textiel", "isAIInferred": true }],
      "NACE": [{ "code": "1320", "description": "Weaving of textiles", "isAIInferred": true }],
      "ISIC": [{ "code": "1312", "description": "Weaving of textiles", "isAIInferred": true }]
    },
    "legalAddress": { "addressLine1": "Industrieweg 25", "city": "Rotterdam", "postalCode": "3024 AA", "countryCode": "NL" }
  },
  "legalRepresentatives": [
    { "type": "individual", "role": { "localName": "Bestuurder", "standardized": "Director" }, "individual": { "name": { "fullName": "Pieter Jansen" }, "birthDate": { "year": 1965, "month": 3 } } }
  ]
}
Note: Closed companies have active: false and status Uitgeschreven (Deregistered). No detailed closure reason is available from the KVK.
{
  "company": {
    "id": "87654321",
    "countryCode": "NL",
    "identifiers": { "KVK": "87654321" },
    "legalName": "Bakkerij van den Berg V.O.F.",
    "activityDescription": "Vervaardiging van brood en banketbakkerswerk.",
    "status": { "localName": "Ingeschreven", "active": true, "statusDetailsBeta": { "status": "ACTIVE" } },
    "legalForm": { "localName": "Vennootschap Onder Firma", "englishTranslation": "General Partnership", "standardized": "Partnership", "iso20275Code": "62Y3" },
    "legalAddress": { "addressLine1": "Kalverstraat 50", "city": "Utrecht", "postalCode": "3511 AA", "countryCode": "NL" }
  },
  "legalRepresentatives": [
    { "type": "individual", "role": { "localName": "Vennoot", "standardized": "Partner" }, "individual": { "name": { "fullName": "Pieter van den Berg" } } },
    { "type": "individual", "role": { "localName": "Vennoot", "standardized": "Partner" }, "individual": { "name": { "fullName": "Maria van den Berg" } } }
  ],
  "shareholders": [
    { "type": "individual", "sharePercentage": null, "individual": { "name": { "fullName": "Pieter van den Berg" } } },
    { "type": "individual", "sharePercentage": null, "individual": { "name": { "fullName": "Maria van den Berg" } } }
  ]
}
Note: VOF partners (Vennoten) appear as both legal representatives and shareholders. Ownership percentages are typically not stated for partnerships, so sharePercentage is null.
{
  "company": {
    "id": "11223344",
    "countryCode": "NL",
    "identifiers": { "KVK": "11223344" },
    "legalName": "Consultancy Van Dijk",
    "activityDescription": "Advisering op het gebied van management en bedrijfsvoering.",
    "status": { "localName": "Ingeschreven", "active": true, "statusDetailsBeta": { "status": "ACTIVE" } },
    "legalForm": { "localName": "Eenmanszaak", "englishTranslation": "Sole Proprietorship", "standardized": "Sole Proprietorship", "iso20275Code": "4QXM" },
    "legalAddress": { "addressLine1": "Keizersgracht 200", "city": "Amsterdam", "postalCode": "1016 AA", "countryCode": "NL" }
  },
  "shareholders": [
    { "type": "individual", "sharePercentage": null, "individual": { "name": { "fullName": "Sophie van Dijk" } } }
  ]
}
Note: For sole proprietorships, the owner (Eigenaar) appears as a shareholder. The entrepreneur is the company itself.
{
  "company": {
    "id": "55667788",
    "countryCode": "NL",
    "identifiers": { "KVK": "55667788" },
    "legalName": "Stichting Kunstbehoud Nederland",
    "activityDescription": "Behoud en promotie van Nederlands cultureel erfgoed.",
    "status": { "localName": "Ingeschreven", "active": true, "statusDetailsBeta": { "status": "ACTIVE" } },
    "legalForm": { "localName": "Stichting", "englishTranslation": "Foundation", "standardized": "Nonprofit Organization", "iso20275Code": "V44D" },
    "legalAddress": { "addressLine1": "Museumplein 10", "city": "Amsterdam", "postalCode": "1071 DJ", "countryCode": "NL" }
  },
  "legalRepresentatives": [
    { "type": "individual", "role": { "localName": "Bestuurder", "standardized": "Director" }, "individual": { "name": { "fullName": "Willem de Groot" }, "birthDate": { "year": 1970, "month": 8, "day": 20 } } }
  ]
}
Note: Foundations (Stichtingen) have no shareholders — they are non-profit entities with a board of directors (Bestuurders). No UBOs are available from the KVK.
Documents are returned when "dataPoints": ["availableDocuments"] is requested.
API CategoryDocumentNotes
tradeRegisterExtractUittreksel Handelsregister PDFWhen available (~30 sec, online flow)
financialStatements[]Jaarrekening (annual accounts)When filed, PDF format (mail flow)
articlesOfAssociation[]Statuten (corporate statutes)When filed, PDF format (mail flow, filtered by tapedForAvg)