# Zillow Recently Sold Scraper: Sale Comps & Prices (`themineworks/zillow-recently-sold`) Actor

Scrape Zillow recently sold properties by city or zip for CMA reports, investment analysis, and market research. Filter by sold date range (30 to 365 days), price, beds, and property type. Extract sold price, date, address, beds, baths, sqft, Zestimate and listing URL.

- **URL**: https://apify.com/themineworks/zillow-recently-sold.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 zillow properties

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🏡 Zillow Recently Sold Scraper: Comps & CMA Data

> **Part of the Real Estate MCP.** This actor's data is also available to AI agents through our [Real Estate MCP server](https://apify.com/themineworks/real-estate-mcp) — eight listing, sales and rental-market tools behind one endpoint. No result, no charge.

> ⚡ Part of a 69-scraper suite trusted by 450+ developers across 8,000+ runs · >99% run success · no login, no cookies, no ban risk.

> 💸 You're only charged for delivered results. Empty searches, failed pages and duplicate listings are never billed.

### Overview

Zillow Recently Sold Scraper extracts recently-sold homes from Zillow.com by city, ZIP code, or neighborhood. Every record carries sold price, sold date, address, beds, baths, square footage, Zestimate, coordinates, and the listing URL. No login and no API key.

It is purpose-built for comparable sales (comps) and CMA reports: give it a location and a sold-date window, and get hundreds of sold homes in one run.

✅ No login required | ✅ No API key | ✅ Pay only for results | ✅ MCP-ready for AI agents

Reliability: blocked, empty, or failed regions are never charged. You only pay for sold-home records actually delivered to your dataset.

### Features

Sold-date windows. Filter by 30, 90, 180, or 365 days since sale.
Sold price and date on every record. Populated fields for real comps, not just active listings.
Full property fields. Beds, baths, sqft, Zestimate, coordinates, lot size, photo URL.
HTTP-only and lean. Runs on 512 MB with residential proxies for reliable coverage.
Free failure handling. Blocked or empty regions are never charged.

### How it works

Zillow's official APIs are deprecated and partner-gated, and none give you the full public list of recently-sold homes with sold price and date. This actor queries Zillow's own search backend directly with a recently-sold filter, resolving any location string to a region automatically.

You choose the location, the sold-date window, and the volume. The actor pages through results, extracts each sold home into a flat JSON record, and pushes to the dataset. Field availability depends on what Zillow publishes for each sold home.

### 🧾 Input configuration

```json
{
  "location": "Austin, TX",
  "maxItems": 100,
  "soldInLast": 90,
  "minPrice": 400000,
  "maxPrice": 900000,
  "minBeds": 3,
  "propertyType": "SINGLE_FAMILY"
}
```

### 📤 Output format

```json
{
  "zpid": "29488283",
  "address": "4501 Red River St, Austin, TX 78751",
  "addressLine1": "4501 Red River St",
  "city": "Austin",
  "state": "TX",
  "zipCode": "78751",
  "price": 712000,
  "priceLabel": "$712,000",
  "beds": 3,
  "baths": 2,
  "sqft": 1680,
  "lotSizeSqft": 6534,
  "propertyType": "SINGLE_FAMILY",
  "statusType": "RECENTLY_SOLD",
  "zestimate": 731400,
  "rentZestimate": 3200,
  "latitude": 30.30542,
  "longitude": -97.72519,
  "detailUrl": "https://www.zillow.com/homedetails/4501-Red-River-St-Austin-TX-78751/29488283_zpid/",
  "imgSrc": "https://photos.zillowstatic.com/fp/abc123-p_e.jpg",
  "soldDate": "2026-05-14",
  "soldPrice": 712000
}
```

Every sold-home record carries these fields:

| Field | Description |
| --- | --- |
| 🏷️ `soldPrice` / 🗓️ `soldDate` | Sold price and date |
| 🏠 `address` / `city` / `state` / `zipCode` | Full location fields |
| 💰 `price` / `priceLabel` | Numeric and formatted price |
| 🛏️ `beds` / 🛁 `baths` | Bedroom and bathroom counts |
| 📏 `sqft` / 🌳 `lotSizeSqft` | Interior and lot square footage |
| 🏡 `propertyType` | Property type (e.g. SINGLE\_FAMILY) |
| 🔖 `statusType` | Listing status (RECENTLY\_SOLD) |
| 💵 `zestimate` / 🏦 `rentZestimate` | Zillow's own estimates |
| 📍 `latitude` / `longitude` | Coordinates |
| 📷 `imgSrc` | Primary photo URL |
| 🔗 `detailUrl` | Listing detail URL |
| 🆔 `zpid` | Zillow property ID |

### 💼 Common use cases

**Comparative market analysis (CMA)**
Pull sold comps in a ZIP to value a subject property.
Filter by beds, baths, sqft, and property type to match the subject profile.

**Appraisal support**
Assemble recent, filtered sales for valuation workflows.
Feed straight into appraiser software or a spreadsheet.

**Investor underwriting**
Model deals against actual clearing prices, not asking prices.
Chain into rent Zestimates to model gross yields.

**Market trend reports**
Chart sold-price movement by neighborhood and property type.
Feed dashboards with median sold and days-to-close by ZIP.

### 🚀 Getting started

1. Create a free Apify account and open the actor.
2. Enter a location (e.g. `Austin, TX` or `78701`).
3. Set `soldInLast` (30, 90, 180, or 365 days) and optionally `minPrice`, `maxPrice`, `minBeds`, `minBaths`, `propertyType`.
4. Click Start and let the actor page through results.
5. Download your data as JSON, CSV, or Excel, or pull via API or MCP.

### FAQ

**Do I need a Zillow account or API key?**
No. The scraper requires no login, no cookies, and no API key. You only need an Apify account to run it.

**How do I control the sold-date window?**
Set `soldInLast` to 30, 90, 180, or 365 (days). Only homes sold within that window are returned.

**What is the difference from the Zillow Search Scraper?**
This actor filters to recently-sold homes and adds `soldPrice` and `soldDate`, so you get comps rather than active for-sale listings.

**How much does the Zillow Recently Sold Scraper cost?**
Pay per result: $1 per 1,000 results ($0.001 per property), with no free tier. You only pay for properties actually returned.

**Can I enrich comps with full history?**
Yes. Feed the `detailUrl` or `zpid` into the Zillow Property Details Scraper for full price and tax history, schools, and more.

**Can I use it inside an AI agent?**
Yes. It is exposed as an MCP tool. See below.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/zillow-recently-sold
```

Or call it programmatically with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/zillow-recently-sold').call({
  location: 'Austin, TX',
  maxItems: 100,
  soldInLast: 90,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### 🛠️ Related real estate actors

Chain sold data with the rest of the wedge:

- **[Zillow Search Scraper](https://apify.com/themineworks/zillow-search-scraper)**: for-sale listings by location.
- **[Zillow Property Details](https://apify.com/themineworks/zillow-property-details)**: full detail pages by URL or ZPID.
- **[Zillow Rental Listings](https://apify.com/themineworks/zillow-rental-listings)**: for-rent listings by location.
- **[Redfin Scraper](https://apify.com/themineworks/redfin-scraper)**: Redfin for-sale and sold listings.
- **[Realtor.com Scraper](https://apify.com/themineworks/realtor-scraper)**: Realtor.com listings with agent data.
- **[99acres Scraper](https://apify.com/themineworks/99acres-scraper)**: India rent, buy, PG, and commercial listings.

Typical flow: zillow-recently-sold drives your comps, zillow-property-details fills in full history and schools, zillow-rental-listings and rent Zestimates model gross yield.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.

# Actor input Schema

## `location` (type: `string`):

City, zip code, or neighborhood (e.g. 'Austin, TX', '78701', 'Palo Alto, CA').

## `maxItems` (type: `integer`):

Maximum number of recently sold properties to return.

## `soldInLast` (type: `integer`):

Only return homes sold within the last N days. Common values: 30, 90, 180, 365.

## `minPrice` (type: `integer`):

Minimum sale price in USD.

## `maxPrice` (type: `integer`):

Maximum sale price in USD.

## `minBeds` (type: `integer`):

Minimum number of bedrooms.

## `minBaths` (type: `integer`):

Minimum number of bathrooms.

## `propertyType` (type: `string`):

Filter by property type: SINGLE\_FAMILY, CONDO, TOWNHOUSE, MULTI\_FAMILY, LAND. Leave blank for all.

## Actor input object example

```json
{
  "location": "Austin, TX",
  "maxItems": 100,
  "soldInLast": 90,
  "propertyType": ""
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Austin, TX",
    "maxItems": 100,
    "soldInLast": 90
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/zillow-recently-sold").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Austin, TX",
    "maxItems": 100,
    "soldInLast": 90,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/zillow-recently-sold").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Austin, TX",
  "maxItems": 100,
  "soldInLast": 90
}' |
apify call themineworks/zillow-recently-sold --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=themineworks/zillow-recently-sold",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/fiWuQcfObGWn1dm4J/builds/t2cgQyLvHITNbGqHz/openapi.json
