# Changelog of Suumo Scraper (`normdata/suumo-scraper`) Actor

- **URL**: https://apify.com/normdata/suumo-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/normdata/suumo-scraper.md

## Changelog

### 2026-09-19

- Initial build: search (by real Suumo search URL, walking every page) and detail (by listing URL)
  modes reading Suumo's own real rental listings directly. No key, no login.
- **Real depth found beyond what the closest competitor documents:** every listing already carries
  nearby facilities (supermarkets, convenience stores, drugstores) with exact real walking
  distances, a full 20-28-tag amenities list, real listing last-updated/next-update dates, real
  listing photos, and detailed guarantor/insurance/parking/move-in/transaction terms. None of it is
  in the closest competitor's own documented field list. Surfaced via the opt-in `fetchDetails`
  toggle (photos are free on every Search-mode row).
- **Real technical finding used to keep this reliable without a paid proxy:** the source shows real
  rate-limiting under a rapid burst of requests from one IP, confirmed live, matching a real
  competitor's own documented need for "anti-blocking." Handled with retry-and-backoff plus a real,
  measured concurrency rather than a guessed one.
- **Real bug found and fixed before shipping:** the main rent figure uses a different, one-off real
  markup pattern than every other field on the page. An early version of the parser missed it
  entirely when enriching a listing outside of a search result (Detail mode). Found by checking
  Detail mode's own output against Search mode's, not just spot-checking one path, then fixed by
  adding the real pattern; the two modes were then verified to produce an identical column set.
- **Real bug found and fixed:** the real deposit/key-money field is a single combined value on the
  detail page but two separate columns on the search-results table. Normalizing them without
  splitting the combined page's value would have silently swapped which real number lands in which
  output column for Detail-mode-only rows. Fixed by splitting the combined value to match.
- Removed a `query` output field that only echoed the input URL back on every row and carried no
  real per-row signal, after review.
- **Bottleneck-tested on real Apify infrastructure, not just locally:** 1,000 fully-enriched rooms
  (every bonus field populated) measured at three concurrency levels to find a real, safe ceiling
  rather than guess one: 246s at concurrency 2 (zero retries), 100s at concurrency 6 (zero retries),
  76s at concurrency 10 (zero retries). Settled on 10, kept with real margin below the ~13-request
  burst threshold found earlier, rather than pushed further. All three runs verified at 0 duplicates
  and 0 missing core fields.
- 10 unit tests, 437 `expect()` calls, against real saved search-page and detail-page fixtures.
- Full live field audit across both modes against `dataset_schema.json`: 37/37 fields match with
  zero discrepancy.
