KVK Scraper | Dutch Companies and SBI Codes avatar

KVK Scraper | Dutch Companies and SBI Codes

Pricing

from $3.82 / 1,000 companies

Go to Apify Store
KVK Scraper | Dutch Companies and SBI Codes

KVK Scraper | Dutch Companies and SBI Codes

KVK scraper for the Dutch Kamer van Koophandel Handelsregister. Search by company name, keyword, KVK number or kvk.nl link and get legal form, trade names, SBI activity codes, address, registration date and status. 100 companies in 1 second, 24 fields each. No login and no KvK API key needed.

Pricing

from $3.82 / 1,000 companies

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

KVK Scraper (Kamer van Koophandel) | Dutch Companies and SBI Codes (2026)

KVK companies, 24 fields each, from any search.

From SilentFlow. Creators of Facebook Search Scraper and Pinterest Scraper, with 570,000+ combined lifetime runs.

Every company in the Dutch Business Register (the KVK Handelsregister), with its SBI activity codes, registration date, address and status, in rows you can filter, mail and load into your CRM. 100 companies in about 2 seconds.

Why choose this actor?

Copying company details from kvk.nl ten results at a time? Paying for a KvK API contract when you only need a list of companies in one trade and one city? Getting rows back with an empty activity code, so you still cannot tell a bakery from a foundation that happens to be called "Bakkerij"?

  • More data on every company. Each row has 28 columns, and on our default run (the keyword "bakkerij", 100 rows) 22 data fields were filled on more than half of the rows: KVK number, branch number, record type, legal form and its code, status, trade names, the activity as registered, the main SBI code and its description, every SBI code, the activities list, the full visiting address split into street, number, postcode, city and country, and the registration date.
  • SBI codes and registration dates, not empty columns. All 100 rows of that run carried their numeric SBI code, with the secondary activities next to the main one, and 96 carried the date the branch was registered. That is the column you sort and segment a Dutch lead list on, and it is in every branch row you export.
  • Three ways in: a keyword, a number or a kvk.nl link. Type a company name or a trade, paste KVK numbers or 12-digit branch numbers, or paste kvk.nl search and company pages straight from your browser. Four numbers returned 66 records (the legal entity and the branches of each company), and three kvk.nl links returned 241 rows, in the same run format.

Try KVK Scraper

Try your first company list

Paste this input in the Input tab, or send it from the API, and run. "Bakkerij" is Dutch for bakery: you get the first 100 registered companies whose name, trade name or activity matches it, each with its KVK number, legal form, SBI code, address and registration date. Our test run returned 100 rows in about 2 seconds.

{
"searches": ["bakkerij"]
}

The Apify Free plan is enough to run it: no credit card, no KvK account, no API key.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT, Cursor or any coding assistant to give it the full picture of this actor:

You have access to the KVK Scraper on Apify: silentflow/kvk-scraper
It reads the Dutch Business Register (KvK Handelsregister, kvk.nl). One row = one register record:
a legal entity (rechtspersoon), a main branch (hoofdvestiging) or another branch (nevenvestiging).
Input (no field is required; give at least one of searches, companyIds, startUrls):
- searches (array of strings): company names, trade names, keywords, streets or postcodes, e.g. ["bakkerij"].
A KVK number or a kvk.nl link typed here is read as a lookup.
- companyIds (array of strings): 8-digit KVK numbers (every record of the company) or 12-digit
branch numbers (one location), e.g. ["17001907", "000010258434"]. Lookups ignore the status filter.
- startUrls (array of {url}): kvk.nl search URLs (?q=... or ?handelsnaam=...&plaats=...) or
company pages (https://www.kvk.nl/bestellen/#/{kvk}{branch}).
- city (string): keep companies whose visiting address is in this city; also added to the search.
- maxItems (integer, default 100): max rows per search term, URL or number. One search reads at most 5,000 records.
- registrationStatus (string, default "active"): "active", "deregistered" or "all".
- registrationTypes (array): any of "hoofdvestigingen", "nevenvestigingen", "rechtspersonen", "overig". Empty = all.
- sbiCodes (array of strings): keep records with an SBI code starting with these digits, e.g. ["1071"].
- debugMode (boolean, default false).
Output per row (28 fields, missing values are null):
- id (string, stable: kvk number + branch number), url (kvk.nl company page), name
- kvkNumber (8 digits), branchNumber (12 digits or null for a legal entity)
- registrationType (Hoofdvestiging | Nevenvestiging | Rechtspersoon), legalForm, legalFormCode, isActive (boolean)
- tradeNames (array), formerTradeNames (array), statutoryName, activityDescription
- sbiCode, sbiDescription (main activity), sbiCodes (array), activities (array of {code, description, isMain})
- address, street, houseNumber, houseNumberAddition, postalCode, city, countryCode ("NL"), postalAddress
- registrationDate (YYYY-MM-DD)
- searchQuery (the input that produced the row), scrapedAt (RFC 3339 UTC)
Use apify-client for Python or JavaScript: client.actor("silentflow/kvk-scraper").call(run_input={...}),
then read the default dataset. Dataset views: overview, locations, activities.

How to scrape KVK company data

Get the registered bakeries of the Netherlands

The simplest run: one keyword. Each keyword is its own search through the whole register.

{
"searches": ["bakkerij"],
"maxItems": 500
}

Build a lead list of accountants in one city

Add a city and keep one row per company by asking for main branches only. The city is added to the search and every row is checked against the visiting address.

{
"searches": ["accountant"],
"city": "Amsterdam",
"registrationTypes": ["hoofdvestigingen"],
"maxItems": 500
}

Check a list of KVK numbers

Paste the numbers from your CRM or your supplier file. Each KVK number returns the legal entity and its branches; each branch number returns that one location. Lookups return active and deregistered records alike, so you see the status of every number.

{
"companyIds": ["17001907", "06021609", "000022544615"],
"maxItems": 50
}

Input parameters

ParameterTypeDefaultWhat it does
searchesarray of text["bakkerij"] in the formCompany names, trade names, keywords, streets or postcodes. One search per entry.
companyIdsarray of textempty8-digit KVK numbers or 12-digit branch numbers (vestigingsnummer).
startUrlsarray of URLsemptykvk.nl search pages or company pages.
citytextemptyKeep companies whose visiting address is in this city. Applies to searches and search URLs.
maxItemsinteger100Most rows per search term, URL or number.
registrationStatusselectactiveactive (ingeschreven), deregistered (uitgeschreven) or all. Applies to searches.
registrationTypesmulti-selectallhoofdvestigingen (main branches), nevenvestigingen (other branches), rechtspersonen (legal entities), overig (other records).
sbiCodesarray of textemptyKeep records with an SBI code starting with these digits (1071, 6920, 62). Applies to searches and search URLs.
debugModebooleanfalseDetailed logs, for troubleshooting.

No field is required. A run needs at least one search term, number or URL, and every other setting has a working default.

Formats accepted:

  • Search terms: anything you would type in the kvk.nl search box. Philips, installatiebedrijf Rotterdam, Kromstraat Veldhoven, 5504BC. A term that is a KVK number or a kvk.nl link is read as a lookup.
  • KVK numbers: 17001907, 1700 1907, 17.00.19.07, KvK 17001907, KVK-nummer: 17001907. A 7-digit value is read with its leading zero back (6021609 becomes 06021609), the way a spreadsheet often drops it.
  • Branch numbers: 12 digits, 000010258434. A 20-digit value (KVK number followed by branch number, the key of a kvk.nl company page) works too.
  • kvk.nl search URLs: https://www.kvk.nl/zoeken/?q=bakkerij, and older links such as https://www.kvk.nl/zoeken/handelsregister/?handelsnaam=kapper&plaats=Groningen (the place becomes the city filter of that URL).
  • kvk.nl company pages: https://www.kvk.nl/bestellen/#/17001907000010258418, with or without ?origin=search, and old ?kvknummer= links.
  • Cities: case and accents do not matter. Den Haag and The Hague match 's-Gravenhage, Den Bosch matches 's-Hertogenbosch, and Hengelo matches Hengelo (Gld).

What data can you extract from KVK?

One row per register record. A company with one shop has two records (the legal entity and its main branch, or only the main branch for a sole trader); a chain has one record per location. Every row carries the same 28 columns, in the same order, and a missing value is null, never an empty text.

GroupFields
Identityid, url, name, kvkNumber, branchNumber
Register entryregistrationType, legalForm, legalFormCode, isActive, tradeNames, formerTradeNames, statutoryName, activityDescription
Activity (SBI)sbiCode, sbiDescription, sbiCodes, activities (each with code, description, isMain)
Place and timeaddress, street, houseNumber, houseNumberAddition, postalCode, city, countryCode, postalAddress, registrationDate
RunsearchQuery, scrapedAt

What the fields mean in practice:

  • id is the KVK number followed by the branch number (or by the sub-dossier number of an old record, or nothing for a legal entity). It is the same key kvk.nl uses, it never changes for a record, and it is unique in your dataset: a record found by two searches is delivered once.
  • url is the permanent kvk.nl page of the record, where you can order the official extract.
  • registrationType is written as the register writes it: Hoofdvestiging (main branch), Nevenvestiging (other branch) or Rechtspersoon (legal entity: BV, NV, foundation, association).
  • sbiCode is the main SBI activity (the Dutch version of the European NACE classification), sbiCodes lists every activity of the record, and activities gives each code with its Dutch description and whether it is the main one.
  • activityDescription is the activity in the company's own words, as filed.
  • address is ready to print (Heuvel 25, 5502AJ Veldhoven); the same address is also split into street, houseNumber, houseNumberAddition, postalCode and city for mail merges and maps. postalAddress is filled when the company receives mail elsewhere.
  • registrationDate is the date the record was entered in the register, as YYYY-MM-DD. scrapedAt is the moment the row was read, in RFC 3339 UTC.

The dataset has three views: Companies (name, KVK number, legal form, main activity, city, registration date, status, link), Addresses (for mailings) and SBI activities (for segmentation).

Output example

A real row from the lookup of KVK number 17001907, the second shop of a family bakery in Veldhoven:

{
"id": "17001907000010258434",
"url": "https://www.kvk.nl/bestellen/#/17001907000010258434",
"name": "Bakkerij Moeskops",
"kvkNumber": "17001907",
"branchNumber": "000010258434",
"registrationType": "Nevenvestiging",
"legalForm": "Commanditaire Vennootschap",
"legalFormCode": "CV",
"isActive": true,
"tradeNames": ["Bakkerij Moeskops"],
"formerTradeNames": ["Firma Moeskops en Zoon"],
"statutoryName": null,
"activityDescription": "Broodverkopersbedrijf en winkel in chocolaterieen en suikerwerken.",
"sbiCode": "47241",
"sbiDescription": "Detailhandel in brood en banket",
"sbiCodes": ["47241", "47242"],
"activities": [
{"code": "47241", "description": "Detailhandel in brood en banket", "isMain": true},
{"code": "47242", "description": "Detailhandel in chocolade en suikerwerk", "isMain": false}
],
"address": "Heuvel 25, 5502AJ Veldhoven",
"street": "Heuvel",
"houseNumber": "25",
"houseNumberAddition": null,
"postalCode": "5502AJ",
"city": "Veldhoven",
"countryCode": "NL",
"postalAddress": "Kromstraat 10, 5504BC Veldhoven",
"registrationDate": "2004-01-01",
"searchQuery": "17001907",
"scrapedAt": "2026-10-21T18:25:43Z"
}

Advanced usage

Keep only real bakeries with an SBI code

A keyword matches names as well as activities: on our default "bakkerij" run, 12 of the 100 rows were a care foundation, a pet-food maker, a holiday rental, a fast-food place and others that only carry the word in their name. Add the SBI code of bread and pastry makers (1071) and of bakery shops (4724) to keep the trade you are after.

{
"searches": ["bakkerij", "banketbakkerij"],
"city": "Utrecht",
"sbiCodes": ["1071", "4724"],
"registrationTypes": ["hoofdvestigingen"],
"maxItems": 50
}

Our run of this input returned 60 main branches, every one with a visiting address in Utrecht and an SBI code starting with 1071 or 4724. Records that both terms found were delivered once.

Map every branch of a chain

One KVK number holds every location of a company. Ask for the other branches only and raise the cap: the number below, a supermarket chain, holds 1,042 records.

{
"companyIds": ["35012085"],
"registrationTypes": ["nevenvestigingen"],
"maxItems": 2000
}

Our run of this input returned 1,040 shops in 8 seconds, each with its own branch number, address and SBI codes, ready for a map or a territory plan.

Find the deregistered companies of a trade in a city

Closed companies stay in the register. Switch the status to deregistered to see which hairdressers in Rotterdam stopped trading, or set it to all and sort on isActive.

{
"searches": ["kapper"],
"city": "Rotterdam",
"registrationStatus": "deregistered",
"maxItems": 300
}

Paste the kvk.nl pages you already have open

Searched on kvk.nl and want the full list in a spreadsheet? Paste the address of the search page, or of any company page, and mix them with numbers in the same run.

{
"startUrls": [
{"url": "https://www.kvk.nl/zoeken/?source=all&q=installatiebedrijf"},
{"url": "https://www.kvk.nl/zoeken/handelsregister/?handelsnaam=kapper&plaats=Groningen"},
{"url": "https://www.kvk.nl/bestellen/#/17001907000010258418"}
],
"registrationStatus": "all",
"maxItems": 120
}

Our run of these three links returned 241 rows: 120 installers, 120 hairdressers in Groningen and the bakery behind the company page, with active and deregistered records side by side.

Go past 5,000 matches by splitting the search per city

One search reads at most 5,000 records, the depth kvk.nl itself serves. A broad trade across the whole country has more: split it into one search per city and every search gets its own 5,000.

{
"searches": [
"installatiebedrijf Amsterdam",
"installatiebedrijf Rotterdam",
"installatiebedrijf Utrecht",
"installatiebedrijf Eindhoven",
"installatiebedrijf Groningen"
],
"registrationTypes": ["hoofdvestigingen"],
"maxItems": 5000
}

To check a run before you scale it, keep maxItems low on the first try, look at the rows, then raise it. Schedule the same input every week and compare the id column to spot new registrations and closures.

FAQ

What is KVK? The Kamer van Koophandel (KVK, the Netherlands Chamber of Commerce) keeps the Handelsregister, the official Business Register of the Netherlands. Every company, sole trader, foundation and association that does business in the Netherlands is registered there with an 8-digit KVK number, and every business location gets its own 12-digit branch number. It plays the role Companies House plays in the United Kingdom.

What does this actor return? One row per register record found by your searches, numbers or links: the name, KVK and branch numbers, the record type, legal form, status, current and former trade names, statutory name, the registered activity, the SBI codes, the visiting and postal addresses and the registration date, with a link to the record on kvk.nl.

Do I need a KVK account or an API key? No. The actor reads the public search of kvk.nl. You do not need a KvK API subscription, a login or a key, only an Apify account, and the Free plan is enough to start.

How fresh is the data? Live. Every run reads the register at the moment it runs: nothing is cached or bought from a third party. A company registered this morning shows up in this afternoon's run if kvk.nl already shows it.

How many companies can one run return? maxItems sets the most rows per search term, URL or number, 100 by default. A run can hold as many terms and numbers as you want. One search reads at most 5,000 records, the depth kvk.nl serves: on our test, "bakkerij" across every status stopped at 5,000 rows in 54 seconds and said so in the log, while the 4,146 active bakeries came back in full in 49 seconds. Add a city, a postcode or a more precise term to reach the records past 5,000.

What is the difference between a KVK number and a branch number? The KVK number identifies the company (the legal entity). The branch number (vestigingsnummer) identifies one business location of it. A company with five shops has one KVK number and five branch numbers. Look up a KVK number to get every record of the company, or a branch number to get one location.

Why do some rows have no address or no SBI code? Legal-entity records (BV, NV, foundation) carry no address and no activity in the register: the main branch holds them. Ask for hoofdvestigingen to get one row per company with an address. A few very old records also lack a registration date. Missing values are null, so your filters and formulas treat them the same way every time.

Can I search several terms or numbers in one run? Yes. Each search term, number and link is read on its own, and the results go to the same dataset. A record found twice (by two keywords, or by a keyword and its number) is delivered once.

Does it return directors, owners, employees or annual accounts? No. Directors, ultimate beneficial owners, employee counts and financial statements are only sold by KVK as paid extracts and are not part of the public search. The url of each row opens the kvk.nl page where you can order them.

Are the values in English? The values are written as the register writes them, in Dutch: Hoofdvestiging, Besloten Vennootschap, Detailhandel in brood en banket. Field names are in English, and the SBI codes are numeric, so they map to NACE codes and English labels in one lookup.

Are the links permanent? Yes. id and url are built from the KVK number and the branch number, which never change for a record. Save them and the same row points to the same company next year.

What does isActive: false mean? The record was deregistered (uitgeschreven): the company or the branch stopped. It stays in the register, so it can still be found with the deregistered or all status, and a number lookup always returns it with its status.

More SilentFlow scrapers

๐Ÿ›’ E-commerce

๐Ÿ’ผ Jobs

๐Ÿ  Real estate

๐Ÿ“ฃ Social media

๐Ÿข Business data

โœˆ๏ธ Travel

๐ŸŽฏ Lead generation

๐Ÿ”Ž SEO

๐Ÿ“ˆ Marketing

๐Ÿงฐ More tools

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available data from kvk.nl, the public search of the Dutch Business Register. It does not bypass any login, paywall, or CAPTCHA. Users are responsible for complying with KVK's terms of use and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). Some records belong to sole traders, whose trade name and business address can identify a person: handle that personal data accordingly, for a legitimate purpose and with the right to object respected for direct marketing. The data returned is informational; for a legally binding statement, order the official KVK extract from the url of the record.

Built by SilentFlow for sales, compliance and data teams who work with Dutch companies.