Date: 2026-09-10
Affected: kleinanzeigen-scraper, kleinanzeigen-free-finds, kleinanzeigen-deal-radar
Duration: 9.2% of runs over the 30 days to 10 September; four fixes shipped that day
Over the thirty days to 10 September 2026, 149 of 1,620 customer runs of the Kleinanzeigen scraper failed - 9.2%. Over the same window Marktplaats and 2dehands, which read a JSON API rather than HTML pages, failed 0 of 1,523 each. Separately, and worse, some runs that reported success had quietly returned nothing.
A failed run costs nothing and is obvious. The empty ones were the real problem: Kleinanzeigen answers a client it is throttling with an ordinary 0 results page - site chrome intact, HTTP 200, no challenge, nothing to distinguish it from a search that genuinely has no matches. A run that hit one reported “0 listings match the query” and finished successfully. Anyone scheduling that query was told their search had no matches. On the two monitor actors the same page reads as “nothing new”, so the alert simply never fired.
A second path did the same thing on large requests: a run split into query shards that was blocked before its first listing ended as a successful, empty run rather than as a failure.
Three faults, one blind spot. The retry budget in front of the first fetch was
four attempts over 44 seconds, and a run blocked past that ended with nothing.
HTTP 405, which some sites answer to datacenter routes, was treated
as a permanent error rather than a refusal, so those runs died in about two
seconds without ever trying a fresh IP. And a request for more results than the
site's window holds mapped the entire result set before delivering a row: asking
for 2,000 listings of 922,389 meant roughly 740 paced probes, which we measured
at 23 minutes with nothing delivered.
The blind spot is the honest part. Our own checks only ever fetched a single page, while a customer's run pages deeply and, past a certain size, splits the query into shards. Every canary and every diagnostic we ran stopped short of the paths that were failing. Our monitoring was green throughout.
All shipped 10 September. A zero from the site is now re-read on a second exit IP before it is believed, on the scraper and on both monitors - it either recovers there or the run states that the query itself is empty. A blocked shard run with nothing collected now fails instead of reporting success. The fetch before the first item gets six attempts over about 90 seconds, with jitter so scheduled runs stop retrying in lockstep. A 405 answering a GET is treated as a refused route fleet-wide and rotates. Splitting now stops as soon as enough shards are in hand to fill the order, so the same 2,000-item request returns in under eight minutes with the first rows in under three.
Our own checks now run the deep and sharded paths, not only the first page. The bounded split was applied to the nine sibling actors that use the same splitter. The 30-day success figure on our status page is a trailing window, so it will carry these failures for several weeks after the cause was removed; we would rather leave it visible than reset it.
Questions about this incident? contact@lowlanddata.com - reports get read the same day.