# Zillow Deal Finder (`gaurangghinaiya/zillow-deal-finder`) Actor

Finds Zillow listings priced below Zillow's own Zestimate. Rich filters (price, beds, baths, sqft, year built, property type). Unofficial, not affiliated with Zillow.

- **URL**: https://apify.com/gaurangghinaiya/zillow-deal-finder.md
- **Developed by:** [Gaurang Ghinaiya](https://apify.com/gaurangghinaiya) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

Search any US city, town, or ZIP code and get back Zillow listings **ranked by how far below (or above) Zillow's own Zestimate they are priced**, not just a raw property dump. Filter by price, beds, baths, square feet, year built, and property type. Runs on the Apify platform: proxy rotation, scheduling, an API, and CSV/JSON/Excel export included, no scraping code of your own.

### What does Zillow Deal Finder do?

This Actor takes one or more locations (city, "City, ST", or ZIP) plus optional filters, searches [Zillow](https://www.zillow.com), and returns one structured record per listing. Every listing carries Zillow's own Zestimate alongside the asking price, and a computed `dealScore`: the percent the price sits below (negative) or above (positive) that Zestimate, ranked from best deal to worst within each search. No separate valuation model is needed, Zillow already publishes its own estimate for almost every listing; this Actor just reads it and does the comparison for you.

### Why use Zillow Deal Finder?

- **Buyers and investors** can scan a market and jump straight to listings priced meaningfully under Zillow's own valuation instead of manually comparing dozens of tabs.
- **Agents and flippers** can monitor a farm area for underpriced inventory as it lists.
- **Analysts** get price, Zestimate, and full property detail in one structured feed for market research.
- **Builders** can call this through the Apify API on a schedule to power an alert ("notify me when a 3BR in 78747 lists more than 10% under Zestimate"), with a per-run spend cap so cost never surprises you.

### How to use Zillow Deal Finder

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Enter one or more **Locations**: a city ("Austin, TX"), a city slug, or a 5-digit ZIP code.
3. Optionally set price range, minimum beds/baths/square feet, minimum year built, and property type.
4. Set **Max results per location** to cap how many listings are pulled per location.
5. Click **Start**. Results appear in the **Dataset** tab as they are scored.
6. Sort or filter the dataset by `dealScore` to find the best deals first, or export as JSON, CSV, or Excel.

### Input

| Field | Type | Description |
|---|---|---|
| `locations` | array of strings | City, "City, ST", or ZIP code. Each is searched independently. |
| `maxResults` | integer | Upper bound on listings returned per location. Default 50. |
| `priceMin` / `priceMax` | integer | Price range in USD. |
| `bedsMin` / `bathsMin` | integer | Minimum bedrooms / bathrooms. |
| `sqftMin` | integer | Minimum interior square footage. |
| `yearBuiltMin` | integer | Earliest construction year. |
| `propertyTypes` | array | Restrict to house, condo, townhouse, multi-family, apartment, manufactured, or lot/land. Leave empty for all types. |
| `proxyConfiguration` | object | Proxy settings. Datacenter is sufficient; the search endpoint carries no anti-bot challenge. |

See the **Input** tab for the full schema with validation and defaults.

### Output

Every item is one listing, enriched with its computed deal score:

```json
{
  "zpid": "464100001",
  "address": "412 Maple Ridge Dr, Austin, TX 78747",
  "price": 289000,
  "zestimate": 342000,
  "dealScore": -15.5,
  "rank": 1,
  "beds": 3,
  "baths": 2,
  "sqft": 1780,
  "homeStatus": "House for sale",
  "listingUrl": "https://www.zillow.com/homedetails/412-Maple-Ridge-Dr-Austin-TX-78747/464100001_zpid/",
  "scrapedAt": "2026-08-24T18:10:01.249Z"
}
```

This example is a real item captured from a live run. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the **Dataset** tab.

### Data fields

| Field | Description |
|---|---|
| zpid | Zillow's internal property ID. |
| address, addressStreet, addressCity, addressState, addressZipcode | Full and parsed address. |
| price, zestimate | Listed price and Zillow's own valuation estimate, both in USD. |
| dealScore | Percent the price sits below (negative) or above (positive) the Zestimate. Null when this listing has no Zestimate available. |
| rank | Rank within this search, 1 is the best deal. Null when unscored. |
| beds, baths, sqft | Bedroom count, bathroom count, interior square footage. |
| latitude, longitude | Coordinates. |
| homeStatus | Listing status text (for example "House for sale"). |
| brokerName | Listing broker, when available. |
| imageUrl | Primary listing photo. |
| listingUrl, scrapedAt | Link to the original listing and the scrape timestamp. |

### Pricing: how much does it cost to use Zillow Deal Finder?

This Actor uses Apify's pay-per-event pricing: you pay only for what you use. Platform and proxy usage is included in the event price below, no separate usage bill.

- Result: **$0.0015 per listing** ($1.50 per 1,000)

**Worked example.** In a real cloud test, scraping 15 filtered listings took 12 seconds of compute and about 26 KB of datacenter proxy transfer, an actual measured platform cost of roughly $0.00007 per listing, well within the price above. A run of 1,000 listings costs **$1.50**, flat, no additional platform or proxy charges.

For comparison, the most-used Zillow scraper on Apify Store prices its default tier at $2.00-2.30 per 1,000 results. This Actor is priced under that.

Set **Max results per location** and your run's spend cap to control cost precisely, and the Actor stops cleanly once your limit is reached so you are never surprised by a bill.

### Tips and advanced options

- Zillow ships a Zestimate on nearly every listing on the first page of a search, but coverage drops noticeably on later pages of the same search. Listings without one still come back with `dealScore` and `rank` set to null rather than being dropped, so a large `maxResults` pull will have a higher proportion of unscored listings than a small one.
- `rank` is computed once across a location's entire result set (all pages combined), not per page, rank 1 is always the single best deal for that location and run.
- Narrower filters (a specific price band, beds/baths minimums) tend to return a more comparable, more useful set of deal scores than an unfiltered city-wide pull.
- Search results only, not individual listing detail pages, cover this Actor's fields (photos beyond the primary image, full description, sale history are not included in v1).

### FAQ and support

**Is this affiliated with Zillow?** No. This Actor is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. "Zillow" and "Zestimate" are trademarks of Zillow Group, Inc.

**How is dealScore calculated?** `(price - zestimate) / zestimate * 100`, using Zillow's own Zestimate for that listing at the time it was scraped. A more negative value means a larger discount to Zillow's own valuation.

**What data does this collect?** Only publicly visible listing data shown on Zillow's own search results pages: price, address, specification, and Zillow's own valuation estimate. No private, account, or contact information is collected.

**Is scraping Zillow allowed?** Use of this Actor must comply with Zillow's Terms of Service and all applicable laws, including data protection regulations such as GDPR and CCPA. This Actor is intended for legitimate research, market analysis, and personal buying or selling decisions. Please respect rate limits and avoid overloading Zillow's infrastructure; you are responsible for how you use the data you collect.

**Need something custom?** If you need additional fields, larger-scale city-wide crawls, or a related scraper, reach out through the Issues tab or the Actor's contact option in Apify Store.

# Actor input Schema

## `locations` (type: `array`):

City ('Austin, TX'), city slug ('austin-tx'), or 5-digit ZIP code to search. Each location is searched independently.

## `maxResults` (type: `integer`):

Upper bound on listings returned per location.

## `priceMin` (type: `integer`):

Minimum listing price in USD.

## `priceMax` (type: `integer`):

Maximum listing price in USD.

## `bedsMin` (type: `integer`):

Minimum number of bedrooms.

## `bathsMin` (type: `integer`):

Minimum number of bathrooms.

## `sqftMin` (type: `integer`):

Minimum interior square footage.

## `yearBuiltMin` (type: `integer`):

Earliest construction year to include.

## `propertyTypes` (type: `array`):

Restrict to specific property types. Leave empty for all types.

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter is cheapest and sufficient; Zillow search pages carry no anti-bot challenge.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "locations": [
        "Austin, TX"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gaurangghinaiya/zillow-deal-finder").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 = {
    "locations": ["Austin, TX"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("gaurangghinaiya/zillow-deal-finder").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call gaurangghinaiya/zillow-deal-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gaurangghinaiya/zillow-deal-finder"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CmB8ccdw9EBUDAeSj/builds/gdTxBiKQePqwnNoQC/openapi.json
