Zillow Search Scraper - Listings by City or ZIP avatar

Zillow Search Scraper - Listings by City or ZIP

Pricing

from $0.90 / 1,000 search results

Go to Apify Store
Zillow Search Scraper - Listings by City or ZIP

Zillow Search Scraper - Listings by City or ZIP

Scrape Zillow listings by city, ZIP code, county, or neighborhood, or paste a Zillow search URL. Get price, Zestimate, rent estimate, beds, baths, size, lot, address, coordinates, and broker across for-sale, for-rent, and sold homes. Breaks Zillow's 820-result cap. Export to JSON, CSV, or Excel.

Pricing

from $0.90 / 1,000 search results

Rating

0.0

(0)

Developer

Kamil Ertekin

Kamil Ertekin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Type a place, or paste a Zillow search URL, and pull every matching listing back as structured data. Zillow Search Scraper resolves plain-English locations such as "Austin, TX" or "78731" through Zillow's own autocomplete, then reads the search results page directly, with no browser involved. Each row carries 41 fields, and this page publishes the measured fill rate for every one of them, so you know what you are buying before you spend anything.

What can Zillow Search Scraper do?

📍 Search by city, ZIP code, county, or neighborhood, typed in plain English. Or paste a Zillow search URL and it runs exactly as given.

🔎 Filter on price, beds, baths, square footage, lot size, year built, pool, waterfront, single-story, garage, air conditioning, basement, open house, 3D tour, and days listed, then sort by newest, price, size, or lot. Every one of these keys was checked live against Zillow's own result count before it shipped.

🏠 For sale, for rent, and recently sold, all from one Actor.

🧩 Get past Zillow's 820-result cap. Large areas split into smaller map sections and search each one separately, automatically.

💰 The rental price trap, handled. Zillow accepts a price filter on rental searches and quietly ignores it. This Actor switches to the key that moves the result count.

🌐 Residential US proxies by default. In a same-second A/B, residential returned 60 of 60 properties in 101 seconds; datacenter returned nothing in 408.

💵 Only rows that reach your dataset are billed. Retries, blocks, duplicates, and listings that miss your filters cost nothing.

🤖 Call it from the Apify API or an MCP server to drive a Zillow search from an agent.

What Zillow data can you extract?

Every listing returns 41 fields:

FieldWhat it is
zpid · urlZillow's internal ID and the listing page
price · priceLabel · currencyPrice as a number, Zillow's formatted string, and the currency
zestimate · rentZestimateZillow's own value and rent estimates
taxAssessedValueAssessed value, where published
bedrooms · bathrooms · livingAreaSize
lotAreaValue · lotAreaUnitsLot size, with its unit
streetAddress · city · state · zipcode · addressLocation
latitude · longitudeCoordinates
homeStatus · statusText · daysOnZillowListing state
brokerNameListing brokerage
homeType · listingTypeProperty type and search type
mainImage · hasVideo · has3DModelMedia
isZillowOwned · isFeaturedListing · isUndisclosedAddressFlags
isBuilding · buildingNameWhether the row is a whole apartment building, and its name
priceMin · priceMax · bedroomsMin · bedroomsMaxRent and bedroom span across a building's units
availableUnitCount · unitCountHow many units the building has available
searchLocationWhich input location produced this row

How often is each field actually filled?

Measured on 2026-08-24 across 5,000 unfiltered Austin, TX for-sale results:

Fill rateFields
100%zpid, url, price, priceLabel, currency, streetAddress, city, state, zipcode, address, homeType, homeStatus, statusText, listingType, daysOnZillow, mainImage, and the flag fields
99.7%latitude, longitude
99%bedrooms, bathrooms
95%brokerName
83%livingArea, taxAssessedValue
27%rentZestimate
19%zestimate

Zillow itself publishes a Zestimate on roughly one active listing in five, and a rent Zestimate on roughly one in four. That holds on the listing page as much as in search, so no Zillow scraper can return one where Zillow has not published one.

Everything you would use to filter, join, map, or price a dataset (zpid, price, address, coordinates, beds, baths, area, days on market) comes back on every row.

Rentals behave differently, and this Actor handles it

Most rental search results are not single homes. They are whole apartment buildings, and Zillow returns those in a different shape with no single price and no single bedroom count. On page one of a Denver rental search, 38 of 41 results were buildings.

A building row gets isBuilding: true, its buildingName, the rent span in priceMin and priceMax, the bedroom span in bedroomsMin and bedroomsMax, and availableUnitCount. price is filled with the lowest available rent and priceLabel reads $1,720 to $2,400/mo, so sorting and filtering keep working across a mixed result set. bathrooms and livingArea stay empty on those rows, because a building does not have one of either.

How to scrape Zillow search results

  1. Enter your locations. Type Austin, TX, 78731, or Brooklyn, NY, or paste a Zillow search URL.
  2. Set your filters, or leave them empty to pull everything in the area.
  3. Set Maximum results. This is your spend cap, and it defaults to 100. Searching several places at once? Maximum per location stops one large city from eating the whole run.
  4. Click Start, then download from the Storage tab, or pull results through the API.

Getting past Zillow's 820-result limit

A Zillow search reports its true total, then caps out at 20 pages of 41 results, 820, no matter what that total says. Austin, TX reported 5,787 for-sale listings on 2026-08-24 and handed back exactly 820.

This Actor works around the cap. When an area holds more listings than one search can return, it splits the map bounding box into quarters and searches each one separately, recursing up to 4 levels deep and removing duplicates by zpid. A real run on Austin, TX:

Austin, TX: 5,787 listings match.
Austin, TX holds 5,787 listings, more than one search returns (820). Splitting into 4 smaller areas.
Austin, TX holds 3,077 listings, more than one search returns (820). Splitting into 4 smaller areas.
Austin, TX holds 2,523 listings, more than one search returns (820). Splitting into 4 smaller areas.
...
Done. 1500 records pushed from 43 pages (209 duplicates dropped, 0 unchanged, 0 blocked)

That run took 52 seconds on residential proxies. The duplicates are listings that appeared in more than one map section after the split, and you are not charged for them.

Pushed harder, the same search returned 5,000 listings in 3 minutes 49 seconds across 186 pages, with 2,456 duplicates filtered out and zero blocked requests. Every one of the 5,000 rows was a distinct property, spanning 63 ZIP codes, 864 brokerages, and prices from $2,995 to $63,000,000. Those 2,456 duplicate fetches are absorbed on our side, not billed to you.

Turn off Cover areas larger than one search can return to stop at 820 per location and spend less.

How much does it cost to scrape Zillow?

You pay per result delivered to your dataset.

Your Apify discount tierPrice per 1,000 results
Free$1.50
Bronze$1.50
Silver$1.20
Gold$0.90

Platform usage (compute, proxies, storage) is included in that price. Retries, blocked requests, duplicates, and listings that do not match your filters are free. Zillow applies your filters before it returns anything, so a narrower search returns fewer rows and costs less.

⬇️ Input example

Sale, with filters:

{
"locations": ["Austin, TX", "78731"],
"listingType": "forSale",
"minPrice": 400000,
"maxPrice": 900000,
"minBedrooms": 3,
"hasPool": true,
"maxItems": 500
}

Rentals. Price here means monthly rent:

{
"locations": ["Denver, CO"],
"listingType": "forRent",
"minPrice": 1500,
"maxPrice": 2500,
"maxItems": 200
}

New listings only, for a scheduled run:

{
"locations": ["Phoenix, AZ"],
"daysOnZillow": "1",
"maxItems": 0
}

⬆️ Output example

A real row:

{
"zpid": "29342650",
"url": "https://www.zillow.com/homedetails/5014-W-Frances-Pl-Austin-TX-78731/29342650_zpid/",
"price": 750000,
"priceLabel": "$750,000",
"zestimate": 726800,
"rentZestimate": 4839,
"bedrooms": 4,
"bathrooms": 3,
"livingArea": 2013,
"streetAddress": "5014 W Frances Pl",
"city": "Austin",
"state": "TX",
"zipcode": "78731",
"homeStatus": "FOR_SALE",
"listingType": "forSale",
"searchLocation": "78731"
}

Integrations

Results do not have to stop at a dataset. Every public Actor on Apify carries the platform's integrations, so a run can push listings wherever your team already works.

  • n8n, Make, Zapier and Pipedream for no-code automation.
  • HubSpot and Airtable to land listings as CRM records or rows.
  • Slack, Telegram and Gmail to push new listings to people rather than to storage.
  • Google Drive, Snowflake, Keboola and Airbyte for exports and warehouse loads.
  • Webhooks and the GitHub integration for anything custom.
  • LangChain, the OpenAI Agents SDK, the Vercel AI SDK and Google ADK to hand listings to an LLM app.

Two combinations worth setting up on day one:

A daily new-listings feed. Schedule a run with Listed within set to 1 day and point a webhook or Slack step at the finished dataset. Only the rows that appeared overnight count against your bill, not a re-scrape of the whole area.

An agent that searches Zillow. The Apify API and MCP server both expose this Actor as a callable tool. See the FAQ below for how its permissions work.

❓ FAQ

You are responsible for how you use the data you collect. Read Apify's guide on the legality of web scraping.

Does this Actor respect robots.txt?

No. Zillow's robots.txt disallows the /*?searchQueryState=* route this Actor uses to run filtered searches, and there is no other route that carries prices, so a filtered Zillow search cannot be run compliantly by anyone. A Respect robots.txt switch sits in the Advanced section anyway. Flip it on and the Actor stops and tells you why, instead of quietly returning nothing. If Zillow's robots.txt cannot be fetched at all, the run logs a warning and carries on, since there is nothing to check against.

The permitted alternative is Zillow's sitemap. It publishes addresses without prices, which means it cannot answer "three-bed homes under $600k." Every Zillow search Actor on the Apify Store uses the same route this one does.

Why does a price filter do nothing on Zillow rentals?

On this Actor it does work. Everywhere else, treat a rental price filter as decoration. Zillow accepts the normal price key on rental searches and silently drops it. Applying a $1,500 to $2,500 filter to 24,938 Austin rentals returned 24,938 rentals. Rentals use a different key internally, and this Actor switches to it for you.

Why did I get fewer results than Zillow says exist?

Either your Maximum results cap was reached, or area splitting is off and the search hit the 820 ceiling. Check the run log; it states which one happened.

Can I use my own Zillow search URL?

Yes. Paste it into Zillow search URLs and it runs exactly as given, so any filter Zillow supports will work. Area splitting cannot apply to a pasted URL, so those searches stop at 820.

Can I use this with the Apify API or an MCP server?

Yes. Use the API and MCP tabs on this Actor's page. It runs under limited permissions, so an agent can call it without broad account access.

Support

Missing a filter, or want a different output shape? Open an issue on the Issues tab. Filter requests are welcome. If Zillow's own search supports a field, it can usually be added.