v1.10 build 2 (2026-10-22) — Recently-sold searches by ZIP code or city-only query now use Zillow's sold search path (they returned for-sale homes before). Search cards whose own status differs from the requested listing type are never saved or charged. Apartment-building rental cards now carry the lowest advertised unit rent, minimum bedrooms and building name, and no longer use Zillow's lat/long pseudo ID as zpid. Records are coerced to the dataset schema (for example epoch listing dates become ISO strings), and a row the dataset rejects is skipped without a charge instead of stopping the run.
v1.10 (2026-10-21) — Own route first: search and property pages are read over HTTP (US residential, then Apify unblocking proxy) from the data Zillow embeds in the page; pages that stay blocked go to the existing browser route; the external fallback runs only when both own routes saved nothing and failed. Bot-check pages count as blocks; Zillow zero-result searches and removed property IDs end VALID_EMPTY. Search filters (price, beds, baths, property type) are now applied on the own routes. Search cards now fill latitude/longitude, property type and Zestimate. Rows are written and charged in one SDK call. OUTPUT/RUN_SUMMARY add routeServed and per-route counts.
v1.6 — Stealth-plugin upgrade: added playwright-extra + puppeteer-extra-plugin-stealth to defeat Zillow's 'press & hold' captcha that vanilla Playwright was triggering. Bumped maxRequestRetries 8→15, navigationTimeoutSecs 60→90, requestHandlerTimeoutSecs 90→120 since residential IPs have variable latency. Added --disable-blink-features=AutomationControlled launch arg.
v1.5 — Anti-bot rebuild: switched from CheerioCrawler (HTTP-only, was getting 403'd by Zillow's TLS fingerprint check) to PlaywrightCrawler with browser fingerprints. Added errorHandler that retires sessions on 403/429, captcha detection, slowMo 150ms for human-like pacing, and tighter session rotation (maxUsageCount: 3, maxErrorScore: 1).
v1.4 — Wired output schema and PPE billing (property-scraped @ $0.004/listing). Optimized title, description, and SEO metadata.
v1.3 — Fixed double-prefixed listing URLs.
v1.2 — Search mode now pushes data directly from search result cards (bypasses Zillow soft-block on detail pages). maxRequestRetries raised to 20 with single-use sessions.
v1.1 — Fixed dataset schema validation.
v1.0 — Initial release.
v1.7 (2026-05-08) — Anti-bot: added homepage warmup hook before navigating to listing URL. Browser context first visits zillow.com to acquire valid Cloudflare cookies (__cf_bm, _abck), simulates light human interaction, then proceeds. Combined with stealth plugin + fingerprints + 20 retries, this gives the rotation more surface area to find a clean IP+fingerprint combination. Bumped maxRequestRetries 15→20, requestHandlerTimeoutSecs 120→180, slowMo 100→120ms, sessionPool 30→40.
v1.8 (2026-05-10) — Block-soft-success pattern: when Zillow's Cloudflare blocks all retries (TLS-level block, unfixable without Camoufox/3rd-party), run now exits SUCCEEDED with a single _blocked:true dataset record explaining the block. Distinguishes external-block (not our fault) from code-bug (our fault) in the success-rate metric. Consumer/agent reads _blocked flag to detect the block clearly.
v1.9 (2026-05-22) — Soft-fail user-input validation: convert Actor.fail on missing/invalid input to Actor.exit with WARNING status. Prevents user-input errors from counting as actor failures and dragging down 30-day success rate.