Skip to content

API

One company per call, by its KVK number or its domain. Back as JSON.

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"    ]  }}
Example with a fictional company.

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.nl

    The same company, by its domain.

  • GET /v1/companies

    Search companies on what they do and use.

  • POST /v1/companies/enrich

    Enrich 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 counting kvk_number and name.
  • fields: the fields we know.

A false, a 0 or an empty list [] is an answer, and counts as known.

MeaningValue
Knownthe value
No, zero or nonefalse, 0 or []
Unknownnull

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.

FieldFormExample
PhoneE.164+31301234567
Postcodewithout a space3511AA
CountryISO 3166-1NL
Legal form, providerslower-case codebv
Amountcents, with currency4900
DateISO 86012026-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. The Retry-After header 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"  }}
Example with a fictional number we don't know.

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.