Zillow Search Scraper avatar

Zillow Search Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Zillow Search Scraper

Zillow Search Scraper

Scrape Zillow real-estate listings by location or search URL. Extracts zpid, address, price, beds/baths, photos, status, broker, lat/lon, and 40+ more fields from Zillow Search Results Pages.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Crikit

Crikit

Maintained by Community

Actor stats

2

Bookmarked

7

Total users

2

Monthly active users

11 days ago

Last modified

Categories

Share

What this Zillow Search Scraper does

This Zillow Search Scraper extracts real estate listing data from Zillow Search Results Pages at scale. Give it a Zillow search URL (or a location string like austin-tx, 90210, Seattle, WA) and the actor walks every page in the search, parses Zillow's server-rendered JSON payload, and emits one structured record per listing. No login, no cookies, no API key. The actor works entirely from public search pages on zillow.com.

The Zillow Search Scraper is built for analytics, lead generation, and market intelligence use cases that need clean Zillow data without writing a scraper from scratch.

What you get per listing

The actor extracts all 60+ fields Zillow embeds in each search result, including:

  • Identity: zpid, id, palsId, detailUrl (link to the property's HDP page on Zillow)
  • Address: address, addressStreet, addressCity, addressState, addressZipcode, isUndisclosedAddress
  • Pricing: price, unformattedPrice (numeric), countryCurrency, shouldShowZestimateAsPrice, shouldShowRequestOnPrice
  • Physical: beds, baths, area (sqft), latLong (latitude/longitude)
  • Status: statusType (FOR_SALE / RECENTLY_SOLD / FOR_RENT / COMING_SOON / PENDING), statusText, rawHomeStatusCd, marketingStatusSimplifiedCd, availabilityDate
  • Media: imgSrc (hero photo), hasImage, has3DModel, hasVideo, carouselPhotosComposable (responsive photo srcset)
  • Open house: hasOpenHouse, openHouseStartDate, openHouseEndDate, openHouseDescription
  • Broker / attribution: brokerName, isFeaturedListing, isShowcaseListing, isZillowOwned, isPaidBuilderNewConstruction
  • Provenance (added by the actor): foundOnSearchPage, foundFromSearchUrl

Every field that Zillow returns flows through to your dataset, so when Zillow adds a new attribute, your dataset gets it on the next run with no schema changes.

Why use this Zillow Scraper

  • Breaks Zillow's 820-result ceiling. Every other Zillow search scraper stops at 820 listings per search, because that is where Zillow's own pagination ends. FULL_REGION mode recursively splits the search into price bands — each band is a separate filter, so each gets its own fresh 820-result window — and returns the region whole. A full Austin TX pull returns 5,808 listings instead of 820, in 77 seconds.
  • Fast and, more importantly, predictable. 820 listings in ~30 seconds (median of 6 runs), a full 5,800-listing region in ~53–77 s. Slow runs are what hurt a pipeline, and those are gone: across repeated runs the previous engine ranged 27–85 s while this one ranges 16–33 s.
  • Exact maxItems. Ask for 500 and you get 500, never 517. Since you are billed per result, an overshooting scraper is an overcharging scraper.
  • 100% field match with the leading competitor on the same input (820 / 820 listings on a full Austin scrape, validated against ground truth).
  • No cookies, no logins. You never paste credentials. The scraper works from a clean Apify residential proxy session.
  • No browser. Pure HTTP with Chrome TLS and header fingerprints, so it survives Zillow's PerimeterX stack at a fraction of the cost and several times the speed of browser-based scrapers.
  • Stable schema. The output mirrors Zillow's own listResults shape; downstream pipelines that already parse Zillow data work without modification.

Input

FieldTypeDescription
searchUrlsarray of {url}Zillow search URLs. Anything that resolves to a Search Results Page works (e.g. https://www.zillow.com/austin-tx/, https://www.zillow.com/homes/for_sale/?searchQueryState=...).
locationQueriesarray of stringsConvenience input. Strings like austin-tx, 90210, Seattle, WA are auto-converted to Zillow URL slugs.
extractionMethodstringPAGINATION (default) walks _p/ pages, up to ~820 listings per search URL — Zillow's own cap. FULL_REGION breaks that cap by recursively splitting the search into price bands and paginating each, then de-duplicating by zpid.
maxConcurrencyintegerParallel requests in flight. Default 16, which is the measured sweet spot; 24 was no faster and 8 was 45% slower.
slimOutputbooleanDrop the bulky carouselPhotosComposable photo-srcset blob and a few rarely-queried fields. Roughly halves dataset size. imgSrc is always kept.
maxItemsintegerHard cap on listings returned. 0 = unlimited (still bounded by maxPagesPerSearch and Zillow's own 820 cap per slice).
maxPagesPerSearchintegerCap on pages walked per search URL. Zillow itself only paginates up to 20 pages (~820 listings) per region+filter combination.
proxyConfigurationobjectApify proxy settings. Residential US strongly recommended; datacenter IPs get flagged within a handful of requests by PerimeterX.

You must supply at least one of searchUrls or locationQueries.

Sample input

{
"searchUrls": [
{ "url": "https://www.zillow.com/austin-tx/" },
{ "url": "https://www.zillow.com/seattle-wa/condos/" }
],
"locationQueries": ["90210"],
"extractionMethod": "PAGINATION",
"maxItems": 200,
"maxPagesPerSearch": 20,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Sample output

{
"zpid": "338246448",
"id": "338246448",
"palsId": "222004_40830219",
"address": "2500 Longview St #518, Austin, TX 78705",
"addressCity": "Austin",
"addressState": "TX",
"addressZipcode": "78705",
"price": "$500,000",
"unformattedPrice": 500000,
"beds": 2,
"baths": 2,
"area": 1010,
"latLong": { "latitude": 30.289932, "longitude": -97.75102 },
"statusType": "FOR_SALE",
"statusText": "For Sale",
"imgSrc": "https://photos.zillowstatic.com/fp/example-cc_ft_960.jpg",
"brokerName": "Compass RE Texas, LLC",
"detailUrl": "https://www.zillow.com/homedetails/2500-Longview-St-518-Austin-TX-78705/338246448_zpid/",
"foundOnSearchPage": 1,
"foundFromSearchUrl": "https://www.zillow.com/austin-tx/"
}

Measured coverage

Validated by running the same input as the leading competitor (Austin TX, full 820-result pull) and comparing:

MetricValue
Listings overlap with competitor820 / 820 (100.0%)
Field-name match61 / 61 fields
Critical fields (zpid, address, price, beds/baths, lat/lon, statusType, brokerName, imgSrc, detailUrl)97.6% to 100% coverage, 100% value match on overlapping records

Fields that are present on a subset of listings (rentals only, land only, providerListing only) flow through automatically when Zillow includes them in the source data.

Performance

Measured on Apify, 1 GB memory, Apify residential US proxy, Austin TX (https://www.zillow.com/austin-tx/):

ModeListingsRuntime (median)RangeThroughput
PAGINATION820 (Zillow's per-search cap)30 s16–33 s (n=6)~28 listings/s
FULL_REGION5,808–5,810 (the entire region)53–77 s (n=2)75–110 listings/s

FULL_REGION returned exactly as many listings as Zillow's own reported totalResultCount — 5,808 against 5,808, and 5,810 against 5,810 on a later run. Complete recovery, no gaps. On austin-tx/rentals/ it returned 5,849 in 60 s.

Runtime varies with residential-proxy conditions; the numbers above are real observed runs, not best cases.

Pricing

Pay-per-result, $0.001 per listing — $1.00 per 1,000 listings.

Worked examples:

  • 100 listings: $0.10
  • 1,000 listings: $1.00
  • 10,000 listings: $10.00
  • One full Austin TX region (5,808 listings, FULL_REGION): about $5.81

The leading Zillow search scraper on Apify Store charges $0.0023 per listing on the FREE tier and $0.0013 at GOLD — and it cannot exceed 820 listings per search at any price.

A run also charges one Actor Start event ($0.005 per GB of memory, once per run), which covers the fixed cost of spinning up.

Limits and edge cases

  • 820 listings per (region, filter) slice in PAGINATION mode. Zillow caps /page_p/ pagination at 20 pages of 41 listings = 820. Switch extractionMethod to FULL_REGION to go past it; the actor then splits the search into price bands automatically. Very large regions (a whole state) will use proportionally more requests, so pair FULL_REGION with maxItems if you want a hard ceiling on spend.
  • Datacenter proxies do not work. Zillow's PerimeterX blocks them outright — a control run on Apify's datacenter pool returned zero listings. Residential US is required, and the actor now fails loudly rather than returning an empty dataset.
  • Geo gating. Run on a US Apify proxy. Zillow auto-redirects non-US IPs to localized pages (Canadian IPs get Canadian listings).
  • Restricted listings. Some states (e.g. NY, parts of CA) hide certain listings from unauthenticated viewers. They appear in restrictedListingCount totals on Zillow but are not in the returned listResults. This affects approximately 1-3% of listings in affected markets.
  • PerimeterX retries. Zillow runs PerimeterX bot detection. Expect 1-2 retries per 20-request batch; the actor handles this transparently with session rotation. If your concurrency is very high you may see your request count exceed your listing count by 10-15%.
  • Live data. Zillow listings change continuously (new postings, price changes, sold transitions). Running the same input twice will return slightly different listings if the underlying market moved.

Technical details

  • Stack: Node.js 20 + got-scraping with the Chrome header generator, over a purpose-built concurrency pool. No browser, no JavaScript execution, no DOM parsing — the __NEXT_DATA__ payload is sliced straight out of the HTML string, which measured ~35x faster than loading it into Cheerio.
  • Memory: 1 GB recommended. 512 MB works but is CPU-starved and runs ~57% slower for no meaningful cost saving.
  • Throughput: ~100,000 listings/hour in PAGINATION mode, ~270,000–400,000/hour in FULL_REGION mode.
  • TLS: got-scraping uses Chrome's HTTP/2 SETTINGS frame and realistic headers to defeat Zillow's JA3 fingerprinting.
  • Latency hiding: the first page of each search is hedged (a second attempt starts if the first stalls) and the next few pages are prefetched speculatively, so a slow page-1 round trip no longer stalls the whole run.

FAQ

Does this Zillow Search Scraper need an API key? No. Zillow's web search is publicly accessible; the actor reads the same data anyone can see in a browser.

Does it need my Zillow login or cookies? No. This scraper never asks for user credentials.

What's the difference between this and a detail scraper? This actor extracts the search-page listing card (60+ fields). For deeper details on a single property (RESO facts, price history, tax history, schools, full photo set), use a detail page scraper that takes a zpid or detail URL as input.

How does FULL_REGION get past Zillow's 820 limit? Zillow applies the 20-page cap per (region, filter) combination, not per region. Adding a price filter creates a new combination with its own fresh 820-result window. The actor measures the result count, splits the price range geometrically, and recurses until every band fits under the cap — then paginates each band and de-duplicates by zpid. On Austin the price bands summed to 5,891 against a region total of 5,808, and after dedup the actor returned exactly 5,808.

Can I run it via the Apify API or schedule it? Yes, like any Apify actor. Use the standard Run actor API or attach a schedule in the Apify Console.

Changelog

  • 0.2 (2026-08-08): FULL_REGION mode recovers every listing in a region instead of stopping at Zillow's 820 cap (5,808 on Austin vs 820 — 7.1x the data). Rewrote the fetch engine — no Cheerio, no request queue, batched dataset writes, hedged first-page requests, speculative prefetch. Measured over repeated paired runs: median runtime 40 s → 30 s, worst case 85 s → 33 s, internal cost 8% lower. maxItems is now an exact ceiling instead of overshooting to the end of a page. Added maxConcurrency and slimOutput. Blocked runs now fail loudly instead of silently returning a partial dataset. Fixed ZIP-code location queries, which now resolve via /homes/{zip}_rb/.
  • 0.1 (2026-05-14): initial release. PAGINATION mode (up to 820 listings per search slice). 61-field output matches competitor schema 1:1.