🇳🇱 Netherlands — Kamer van Koophandel (KVK) — Handelsregister, Open Dataset APIs (opendata.kvk.nl, HVDS, CC-BY 4.0)
Access Netherlands's official company register in real time via the OpenRegistry MCP endpoint. Unified schema, source-linked, live passthrough (no caching).
Data license: Creative Commons Attribution 4.0 (CC-BY 4.0). High Value Data Set (HVDS) under EU Regulation 2023/138; may not be enriched in ways that trace back to an individual natural person.
Real-time: yes — every call hits upstream
Caching notes: All caches: 10 seconds for cross-call deduplication. Each call hits opendata.kvk.nl fresh. Upstream rate limits are severe: basisbedrijfsgegevens 100 req/5 min; jaarrekeningen 1 req/min. Pass fresh=true to bypass the local cache (does not bypass upstream rate limits).
Netherlands' official company register via the free high-value open-data tier. 8-digit KVK-number lookup only; no name search on the free tier. Profile's company_name is empty by design (PII stripped upstream); only BV + NV legal forms are covered.
Company ID format
Nederlands KVK-nummer: 8 digits. Values with fewer digits are left-padded with zeros. Whitespace / dots / dashes are stripped.
searchblocker — search_companies returns 501 on the free tier. The free feed looks up only by 8-digit kvkNummer — no name-search endpoint. Workaround: use the EU cross-border lookup portal to find the number first, then call get_company_profile. A paid subscription surface exists for name search but is not proxied.
id_formatinfo — company_id is the 8-digit KVK-nummer. Shorter values are left-padded with zeros; whitespace / dots / dashes are stripped on input.
statusinfo — Status is derived from (actief, insolventieCode): actief='N' → dissolved; actief='J' + insolventieCode ∈ {FAIL, SSAN, SURS} → inactive; actief='J' + no insolventieCode → active; anything else → unknown.
otherwarning — The free tier strips personally identifying content by legal design: company_name comes back EMPTY; no trading name, no full address (only the first 2 postcode digits), no national IDs, no establishment numbers. Coverage limited to the two main commercial legal forms (BV, NV). For the full record use a paid channel (not proxied here).
filingsinfo — list_filings + get_financials return AT MOST ONE item — the latest adopted annual accounts. filing_id='accounts/{FinancialYear}', category='accounts', has_document=false because the full key→value tree is embedded in jurisdiction_data.opendataFields. Entities with no adopted filing resolve to empty list (expected for group-exempted subsidiaries and for large entities that filed PDF-only for fiscal years before 2025).
documentsblocker — get_document_metadata + fetch_document return 501. The annual-accounts body is embedded inline in list_filings / get_financials output (no separate body to fetch). Paid register extracts exist on a separate portal (not proxied).
officersblocker — get_officers returns 501. Officer / director data requires a paid data subscription or a one-off register extract — neither is proxied.
shareholdersblocker — get_shareholders returns 501 permanently. Dutch company law keeps the shareholder register privately at the company's registered office — it is NOT received by the register and no public or paid channel returns Dutch shareholders. For listed entities, consult the national securities regulator's threshold-crossing disclosures.
pscblocker — get_persons_with_significant_control returns 501. The Dutch UBO register is AML-gated — access restricted to obliged entities (banks, notaries, auditors, law-enforcement). No public programmatic access.
chargesblocker — get_charges returns 501. Dutch pledges are held by the tax authority (no public channel). Real-estate mortgages are at the national cadastre (separate paid subscription).
officersblocker — get_officer_appointments + search_officers return 501. No public people-index is published; national privacy rules keep natural-person cross-company search off the public surface.
routinginfo — Global cross-country search silently skips NL (no name-search channel). Direct jurisdiction='NL' + a known 8-digit kvkNummer still works via get_company_profile / list_filings / get_financials.
Available jurisdiction_data fields
Every tool response carries a jurisdiction_data object with the raw upstream fields (names unchanged). The full field set per record type:
rechtsvormCode ('BV' besloten vennootschap / 'NV' naamloze vennootschap — HVDS covers only these two forms)
postcodeRegio (integer — first two digits of bezoekadres postcode; HVDS-anonymised, full postcode and street are NOT exposed)
activiteiten[] ({ sbiCode (max 6 digits per CBS SBI classificatie), soortActiviteit: 'Hoofdactiviteit'|'Nevenactiviteit' })
lidstaat ('NL')
NOT exposed by HVDS (by legal design): company name / handelsnamen / statutaire naam / full address / RSIN / vestigingsnummer / officers / shareholders / UBO / capital / jaarrekeningen body. For those, use the paid Digitaal uittreksel or the €6.40/mo + €0.02/call Handelsregister REST subscription.
filing (7 fields)
opendataFields[] — nested key→value tree of one ADOPTED annual accounts filing. Each node is { key: string, value?: string, opendataFields?: [...] }.
Top-level keys always include: SbiBusinessCode (primary SBI activity code of the reporting entity), DocumentAdoptionDate (vaststellingsdatum — date the accounts were adopted by the shareholders), FinancialYear (boekjaar, e.g. '2024').
Top-level section subtrees when present: BalanceSheet (balans), IncomeStatement (winst-en-verliesrekening), CashFlowStatement (kasstroomoverzicht). Consolidated variants (ConsolidatedBalanceSheet / ConsolidatedIncomeStatement / ConsolidatedCashFlowStatement) appear only when the entity filed a consolidated account.
Inside each section the tree descends through XBRL section titles (BalanceSheetTitle, AssetsTitle, EquityAndLiabilitiesTitle, GrossMarginTitle, CashFlowOperatingActivitiesTitle, …) into leaf { key, value } concepts (EquityAndLiabilities, Assets, Equity, NetResultAfterTax, IntangibleAssets, PropertyPlantEquipment, FinancialAssets, Inventories, Receivables, CashAndCashEquivalents, OperatingResult, ResultBeforeTax, IncomeTaxExpense, CashFlowInvestingActivities, CashFlowFinancingActivities, NetCashFlows, …).
Coverage depth varies by business class — micro BVs may expose only EquityAndLiabilities; mid-sized filers expose the full balance sheet + P&L; a small subset adds consolidated.
The endpoint returns ONLY the latest adopted filing per KVK (no historical feed). get_financials / list_filings therefore return 0 or 1 item; entities without vastgestelde XBRL return 404 IPD7002 → empty list (handled internally).
openregistry does NOT parse the XBRL — the full tree is preserved verbatim in jurisdiction_data.opendataFields so the AI client extracts concepts directly.