Netherlands Insolvency Register - Bankruptcy Feed avatar

Netherlands Insolvency Register - Bankruptcy Feed

Pricing

$2.00 / 1,000 per insolvency publication returneds

Go to Apify Store
Netherlands Insolvency Register - Bankruptcy Feed

Netherlands Insolvency Register - Bankruptcy Feed

From $2 per 1,000 records, no start fee. The Dutch national insolvency register: every bankruptcy, suspension-of-payment and debt-restructuring publication in its rolling 30-day window - company name, KvK number, address, court, case number, and the court-appointed trustee with a phone number.

Pricing

$2.00 / 1,000 per insolvency publication returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

🇳🇱 Netherlands Insolvency Register — new bankruptcies, structured

Every bankruptcy, suspension of payment and personal debt restructuring published by the Dutch courts, from the judiciary's own register — with the KvK number, the business address, and the phone number of the trustee the court put in charge of the estate.

The Centraal Insolventieregister (insolventies.rechtspraak.nl) is where the eleven Dutch district courts are legally required to publish insolvency decisions. It is the authoritative, same-day record that a company has gone under. This Actor turns it into a table.


📊 The numbers, measured on 2026-09-16/17

Every figure below was counted against the live register on the day this Actor was built. Nothing here is an estimate.

Publications in the register's whole rolling window2,574
Business days that window covers22 (2026-08-18 → 2026-09-16)
Publications per business day~117
New bankruptcies declared in those 30 days653
Full sweep, everything, at the default settings103 seconds
Company rows a full sweep delivered859
Detail requests that failed in that sweep0 of 2,574

Field fill — counted on all 859 company rows of a full live sweep

FieldFillFieldFill
subjectName100%trusteeName100%
kvkNumber100%trusteePhone95.7%
court100%businessAddress98.4%
caseNumber100%businessCity98.4%
caseType100%postalAddress93.6%
publicationDate100%tradeNames93.2%

A second, independent count over a random 300-record sample (companies and private individuals, recounted by offline_validate.mjs on every run) agrees: supervisionCaseNumber 100%, supervisingJudge 100%, trusteeAddress 100%, hearingLocation 23.3%, previousCaseNumber 10.0%, claimsDeadline 6.0%.

"Filled" excludes "", null, "N/A", "-" and "Onbekend".


❌ What this register does NOT have — read this before you buy

Two columns you would expect on a lead list are not here, and no scraper can conjure them:

There is no email address. None. Not sparse — absent. A regex over 300 complete detail payloads returned zero matches, a regex over a whole day's bulletin returned zero, and not one of the register's 106 schema keys even contains the string "mail". This Actor does not ship an email column, and you should not believe any tool that says it can get you one from this source.

The phone number is the lawyer's, not the company's. The register has a telefoonnummer field on the insolvent party's address, and across 703 subject address records it was populated 0 times. The only phone number in this dataset is the court-appointed trustee's office line (95.7% filled, 142 distinct numbers across 286 in the sample — these are real, different law firms). That is deliberate on the register's part: once a company is bankrupt, the person you are legally meant to contact about the estate is the trustee.

So: this is a distress-signal feed and a trustee directory, not a company-contact scraper. If you want the company's own switchboard, join kvkNumber to a Chamber-of-Commerce source.


🧩 What one row is

One row per publication, which is the grain the register itself publishes in. Across a 300-record sample, 300 publications carried 300 distinct national case numbers, so in a 30-day window a publication is effectively one case event.

Publication types, with the count each drew over the measured 30-day window:

Type30 daysWhat it means
uitspraken faillissement653A company has just been declared bankrupt. The lead.
uitspraken schuldsanering512A private individual entered debt restructuring.
einde faillissementen433A bankruptcy closed — estate wound up or no assets found.
einde schuldsaneringen299A debt restructuring ended.
uitspraken surseance29Suspension of payment granted (the step before bankruptcy).
einde surseances21A suspension ended.
overig936Hearings, corrections, trustee and judge replacements, distribution lists.

Pick uitspraken faillissement alone and you get a clean stream of newly-failed companies. Leave it empty and you get the whole docket, which is what you want if you are tracking cases rather than sourcing leads.


🔒 Privacy — why this ships companies only by default

The register covers named private individuals as well as companies, with their birth date (99.4% filled) and home address (87.4%) attached. Measured on the 300-record sample: 125 companies, 175 private individuals.

Two gates, both shut by default:

  1. subjectType defaults to companies. A default run never returns a private individual at all.
  2. includePersonalData defaults to false. Even if you switch to individuals, birthDate, birthPlace and homeAddress are omitted entirely (the keys are absent, not null) and the row is flagged personalDataWithheld: true. Name, case and trustee still come through, because that is the publication.

The register also has its own suppression flag, geheimAdres — 21 of the 300 records — and it blanks the addresses server-side when set. Those rows come back with addressWithheld: true.

This is public-register data from a court, but it is still EU personal data about named people in financial distress. Your lawful basis for processing it is yours, not ours.

Company/individual is decided by the register's own KvKNummer field, never by the name. We tested a name-suffix rule (B.V., V.O.F., Stichting…) and it missed a real company — "EANA Transport" — 1 time in 125, so it is not used anywhere in this Actor, not even to skip a lookup.


⏳ The hard limit: there is no archive

The register serves a rolling window of about one calendar month and nothing behind it. A search with an older start date is refused outright with StartDate mag niet liggen voor 17-08-2026, and asking the daily bulletin for a day outside the window returns HTTP 200 with zero publications — a success-shaped empty.

There is no way to backfill. If you want Dutch insolvency history, run this on a daily or weekly schedule and keep your own. daysBack maxes out at 31 for that reason, and if you ask for more than the register is serving, the Actor reads the real floor out of the refusal message and clamps to it rather than guessing, recording the clamp in RUN_SUMMARY.

And the date search does not filter on the publication's date

Measured, and worth knowing: of 300 publications returned by a 30-day query, 275 (91.7%) were dated inside that window and 25 were not — the oldest from 2023. The register re-serves an older publication when its case record is touched. The same check on a 7-day query gave 55 of 61 (90.2%).

onlyPublicationsDatedInWindow is on by default, so "the last 7 days" means the last 7 days. Those strays are fetched, found to be out of window, dropped, and not charged. Turn it off if you want them — an old case being re-published is itself a signal.


🚧 Two things that will silently corrupt a naive scrape

1. The register caps every search at 1,005 rows, reports 1,005 as the total, and has no pagination. The model has no offset, page or limit field. Asked for the whole window unfiltered it answers aantalResultaten: 1005; the truth for that same window is 2,574. So this Actor never issues one broad query. It always splits by district court — eleven cheap POSTs, 4.2 seconds — where the largest single court over a full window is 494 of the 1,005 ceiling. If a court ever does reach the ceiling it is split again by publication type (worst measured cell: 240), and if anything is still truncated it is named in RUN_SUMMARY rather than quietly shipped as complete.

That partitioning is verified, not hoped for: partitioning the same window by court and by publication type produced the identical set of 2,574 publication ids, and those 2,574 ids carry exactly the eleven court tokens. Note that 134 publications appear under two courts, so deduplication is mandatory — this Actor dedupes by publication id.

2. The register throttles with a zero-byte HTTP 403 that looks exactly like a block. Past roughly 45 requests/second it starts refusing requests with a completely empty 403 — no body, no message, no Retry-After. Measured 403 rate over 300 calls: 0% at 13.6, 22.2, 29.5 and 44.6 req/s; ~15% at ~60 req/s. It is not a block: 150 of 150 refused ids returned HTTP 200 when asked again more slowly. A scraper that treats that 403 as a dead record silently drops ~15% of the register — which is exactly what happened on our first full sweep, losing 108 of 2,574 records. This Actor retries a 403 on a fresh proxy session and defaults to concurrency 4. The full sweep at those defaults: 0 failures out of 2,574.


📦 What you get in a row

{
"publicationId": "13.ams.26.290.F.1300.1.26",
"publicationUrl": "https://insolventies.rechtspraak.nl/#!/details/13.ams.26.290.F.1300.1.26",
"publicationDescription": "Uitspraak faillissement op 15 september 2026",
"publicationDate": "2026-09-16",
"subjectType": "company",
"subjectName": "World Logistics Services B.V.",
"kvkNumber": "76306593",
"tradeNames": ["Class Opleidingen", "Transportservice Holland"],
"formerTradeNames": [],
"businessAddress": "Hagenau 52, 1025CT Amsterdam",
"businessStreet": "Hagenau 52",
"businessPostalCode": "1025CT",
"businessCity": "Amsterdam",
"postalAddress": null,
"court": "Rechtbank Amsterdam",
"caseNumber": "F.13/26/290",
"caseType": "faillissement",
"supervisionCaseNumber": "NL:TZ:0000540207:F001",
"previousCaseNumber": null,
"supervisingJudge": "mr. V.G.T. van Emstede",
"trusteeRole": "curator",
"trusteeName": "mr V.N. Gijlstra",
"trusteePhone": "020-5747474",
"trusteePhoneE164": "+31205747474",
"trusteeAddress": "Dijsselhofplantsoen 16, 1077BL AMSTERDAM",
"trusteePostalCode": "1077BL",
"trusteeCity": "AMSTERDAM",
"claimsDeadline": null,
"hearingLocation": null,
"publicationCount": 1,
"publicationHistory": [
{ "publicationId": "13.ams.26.290.F.1300.1.26",
"description": "Uitspraak faillissement op 15 september 2026",
"date": "2026-09-16" }
],
"addressWithheld": false,
"personalDataWithheld": false,
"scrapedAt": "2026-09-17T01:12:44.108Z"
}

caseType is derived from the national case number's prefix — F. faillissement, R. schuldsanering, S. surseance — and was correct on 300 of 300. trusteePhoneE164 is derived; the register's own string is kept untouched in trusteePhone, because the register writes numbers four different ways (0492-749990, 071-5358000, 0546-58 88 19, 0113211666).


⚙️ Suggested inputs

A weekly feed of newly-bankrupt Dutch companies — the main use:

{
"daysBack": 7,
"publicationTypes": ["uitspraken faillissement"],
"subjectType": "companies",
"maxRecords": 500
}

Measured live: 97 bankruptcy publications in the last 7 days, 25 company rows delivered in 3.7 seconds at a cap of 25.

One region only — add "courts": ["amsterdam", "noord-holland"].

Everything the register currently holds — "daysBack": 31, "maxRecords": 0. 2,574 publications examined, 859 company rows, 103 seconds.

A capped run returns the newest publications first: the register orders every result set newest-first, verified across a whole 494-row court partition (42 of 42 consecutive dated pairs in non-increasing order).


💰 Pricing

$0.002 per delivered row. No start fee. Both Apify auto-events removed.

You are charged once per row that reaches your dataset, and for nothing else:

  • a publication read but excluded by your filters — not charged
  • a publication dated outside your window — not charged
  • a publication the register has no detail record for — not charged
  • a publication we could not reach — not charged

All four are counted separately in RUN_SUMMARY, so the bill always reconciles. A run that matches nothing costs nothing at all, because there is no run-start fee.


⚖️ Source and robots.txt

Data: Centraal Insolventieregister, published by the Raad voor de rechtspraak. The endpoints used are the register's own public JSON services, unauthenticated.

robots.txt at the time of building, verbatim:

user-agent: *
Disallow: /Services/VerslagenService/getPdf/*
Disallow: /default*
Disallow: /#!/result*
Disallow: /#!/detail*
Disallow: /pdf*
Sitemap: https://insolventies.rechtspraak.nl/sitemap.xml

The WebInsolventieService and BekendmakingenService endpoints this Actor reads are not in that Disallow list. The Actor does not touch VerslagenService/getPdf.


🧪 Verification

node offline_validate.mjs runs 305 assertions with no network and no platform, against bytes captured from the live register: the real CSRF form page, the real 400 the service returns when the handshake is missing, all eleven per-court search responses, the 203-byte refusal that names the register's rolling floor, a 33-day sweep of start-date boundaries, and 300 real detail records. The field-fill percentages in this README are recounted by that validator on every run, and the dataset schema's field list is diffed against the fields the code actually produces.