# Changelog of Zillow Scraper — Property Listings & Agent Leads (`khadinakbar/zillow-all-in-one-scraper`) Actor

- **URL**: https://apify.com/khadinakbar/zillow-all-in-one-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/khadinakbar/zillow-all-in-one-scraper.md

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.
