Search the Dutch Chamber of Commerce (KVK) Handelsregister by company name or activity keyword and get clean company rows: KVK number, branch number, trade names, legal form, status, address and activity. Deduplicated, with a town filter.
KVK Handelsregister company search (browser-free, curl-cffi). At run start it reads the public
https://www.kvk.nl/config.env.js, parses window.__ENV for the API base URL and the general search
profile id (nothing is hardcoded), then walks GET {base}/zoeken/v3/search?q=&language=nl&site=handelsregister&size=10&start=<offset>
with the profileId header. start is an item offset.
Stops on an empty page, the hit count, the API's 400 "Combination Size and Start is invalid." window
cap, or maxResultsPerQuery / maxResults. Dedupe on kvkNummer + vestigingsnummer across the run.
A page that fails after its retries is skipped; two consecutive failures (or a failed first page) end only
that query. A query the register answers with zero hits finishes SUCCEEDED with zero rows. A 401/403
re-reads the config in case the profile id was rotated.
Optional place is appended to each query as search text (live: bakkerij 15,940 hits ->
bakkerij Utrecht 435 hits, Utrecht rows). Postcode-only narrowing is not offered: bakkerij 3511AA returned 0.
The start event is charged with the first delivered batch, not at launch; a run with no rows charges nothing.
Default proxy is bare Apify datacenter; a country pin was refused (HTTP 407) for the probed tokens, so it is
not defaulted. A requested proxy that cannot be created fails the run rather than going direct.
Offline tests against real captured bodies (no live network).