Dutch Company Branches: Establishment Number vs KVK Number
KVKBase Team

Dutch Company Branches: Establishment Number vs KVK Number

What is the difference between a KVK number and a Dutch establishment number, and how do you fetch every branch of a company via the API? Read the guide.

kvkapibranchesvestigingsnummeraddresses

Sooner or later, anyone working with Dutch company data runs into it: a customer gives you their KVK number, but the delivery address belongs to a branch in another city. Or your CRM shows the same company three times because someone created three shops as separate customers. The cause is almost always the same distinction: a company is not the same thing as an establishment.

At the start of 2026 the Dutch business register held more than 2.5 million establishments (vestigingen). Most belong to businesses with a single address, but retail chains, franchisees, installers and healthcare providers can have dozens. This article explains how the KVK number and the establishment number (vestigingsnummer) relate, and how to fetch every branch of a company through the KVKBase API.

KVK number vs establishment number

The KVK number has 8 digits and belongs to the registration of the business or legal entity. It stays the same for as long as the company exists, even when it moves or adopts a new trade name. It is the number printed on invoices and websites, and the one most systems use to identify a Dutch company. Our complete guide to KVK number lookups covers its format and checks.

The establishment number has 12 digits and belongs to a physical location where the business operates. Each establishment gets its own number, with its own address, trade names and activities. One of them is the main establishment (hoofdvestiging), the rest are secondary ones (nevenvestigingen). When a branch moves, the address of that establishment changes, but the company’s KVK number does not.

Think of it as a tree: the KVK number is the trunk, the establishments are the branches. A sole trader can have several of them too, say a hairdresser with two salons. The opposite also exists: a foundation that only manages assets and runs no business is in the register, but has no establishment at all.

When do you need branch data?

For plenty of use cases the KVK number is enough. If you only want to know whether a company exists and is active, a regular lookup does the job. Establishments start to matter once the location itself matters.

Take a wholesaler supplying restaurants. The customer orders under one KVK number, but the pallets need to go to five different restaurants. If you fetch all branches when the account is created, the customer can pick a delivery address from a list at checkout, with no typos in postcodes. The same goes for a service company sending technicians to sites, or an insurer writing a policy per location.

It matters in sales and marketing as well. A chain with forty stores is a very different lead from a company with one office, even when both are a BV with the same SBI code. The number of branches is a strong signal of size and reach, and activities can differ per location: a construction firm might run an office at one address and a workshop at another. Our article on SBI codes explains how to classify those activities.

Fetching every branch through the API

The KVKBase API has a dedicated endpoint for branches: GET /v1/lookup/{kvkNumber}/branches. Pass the KVK number and you get the list of establishments, each with its establishment number, name, address, activities and a flag for the main establishment. A call costs 5 tokens.

const API_KEY = process.env.KVKBASE_API_KEY;

async function getBranches(kvkNumber) {
  const response = await fetch(
    `https://api.kvkbase.nl/v1/lookup/${kvkNumber}/branches`,
    { headers: { Authorization: `Bearer ${API_KEY}` } }
  );
  if (!response.ok) throw new Error(`KVKBase returned ${response.status}`);
  return response.json();
}

const data = await getBranches("12345678");
for (const b of data.branches) {
  const city = b.address?.city ?? "unknown";
  console.log(`${b.branchNumber}  ${b.name}  (${city}, ${b.isMain ? "main" : "secondary"})`);
}

A response looks roughly like this:

{
  "kvkNumber": "12345678",
  "companyName": "Bakkerij De Korenaar B.V.",
  "totalBranches": 2,
  "branches": [
    {
      "branchNumber": "000012345678",
      "name": "Bakkerij De Korenaar",
      "isMain": true,
      "address": {
        "street": "Dorpsstraat",
        "houseNumber": "12",
        "postalCode": "3732 HB",
        "city": "De Bilt",
        "country": "Nederland"
      },
      "activities": [
        { "sbiCode": "10711", "description": "Brood- en banketbakkerijen", "isMain": true }
      ]
    },
    {
      "branchNumber": "000087654321",
      "name": "De Korenaar Utrecht",
      "isMain": false,
      "address": {
        "street": "Oudegracht",
        "houseNumber": "140",
        "postalCode": "3511 AZ",
        "city": "Utrecht",
        "country": "Nederland"
      },
      "activities": [
        { "sbiCode": "47241", "description": "Winkels in brood en banketbakkerswerk", "isMain": true }
      ]
    }
  ]
}

Two things to watch for. The address field can be null when no address is on file for an establishment, so check it before reading from it. And compare totalBranches with the length of the branches array: for large chains the total can be higher than the number of branches returned with full details, and you want to know that before you treat your list as complete. Note that SBI descriptions come back in Dutch, as the register stores them.

Letting customers pick a delivery address

A common use is a dropdown of delivery addresses. Fetch the branches once when the account is created, store them, and let the customer choose on every order. Put the main establishment first, since it is usually the billing address too.

async function deliveryOptions(kvkNumber) {
  const { branches } = await getBranches(kvkNumber);
  return branches
    .filter((b) => b.address)
    .map((b) => {
      const a = b.address;
      const number = a.houseNumber + (a.houseNumberAddition ?? "");
      return {
        establishmentNumber: b.branchNumber,
        label: `${b.name}, ${a.street} ${number}, ${a.city}`,
        isMain: b.isMain,
      };
    })
    .sort((x, y) => Number(y.isMain) - Number(x.isMain));
}

Store the establishment number on every order, not just the address as text. When a branch moves later, you can fetch it again and update the address, instead of guessing which free-text address belonged to which location.

Branches in your CRM: one company, several locations

In a CRM you usually want one account per KVK number, with the establishments as locations underneath. That avoids duplicate accounts and keeps revenue, touchpoints and contracts together at the right level. Use the KVK number as the key for the account and the establishment number as the key for each location.

It works the other way round too. If you have a CRM full of loose accounts, fetch the branches per account and see which ones share a KVK number. That surfaces duplicates a name match would never catch, because the branch trades under a different name. Keep the legal form in mind: a group with several BVs has several KVK numbers, even if your sales team thinks of it as one customer. Our article on Dutch legal entity types in KVK data goes into that.

Regular lookup or branches endpoint?

If all you need is the address of the main establishment, a regular lookup is cheaper. With ?enrich=true you get the full address, trade names, legal form and SBI codes for 2 tokens. The branches endpoint is for when you really want every location. A practical approach is to run the regular lookup first and only call the branches endpoint for business customers that are likely to have several locations, or as soon as a customer asks for delivery to another address.

All parameters and token costs are in the API reference.

Get started

Branch data is the difference between “we know this company” and “we know where this company operates”. One extra endpoint gives you every location, with its own address and activities, tied neatly to the KVK number you already use.

Create a free KVKBase account and try the branches endpoint with the KVK number of a company you know.