Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Short answer: you should not build an automated scraper that collects information from Zillow’s consumer website. Zillow’s Terms of Use prohibit “conduct automated queries (including screen and database scraping, spiders, robots, crawlers, bypassing “captcha” or similar precautions, or any other automated activity with the purpose of obtaining information from the Services) on the Services.” A compliant project starts by defining the data you need, then using an approved API or licensed dataset. The right route differs for MLS listings, public records and market statistics.

Start by defining the data you actually need

“Zillow data” is not one interchangeable dataset. Before writing code, classify the output your application requires.

Individual current listings

If you need addresses, prices, status, property types, broker details or other listing-level fields, you need an MLS or broker data license. Zillow Group’s Bridge Listing Output is a REST service that returns JSON normalized to the RESO Data Dictionary. Access is invite-only and depends on participating MLS partners in the United States and Canada. Approval for one market does not grant unrestricted access to every market or permission to republish records.

Parcel, assessment and transaction records

For tax-assessor, parcel and county transaction information, the separate Bridge Public Records API is the relevant product. Zillow Group describes US coverage reaching back roughly 15 years. It is also invite-only, and your agreement controls fields, uses, retention and redistribution.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Aggregate market trends

If your analysis needs home-value, rent or inventory trends rather than a row for every property, use Zillow Real Estate Metrics. The site provides downloadable CSV datasets for public use with attribution. Geography ranges from neighborhood to national, and some series extend as far back as the late 1990s. These files are not a substitute for a current listing feed.

Need Appropriate route Access and limits
Current MLS listings Bridge Listing Output Invite-only; participating US and Canadian MLS partners; license terms apply
Parcel, assessment and county transactions Bridge Public Records API Invite-only; US coverage stated at roughly 15 years; agreement controls use
Market-level trends Zillow Real Estate Metrics CSV files Public downloads with attribution; aggregate rather than listing-level records
Unlicensed extraction from Zillow.com Do not implement Consumer Terms prohibit automated collection and CAPTCHA bypass

Why a consumer-site Zillow scraper is not an authorized implementation

The restriction is broader than a particular endpoint or HTML layout. Zillow’s consumer terms expressly cover screen and database scraping, spiders, robots, crawlers and bypassing CAPTCHA or similar precautions when the purpose is obtaining information. A headless browser that loads pages, rotates IP addresses or imitates human clicks is still automated collection; changing the technique does not change the permission question.

Do not reverse-engineer private endpoints, defeat bot checks, harvest session cookies, or design a system to avoid rate limits. Those approaches can expose your project to account termination, blocked infrastructure, contractual disputes and unreliable data. The terms and product pages can change, so check the current agreement immediately before deployment. This article is a US-focused engineering guide, not legal advice for every jurisdiction.

How to build the pipeline for an authorized source

The same engineering pattern works for an API or website that you own or are explicitly allowed to collect from. Keep the source agreement beside the code and encode its restrictions as configuration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

1. Write a data and permission specification

  • List every field you will store, such as listing ID, status, price and update timestamp.
  • Define permitted geography, property types, query purpose and users.
  • Record rate limits, display requirements, attribution language, retention period and deletion procedure.
  • Decide whether records may be cached, exported or shared with third parties.

2. Retrieve only permitted records

Prefer the licensed provider’s documented REST endpoint. Send credentials in an environment variable, use HTTPS, set a finite timeout and honor pagination and retry headers. Never put an API key in browser JavaScript or source control.

import os, time, requests

BASE_URL = os.environ["AUTHORIZED_API_URL"]
TOKEN = os.environ["AUTHORIZED_API_TOKEN"]

params = {"page": 1, "limit": 100}
headers = {"Authorization": f"Bearer {TOKEN}", "Accept": "application/json"}
records = []

while True:
    response = requests.get(BASE_URL, params=params, headers=headers, timeout=30)
    response.raise_for_status()
    payload = response.json()
    batch = payload.get("data", [])
    records.extend(batch)
    if not payload.get("next_page") or not batch:
        break
    params["page"] += 1
    time.sleep(1)  # replace with the provider's documented limit

print(f"received {len(records)} permitted records")

This example deliberately uses a placeholder authorized endpoint. Replace it only with an endpoint and credential issued under your agreement; it is not a recipe for querying Zillow.com.

3. Validate and normalize

Validate required identifiers, parse currency and dates with explicit time zones, normalize state and county codes, and reject impossible values. Keep the provider’s original ID as the stable key. RESO-normalized MLS output reduces field-name variation, but your own database should still version its schema because definitions and enumerations can change.

4. Deduplicate and track changes

Use the licensed record ID as the primary key. Store a source timestamp and an ingestion timestamp. For updates, compare meaningful fields and write an audit event rather than silently overwriting history. If a listing is withdrawn, apply the source’s deletion or display rules instead of treating the last response as permanently current.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

5. Handle failures without hammering the source

Retry only transient failures such as 429, 502 or 503, with exponential backoff and a maximum attempt count. Do not retry authentication failures indefinitely. Log status code, request ID, page or cursor, elapsed time and a redacted error message. A dead-letter queue lets an operator replay a failed page after the provider recovers.

import random, time

def get_json(url, *, headers, params, attempts=4):
    for attempt in range(attempts):
        r = requests.get(url, headers=headers, params=params, timeout=30)
        if r.status_code == 200:
            return r.json()
        if r.status_code not in (429, 502, 503, 504):
            r.raise_for_status()
        delay = min(30, 2 ** attempt) + random.random()
        time.sleep(delay)
    raise RuntimeError("authorized source remained unavailable after retries")

6. Protect provenance and credentials

  • Store secrets in a secret manager and rotate them when staff or vendors change.
  • Encrypt raw responses and restrict production database access.
  • Keep a provenance record containing provider, agreement version, request time and transformation version.
  • Implement the contract’s retention and deletion schedule as an automated job.
  • Display attribution exactly as required by the license.

Using Zillow’s approved alternatives

Bridge Listing Output

Contact Zillow Group or the relevant MLS partner to request current access. Ask which MLS markets participate, which fields are licensed, the update cadence, rate limits, permitted display, retention and redistribution rules. Build against the documented REST and JSON interface only after credentials are issued. “Invite-only” means an endpoint discovered on the internet is not an invitation to use it.

Bridge Public Records API

Request the product separately if your use case concerns parcels, assessments or county transactions. Confirm county coverage, historical depth, update timing and whether your planned storage or customer-facing display is allowed. The stated roughly 15-year depth is a product description, not a guarantee that every county has identical history.

Real Estate Metrics downloads

Select the geography and series, download the CSV, retain the file’s metadata and include Zillow attribution in reports or applications. Treat the data as periodic aggregate statistics: it cannot answer “what is the current status of this particular listing?”

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Common failure modes and fixes

Symptom Likely cause Compliant fix
403 or CAPTCHA page from Zillow.com Consumer-site automation is blocked or prohibited Stop requests; obtain licensed API access or use an allowed dataset
401/403 from an approved API Wrong credential, expired token or missing entitlement Check the account, scope and agreement; do not try to bypass authorization
429 responses Provider rate limit exceeded Honor Retry-After, reduce concurrency and request a higher documented quota
Duplicate properties Using address text instead of a stable source ID Key records by provider ID and normalize addresses only for search
Stale or missing listings Unknown update cadence or withdrawn records Confirm cadence and lifecycle semantics with the data provider
Unexpected schema values Enumeration or field definition changed Version schemas, validate inputs and quarantine unknown values

Performance, reliability and cost planning

Do not estimate capacity from page count alone. Measure records per response, payload size, provider latency, allowed concurrency and the frequency of updates permitted by your license. Incremental syncs using a provider’s modified-since cursor are cheaper and less error-prone than repeatedly downloading a full corpus. Cache only for the period your agreement allows, and separate raw licensed data from derived, non-identifying aggregates.

Plan for partial outages: queue jobs, checkpoint cursors, make writes idempotent and expose freshness timestamps to users. A successful HTTP response is not proof that a record is complete; validate required fields and monitor sudden drops in volume. No reliable universal scraper success rate or block-rate statistic is established for Zillow, so do not promise one.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup: ScreenshotNeo

If your legitimate task is simply to capture a page you own or are authorized to access, ScreenshotNeo provides a single-call screenshot API instead of maintaining browser infrastructure. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and each response reports its page verdict and billing status in headers. Its MCP server exposes take_screenshot, get_page_info and capture_pdf tools to Claude, Cursor and other MCP clients.

See the complete parameters in the ScreenshotNeo documentation. This example targets an authorized URL:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));

The free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots, and every plan includes the full feature set. Create a free ScreenshotNeo account.

Deployment checklist

  • Verify the current Zillow terms and the specific API or dataset license.
  • Confirm geography, property coverage, fields and update cadence.
  • Document permitted display, retention, attribution and deletion.
  • Use issued credentials, encrypted storage and rotation.
  • Implement pagination, backoff, idempotent writes and provenance logs.
  • Test withdrawn, duplicate, malformed and partially unavailable records.
  • Never automate Zillow.com consumer pages or bypass CAPTCHA and bot controls.

Frequently Asked Questions

Can I use Selenium or Playwright to collect Zillow listings?

Not for automated information collection from Zillow Services unless you have explicit authorization that permits it. A browser automation framework does not override Zillow’s consumer Terms of Use.

Does the Real Estate Metrics CSV contain individual homes?

No. It provides aggregate market statistics by geography and series, not a current record for each listing.

Is Bridge Listing Output the same as the Public Records API?

No. Bridge Listing Output is for licensed MLS listing data; Bridge Public Records API covers parcel, assessment and county transaction information. They have separate access and terms.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.