Zillow Scraper
Pricing
from $2.40 / 1,000 result items
Zillow Scraper
Zillow scraper for for-sale and for-rent listings from any Zillow city search: price, beds, baths, area, status, coordinates and listing URL. No login. Monitor mode returns only new listings and price or status changes for a saved search, so it also works as a Zillow price tracker.
Pricing
from $2.40 / 1,000 result items
Rating
0.0
(0)
Developer
Viktor Dubnytskiy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Get Zillow for-sale or for-rent listings for one or more US cities, one flat row per listing, straight from the city search page. No login, no account, no session.
Try it: the prefilled example returns 20 rows in about 20 seconds and costs about $0.064. Results cost $3 per 1,000.
What you get
Real rows from the example dataset (cities: ["austin-tx"]):
| address | price | beds/baths | area | status |
|---|---|---|---|---|
| 500 Denson Dr, Austin, TX 78752 | $395,000 | 3 / 2 | 1110 sqft | FOR_SALE (Active) |
| ... | ... | ... | ... | ... |
Full row: id (zpid), url, address, city, state, zip, price, priceText, beds, baths, areaSqft, lotAreaText, homeType, statusType, statusText, daysOnZillow, latitude, longitude, imageUrl, query.
Use cases
- Buyer watch — put a city (and optional price/bed filters) into monitor mode; each run returns only listings that are new since the previous run, so you get an alert instead of re-checking Zillow yourself.
- Price-drop tracking — monitor mode fingerprints each listing on price and status, so a run flags a listing the moment its price or status (for sale / pending / sold) changes.
- One-off local market snapshot — a single run for one or a few cities when you just need today's list of active listings and nothing recurring.
Try it in 10 seconds
One-off list — hit Start/Try it, the input already works: cities: ["austin-tx"], forRent: false, maxListingsPerCity: 200, maxItems: 20, nothing required.
Monitor mode — save the task, then set:
{"mode": "monitor","monitorStateId": "austin-tx-watch","cities": ["austin-tx"],"minBeds": 3,"webhookUrl": "https://your-endpoint.example.com/hook","telegramBotToken": "","telegramChatId": ""}
and put it on a schedule (Apify → Schedules). Each monitor run charges one monitor-check event ($0.006) and returns only listings that are new or whose price/status changed since the previous run, each billed as one change event ($0.003) — a run with nothing new charges only the check.
Related actors
- Amazon Price Tracker: Product Scraper by ASIN, Buy Box, Stock — the same price-alert pattern for retail products.
- Walmart Product Scraper & Price Monitor (stock, seller, store) — same monitor pattern for a different retail marketplace.
- Etsy Listings Scraper (search, shops, listing details, prices) — same alerting approach for handmade and vintage goods.
How it works
- Each city slug (or full Zillow city URL) is turned into the city's search page (
zillow.com/<city-slug>/or.../rentals/) and paged (<n>_p/) untilmaxListingsPerCityis reached, a page repeats listings already seen, or Zillow signals the last page (a distinct "page past the end" response, not an empty page) — verified on real fetched pages for both the for-sale and the rentals path. - Each listing card is read from the page's own embedded JSON (
__NEXT_DATA__) — the same data Zillow's own search results render from, not a scrape of visible HTML text. - Building-level rental cards (an apartment complex shown as one card with a price range across units, no single listing id) are skipped: they are not one listing.
- A wall (bot-verification page) is retried through Apify's Web Unblocker proxy and reported as a block, so an empty dataset never hides a wall as "no listings".
Input
| Field | Meaning | Default |
|---|---|---|
cities | City slugs or Zillow city URLs | ["austin-tx"] |
forRent | false = for-sale, true = for-rent | false |
maxListingsPerCity | Stop a city after this many matching listings | 200 |
minPrice / maxPrice | Client-side price filter (USD) | none |
minBeds | Client-side minimum-bedrooms filter | none |
maxItems | Stop the whole run after this many rows | 200 |
mode | scrape or monitor (only new/changed since last run) | scrape |
monitorStateId, webhookUrl, telegramBotToken, telegramChatId | Monitor-mode state key and alert targets | empty |
Pricing
| Event | Price |
|---|---|
| result | $0.003 per listing ($3 per 1,000) |
| monitor-check | $0.006 per monitor run |
| change | $0.003 per new/changed listing |
Charged only for listings actually pushed. Web Unblocker proxy usage is billed by Apify on top of the actor's own events.
Found it useful? A short review on the Store page helps other people find this actor and tells us what to improve. If a listing or alert looks wrong, open an issue on the actor page — issues are answered within a day.
Why this actor
- No login and no cookies to supply.
- Client-side price/bed filters so you do not need to build Zillow's own filter URL.
- Monitor mode with webhook and Telegram alerts on new listings and price/status changes — built for a recurring watch, not just a one-off pull.
- A run that finds nothing pushes nothing and charges no result events; the run summary explains why instead of leaving you guessing.
Limits
- US listings only (Zillow's own coverage).
- Filters (
minPrice,maxPrice,minBeds) are applied after the fetch, not via Zillow's own filtered search URL, so a very narrow filter on a small city can still page through the whole unfiltered list. - Building-level rental cards (apartment complexes shown with a price range instead of one listing) are not returned — only individually-listed units, which on a typical rentals page are a small minority of the cards (about 1 in 41 on the pages checked), so a rentals run over several pages returns few rows per page fetched.
- No agent, broker or owner names, and no phone numbers — only listing-level facts.
FAQ
Does it need a Zillow login or cookies? No. There is no account field at all; every request is made as a logged-out visitor through Apify's Web Unblocker proxy.
What happens when a city slug does not exist? No rows are pushed for that city and no result events are charged; the RUN_SUMMARY record in the run's key-value store notes it separately from a real block.
Are agent or broker names collected? No. Listing rows carry only the property's own facts (address, price, beds/baths, area, status) — no agent, broker or owner name or phone number.
What does monitor mode actually save me? It keeps state per monitorStateId (or per saved task) across runs, so a schedule returns only listings that are new or whose price/status changed instead of the whole list again.
Changelog
- 0.1: initial release — city-page listings (for-sale/for-rent), client-side price/bed filters, monitor mode; a wall is retried through Web Unblocker and reported as a block instead of an empty dataset.
If this actor saved you time, a short review on its Store page genuinely helps other people find it. Found a bug or need a field that is missing? Open a ticket on the Issues tab.