# Changelog of Zillow Agent Scraper - Agent Leads & Their Listings (`studioxl/zillow-agent-scraper`) Actor

- **URL**: https://apify.com/studioxl/zillow-agent-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/studioxl/zillow-agent-scraper.md

## Changelog

### 0.2.0 (2026-08-31)

- **An agent's portfolio now comes from the agent, not from a city-wide scan.**
  Until now, working out what an agent was selling meant searching every listing
  in the area, opening each property page, reading off the listing agent's name
  and grouping by it. Zillow answers the same question directly, from endpoints
  keyed on the agent's id, and it answers it completely. The old route is gone. A
  100-agent Chicago run with a 25-listing cap now takes 1 minute 41 seconds and
  167 page fetches, against 24 minutes and $3.77 for a single agent on the last
  run of the old design.
- **Portfolios are complete rather than best-effort.** The scan could only ever
  find listings that happened to fall inside it, so an agent's row meant "some of
  what they have". It now means all of it, and `listingCount` reports the agent's
  real total next to however many your cap fetched.
- **New: rentals.** The agent's live rental listings, same shape as for-sale. Off
  by default, because most agents have few. The Chicago agent with 55 properties
  for sale had 4.
- **New: full property records, optional.** The agent endpoint carries no
  valuation, floor area, year built, tax rate or description, because Zillow does
  not publish those there. Switching this on opens each listing's property page
  and adds them, along with the listing agent's direct phone. Charged separately
  from the agent row, since one property fetch costs about what a whole agent
  costs.
- **Agents are keyed on their Zillow id, not their name.** A Chicago run returned
  two different agents both called Patrick Shino, with different ids and different
  sales counts. Under the old name-keyed design one would have silently replaced
  the other.
- **Filters now run before anything is fetched.** A run capped at 50 agents reads
  50 agents' portfolios instead of every agent the directory returned, so a
  narrow search is cheap rather than merely short.
- **Every URL is now permitted by robots.txt.** The city-wide listing scan was
  the one part of this Actor that Zillow's rules did not allow. Removing it
  removed the exception, and the note about it is gone from the input.
- **A portfolio that was not requested, or could not be read, is left off the
  row.** It used to report a count of 0, which reads as "this agent has none"
  when it means "we never looked" or "the request failed". Measured on a
  100-agent run: 57 rows carried a zero that was really a failed fetch. Failures
  now set an explicit `Unavailable` flag instead.
- **Fixed: career sales came back empty whenever the stats endpoint was busy.**
  The call sat outside the crawler and so had no retry, and the retry that was
  added still reused one sticky proxy session, so all four attempts landed on the
  same blocked address. Each attempt now takes a fresh session. Verified at 100
  out of 100 agents.
- **Fixed: every portfolio request returned 403 on first release.** These
  endpoints are public but not unguarded; called with a bare crawler's default
  headers they refuse everything. They want a `Referer` on zillow.com, the same
  thing the sales-stats endpoint has always needed.
- **Fixed: the run summary under-reported blocking.** It counted only this
  Actor's own block detection, while the crawler raises its own error type on an
  HTTP 403, so a run that lost hundreds of requests still printed "0 blocked".
- **Sold history was built, then withdrawn before release.** Zillow publishes an
  agent's closed sales from a profile endpoint, and it worked on 30 August 2026,
  returning 7,112 sales for one Chicago agent. On 31 August it began returning
  403 to any request without a browser session cookie. Confirmed both ways the
  same day: 200 inside a real browser, 403 from 30 different residential
  addresses on the same URL with the same headers. Reaching it now needs a full
  browser per profile, which this Actor deliberately does not run, so the option
  was removed rather than shipped unreliable. `salesAllTime`, `salesLastYear` and
  `averageSalePrice` are unaffected and still come from an ungated endpoint.
- **Removed three inputs** that only made sense for the old design:
  `includeListings`, `listingsToScan` and `listingType`.
- **Default memory raised to 1 GB**, with 4 GB available.
- **Corrected the README.** It advertised `agentLicenseNumber` and `brokerPhone`,
  both of which were measured empty on 745 properties and removed from the parser
  in the detail Actor, and it described that Actor as returning 65 fields when it
  returns 60.

### 0.1.6

- Agent directory, sales statistics, and portfolios assembled by scanning a
  city's listings and matching each property to its listing agent by name.
