Zillow Scraper avatar

Zillow Scraper

Pricing

from $0.60 / 1,000 results

Go to Apify Store
Zillow Scraper

Zillow Scraper

Scrape Zillow listings by city, ZIP, or neighborhood. Pull homes for sale, for rent, and recently sold with prices, beds, baths, photos, and Zestimates, plus full detail: price and tax history, schools, lot facts, and agent contacts. No 1,000-result cap. Export to CSV, JSON, or Excel for comps.

Pricing

from $0.60 / 1,000 results

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

1

Monthly active users

10 days ago

Last modified

Share

Turn any U.S. city, ZIP, or neighborhood into a clean feed of Zillow listings. For sale, for rent, or recently sold, with prices, beds, baths, photos, valuations, and full property detail in one structured record per home.

Type a location. Get back every listing that matches, with the fields you actually use for comps, lead lists, and market analysis. No copy-pasting from Zillow tabs, no building search URLs by hand, no hitting the 1,000-result wall.

How it works

How it works

  1. You enter a location. A city like Austin, TX, a ZIP like 90210, a neighborhood, county, or state. Add price, bed, bath, or home-type filters if you want.
  2. The scraper pulls every matching listing. Buy, rent, or sold, across the whole area, not just the first page Zillow shows you.
  3. You get one structured record per home, ready to export to CSV or Excel, drop into a sheet, or feed into a model or dashboard.

Turn on Fetch Details and each home is enriched with its full property profile: price history, tax history, assigned schools, lot and construction facts, HOA, agent name and phone, and more.

✨ Why teams choose this over other Zillow scrapers

Building search URLs by hand just to scrape a city? Hitting the 1,000-result cap on a big metro? Stuck with raw listing dumps that are missing the fields you actually need?

  • πŸ™οΈ Just type a location. A city, ZIP, neighborhood, or address. No building a Zillow URL, no copying map coordinates, no learning a query format. Most scrapers make you do that work yourself.
  • ♾️ No 1,000-result limit. Pull every for-sale, rental, or sold home in an entire metro, not the capped page Zillow shows in the browser. Big markets come back complete.
  • 🏠 Buy, rent, and sold in one place. One Actor handles all three. Switch with a single setting instead of wiring up three different tools.
  • πŸ“œ The full property story, not just the card. Turn on detail enrichment and get price history, tax history, assigned schools, lot and construction facts, HOA, and Zestimate. The data behind the listing, not just the headline.
  • πŸ“‡ Agent contact details. Pull the listing agent's name, phone, and brokerage for outreach and lead lists, captured straight from the listing.
  • πŸ“Έ Whole photo galleries, ready to use. Full-resolution image URLs for every photo, not a single thumbnail and not raw keys you have to assemble.
  • πŸ“‰ Spot price drops and deals. Every listing carries its price change and the date it changed, so you can surface reductions the moment they happen.
  • πŸ’° Pay per result, not per minute. Proxies included, no compute fees. You pay for homes delivered, and nothing else.
  • 🧹 One clean record per home. Normalized JSON with a flat, predictable shape. It drops straight into a spreadsheet, a CRM, or an AI workflow.

🎯 What you can do with Zillow data

TeamWhat they build
Real estate investorsPull every sold home in a ZIP with price and tax history to run comps and spot undervalued deals
Agents and brokeragesBuild for-sale and for-rent lead lists by city with the listing agent's name and phone attached
Proptech and data productsPower a property search app or AVM with normalized buy, rent, and sold listings at scale
Market analystsTrack price drops, days on market, and inventory across neighborhoods over time
Mortgage and lendingEnrich applications with tax history, valuations, and assigned-school data for a property
Rental operatorsAggregate every rental in a metro with rent, beds, baths, and per-unit pricing for buildings
ResearchersCompare home values, year built, and lot size across cities and ZIP codes

πŸ“₯ Input parameters

You only need a location and how many homes you want. Everything else is optional.

Core

FieldTypeRequiredDescription
locationstringYes*A city, ZIP, neighborhood, county, state, or address. Example: Austin, TX.
locationsarray of stringsNoSearch several locations in one run. Overrides location when set.
operationstringNobuy, rent, or sold. Default buy.
maxItemsintegerYesMaximum number of listings to return. Default 100.
fetchDetailsbooleanNoEnrich each listing with full detail-page data (price/tax history, schools, lot facts, agent). Default false.

* Provide either location or locations.

Filters

FieldTypeDescription
minPrice / maxPriceintegerPrice range. Per month for rentals. 0 for any.
minBeds / maxBedsintegerBedroom range. 0 for any.
minBathsnumberMinimum bathrooms.
homeTypesarrayRestrict to houses, townhomes, multifamily, condos, land, apartments, manufactured. Empty for all.
sortBystringnewest, relevance, lowPrice, highPrice, bedrooms, bathrooms, sqft, lotSize, yearBuilt.
locationTypestringForce a match type (city, zipcode, neighborhood, county, state) when a name is ambiguous. Auto-detects by default.
{
"location": "Austin, TX",
"operation": "buy",
"maxItems": 500,
"minPrice": 300000,
"maxPrice": 600000,
"minBeds": 3,
"homeTypes": ["houses"],
"sortBy": "newest"
}

πŸ“Š Output data

One record per home. The base record covers everything on the listing card and more.

{
"zpid": "29489604",
"url": "https://www.zillow.com/homedetails/5800-Breezewood-Dr-Austin-TX-78745/29489604_zpid/",
"operation": "buy",
"statusText": "Active",
"homeStatus": "FOR_SALE",
"homeType": "SINGLE_FAMILY",
"price": 350000,
"currency": "USD",
"pricePerSqft": 299.15,
"beds": 3,
"baths": 2,
"livingArea": 1170,
"lotAreaValue": 6298.776,
"lotAreaUnit": "sqft",
"address": { "streetAddress": "5800 Breezewood Dr", "city": "Austin", "state": "TX", "zipcode": "78745" },
"latitude": 30.204609,
"longitude": -97.77888,
"daysOnZillow": 1,
"zestimate": 352800,
"rentZestimate": 2450,
"taxAssessedValue": 328033,
"priceChange": -17000,
"datePriceChanged": "2026-06-18",
"listingTypes": ["FSBA"],
"brokerName": "Jorgenson Real Estate",
"photos": ["https://photos.zillowstatic.com/fp/00b223faef21b41ee54f5db0bcf4a1ce-p_e.jpg"]
}

With fetchDetails: true, each record gains a details object with the full property profile:

{
"zpid": "29489604",
"price": 350000,
"details": {
"description": "Clean, move-in-ready home in South Austin...",
"yearBuilt": 1971,
"lotSize": "6,298 sqft",
"parcelNumber": "04160911220000",
"taxAnnualAmount": 5793,
"monthlyHoaFee": 0,
"stories": 1,
"heating": ["Central", "Electric"],
"cooling": ["Central Air", "Electric"],
"appliances": ["Dishwasher", "Gas Range", "Microwave", "Oven"],
"agentName": "Mike Kelly",
"agentPhone": "(512) 439-3698",
"brokerName": "Jorgenson Real Estate",
"mlsId": "4443738",
"priceHistory": [
{ "date": "2026-06-25", "event": "Listed for sale", "price": 350000, "pricePerSqft": 299 }
],
"taxHistory": [
{ "year": "2025", "taxPaid": 4744.89, "value": 328033, "valueIncreaseRate": -0.14 }
],
"schools": [
{ "name": "Pleasant Hill Elementary School", "rating": 3, "grades": "PK-5", "distance": 0.6 }
]
}
}

πŸ—‚οΈ Data fields

Listing

CategoryFields
Identityzpid, url, operation, statusType, statusText, homeStatus
Priceprice, priceText, currency, pricePerSqft, priceChange, datePriceChanged
Sizebeds, baths, livingArea, lotAreaValue, lotAreaUnit, homeType
Locationaddress (street, city, state, ZIP), latitude, longitude
MarketdaysOnZillow, zestimate, rentZestimate, taxAssessedValue, dateSold
FlagslistingTypes, isFeatured, isZillowOwned, isNonOwnerOccupied, isPremierBuilder, hasVideo, has3DModel
MediaimgSrc, photos
BrokerbrokerName
Rentalsunit, isBuilding, buildingName, minBaseRent, maxBaseRent, unitCount, units

Details (with fetchDetails: true)

CategoryFields
Descriptiondescription, yearBuilt, lotSize, stories, parcelNumber
Factsheating, cooling, appliances, flooring, hasGarage, parkingCapacity, pricePerSqft
Moneyzestimate, rentZestimate, monthlyHoaFee, propertyTaxRate, taxAnnualAmount, lastSoldPrice
HistorypriceHistory, taxHistory
Schoolsschools (name, rating, grades, distance, link)
AgentagentName, agentPhone, agentEmail, brokerName, mlsId, mlsName

πŸš€ Examples

Get the newest homes for sale in a city

{ "location": "Austin, TX", "operation": "buy", "maxItems": 200 }

Pull every recently sold home in a ZIP for comps

{ "location": "78745", "operation": "sold", "maxItems": 1000, "fetchDetails": true }

Build a rental lead list under a budget

{ "location": "Denver, CO", "operation": "rent", "maxPrice": 2500, "minBeds": 2, "maxItems": 500 }

Find 4-bed houses in a price band with full detail

{ "location": "Phoenix, AZ", "operation": "buy", "minBeds": 4, "minPrice": 400000, "maxPrice": 700000, "homeTypes": ["houses"], "fetchDetails": true, "maxItems": 300 }

Scrape several metros in one run, cheapest first

{ "locations": ["Miami, FL", "Tampa, FL", "Orlando, FL"], "operation": "buy", "sortBy": "lowPrice", "maxItems": 1500 }

πŸ€– Copy to your AI assistant

Paste this block into Claude, ChatGPT, or Cursor to give it full context about this scraper:

You have access to the Zillow Scraper on Apify: silentflow/zillow-scraper
It scrapes U.S. residential listings (for sale, for rent, recently sold) from Zillow by location.
Input schema:
- location (string): a city, ZIP, neighborhood, county, state, or address. Required unless locations is set.
- locations (array of strings): scrape several locations in one run; overrides location.
- operation (string): "buy" | "rent" | "sold". Default "buy".
- maxItems (integer, required): max listings to return. Default 100. No hard cap from the source.
- minPrice, maxPrice (integer): price range (per month for rent). 0 = any.
- minBeds, maxBeds (integer): bedroom range. 0 = any.
- minBaths (number): minimum bathrooms.
- homeTypes (array): "houses","townhomes","multifamily","condos","land","apartments","manufactured".
- sortBy (string): "newest","relevance","lowPrice","highPrice","bedrooms","bathrooms","sqft","lotSize","yearBuilt".
- locationType (string): force "city"|"zipcode"|"neighborhood"|"county"|"state"; auto-detects by default.
- fetchDetails (boolean, default false): enrich each listing with price/tax history, schools, lot facts, HOA, and agent contact.
Output per listing (flat JSON): zpid, url, operation, statusText, homeStatus, homeType, price, currency,
pricePerSqft, beds, baths, livingArea, lotAreaValue, lotAreaUnit, address{streetAddress,city,state,zipcode},
latitude, longitude, daysOnZillow, zestimate, rentZestimate, taxAssessedValue, priceChange, datePriceChanged,
listingTypes, brokerName, photos[], and (for rentals) buildingName/minBaseRent/maxBaseRent/units.
With fetchDetails, a details object adds description, yearBuilt, lotSize, parcelNumber, heating/cooling/appliances,
agentName/agentPhone/agentEmail/brokerName/mlsId, priceHistory[], taxHistory[], schools[].
Pay per result. Proxies included. Use apify-client for Python or JS.

πŸ’» Integrations

Build a comps list for an investor (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/zillow-scraper").call(run_input={
"location": "78745",
"operation": "sold",
"maxItems": 1000,
"fetchDetails": True,
})
comps = []
for home in client.dataset(run["defaultDatasetId"]).iterate_items():
comps.append({
"address": home["address"]["streetAddress"],
"soldPrice": home.get("price"),
"soldDate": home.get("dateSold"),
"perSqft": home.get("pricePerSqft"),
"beds": home.get("beds"),
})
comps.sort(key=lambda c: c["soldPrice"] or 0)
print(f"{len(comps)} comparable sales")

Build an agent lead list (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('silentflow/zillow-scraper').call({
location: 'Denver, CO',
operation: 'buy',
fetchDetails: true,
maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const leads = items
.map(h => h.details && ({
agent: h.details.agentName,
phone: h.details.agentPhone,
brokerage: h.details.brokerName,
listing: h.url,
}))
.filter(Boolean);
console.log(`${leads.length} agent leads ready for outreach`);

Export straight to CSV (Apify CLI)

apify call silentflow/zillow-scraper \
--input '{"location":"Phoenix, AZ","operation":"rent","maxItems":1000}' \
--output-dataset \
| apify datasets get-items --format csv > phoenix-rentals.csv

πŸ“ˆ Performance

MetricValue
MarketsAll U.S. cities, ZIPs, neighborhoods, counties, states
OperationsFor sale, for rent, recently sold
Result capNone from the source. Set maxItems to whatever you need.
CoverageWhole-metro, not the capped browser page
Detail enrichmentOptional, per listing
ProxiesResidential, included
ReliabilityHigh

πŸ’Ύ Data export

Every run produces a dataset you can download from the Apify console as JSON, CSV, Excel, XML, or RSS, or pull programmatically:

https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN

Schedule runs, trigger them by API, or connect the output to Make, Zapier, Google Sheets, or your own database.

πŸ’‘ Tips for best results

  1. Use a clear location. Austin, TX beats Austin. Add the state to avoid matching the wrong city. For a single property, paste the full address.
  2. Filter at the source. Set minPrice, minBeds, and homeTypes in the input instead of pulling everything and filtering later. You get exactly what you need and nothing extra.
  3. Turn on fetchDetails only when you need depth. The base listing already has price, beds, baths, photos, and valuations. Add detail when you want price history, schools, lot facts, or agent contact.
  4. Run several markets at once. Pass a locations array to cover a whole region in one run instead of starting one job per city.
  5. For sold comps, always enable fetchDetails. Zillow hides the sold price on the result card, so detail enrichment fills it in along with the full sale and tax history.

❓ FAQ

What does this scraper extract? Residential listings from Zillow for sale, for rent, and recently sold, with price, beds, baths, square footage, lot size, location, photos, Zestimate, days on market, and listing status. With detail enrichment it also returns description, price and tax history, assigned schools, construction and lot facts, HOA, and the listing agent's contact.

How do I search? Do I need a Zillow URL? No URL needed. Type a city, ZIP, neighborhood, county, state, or address. The scraper resolves it for you.

Can I scrape several locations in one run? Yes. Use the locations array. Each location is searched and the results are combined and de-duplicated.

Is there a limit on how many homes I can get? No hard cap from the source. The scraper covers a whole market, not the capped page the browser shows. Set maxItems to your target.

Do I need a Zillow account or login? No. The scraper reads publicly available listing data. No login, no API key.

How fresh is the data? Each run reads Zillow live, so you get the current listings and prices at the moment you run it.

Why is the price empty on some sold homes? Zillow does not show the sold price on the search card. Turn on fetchDetails and the sold price is filled in from the property's price history.

Can I get the listing agent's contact? Yes, with fetchDetails. You get the agent's name, phone, and brokerage. Email is included when the listing exposes it publicly.

What about apartment buildings with many units? Buildings return as one record with the building name, availability, and per-unit pricing (beds and rent) instead of a single price.

This Actor extracts publicly available data from Zillow. It does not bypass any login, paywall, or CAPTCHA. Users are responsible for complying with Zillow's terms of service and applicable laws in their jurisdiction. The data returned is informational; verify accuracy for regulated use cases such as lending, appraisal, or compliance.

πŸ“¬ Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the Actor page

Response time: usually under 24 hours.

Check out our other scrapers: silentflow on Apify