Zillow Search Scraper
Pricing
from $5.00 / 1,000 listing returneds
Zillow Search Scraper
Bulk Zillow listings search by ZIP, city, search URL, or map bounding box. Auto-paginates past Zillow's 800-result cap. MCP-ready.
Pricing
from $5.00 / 1,000 listing returneds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Zillow Search Scraper — ZIP, City & Map Bounds
Zillow Search Scraper is an Apify Actor for bulk Zillow listings search by ZIP code, city or neighborhood text, a saved Zillow search URL, or a map bounding box. It accepts one search source per run, applies listing filters, and returns one record per listing with fields such as zpid, url, address, price, beds, baths, sqft, listing status, geocoordinates, broker contact, image URL, Zestimate, and scrapedAt. The output is designed for downstream enrichment, analysis, and AI-agent workflows through Apify MCP.
Best fit and connected workflows
This Actor fits workflows that start from Zillow discovery and end with a clean listing dataset.
Use it when you want to:
- scan multiple US ZIP codes for active inventory,
- query a city, state, or neighborhood by text,
- replay a Zillow search URL with its embedded filters,
- target an exact bounding box for programmatic agent workflows,
- collect listing rows before handing selected
zpidvalues to a detail-enrichment step.
Use For deeper property detail enrichment, connect the discovered listings to Zillow Scraper - Property Listings & Agent Leads. That downstream Actor is a natural next step when you already have a returned public Zillow URL or zpid and want richer property-level records.
Practical scenario
Maya, a leasing analyst, starts with Austin, TX as a city search and sets listingType to forRent with a capped run size. The Actor returns rows with address, price, beds, baths, sqft, listing status, days on Zillow, agent contact, and URL. Maya filters the dataset for listings that match her target size and budget, then passes the selected zpid values to a downstream review or enrichment step.
Input fields
Provide one of searchUrl, zipCodes, searchQuery, or mapBounds, then add filters and a maxResults cap.
| Field | Type | Description |
|---|---|---|
searchUrl | string | Paste a Zillow search URL. The Actor extracts the embedded search state and runs that exact search. |
zipCodes | array of string | List of US ZIP codes to scrape. Each ZIP is processed independently. |
searchQuery | string | City, state, or neighborhood search such as Austin, TX. Zillow resolves this to a region. |
mapBounds | object | Bounding box with north, south, east, and west decimal degrees for exact geospatial targeting. |
listingType | string | One of forSale, forRent, or sold. Defaults to forSale. |
maxResults | integer | Hard cap on listings pushed to the dataset, from 1 to 5000. Defaults to 100. |
minPrice | integer | Lowest acceptable list price in USD. |
maxPrice | integer | Highest acceptable list price in USD. |
minBeds | integer | Minimum bedroom count from 0 to 10. |
minBaths | integer | Minimum bathroom count from 0 to 10. |
homeType | array of string | Restrict results to property types such as houses, condos, townhomes, multifamily, manufactured, land, or apartments. |
bypassPagination | boolean | Skip recursive subdivision past Zillow's 800-result cap. |
proxyConfiguration | object | Apify Proxy settings. Residential US is the default configuration. |
Focused input example
{"searchQuery": "Austin, TX","listingType": "forSale","maxResults": 50,"minPrice": 400000,"minBeds": 2,"homeType": ["houses", "townhomes"],"bypassPagination": false}
Output fields
The default dataset contains one record per returned listing.
| Field | Type | Description |
|---|---|---|
zpid | string | Zillow Property ID, a stable join key for downstream enrichment. |
url | string | Full Zillow detail URL. |
address | string | Street address as shown by Zillow. |
city | string or null | City. |
state | string or null | 2-letter state. |
zipCode | string or null | ZIP code. |
price | number or null | Current list price for forSale and forRent, or sold price for sold. |
listingStatus | string or null | Raw Zillow status such as FOR_SALE, PENDING, SOLD, FOR_RENT, or COMING_SOON. |
listingType | string | Run listing mode: forSale, forRent, or sold. |
homeType | string or null | Property type such as SINGLE_FAMILY, CONDO, or TOWNHOUSE. |
beds | number or null | Bedrooms. |
baths | number or null | Bathrooms. |
sqft | number or null | Living area in square feet. |
lotSize | number or null | Lot size in square feet. |
yearBuilt | number or null | Year built. |
latitude | number or null | Latitude. |
longitude | number or null | Longitude. |
daysOnZillow | number or null | Days on Zillow. |
zestimate | number or null | Zestimate in USD. |
rentZestimate | number or null | Rent Zestimate in USD. |
brokerName | string or null | Broker or brokerage. |
listingAgent | string or null | Listing agent. |
agentPhone | string or null | Listing agent phone. |
imgSrc | string or null | Primary image URL. |
scrapedAt | string | ISO 8601 UTC timestamp of the scrape. |
Illustrative output record
{"zpid": "123456789","url": "https://www.zillow.com/homedetails/123456789_zpid/","address": "123 Example St","city": "Austin","state": "TX","zipCode": "78704","price": 625000,"listingStatus": "FOR_SALE","listingType": "forSale","homeType": "SINGLE_FAMILY","beds": 3,"baths": 2,"sqft": 1840,"lotSize": 5227,"yearBuilt": 1998,"latitude": 30.25,"longitude": -97.75,"daysOnZillow": 12,"zestimate": 640000,"rentZestimate": 3200,"brokerName": "Example Brokerage","listingAgent": "Example Agent","agentPhone": "(555) 123-4567","imgSrc": "https://photos.zillowstatic.com/fp/example.jpg","scrapedAt": "2026-07-27T00:00:00.000Z"}
How it works
The Actor accepts one Zillow search source per run, applies the selected listing mode and filters, and collects listings into the default dataset. It can also recurse through map subdivisions to continue past Zillow's 800-result cap. The dataset schema includes an overview table with link, price, and sqft columns for quick review.
Under the hood, the Actor reads Zillow search state, translates it into search requests, and writes a flat listing record for each returned property.
Pricing
This Actor uses Pay per event plus Apify platform usage. The primary event is Listing returned, which is charged for each listing pushed to the default dataset. The run also includes an Actor start event, which is charged once per run and scales with RAM.
Open the live Pricing tab on the Actor page for the current rates.
Example in words: if a run returns one hundred listings, the listing-returned charge is applied one hundred times, and the actor-start charge is applied once.
Use with AI agents (MCP)
This Actor is available through Apify MCP as a tool that turns Zillow search inputs into structured listing records. It is useful when an agent needs to query a city, ZIP set, saved search URL, or map bounds and then reason over returned listing fields.
Exact Actor identity: khadinakbar/zillow-search-scraper
Tool description: search Zillow inventory by one input source per run, optionally narrow by price, beds, baths, home type, and result cap, then read back structured listings from the dataset.
Find active for-sale homes in Austin, TX with at least 3 beds, cap the run at 25 listings, and return the dataset rows so I can sort by price and days on Zillow.
Output interpretation:
zpidis the stable join key for follow-up workflows.urlpoints to the public Zillow detail page.scrapedAtshows when the record was collected.listingStatus,beds,baths,sqft,price,zestimate, anddaysOnZilloware the most direct fields for screening and ranking.
Provenance and scope:
- Records come from Zillow search results.
searchUrlreplays the Zillow search encoded in the URL.mapBoundsis the most precise input for agent-driven geospatial searches.zipCodesruns each ZIP independently.
Pagination and cost guidance:
- Zillow search pages are capped at 800 listings per search.
- The Actor can subdivide the search area to continue past that cap.
maxResultssets a hard stop on returned listings.- Costs scale with returned listing records, so tighter filters and a smaller cap keep runs focused.
Apify API example
JavaScript example with APIFY_TOKEN and dataset readback:
const { ApifyClient } = require("apify-client");(async () => {const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const run = await client.actor("khadinakbar/zillow-search-scraper").call({searchQuery: "Austin, TX",listingType: "forSale",maxResults: 10,minBeds: 2,});const dataset = client.dataset(run.defaultDatasetId);const { items } = await dataset.listItems({ format: "json" });console.log(items);})();
Best results and outcome guidance
Start with the narrowest search source that matches your workflow:
- use
searchUrlwhen Zillow filters are already configured, - use
zipCodesfor market-by-market scans, - use
searchQueryfor region-level discovery, - use
mapBoundswhen you already have exact boundaries.
For cleaner result sets, combine one search source with a single listingType, a realistic maxResults, and only the filters that matter for the task. If you are preparing a downstream enrichment workflow, keep zpid and url in the handoff set.
Continue the workflow
- Then use Zillow Agents Scraper — Profiles & Leads to continue from Zillow Search Scraper — ZIP, City & Map Bounds discovery into enrichment data for the selected records.
- Then use Zumper Scraper — Apartments & Houses for Rent Data to extend Zillow Search Scraper — ZIP, City & Map Bounds with a neighboring property research source when the brief calls for Zumper data.
Design note
I found that the dataset schema requires zpid, url, listingType, and scrapedAt, which makes each returned record easy to join, trace, and reuse in downstream workflows.
FAQ
When should I use searchUrl instead of searchQuery?
Use searchUrl when you already built the Zillow search in the UI and want the Actor to replay the exact search state. Use searchQuery for simple city, state, or neighborhood lookup.
Can I execution multiple ZIP codes in one job?
Yes. Put the ZIP codes in the zipCodes array, and the Actor processes each ZIP independently.
What should I use for exact geospatial targeting?
Use mapBounds with north, south, east, and west values when you have a defined bounding box or polygon workflow.
How do I hand results to a detail enrichment step?
Use zpid and url from the dataset, then connect selected listings to Zillow Scraper - Property Listings & Agent Leads.
What listing modes are available?
The Actor supports forSale, forRent, and sold.
Responsible use
Use Zillow Search Scraper in line with Zillow's terms, applicable data protection rules, and any real-estate licensing or MLS obligations relevant to your workflow. Treat returned records as sourced from Zillow search results and review any downstream use, redistribution, or enrichment against your own compliance requirements.