Zillow Scraper avatar

Zillow Scraper

Pricing

from $2.40 / 1,000 result items

Go to Apify Store
Zillow Scraper

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

Viktor Dubnytskiy

Maintained by Community

Actor 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"]):

addresspricebeds/bathsareastatus
500 Denson Dr, Austin, TX 78752$395,0003 / 21110 sqftFOR_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.

How it works

  1. 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/) until maxListingsPerCity is 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.
  2. 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.
  3. 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.
  4. 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

FieldMeaningDefault
citiesCity slugs or Zillow city URLs["austin-tx"]
forRentfalse = for-sale, true = for-rentfalse
maxListingsPerCityStop a city after this many matching listings200
minPrice / maxPriceClient-side price filter (USD)none
minBedsClient-side minimum-bedrooms filternone
maxItemsStop the whole run after this many rows200
modescrape or monitor (only new/changed since last run)scrape
monitorStateId, webhookUrl, telegramBotToken, telegramChatIdMonitor-mode state key and alert targetsempty

Pricing

EventPrice
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.