API
Fetch a company
Send a KVK number and you get the company back: what it does and uses, as fixed fields.
Field names are English, in snake_case. The explanations and error messages are in Dutch.
website is the company's main site, websites are the domains we know for the company. A list is an array, even with one value in it.
GET /v1/companies/00000002{ "kvk_number": "00000002", "name": "Voorbeeld B.V.", "legal_form": "bv", "active": true, "vat_number": "NL000000002B01", "address": { "street": "Voorbeeldstraat", "house_number": "1", "postcode": "3511AA", "city": "Utrecht", "country": "NL", "latitude": 52.0907, "longitude": 5.1214 }, "building": { "uses": [ "kantoorfunctie" ], "floor_area": 180, "construction_year": 1931 }, "website": "voorbeeld.nl", "websites": [ "voorbeeld.nl", "voorbeeldbv.nl" ], "languages": [ "nl", "en" ], "services": [ "Advies", "Onderhoud" ], "trust_marks": [], "rating": null, "apps": [], "webshop": false, "webshop_platform": null, "payment_providers": [], "payment_methods": [], "shipping_countries": [], "shipping_area": null, "phone": "+31301234567", "whatsapp": null, "email": "[email protected]", "social_profiles": [ { "platform": "linkedin", "url": "https://www.linkedin.com/company/voorbeeld" } ], "chat": [], "booking": false, "booking_tools": [], "opening_hours": [ { "day": "monday", "opens": "09:00", "closes": "17:00" }, { "day": "tuesday", "opens": "09:00", "closes": "17:00" }, { "day": "wednesday", "opens": "09:00", "closes": "17:00" }, { "day": "thursday", "opens": "09:00", "closes": "17:00" }, { "day": "friday", "opens": "09:00", "closes": "17:00" } ], "open_vacancies": 2, "vacancies": [ { "title": "Adviseur", "location": "Utrecht", "employment_type": "FULL_TIME", "url": "https://voorbeeld.nl/vacatures/adviseur" }, { "title": "Office manager", "location": "Utrecht", "employment_type": "PART_TIME", "url": "https://voorbeeld.nl/vacatures/office-manager" } ], "technologies": [ { "name": "Google Analytics", "category": "analytics", "version": null, "support": null }, { "name": "WordPress", "category": "cms", "version": "6.9", "support": "current" }, { "name": "Cookiebot", "category": "consent", "version": null, "support": null } ], "cms": "WordPress", "outdated_software": false, "hosting": { "provider": "transip", "dns_provider": "transip", "cdn": null, "http3": false }, "security_headers": [ "strict-transport-security", "x-content-type-options" ], "email_provider": "microsoft", "mail_security": { "spf": "softfail", "dmarc": "quarantine", "dkim": true, "bimi": false, "mta_sts": false }, "cookie_banner": true, "consent_platform": "Cookiebot", "privacy_statement": true, "tracks_before_consent": false, "known": { "count": 35, "total": 39, "fields": [ "legal_form", "active", "vat_number", "address", "building", "website", "websites", "languages", "services", "trust_marks", "apps", "webshop", "payment_providers", "payment_methods", "shipping_countries", "phone", "email", "social_profiles", "chat", "booking", "booking_tools", "opening_hours", "open_vacancies", "vacancies", "technologies", "cms", "outdated_software", "hosting", "security_headers", "email_provider", "mail_security", "cookie_banner", "consent_platform", "privacy_statement", "tracks_before_consent" ] }}From number to list
The KVK number comes first. The domain is an equal second way in: if you only have a website, for example from the email address on a sign-up, you get the same response.
After that: searching on what companies do and use, and enriching a list in one go.
GET /v1/companies/{kvk_number}One company by its KVK number.
GET /v1/companies?domain=voorbeeld.nlThe same company, by its domain.
GET /v1/companiesSearch companies on what they do and use.
POST /v1/companies/enrichEnrich a list of KVK numbers in one go.
Unknown is null
A field we don't know is null. Never a blank string and never a zero, so you can tell no apart from we don't know.
The known object counts the fields we know. A number, not text like "6/7", so you can sort and filter on it.
count: how many fields we know.total: how many fields a response has, not countingkvk_numberandname.fields: the fields we know.
A false, a 0 or an empty list [] is an answer, and counts as known.
| Meaning | Value |
|---|---|
| Known | the value |
| No, zero or none | false, 0 or [] |
| Unknown | null |
Format
Values come in a fixed form, so you can store them without converting. How you show them is up to you: the app shows a phone number as 030 123 45 67.
| Field | Form | Example |
|---|---|---|
| Phone | E.164 | +31301234567 |
| Postcode | without a space | 3511AA |
| Country | ISO 3166-1 | NL |
| Legal form, providers | lower-case code | bv |
| Amount | cents, with currency | 4900 |
| Date | ISO 8601 | 2026-10-20 |
Your API key
Send your key in the header Authorization: Bearer <key>. You create your keys yourself, in your account.
Each key can make [number] requests per minute. Above that, you get the error rate_limited.
Errors
An error always has the same shape: an error object with a code for your code to act on, a message in Dutch and a docs_url to the explanation below.
invalid_api_key(401): the key is missing, or we don't know it. It may have been revoked.invalid_kvk_number(422): a KVK number has eight digits, without spaces or dots.company_unknown(404): we don't know the number. That says nothing about the company.rate_limited(429): the key has reached its limit. TheRetry-Afterheader says after how many seconds you can try again.
GET /v1/companies/00000001{ "error": { "code": "company_unknown", "message": "We kennen KVK-nummer 00000001 niet. Dat zegt niets over het bedrijf.", "docs_url": "https://achtcijfers.nl/api#company_unknown" }}What you get per call
How many fields a response has, you choose with the package: Basis, Plus or Tech. Which field is in which package is on Fields. You pay per company, and a number we don't know costs nothing. Go to pricing.