Scrape Zillow property listings with Browserless
Search Zillow properties and retrieve listing details as structured JSON. Start with the dedicated Zillow Scraper API, then use browser automation, MCP, or agent Skills for custom workflows.
Everything you need to scrape Zillow
Collect real estate data without rebuilding browsers, proxy handling, and parsing logic for every request.
Choose your Browserless Zillow scraper
Use the ready-made API for common real estate listings data, or choose a browser workflow when you need more control.
Predefined Scrapers API
Call POST /scrapers/zillow/search with a place, sale or rent, and optional filters. Receive validated JSON listing rows, prices, addresses, and Zillow URLs.
Predefined Scrapers API
Call POST /scrapers/zillow/property with a zpid or listing URL for property facts, listing information, and available price history.
Browserless features that make Zillow scraping reliable
The Zillow APIs handle common property queries, while Browserless's browser tools give you more control when a workflow needs to go beyond a single API call.
zpid to retrieve available listing information, address, characteristics, history, photos, and related property fields.What is a Zillow scraper?
Turn Zillow listings into useful property data.
A Zillow scraper automatically collects publicly visible real estate listings or property information from Zillow search pages and individual property URLs.
Teams use the data for property comparisons, market research, listing monitoring, and business intelligence. Structured records are far easier to analyze than listings copied by hand from the website.
How Browserless overcomes the challenges of scraping Zillow
Use the dedicated API for common property records and browser tools where custom page interaction is necessary.
The challenge
Bot detection blocks automated requests
Browserless’s solution
The Zillow Scraper API tries its direct extraction path and can fall back to a stealth browser; BrowserQL and BAP support custom protected-page workflows.
The challenge
Too many requests or IP-based limits
Browserless’s solution
For browser workflows, use built-in residential proxies and control concurrency. For scraper API responses, retry temporary failures with backoff.
The challenge
Search pages require the right location and filters
Browserless’s solution
Use supported search parameters and check the returned query and listing rows; the Zillow agent Skill can verify filters on live pages.
The challenge
HTML selectors and page layouts change
Browserless’s solution
Start with validated JSON from /scrapers/zillow/search or /scrapers/zillow/property so routine fields do not depend on your own page parsing logic.
The challenge
One search result lacks full property detail
Browserless’s solution
Take a home result’s zpid or Zillow listing URL (building URLs aren’t accepted) and call /scrapers/zillow/property to retrieve additional facts and history where available.
The challenge
Large datasets need consistent export and retries
Browserless’s solution
Page through up to 24 pages (984 listings) per search and split larger markets by ZIP code. Retry when error.retryable is true and deduplicate by zpid before exporting.
How Browserless scrapes Zillow listings
A property-search workflow using the new predefined scraper, with detail lookups when you need more fields.
- 01
Set your search
Choose a location, for sale or for rent, and supported price or property filters.
- 02
Call the Zillow API
Send a Zillow search API request and receive structured JSON.
- 03
Check the results
Validate
ok, results, and page fields, and then deduplicate byzpid. - 04
Enrich and export
Fetch more property details, then save JSON or CSV.
A simple Zillow scraper code example
Search Zillow homes for sale by location using the predefined scraper API. No Puppeteer package or custom HTML parsing is required.
Requirements: Node.js 18+ and a Browserless Cloud API token set as BROWSERLESS_TOKEN.
Node.js
zillow-scraper.mjs
const token = process.env.BROWSERLESS_TOKEN;
const location = process.argv.slice(2).join(" ") || "San Francisco, CA";
if (!token) throw new Error("Set BROWSERLESS_TOKEN first.");
const response = await fetch(
"https://production-sfo.browserless.io/scrapers/zillow/search?timeout=90000",
{
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
params: { query: location, tenure: "sale", page: 1 },
}),
signal: AbortSignal.timeout(105000),
},
);
const result = await response.json().catch(() => ({}));
if (!response.ok || !result.ok) {
throw new Error(result.error?.message || `HTTP ${response.status}`);
}
const listings = result.data.results.map((home) => ({
zpid: home.zpid,
url: home.url,
address: home.address?.line ?? null,
price: home.price?.amount ?? null,
beds: home.beds ?? null,
baths: home.baths ?? null,
status: home.status ?? null,
}));
console.log(JSON.stringify({ location, listings }, null, 2));Run: node zillow-scraper.mjs "San Francisco, CA"
Save the example as zillow-scraper.mjs. It returns one search page (up to 41 listings) as JSON. Each successful call costs a fixed 10 units, as does a not-found result; other failed calls are free. The 90-second timeout leaves room for the browser fallback. Add pagination, property lookups, and CSV or Google Sheets export as needed.
Automate Zillow scraping with MCP
Use the Browserless MCP server from an AI assistant for custom page extraction. The documented Zillow example scrapes public real estate agent directories, not the new property-search API.
- 01
Connect MCP
Connect your MCP-compatible client to the hosted Browserless server at
https://mcp.browserless.io/mcp. Sign in with OAuth or pass your API token – see the MCP setup guide. - 02
Request agent data
Ask the assistant to use
browserless_smartscraperon a publicly accessible Zillow agent-directory page and return the visible agent names and profile URLs as markdown.