Zillow Sold Homes Scraper - Recent Sales Data avatar

Zillow Sold Homes Scraper - Recent Sales Data

Pricing

Pay per usage

Go to Apify Store
Zillow Sold Homes Scraper - Recent Sales Data

Zillow Sold Homes Scraper - Recent Sales Data

Scrape recently sold homes from Zillow. Get sale prices, dates, property details, price history, and agent info. Perfect for real estate investors, market analysis, and comps research.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ricardo Akiyoshi

Ricardo Akiyoshi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

Scrape recently sold homes from Zillow for any US location. Extract sale prices, sale dates, original list prices, price history, property details, Zestimates, tax assessments, agent info, photos, and more.

Built for real estate investors, analysts, appraisers, flippers, and agents who need reliable comparable sales (comps) data at scale.

Features

  • Sold-home focus -- dedicated to recently sold properties with sale-specific fields: sold price, sold date, original list price, price change amount/percentage, days on market
  • Any US location -- search by city, state, zip code, or neighborhood
  • Flexible time frames -- 1 day, 7 days, 14 days, 30 days, 90 days, 6 months, 12 months, 24 months, or 36 months
  • Advanced filters -- min/max price, min/max bedrooms, sort by newest/price
  • 6 extraction strategies with fallbacks:
    1. __NEXT_DATA__ (Next.js server-rendered JSON)
    2. Inline script / searchQueryState parsing
    3. hdpApolloPreloadedData (Apollo GraphQL cache)
    4. JSON-LD structured data (schema.org)
    5. Open Graph / Twitter meta tags
    6. CSS selector DOM parsing
  • Rich data output -- sold price, sold date, original list price, price change, days on market, beds, baths, sqft, lot size, year built, price/sqft, Zestimate, tax assessment, HOA fees, full description, lat/long, price history array, agent info, photos, MLS ID
  • Smart pagination -- automatically follows Zillow's multi-page results
  • Deduplication -- tracks seen ZPIDs and addresses to avoid duplicates
  • Anti-bot handling -- 12 rotating User-Agents with full browser-like headers, CAPTCHA detection, graceful shutdown
  • Proxy support -- residential proxies strongly recommended for Zillow
  • Pay-per-event pricing -- $0.005 per sold listing scraped

Use Cases

Real Estate Investors

Pull recently sold homes in target neighborhoods to identify undervalued markets. Compare sold prices against Zestimates to find areas where homes sell below estimated value. Track price-per-square-foot trends across zip codes.

Comparable Sales (Comp) Analysis

Build a comps dataset for property valuation by pulling all recent sales in a target area. Compare sold prices against original list prices to understand negotiation patterns and market dynamics.

House Flippers

Find properties that sold significantly below market value. Identify quick flips by tracking sold price vs. original list price and days on market. Spot distressed sales and below-market transactions.

Real Estate Agents

Research recent sales in your farm area. Generate CMA (Comparative Market Analysis) reports with accurate sold data. Track competitor listings and their sold prices.

Market Trend Analysis

Monitor sold home data over time to track median prices, average days on market, and price-to-list ratios. Build time series datasets for seasonal analysis and market cycle forecasting.

Appraisal Support

Collect structured comparable sales data with sold prices, sale dates, property characteristics, and location data. Export to spreadsheets for side-by-side comparison in appraisal reports.

Input

FieldTypeDefaultDescription
locationStringlos-angeles-caCity, zip code, or neighborhood slug (required)
minPriceInteger0Minimum sold price filter
maxPriceInteger0Maximum sold price filter
minBedsInteger0Minimum bedrooms
maxBedsInteger0Maximum bedrooms
daysOnZillowString90Time frame: 1, 7, 14, 30, 90, 6m, 12m, 24m, 36m
sortByStringnewestSort order: newest, price_low, price_high
maxResultsInteger100Maximum listings to scrape (0 = unlimited)
proxyConfigurationObject(none)Apify proxy settings (residential recommended)

Location Format

Use Zillow's URL-friendly slug format:

LocationSlug
Los Angeles, CAlos-angeles-ca
New York, NYnew-york-ny
Miami, FLmiami-fl
Chicago, ILchicago-il
Austin, TXaustin-tx
Phoenix, AZphoenix-az
Denver, COdenver-co
Atlanta, GAatlanta-ga
ZIP code 9021090210
ZIP code 3310133101

Input Examples

Recently sold homes in Los Angeles (last 90 days)

{
"location": "los-angeles-ca",
"daysOnZillow": "90",
"maxResults": 200
}

Sold houses in Miami over $500K (last 30 days)

{
"location": "miami-fl",
"daysOnZillow": "30",
"minPrice": 500000,
"maxResults": 300
}

Sold homes in Manhattan (last 7 days, price high to low)

{
"location": "manhattan-new-york-ny",
"daysOnZillow": "7",
"sortBy": "price_high",
"maxResults": 100
}

Comp analysis: 3-5 bed homes in ZIP 30309 under $800K

{
"location": "30309",
"daysOnZillow": "6m",
"minBeds": 3,
"maxBeds": 5,
"maxPrice": 800000,
"maxResults": 500,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Full 3 years of sales in Austin with residential proxies

{
"location": "austin-tx",
"daysOnZillow": "36m",
"maxResults": 1000,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output

Each sold listing is saved to the default dataset with comprehensive property and sale data.

Example Output

{
"zpid": "20485713",
"address": "123 Main St, Los Angeles, CA 90001",
"streetAddress": "123 Main St",
"city": "Los Angeles",
"state": "CA",
"zipcode": "90001",
"soldPrice": 825000,
"soldPriceFormatted": "$825,000",
"soldDate": "2026-02-15",
"originalListPrice": 849000,
"originalListPriceFormatted": "$849,000",
"priceChange": -24000,
"priceChangeFormatted": "-$24,000",
"priceChangePercent": -2.83,
"daysOnMarket": 42,
"bedrooms": 3,
"bathrooms": 2,
"sqft": 1650,
"lotSize": "5,500 sqft",
"yearBuilt": 1972,
"homeType": "SINGLE_FAMILY",
"pricePerSqft": 500,
"zestimate": 835000,
"zestimateFormatted": "$835,000",
"taxAssessment": 720000,
"taxAssessmentFormatted": "$720,000",
"monthlyHoaFee": null,
"description": "Beautifully renovated 3-bedroom home in prime location with modern kitchen, hardwood floors throughout, and a spacious backyard.",
"latitude": 34.0522,
"longitude": -118.2437,
"priceHistory": [
{
"date": "2026-02-15",
"price": 825000,
"priceFormatted": "$825,000",
"event": "Sold",
"source": "MLS"
},
{
"date": "2026-01-20",
"price": 849000,
"priceFormatted": "$849,000",
"event": "Price change",
"source": "MLS"
},
{
"date": "2026-01-04",
"price": 875000,
"priceFormatted": "$875,000",
"event": "Listed for sale",
"source": "MLS"
}
],
"agentName": "Jane Smith",
"agentPhone": "(310) 555-0123",
"brokerName": "Keller Williams Realty",
"brokerPhone": "(310) 555-0100",
"mlsId": "SR26012345",
"photos": [
"https://photos.zillowstatic.com/fp/abc123-p_e.jpg",
"https://photos.zillowstatic.com/fp/def456-p_e.jpg",
"https://photos.zillowstatic.com/fp/ghi789-p_e.jpg"
],
"url": "https://www.zillow.com/homedetails/123-Main-St-Los-Angeles-CA-90001/20485713_zpid/",
"scrapedAt": "2026-03-02T12:00:00.000Z",
"source": "zillow_sold",
"searchPage": 1,
"extractionStrategy": "__NEXT_DATA__"
}

Performance Tips

  1. Always use residential proxies -- Zillow aggressively blocks datacenter IPs. Use the RESIDENTIAL proxy group for reliable results.
  2. Start with a small test -- run with maxResults: 10 first to verify your location and proxy setup work.
  3. Shorter time frames are faster -- 7 days returns fewer pages than 36m.
  4. Use filters to narrow scope -- price ranges and bedroom counts reduce total pages to crawl.
  5. Expect ~40 results per page -- Zillow caps search results at about 25 pages (1,000 results) per search.
  6. Sort by newest for freshest data -- the default newest sort gives you the most recent sales first.

Anti-Bot Protection

Zillow uses sophisticated anti-bot measures including IP fingerprinting, browser fingerprint detection, rate limiting, CAPTCHA challenges, and JavaScript challenge pages.

This actor handles these by:

  • Rotating 12 realistic User-Agent strings per request
  • Sending full browser-like headers (Sec-Ch-Ua, Sec-Fetch-*, DNT, etc.)
  • Limiting to 12 requests/minute by default
  • Detecting CAPTCHA/block pages and stopping gracefully to preserve collected data
  • Supporting Apify residential proxy rotation
  • Adding pagination delays to mimic human browsing patterns

If you see "CAPTCHA or anti-bot block detected" in logs, all data collected before the block is saved. Switch to residential proxies for reliable results.

Pricing (Pay Per Event)

This actor uses Apify's pay-per-event pricing model. You are charged $0.005 per sold listing successfully scraped and saved to the dataset.

VolumeCostPrice Per Listing
100 listings$0.50$0.005
500 listings$2.50$0.005
1,000 listings$5.00$0.005
5,000 listings$25.00$0.005

Platform usage costs (compute + proxy) are additional.

This actor is provided as a technical tool for data collection. Users are responsible for ensuring their use complies with Zillow's Terms of Use and all applicable laws. This tool is intended for personal research, market analysis, comparable sales analysis, and educational purposes.

Integration — Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("sovereigntaylor/zillow-sold-scraper").call(run_input={
"searchTerm": "zillow sold",
"maxResults": 50
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item.get('title', item.get('name', 'N/A'))}")

Integration — JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('sovereigntaylor/zillow-sold-scraper').call({
searchTerm: 'zillow sold',
maxResults: 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => console.log(item.title || item.name || 'N/A'));