# Changelog of Zillow Search Scraper - Listings by City or ZIP (`studioxl/zillow-search-scraper`) Actor

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

## Changelog

### 0.3 (2026-10-20)

**New filters**

- **Home types:** houses, townhomes, condos, apartments, multi-family, land and
  manufactured. Pick any mix; leave empty for every type. Each one was checked
  on Austin, TX: "condos only" returned only condos (1,319), "houses and
  townhomes" returned 3,621, which is houses (3,498) plus townhomes (123).
  On rentals Zillow treats apartments and condos as one type, so either choice
  gets both.
- **Listing types, for homes for sale:** listed by an agent, for sale by owner
  (FSBO), new construction, foreclosures and bank-owned, auctions, coming soon,
  and pending or under contract. Pick some to get only those. Pending homes are
  left out unless you pick Pending, as on Zillow. Austin by owner: 27 listings,
  all FSBO.
- A home type nobody recognises ("spaceship") ends the run with a message,
  nothing searched and nothing charged, instead of quietly searching every type.
  Zillow's own spellings (`SINGLE_FAMILY`, `TOWNHOUSE`) and plain ones ("condos",
  "fsbo") are understood, also under `homeType` or `propertyType`.

**New columns** (17, all additions; no existing column changed)

- `photos` and `photoCount`: every photo of the listing at full size (1536 px),
  in Zillow's order. Checked against the property page of a 40-photo listing:
  the same 40 photos in the same order.
- `priceChange`, `priceChangeDate` and `priceChangeLabel`: the latest price
  change. A negative amount is a cut; the label is Zillow's own text for cuts
  ("$25,000 (Oct 17)"). 12 of 41 Austin listings had one.
- `datePosted`: the day the listing went up, in the same format as Zillow
  Property Detail Scraper. Empty on sold searches, where Zillow counts from the
  sale.
- `pricePerSqft`: price per sq ft of living area. Monthly rent per sq ft, in
  dollars and cents, on rentals. Empty on apartment buildings.
- Listing type flags, true or false: `isForSaleByAgent`, `isForSaleByOwner`,
  `isNewConstruction`, `isComingSoon`, `isForAuction`, `isForeclosure`,
  `isBankOwned`, `isPending`, `isOpenHouse`. Same names as the detail scraper.
  Empty on apartment buildings, which carry no listing type.
- `scrapedAt`: when the row was collected, as an ISO 8601 UTC timestamp.
- New view in Console: **Price cuts & listing type**.

**Fixes**

- **A location Zillow doesn't know no longer fails the run** when it comes with
  a URL that isn't a search page. The run used to end in a failure that blamed
  the connection settings. It now succeeds with no rows, charges nothing, and
  says which places weren't found and which URLs weren't searches.
- **`limit`, `maxResults` and `resultsLimit` are read as Maximum results**, for
  API and AI-agent callers. A run sent `limit` used to ignore it and deliver up
  to 100. If you set Maximum results to something other than 100 yourself, that
  still wins.
- **New column `dateSold`** on recently sold searches: the exact sale date
  Zillow shows on the card ("Sold 10/19/26"). Filled on 41 of 41 Denver rows.
- No status message mentions proxies or connection settings any more.

**Not added:** year built. Zillow's search results don't include it, so it stays
with Zillow Property Detail Scraper. The README also no longer says the detail
scraper has price history; it doesn't.

### 0.2 (2026-10-20)

- **`zpid` is now a number**, as in Zillow Property Detail Scraper, so the two
  datasets join without a cast. It was a string.
- **`currency` reads `"USD"`**, as on property pages. It was `"$"`.
- **Lot size matches the detail Actor.** `lotAreaUnits` reads `Acres` or
  `Square Feet` (was `acres` / `sqft`), `lotAreaValue` is rounded (whole sq ft,
  acres to 4 decimals; `0.32999999999999996` is now `0.33`), and a new
  `lotSize` column gives every lot in sq ft.
- **New `isShowcaseListing` column.** `has3DModel` was checked against Zillow's
  own card badges on a 41-row Austin page: it is true exactly on listings badged
  "3D Tour" or "Showcase", so the mapping was right. A test run where all 8 rows
  were true was Zillow's default order putting Showcase listings first.
- **Maximum results is now strict.** A busy run could in theory deliver a few
  rows past the cap; it now stops exactly at it.
- A pasted property URL (`/homedetails/`) or a malformed URL is skipped with a
  message instead of failing the run with a misleading error.
- A search that matches nothing ends with a status message saying so, and every
  finished run reports how many listings it delivered.
- Offline tests with saved Zillow pages: `tests/test_offline.py`.
- README and input form rewritten. No change to pricing.

### 0.1.23 (2026-09-24)

- **A place Zillow does not know no longer fails the run.** It now succeeds,
  searches nothing, charges nothing and says which location was not found, the
  same way the agent Actor already handled it.
- **The location lookup retries.** It was a single request with no retry, so one
  refused connection failed the whole run. It now tries three times, the second
  and third through the proxy on a fresh IP.
- **Field names that API and AI-agent callers guess are read.** An MCP-driven run
  sent `"location": "Tempe, AZ"` instead of `"locations"` and failed with nothing to
  search. Another sent `"listingStatus": "Sold"`, which this Actor did not read, so
  it returned and charged for homes for sale instead. Both now work: `location`,
  `city`, `zip` and similar are read as locations, a ZIP sent as a number is
  accepted, and `listingStatus` or `status` sets the listing type when
  `listingType` is not given.
- When a run still has nothing to search, the message names the fields it received
  and did not recognise.

### 0.1 (2026-08-24)

First release.

- Search Zillow by city, ZIP, county, or neighborhood, typed in plain English, or paste a
  Zillow search URL. Filters for price, beds, baths, size, lot, year built, and a dozen
  other features, across for-sale, for-rent, and recently-sold listings.
- **Gets past Zillow's 820-result ceiling.** A search reports its true total but only ever
  returns 20 pages of 41. Austin, TX reported 5,787 for-sale listings and handed back 820.
  Areas over the cap are split into smaller map sections and searched separately, recursing
  up to 4 levels deep, with duplicates removed by `zpid`. A verified run pulled 1,500 Austin
  listings from 43 pages in 52 seconds, dropping 209 duplicates and hitting zero blocks.
- **Rental price filters actually filter.** Zillow accepts a normal price filter on rental
  searches and silently ignores it. In testing, 24,938 Austin rentals stayed at 24,938 with a
  $1,500 to $2,500 filter applied. The key that works is used automatically.
- **Apartment buildings on rentals are parsed properly.** Most rental results are whole
  buildings, not single homes, and Zillow returns them without a price or a bedroom count.
  On page one of a Denver rental search, 38 of 41 results were buildings. Those rows now carry
  `isBuilding`, `buildingName`, `priceMin`, `priceMax`, `bedroomsMin`, `bedroomsMax` and
  `availableUnitCount`, and `price` is filled from the lowest available rent. Measured before
  and after: `price` fill on Denver rentals went from 8% to 100%.
- **Published fill rates.** The README carries the measured fill rate for all 41 fields,
  taken from 200 unfiltered Austin results. Notably `zestimate` is present on 16% of rows and
  `rentZestimate` on 23%, because that is how often Zillow publishes them.
- Residential US proxies by default. A measured A/B returned 60 of 60 properties on
  residential and nothing at all on datacenter.
- Four dataset views: Listings, Price vs Zestimate, Coordinates, and Rentals & buildings.
- **Verified at scale.** A single Austin search returned 5,000 distinct listings in 3 minutes
  49 seconds across 186 pages, filtering 2,456 duplicates and hitting zero blocked requests.
  The result set spanned 63 ZIP codes, 864 brokerages, and prices from $2,995 to $63,000,000.
- Default memory raised to 1 GB, with up to 4 GB available, so large runs have headroom. A
  5,000-result run peaked at 208 MB.
