The Mine Works
← All posts
tutorial July 11, 2026 · 4 min read

How to Scrape Zillow Listings in Python (2026 Guide, No Blocking)

Scrape Zillow for-sale listings by city or ZIP in Python — price, beds, baths, Zestimate, and days on market. No API key, no browser, no blocking.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

Zillow does not offer a public API for third-party developers to pull current listings. The old Zillow API (GetSearchResults, GetDeepSearchResults) was deprecated years ago, and what remains today is gated behind partner agreements aimed at MLS providers and syndication feeds, not people who just want to search for-sale inventory in a city and get structured results back.

The Zillow Search Scraper queries Zillow’s own search endpoints directly — the same backend the site’s map search calls — over plain HTTP. No headless browser, no login, no API key, and it resolves any location string (city, ZIP, or neighborhood) to a search region automatically. It’s built lean (512 MB, HTTP-only) and bills pay-per-result: $1 per 1,000 results ($0.001 each), nothing charged on failed lookups.

What You Get

For each property the actor returns:

  • address, addressLine1, city, state, zipCode — full parsed address
  • price, priceLabel — numeric value and formatted display string
  • beds, baths, sqft — core specs
  • lotSizeSqft, lotSizeUnit — lot size and its unit
  • propertyType — SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, LAND
  • statusType, statusText — FOR_SALE and a human-readable label
  • daysOnZillow — how long the listing has been active
  • zestimate, rentZestimate — Zillow’s automated sale and rent valuations
  • latitude, longitude — coordinates for mapping
  • detailUrl, zpid — the full listing URL and Zillow’s property ID
  • imgSrc, listingSubType — primary photo URL and sub-type flags (e.g. is_FSBA)

Scrape by Location in Python

import os
from apify_client import ApifyClient

apify = ApifyClient(os.environ["APIFY_TOKEN"])

run = apify.actor("themineworks/zillow-search-scraper").call(run_input={
    "location": "Austin, TX",
    "maxItems": 100,
    "minPrice": 400000,
    "maxPrice": 900000,
    "minBeds": 3,
    "propertyType": "SINGLE_FAMILY",
    "daysOnZillow": 30,
})

for home in apify.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{home['address']}{home.get('priceLabel')}")
    print(f"  Zestimate: ${home.get('zestimate'):,}" if home.get('zestimate') else "  No Zestimate")
    print(f"  {home.get('daysOnZillow')} days on Zillow")

Filter for Fresh, Underpriced Inventory

A common pattern: pull recent listings, then flag ones where the list price sits notably below the Zestimate.

listings = list(apify.dataset(run["defaultDatasetId"]).iterate_items())

underpriced = [
    h for h in listings
    if h.get("zestimate") and h.get("price")
    and h["price"] < h["zestimate"] * 0.95
]

for h in sorted(underpriced, key=lambda h: h["price"] / h["zestimate"]):
    gap = (1 - h["price"] / h["zestimate"]) * 100
    print(f"{h['address']}: ${h['price']:,} vs Zestimate ${h['zestimate']:,} ({gap:.1f}% below)")

Chain Into Full Property Details

The detailUrl and zpid fields feed directly into the Zillow Property Details Scraper for price history, tax history, school ratings, and more — see our Zillow Property Details guide for the full enrichment pipeline.

zpids = [h["zpid"] for h in listings[:20]]

details_run = apify.actor("themineworks/zillow-property-details").call(run_input={
    "urls": zpids,
    "includePriceHistory": True,
    "includeSchools": True,
})

Use in Claude, ChatGPT & Any MCP Agent

This actor is available as a hosted MCP server:

https://mcp.apify.com/?tools=themineworks/zillow-search-scraper
{
  "mcpServers": {
    "zillow-search-scraper": {
      "command": "npx",
      "args": ["-y", "@apify/mcp-client"],
      "env": {
        "APIFY_TOKEN": "your-token-here",
        "MCP_ACTOR_URL": "https://mcp.apify.com/?tools=themineworks/zillow-search-scraper"
      }
    }
  }
}

Connect it to Claude Desktop or any MCP-compatible client and ask it to pull Zillow listings for a city, filter by beds and price, or find the newest inventory under the Zestimate — no script needed for a quick lookup.

Use Cases

Investor deal sourcing. Filter by minPrice, maxPrice, minBeds, and propertyType across a metro, then compare price against zestimate to surface listings priced below Zillow’s own valuation model.

Agent lead lists. Pull fresh for-sale inventory in a farm area on a schedule to prospect sellers and buyers before competitors reach out.

Comparable market analysis. Feed zestimate and rentZestimate alongside actual list prices into a valuation model — useful as a baseline before pulling full price and tax history.

Price and inventory monitoring. Re-run the same location weekly and diff results by zpid to catch new listings and price drops as daysOnZillow resets.

Pricing

$1 per 1,000 results ($0.001 per property). A 1,000-listing metro sweep costs $1. A weekly re-run of a 300-property ZIP list costs $0.30/week.

Frequently Asked Questions

Do I need a Zillow account or API key?

No. The scraper requires no login, no cookies, and no API key — only an Apify account to run it.

What is the Zestimate field?

Zillow’s automated valuation estimate for the home; rentZestimate is its estimated monthly rent. Both are returned when Zillow publishes them for a listing — not every listing has one.

How many listings can I pull per run?

Set maxItems as high as you need; the actor pages through Zillow’s results automatically. For very large metros, split the search across ZIP codes or property types.

Can I get more than the search card fields — like price history or schools?

Yes. Pass the detailUrl or zpid from each result into the Zillow Property Details Scraper to pull price history, tax history, school ratings, and HOA fees.

How does Zillow’s data compare to Redfin and Realtor.com?

Coverage and field depth differ by portal — see our Zillow vs Redfin vs Realtor.com comparison for the breakdown.

Related Actor

Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.