Zillow Scraper — US Homes for Sale, Rent & Sold by ZIP or City avatar

Zillow Scraper — US Homes for Sale, Rent & Sold by ZIP or City

Pricing

from $1.00 / 1,000 property listings

Go to Apify Store
Zillow Scraper — US Homes for Sale, Rent & Sold by ZIP or City

Zillow Scraper — US Homes for Sale, Rent & Sold by ZIP or City

Drop-in compatible with maxcopell/zillow-zip-search and maxcopell/zillow-scraper — cheaper, and ZIP, city and URL search in one actor. Zillow listings as JSON: price, beds/baths, area, lot, status, days on Zillow, coordinates, photos, broker. Optional detail pass adds price history and MLS id.

Pricing

from $1.00 / 1,000 property listings

Rating

0.0

(0)

Developer

DIOPSIDE AI

DIOPSIDE AI

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Categories

Share

Zillow Scraper — US homes for sale, rent & sold

Drop-in compatible with maxcopell/zillow-zip-search and maxcopell/zillow-scraper — cheaper, and ZIP, city and URL search live in one actor instead of three. Same input field names, same output record shape. Switching is a one-line change of the actor id.

Give it ZIP codes, plain-text places, or Zillow search URLs. Get back every listing as JSON: price, beds, baths, living area, lot size, home type, status, days on Zillow, coordinates, photos and the listing brokerage. Turn on Scrape property details and each record also carries the property's price history, the listing description, year built, price per square foot, MLS id and brokerage — data that today needs a separate actor at $0.0036/result.

Why this one

This actormaxcopell/zillow-zip-searchmaxcopell/zillow-scrapermaxcopell/zillow-detail-scraper
Search by ZIPyesyesnono
Search by city / neighborhood nameyesnonono
Search by pasted Zillow URLyesnoyesno
Beds / baths / square-footage filtersyesnonono
Price history, description, MLS idyes (optional)nonoyes
Price per result (free tier)$0.001, $0.002 with details$0.0024$0.0023$0.0036
Proxy requiredno———

Three more things it does differently:

  • It refuses to hand you the wrong rows. Zillow answers 200 OK for filter URLs it then ignores — ask for /austin-tx-78704/3-_beds/ and you get the unfiltered 354 results with an empty filter state. Before pushing a single record from a status-scoped search, this actor checks Zillow's own echo of the filter it applied, and fails the target loudly if it does not match.
  • A run that produced nothing is a failed run, and a partial run says in its status message exactly which searches came up empty and why.
  • It resolves your location against Zillow, not against a guess. 78704 is austin-tx-78704, Brooklyn, NY is brooklyn-new-york-ny, Wicker Park, Chicago, IL is a neighborhood region — no rule generates all three, so the actor reads the canonical slug back off Zillow's own pagination link and records it in searchRegion.

Switching from maxcopell/zillow-zip-search or maxcopell/zillow-scraper

Change the actor id. Nothing else. zipCodes, searchUrls, priceMin, priceMax, daysOnZillow, forSaleByAgent, forSaleByOwner, forRent, sold and resultsLimit all mean what they mean there, and every field in the output record is present with the same name, nesting and type. New fields (searchQuery, searchStatus, searchRegion, isBuilding, buildingName, units, hasDetails, propertyDetails) are added alongside; nothing of theirs is renamed.

One difference worth knowing: a ?searchQueryState= URL is reduced to the place you typed into Zillow, because zillow.com/robots.txt disallows that route (see Which pages this reads). The map rectangle in such a URL is not reproduced — search by ZIP, city or neighborhood instead.

Input

FieldTypeDefaultWhat it does
zipCodesstring[]—US ZIP codes to search.
searchTermsstring[]—Cities, neighborhoods or counties in plain text: Austin, TX.
searchUrlsrequest list—Zillow search pages to walk.
forSaleByAgentbooleantrueInclude agent-listed homes for sale.
forSaleByOwnerbooleanfalseInclude FSBO homes.
forRentbooleanfalseInclude rentals (a separate Zillow search per location).
soldbooleanfalseInclude recently sold homes (a separate search per location).
priceMin / priceMaxinteger—Price bounds, USD; monthly rent for rentals.
bedsMin / bedsMaxinteger—Bedroom bounds.
bathsMininteger—Minimum bathrooms.
sqftMin / sqftMaxinteger—Living-area bounds, square feet.
homeTypesstring[]allSINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, APARTMENT, MANUFACTURED, LOT.
daysOnZillowselectany1, 7, 14, 30, 90, 6m, 12m, 24m, 36m.
scrapePropertyDetailsbooleanfalseOpen each property page for price history and full facts.
resultsLimitinteger20Maximum listings per location, shared evenly across the statuses you ticked.
maxItemsinteger—Hard cap for the whole run.
proxyConfigurationproxyoffOptional. See Proxy.
residentialFallbackbooleantrueEscalate to RESIDENTIAL/US once if a tier is blocked.
maxConcurrency / maxRequestsPerMinute / maxRequestRetriesinteger3 / 30 / 3Politeness and resilience.

Ticking both forSaleByAgent and forSaleByOwner costs one Zillow search, not two — its default for-sale page already holds both. forRent and sold are separate searches per location.

Output

{
"zpid": "58312593",
"listingPrice": { "amount": 625000, "currency": "USD", "formatted": "$625,000" },
"listingAddress": {
"street": "3618 S 2nd St", "unit": null, "city": "Austin", "state": "TX",
"zipCode": "78704", "county": null, "country": "USA", "neighborhood": null,
"subdivision": null, "communityName": null, "timeZone": null,
"full": "3618 S 2nd St, Austin, TX 78704"
},
"coordinates": { "latitude": 30.230879, "longitude": -97.77021 },
"listingStatus": "forSale",
"propertyUrl": "https://www.zillow.com/homedetails/3618-S-2nd-St-Austin-TX-78704/58312593_zpid/",
"homeType": "SINGLE_FAMILY",
"listingType": { "isFSBA": true, "isFSBO": false, "isComingSoon": false, "isPending": null,
"isOpenHouse": false, "isNewHome": false, "isForAuction": false,
"isForeclosure": false, "isBankOwned": false, "contingencyType": null },
"bedrooms": 3, "bathrooms": 3, "livingArea": 1454, "livingAreaUnit": "sqft",
"lotArea": 6695.172, "lotAreaUnit": "sqft",
"daysOnZillow": 6, "taxAssessedValue": 619676,
"mainImage": "https://photos.zillowstatic.com/fp/afe48247edbd24c47179c3328401db51-p_e.jpg",
"listingPhotos": [{ "url": "https://photos.zillowstatic.com/fp/afe482...-p_e.jpg", "caption": null }],
"photoCount": 31,
"broker": { "name": "LPT Realty LLC - Ascend Group", "phoneNumber": null,
"buyerBrokerName": null, "buyerAgentName": null },
"sourceSearchUrl": "https://www.zillow.com/78704/",
"scrapedAt": "2026-09-21T08:14:25Z",
"isValid": true,
"searchQuery": "78704",
"searchStatus": "forSale",
"searchRegion": { "regionId": 92617, "regionType": 7, "name": "78704",
"displayName": "Austin TX 78704" },
"hasDetails": true,
"propertyDetails": {
"description": "The classic two-story Austin home establishes an inviting presence…",
"yearBuilt": 2001, "lotSize": 6695, "pricePerSquareFoot": 430,
"priceHistory": [{ "date": "2026-09-14", "price": 625000, "event": "Listed for sale",
"pricePerSquareFoot": 430, "source": "Agent Provided" }],
"mlsId": "9067839", "mlsName": "Unlock MLS",
"brokerageName": "LPT Realty LLC", "photoCount": 31
}
}

An apartment-community card has no single price; it comes back with isBuilding: true, a buildingName, availableUnitCount and a units array of floorplans, with listingPrice.amount set to the lowest rent in the building.

What it does not collect

  • No personal data. Homeowner names, phone numbers and email addresses are not collected. broker.name is a business name, and propertyDetails.agentName / agentPhoneNumber come from the MLS attribution line Zillow prints on the public page — where Zillow withholds them, they are null and stay null.
  • No tax history. Zillow loads the year-by-year tax table from a GraphQL route its robots.txt disallows. The county's assessed value is in taxAssessedValue, which the search page carries.
  • No sold prices in non-disclosure states. In Texas and a dozen other states Zillow does not publish what a home sold for, so listingSoldPrice on those records is null — that is Zillow's data, not a gap in the scraper.
  • Price history is not on every home. Zillow serves it for roughly a third of listings; propertyDetails.priceHistory is an empty list for the rest.

Which pages this reads

zillow.com/robots.txt disallows /api/, /graphql/, /async-create-search-page-state, any URL carrying ?searchQueryState=, and the /homes/ tree. This actor stays off all of them. It reads two sanctioned page types:

  • the region search page, zillow.com/austin-tx/ and zillow.com/austin-tx/2_p/, with the /fsbo/, /rentals/, /sold/ and /houses/ variants;
  • the property page, zillow.com/homedetails/…/<zpid>_zpid/, when details are on.

Both are server-rendered and carry the same JSON the site's own front end uses, so nothing is lost by staying on them. The consequence you can see is that price, bedroom, bathroom, size and days-on-market filters are applied by the actor after fetching rather than by Zillow — on the region route Zillow ignores those URL segments. Narrow searches therefore cost the same number of requests as wide ones, but you are only charged for records that pass your filters.

Sizes, limits and cost

  • 41 listings per request; Zillow stops paginating a single search after 20 pages (~820 results). For a large metro, search by ZIP rather than by city to get past that ceiling.
  • A search page is ~650 KB, a property page ~700 KB. A details-off run of 820 listings is 20 requests and about 13 MB.
  • Pay-per-event: $0.001 per listing, $0.002 per listing with details, plus $0.00005 per run start. 1,000 listings cost $1.00 — against $2.40 on zillow-zip-search.

Proxy

Not required. Zillow's bot protection reads the TLS fingerprint before it reads the IP, and this actor presents a real browser fingerprint over plain HTTP — no browser is launched, which also means no Chromium memory bill. Turn a proxy on for large runs: a single exit IP asked for hundreds of pages in a row will eventually be rate-limited, and the actor will then rotate sessions rather than making progress. residentialFallback moves the run to RESIDENTIAL/US once if the configured tier is blocked outright.

Use cases

  • Track price cuts and days-on-market across a farm area, daily, by ZIP.
  • Build a comparables set: search sold, keep listingSoldPrice, livingArea and propertyDetails.pricePerSquareFoot.
  • Feed a rental pricing model from forRent searches, including whole apartment communities and their floorplan rents.
  • Monitor new inventory with daysOnZillow: "1" on a schedule.
  • Enrich an MLS pipeline: match on propertyDetails.mlsId, add Zestimate and price history.