Blog

How to Access Zillow Real Estate Data Without Scraping

Zillow's official API was shut down in 2021, and scraping their site triggers aggressive anti-bot defenses. Shadow APIs offer a third path: the same internal endpoints Zillow's own frontend uses, discovered automatically from real browsing traffic.

Lewis Tham
April 3, 2026

How to Access Zillow Real Estate Data Without Scraping

Zillow shut down its public API in September 2021. Overnight, thousands of real estate tools, investment calculators, and market analysis platforms lost their data feed. The alternatives that emerged -- scraping HTML, buying from third-party aggregators, or negotiating enterprise contracts -- all have serious drawbacks.

But Zillow's website still works. Every time you search for a home, view a Zestimate, or check market trends, your browser makes dozens of internal API calls to fetch that data as structured JSON. These are shadow APIs -- the private endpoints that power the frontend. And they are far more useful than anything the old public API ever offered.

The Problem with Current Approaches

Scraping Breaks Constantly

Zillow runs one of the most aggressive anti-bot systems in real estate tech. Their defenses include:

  • Fingerprint detection that identifies headless browsers within seconds
  • Rate limiting that blocks IPs after just 20-30 requests
  • Dynamic class names that change on every deployment, breaking CSS selectors
  • CAPTCHA walls that trigger on unusual navigation patterns

Teams that scrape Zillow typically spend more engineering time maintaining their scrapers than building their actual product. A single Zillow frontend deployment can break every selector in your codebase.

Third-Party Data Is Stale and Expensive

Aggregators like ATTOM, Realtor.com API, or RapidAPI wrappers charge $200-500/month for data that is often 24-48 hours behind what you see on Zillow's website. For investment analysis or market monitoring, stale data means missed opportunities.

The Old API Is Gone Forever

Zillow's Bridge Interactive API and the original Zillow API are both permanently shut down. There is no waitlist, no replacement, and no plan to bring them back.

Shadow APIs: The Alternative

When you search for homes on Zillow, your browser does not render data from raw HTML. It calls internal REST endpoints that return structured JSON -- property details, price histories, Zestimates, comparable sales, and market statistics. These endpoints exist because Zillow's frontend is a modern React application that fetches data from its own backend services.

Shadow APIs are these internal endpoints, discoverable by observing real browsing traffic. They are not hidden or encrypted. They are simply undocumented -- never intended for external use, but fully functional when called directly.

The key insight: calling these APIs directly bypasses the entire browser rendering pipeline. No DOM parsing, no JavaScript execution, no anti-bot detection. You get the same data the website shows, but as clean JSON.

What Unbrowse Discovers on Zillow

When Unbrowse indexes Zillow through normal browsing, it captures endpoints like:

Endpoint Pattern Data Returned Format
/async-create-search-page-state Property listings with full metadata JSON
/api/homevalues/property Zestimate and valuation history JSON
/api/nearbyHomeValues Comparable properties and their values JSON
/graphql (GetHomeDetails) Complete property details, photos, tax history JSON
/api/market/overview Market statistics by region JSON

These endpoints return data that the old public API never exposed: renovation estimates, neighborhood scores, rental yield projections, and price forecast confidence intervals.

How It Works

Unbrowse discovers these endpoints by passively observing browser traffic, then makes them callable as standard API routes.

# Install Unbrowse
npx unbrowse setup

# Browse Zillow to discover endpoints
npx unbrowse go "https://www.zillow.com/homes/San-Francisco,-CA_rb/"

# Resolve discovered endpoints for any search
npx unbrowse resolve "zillow home listings in Austin TX"

Once endpoints are indexed, subsequent requests skip the browser entirely:

import Unbrowse from 'unbrowse';

const ub = new Unbrowse();

// Direct API call -- no browser, no rendering
const result = await ub.resolve(
  'zillow property details for 123 Main St, Austin TX'
);

console.log(result.data);
// {
//   price: 485000,
//   zestimate: 492300,
//   bedrooms: 3,
//   bathrooms: 2,
//   sqft: 1850,
//   yearBuilt: 1997,
//   priceHistory: [...],
//   taxHistory: [...]
// }

Performance: Browser vs Shadow API

Metric Browser Automation Shadow API (Unbrowse)
Latency per request 4-8 seconds 200-400ms
Memory usage 500MB+ (headless Chrome) ~5MB
Cost per 1,000 requests $5.30 (compute + proxy) $0.05
Anti-bot detection risk High None
Data format HTML (requires parsing) Structured JSON
Rate limit tolerance 20-30/hour 500+/hour

For a portfolio monitoring tool tracking 200 properties, the difference is dramatic: browser automation takes 15+ minutes and risks getting blocked. Shadow API calls complete in under 30 seconds with zero detection risk.

When to Use This Approach

Shadow APIs via Unbrowse are the right choice when:

  • You need current data. Shadow APIs return whatever Zillow shows on its website right now -- not yesterday's snapshot.
  • You are building an agent or automation. AI agents that call APIs directly are 3.6x faster and 106x cheaper than those that drive a browser.
  • You need data the old API never had. Zestimate confidence ranges, renovation ROI estimates, and neighborhood walkability scores are all available through internal endpoints.
  • You want to avoid scraper maintenance. Shadow APIs are structural -- they change less often than HTML layouts and never break due to CSS class name changes.

This approach is less suitable for bulk data dumps of millions of properties (rate limits still apply per-session) or for data that requires authenticated user sessions (saved searches, user-specific recommendations).

Getting Started

Set up Unbrowse and start discovering Zillow's shadow APIs in under two minutes:

# 1. Install
npm install -g unbrowse

# 2. One-time setup (configures Kuri browser engine)
unbrowse setup

# 3. Browse any Zillow page to index its APIs
unbrowse go "https://www.zillow.com/homes/Denver,-CO_rb/"

# 4. All future lookups resolve via API, not browser
unbrowse resolve "zillow homes for sale in Denver under 500k"

The first visit to any Zillow page takes a few seconds while Unbrowse captures traffic patterns. Every subsequent request to the same endpoint pattern resolves in milliseconds through the cached API route.

FAQ

Is this legal?

Accessing data that a website sends to your own browser is fundamentally different from scraping. When you visit Zillow, your browser receives JSON responses from their API endpoints. Unbrowse observes this traffic from your own browsing session and replays similar requests. There is no circumvention of access controls, no violation of authentication barriers, and no automated crawling of pages you have not visited. The HiQ v. LinkedIn ruling established that accessing publicly available data does not violate the CFAA.

How is this different from scraping?

Scrapers parse rendered HTML -- they load pages in a headless browser, wait for JavaScript to execute, then extract text from DOM elements. Shadow APIs skip all of that. You call the same internal endpoints the website uses and get structured JSON back directly. No browser required, no HTML parsing, no CSS selector maintenance.

What if Zillow changes their internal APIs?

Internal API structures change less frequently than frontend HTML layouts because they are consumed by Zillow's own applications. When changes do occur, Unbrowse detects them during subsequent browse sessions and automatically re-indexes the updated endpoints. The marketplace also benefits from collective discovery -- when any user encounters a changed endpoint, the updated route propagates to all users.

Can I get Zestimate data this way?

Yes. Zestimate values, confidence ranges, and historical valuation data are all served through internal API endpoints that Unbrowse captures during normal property page visits.