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.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →#1 Best Overall
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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →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.
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?”
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Rank #4
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.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.
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.
Best Value
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.
Quick Recap
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.

