Zillow Listings Scraper (price & new-listing alerts)
Pricing
from $2.40 / 1,000 result items
Zillow Listings Scraper (price & new-listing alerts)
Get for-sale or for-rent listings from Zillow city search pages: price, beds, baths, area, status and coordinates. No login. Monitor mode alerts on new listings and price or status changes for a saved city search.
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
2 days 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.
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: 200, 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.