# Zillow Deal Finder: AI Cap Rate, Cash Flow & Price-Cut Scoring (`rich_minds/zillow-deal-finder-ai`) Actor

First 25 deals free. No start fee. A Zillow deal finder for real estate investors: pay only for listings that cash-flow at your terms — cap rate, cash flow, reduced prices and FSBO leads, scored with an AI memo. Free demo on any plan; live search runs Zillow Search Scraper on your own Apify account.

- **URL**: https://apify.com/rich\_minds/zillow-deal-finder-ai.md
- **Developed by:** [Rich Minds](https://apify.com/rich_minds) (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

from $4.00 / 1,000 qualified deal (rules only)s

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Zillow Deal Finder: AI Cap Rate, Cash Flow & Price-Cut Scoring

**New cash-flowing Zillow deals in your inbox every morning, scored 0–100 with AI memos.**

⚡ First **25 deals free** · 💵 **$0.004** per qualified deal, no start fee · 🤖 **$0.015** with the AI deal memo · 🔑 **No API key on paid Apify plans** — free plan: your own Gemini / Groq key · ⏱️ ~3 min for a 200-listing search (estimate)

![One row per qualified Zillow deal — price, cash flow, cap rate, discount to Zestimate, deal score, motivated-seller signals and a one-line pitch](https://api.apify.com/v2/key-value-stores/n1xotgiYWcKLYYgsX/records/shortlist.svg)

> **Try it in 30 seconds.** Click **Try it** — 6 sample listings, free. Type a city or ZIP into **Cities or ZIP
> codes** for a live search (on a plan that runs Store Actors): the first **25 qualified deals** are free.
> → [What a run costs](#-pricing--what-a-run-really-costs) · [What the AI adds](#-what-the-ai-tier-adds) · [Run it weekly](#-run-it-weekly)

### ⚡ At a glance

| | |
|---|---|
| **What you get** | ranked Zillow deals: cap rate, cash flow, 1% rule, discount to Zestimate, flip math, price-cut / FSBO signals, who to call, (AI) a deal memo |
| **You provide** | a city or ZIP (`"Memphis, TN"`, `"44109"`) — or a Zillow search URL |
| **Output** | JSON / CSV / Excel dataset, best deal first, plus `OUTPUT` with the funnel and a per-ZIP `MARKET_REPORT` |
| **Typical run** | 200 listings scanned → ≈ 30 qualified in ~3 minutes (estimate) |
| **Cost of that run** | $0.58 math only (AI off: $0.46 source + 30 × $0.004) · ≈ $0.97 with the AI memo (30 × $0.015 + ≈ $0.06 tokens) |
| **Free tier** | first 25 qualified deals per account |
| **Keys / setup** | none on paid plans; free plan: `list` / `dataset` mode and your own AI key (`llmProvider: byok`) |
| **Works with** | Schedules, e-mail, Slack, webhooks, Google Sheets, Make / n8n / Zapier, MCP & AI agents |

### 🎯 What this Actor does

For real estate investors: it runs **Zillow Search Scraper** (`maxcopell/zillow-scraper`) on your account, does the
investment math on every listing and delivers only the deals that pass your rules:

- **The spreadsheet, already done** — mortgage, expenses, cash flow, NOI, cap rate, cash-on-cash and the 1% rule at *your* terms.
- **Below-market proof** — discount to the Zestimate and $/sqft vs the ZIP median of every listing in the run.
- **Motivated sellers flagged** — price cuts, days on Zillow, FSBO, foreclosure, bank-owned, auction, "as-is" quoted.
- **A deal score 0–100 and grade A/B/C** for your strategy, with the reasons — and who to call on every row.
- **AI deal memo** — red flags, upsides, condition and a fit score against your brief, every number checked.

#### 🏠 Real estate deal finder for rentals and flips

`listingGoal`: **rental** weighs cap rate, cash flow and the 1% rule; **flip** weighs discount to Zestimate, $/sqft under
the ZIP median and motivation. No rent Zestimate? Rent comps (below), else `rentFallbackPct` (0.8 = 0.8% of the price a
month); `rentSource` says which rent was used.

#### 🔨 Flip math — ARV, rehab and the 70% rule

`arv` (sold comps, else Zestimate, else ZIP $/sqft × sqft), `rehabEstimate` from the condition (turnkey $0, light-rehab
$15, heavy-rehab $40, unknown $10 per sqft), `maxAllowableOffer` (ARV × 0.70 − rehab) and `flipProfit` after 3% closing
and 8% selling costs — planning figures in the **Flip math** view.

#### 🏘️ Rent comps and sold comps — numbers you can defend

`rentComps`: a listing without a rent Zestimate gets the median rent of its ZIP's rentals with the same bedroom count
(`zipRentComp`, `rentSource: zip_rent_comps`). `soldComps`: `arv` from homes sold there in the last 6 months
(`soldCompPricePerSqft`, `arvSource: sold_comps`). One capped search per ZIP on your account, ≈ $0.05 a ZIP, at most
`maxCompZips` (5); list rows may carry their own `zipRentComp` / `soldCompPricePerSqft`.

#### 🔎 Motivated seller leads and FSBO leads

`motivatedSellerOnly`, `minPriceCutPct` and `minDaysOnZillow` keep sellers likely to negotiate. `contactRoute` (e-mail →
phone → Zillow's contact form) leads the **Outreach** view; `fetchDetails` adds the agent and real tax / HOA to the
shortlist (`maxDetailFetches`), `writeOfferNote` an AI note to the agent or owner plus, on hot deals, a one-page letter
of intent (PDF, `offerLetterUrl`) with blanks for your price — in the AI price.

#### 👀 Watchlist — alerts on the listings you follow

`sourceMode: watchlist` + `watchlist` (zpids or listing URLs): each run re-checks them (≈ $0.0036 a listing) and
charges only a price or status change (`watchChange`, `previousPrice`, `previousStatus`).

### 🚀 How to use it

1. **Click `Try it`** — the free demo scores 6 sample Cleveland / Columbus listings; it works as is.
2. **Type your market** into **Cities or ZIP codes** (`Memphis, TN`, `44109`) — that switches the demo to the live
   search. Keep `enableAi` on — your first 25 deals show the memo free.
3. **Press Start** — deals land best-first in the **Shortlist**, **Deal math**, **Flip math**, **Motivated sellers** and **Outreach** views.
4. **Make it your daily deal alert** — the first live run's status offers it: Save as a new task → Schedule, with
   `notifyEmail`. `OUTPUT.scheduleInput` holds that run's exact input; only new deals and new price cuts are charged.

![Outreach view — how to reach each seller, the broker, the seller's own words and the red flags to check before you call](https://api.apify.com/v2/key-value-stores/n1xotgiYWcKLYYgsX/records/outreach.svg)

📚 **Learn more:** [Step-by-step tutorial — how to find cash-flowing Zillow deals with this Actor](https://api.apify.com/v2/key-value-stores/n1xotgiYWcKLYYgsX/records/tutorial.html)

### 🆚 Why this instead of a Zillow Scraper?

| | [Zillow Search Scraper (`maxcopell/zillow-scraper`)](https://apify.com/maxcopell/zillow-scraper) | [Zillow Scraper — Cash Flow (`trakk/zillow-scraper`)](https://apify.com/trakk/zillow-scraper) | **Zillow Deal Finder** |
|---|---|---|---|
| **Price** | $0.0023 per row · 633 users / 30 days | $0.003 per row + $0.003 per excluded property · 22 users | $0.004 per qualified deal ($0.015 AI), 25 free |
| **What you pay for** | every row, rentals and duplicates too | every row, even excluded properties | only deals that pass — junk costs **$0** |
| **Same 100 deals, all in** | ≈ 500 raw rows = $1.15, math still yours | ≈ $1.50 for 500 analysed rows, no memo | **$1.55 math only** (100 × $0.004 + $1.15 source) — trakk's price with more math · **$2.65 with the AI memo** |
| **Deal math** | raw fields | cash-flow scenarios | cap rate, cash flow, CoC, 1% rule, flip math, ZIP comps, price cuts |
| **Repeat runs** | same listings again | same listings again | only new deals, new price cuts, watchlist changes |

**The deal finders next to it in the Store search for "zillow deal finder"** (FREE-tier prices, Store, 2026-09-26 —
that search's median is $0.00395 per result; $0.004 here sits on it):

| | [`sian.agency/distressed-deal-finder`](https://apify.com/sian.agency/distressed-deal-finder) | [`optirefine/real-estate-deal-finder`](https://apify.com/optirefine/real-estate-deal-finder) | [`seibs.co/house-flipper-leads`](https://apify.com/seibs.co/house-flipper-leads) | **This Actor** |
|---|---|---|---|---|
| **Price** | $0.036 per row + $0.05 start | $0.10 per row + $0.02 start | $0.005 per row, + $0.005 detail, + $0.005 high score | $0.004 per qualified deal, no start fee |
| **Charged for** | every foreclosure / auction row | every listing returned | every listing, more for good ones | only deals that pass your rules |
| **Cash flow at your terms** | rent estimate only | no | no | yes — cap rate, CoC, 1% rule |
| **Flip math** | comps | distress score only | ARV, max offer | ARV (sold comps on request), 70% max offer, profit |

#### 💸 Cheaper than a PropStream seat — a PropStream alternative and DealCheck alternative

| | PropStream | DealCheck | Mashvisor | This Actor, weekly |
|---|---|---|---|---|
| **Monthly cost** | $99 / seat (Essentials) | $20 / seat (Pro; Plus $10) | $49.99 / seat (billed yearly) | ≈ $2.70 (1 search × 200 listings a week, ≈ 10 new AI deals) |
| **Finds the deals** | list building | no — you type each property | market data | yes — every listing of your search, scored |

Seat prices: list prices on [PropStream](https://www.propstream.com/pricing), [DealCheck](https://dealcheck.io/pricing/)
and [Mashvisor](https://www.mashvisor.com/pricing), checked 2026-09-26.

### 💵 Pricing — what a run really costs

Pay per result: **one event per qualified deal, nothing else.**

| Event | When it is charged | Price |
|---|---|---|
| `free-tier` | your first 25 qualified deals, any mode | **$0.00** |
| `qualified-deal-basic` | AI off — Zillow fields, deal and flip math, signals, rule score and memo | **$0.004** |
| `qualified-deal-ai` | AI on — plus AI memo, red flags, upsides, condition, seller phrases, fit score | **$0.015** |

**Never charged here:** the Zillow search (billed by Zillow Search Scraper on your account), rentals, rows without a
price, deals under `minScore` or failing a filter, repeats without a price drop, unchanged watchlist listings.

**One free tier, one AI reserve:** when the AI is unavailable, rule-scored rows use your free deals down to 5 kept for
the AI — the status says "N of your 25 free deals left, 5 kept for the AI".

**How that compares** — $0.004 is 1.48× one raw Zillow row (median $0.0027), but one qualified deal replaces 5 raw rows.

**Worked example** (estimate) — one Cleveland search, 200 listings: $0.46 source on your account → ≈ 30 qualified with
AI: 30 × $0.015 + ≈ $0.06 tokens → **≈ $0.97 total, $0.032 per deal** ($0.58 with AI off; ≈ $0.60 on your first run).

**AI tier, all in:** ≈ $0.017 per deal ($0.015 here + ≈ $0.002 tokens through Apify's model access, or your own key) — about 4× the basic price.

### 🤖 What the AI tier adds

The FSBO deal from the demo, AI **off** — the math, the signals and the rule memo:

```json
{"address": "1207 Example St, Cleveland, OH 44109", "price": 89900, "monthlyCashFlow": 428, "capRatePct": 11.7,
 "discountToZestimatePct": 14.0, "score": 95, "dealGrade": "A", "motivationSignals": ["stale", "fsbo", "below_zestimate"],
 "aiSummary": "Cap rate 11.7%, cash flow +$428/mo at 25% down, cash-on-cash 20.4%, 14.0% below Zestimate. Estimate from the listing and your assumptions, not financial advice.",
 "sellerPhrases": ["Investor special", "sold as-is", "cash only", "needs TLC"]}
```

AI **on** ($0.015, default model `anthropic/claude-haiku-4.5`, sample for the demo listing) against the brief
*"Cash-flowing 3+ bedroom single-family homes under $200k in Ohio; light rehab is fine, no condos with high HOA."*:

```json
{"fitScore": 88, "score": 92, "assessedBy": "ai", "condition": "light-rehab",
 "scoreReasons": ["homeType SINGLE_FAMILY with 3 bedrooms at $89,900", "monthlyCashFlow +$428 at 25% down", "isFSBO true"],
 "aiSummary": "3-bed single-family FSBO at $89,900, 14.0% below its $104,500 Zestimate, cash-flowing +$428/mo (cap rate 11.7%). On Zillow 96 days and marketed as-is for cash buyers — expect light rehab.",
 "redFlags": ["Sold as-is, cash only — financing may not be accepted", "Only 9 photos on the listing"],
 "upsides": ["20.4% cash-on-cash", "$/sqft 13.3% under the ZIP 44109 median", "Owner-listed: negotiate directly"],
 "dealPitch": "FSBO 3-bed in Cleveland 44109 at $89,900, +$428/mo at 25% down — owner open to cash offers"}
```

The AI reads the listing like an analyst — the 10 minutes per listing you spend before calling.

### ⚙️ Input

Start with `locations`, `minScore`, `listingGoal`, your deal criteria, `enableAi`, `maxDiscoveryChargeUsd` and
`notifyEmail`; everything else has a sensible default.

<details><summary>The fields a buyer decides on, with their defaults</summary>

| Field | Default | What it does |
|---|---|---|
| `locations` | — | Cities, counties or ZIPs, one per line; the Actor builds the Zillow search |
| `sourceMode` | `actor` | Live search, a Zillow dataset, pasted rows or a watchlist (the form starts on the demo). With nothing to search — `{}` — the free demo runs, nothing charged |
| `investorGoal` | — | Your brief — the AI scores every listing against it |
| `minScore` | `60` | The field that decides what you pay: below it = not delivered, not charged |
| `listingGoal` | `rental` | `rental`, `flip` or `any` |
| `minCapRatePct`, `minMonthlyCashFlow`, `minCashOnCashPct`, `minDiscountToZestimatePct`, `minPrice`, `maxPrice`, `minBedrooms`, `homeTypes`, `requireOnePercentRule` | — | Hard deal criteria, free filters |
| `downPaymentPct`, `interestRatePct`, `loanTermYears` | `25`, `7`, `30` | Financing; plus `closingCostPct` 3, `propertyTaxRatePct` 1.1, `insuranceUsdYear` 1500, `vacancyPct` 5, `maintenancePct` 8, `managementPct` 8, `monthlyHoaUsd` 0 |
| `rentFallbackPct` | — | Rent as % of price for listings without a rent Zestimate |
| `rentComps`, `soldComps`, `maxCompZips` | `false`, `false`, `5` | ZIP rent comps and sold-comp ARV (≈ $0.05 a ZIP on your account) |
| `enableAi` | `true` | AI deal memo on/off |
| `maxDiscoveryChargeUsd` | `0.5` | Caps what the Zillow search may cost you — the same cap for an API call |
| `maxQualified` | `100` | Hard cap on output (and spend) |
| `dedupeAcrossRuns`, `alertOnPriceCut` | `true`, `true` | Only new deals; a known deal returns after a price cut |
| `notifyEmail` | — | E-mails the digest after every run with new deals |

The rest — `searchUrls`, `watchlist`, `targetFlags`, `suppressionList`, webhooks (`webhookHeaders`), `dedupeStoreName`,
model, `datasetId`, `resultsLimit` — is explained in the **Input** tab.

</details>

<details><summary>Flag names for <code>targetFlags</code></summary>

`price_cut`, `stale`, `fsbo`, `foreclosure`, `bank_owned`, `auction`, `below_zestimate`, `below_zip_median`,
`positive_cash_flow`, `negative_cash_flow`, `one_percent_rule`, `no_rent_estimate`, `high_hoa`, `seller_language`
(`priceCut` works too); an unknown name stops the run with the valid ones.

</details>

#### List-mode rows

`sourceMode: list` works on any plan and is the free API trial; a row in `itemsList` uses Zillow Search Scraper's format.

<details><summary>The fields a pasted row needs, and what each one switches on</summary>

| Field | Needed? | What it switches on |
|---|---|---|
| `zpid` or `propertyUrl` | required | identity, `url`, `dedupeKey` |
| `listingPrice.amount` (or `price`) | required | every figure — a row without it is skipped free and the status names it |
| `rentZestimate` | optional | cash flow, cap rate, cash-on-cash, 1% rule (else `rentFallbackPct`) |
| `zestimate` | optional | discount to Zestimate, `arv` |
| `livingArea`, `listingAddress.zipCode` | optional | $/sqft, ZIP comps, rehab estimate |
| `taxAssessedValue`, `daysOnZillow`, `priceChange`, `listingType.*`, `broker.*` | optional | tax, stale / price-cut / FSBO signals, contact |
| `zipRentComp`, `soldCompPricePerSqft` | optional | your own comps: rent when there is no `rentZestimate`, sold-comp `arv` |

</details>

### 📤 Output

One dataset item per qualified deal — the demo's foreclosure duplex, shortened:

```json
{"url": "https://www.zillow.com/homedetails/2255-Demo-Rd-Cleveland-OH-44109/900000103_zpid/", "zpid": "900000103",
 "contactRoute": "(216) 555-0178", "contactChannel": "phone", "price": 165000, "rentSource": "rentZestimate",
 "monthlyCashFlow": 748, "capRatePct": 11.43, "arv": 188000, "maxAllowableOffer": 113100,
 "motivationSignals": ["foreclosure", "below_zestimate", "seller_language"], "score": 97, "dedupeKey": "zpid:900000103"}
```

#### Output fields

<details><summary>Every field of a row</summary>

| Field | Description |
|---|---|
| `itemId`, `url`, `zpid`, `dedupeKey` | Identity — stable across runs |
| `contactRoute`, `contactChannel` | Who to reach: agent e-mail → phone → Zillow contact form (`url`); `email`, `phone`, `contact_form` |
| `address`, `street`, `city`, `state`, `zipCode`, `latitude`, `longitude` | Location |
| `status`, `homeType`, `price`, `currency`, `bedrooms`, `bathrooms`, `livingAreaSqft`, `lotArea`, `yearBuilt` | The listing |
| `zestimate`, `rentZestimate`, `taxAssessedValue`, `daysOnZillow` | Zillow's estimates |
| `priceChange`, `priceChangedAt`, `priceCutPct`, `isFSBO`, `isForeclosure`, `isBankOwned`, `isAuction` | Seller signals |
| `brokerName`, `brokerPhone`, `agentName`, `agentPhone`, `agentEmail`, `mainImage` | As published (agent fields from the detail step) |
| `pricePerSqft`, `zipMedianPricePerSqft`, `belowZipMedianPct`, `discountToZestimatePct` | Comps |
| `monthlyRentUsed`, `rentSource`, `zipRentComp`, `soldCompPricePerSqft`, `monthlyMortgage`, `monthlyExpenses`, `monthlyCashFlow`, `noiAnnual`, `capRatePct`, `cashOnCashPct`, `grossRentYieldPct`, `meetsOnePercentRule`, `assumptions` | Deal math and the terms behind it |
| `arv`, `arvSource`, `rehabEstimate`, `maxAllowableOffer`, `flipProfit` | Flip math |
| `motivationSignals`, `flags`, `targetFlagsMatched` | Rule findings |
| `watchChange`, `previousPrice`, `previousStatus` | What changed since the last delivery (watchlist, price-cut re-alert) |
| `ruleScore`, `fitScore`, `score`, `dealGrade`, `label`, `scoreReasons` | Scores — `score` = 60% rule + 40% AI `fitScore` when assessed; `url` and `score` are the fields to map |
| `aiSummary`, `redFlags`, `upsides`, `condition`, `sellerPhrases`, `offerNote`, `offerLetterUrl` | Memo (AI, else the rule fallback; `offerNote` only with AI + `writeOfferNote`, `offerLetterUrl` on its hot deals) |
| `dealPitch` | One-line pitch — AI when on, rule-based on hot / warm deals when off |
| `isNewPriceCut`, `detailsFetched`, `assessedBy`, `aiModel` | Run facts (`assessedBy`: rules, ai, ai-fallback) |
| `chargedEvent`, `billedAs`, `sourceActor`, `sourceSearchUrl`, `scrapedAt`, `qualifiedAt` | Billing and provenance |

</details>

**Upsert key for a CRM or Sheet:** `dedupeKey` (`zpid:<Zillow property id>`) — one property is one row however many
runs find it; `itemId` is its short hash.

Next to `OUTPUT` (funnel, charges, `aiCoverage`, `comps`, errors): a **`DIGEST`** ("vs last run: qualified 41 → 55"),
a client-ready **`REPORT`** page (`OUTPUT.reportUrl`) and a per-ZIP **`MARKET_REPORT`**.

⭐ **Found it useful? A review on the Store helps others find it** — it takes a minute on the Actor's page.

### 🔁 Run it weekly

1. **Save as a new task → Schedule** (daily or weekly) with `notifyEmail` — the first live run's status offers it and
   `OUTPUT.scheduleInput` holds its exact input; every run with new deals e-mails you the digest and the trend.
2. Keep `dedupeAcrossRuns` and `alertOnPriceCut` on — the next run delivers only **new deals and price drops**
   (`isNewPriceCut`). The memory is kept per search (places, URLs, `listingGoal`): rewording `investorGoal` keeps it; a
   changed search starts a new one and the status says so. One `dedupeStoreName` per client keeps their lists apart.
3. Add `slackWebhookUrl`, or push rows to Google Sheets / n8n / Make — [integration recipes](docs/marketing/kit/integrations.md).

Weekly cost is the new deals only: 3 cities × 200 listings = $1.38 source + ≈ 20 new deals × $0.015 ≈ **$1.68 a week**.

#### 🎯 Try it for your niche

| Niche | What it looks for | Start |
|---|---|---|
| Buy-and-hold | cash flow ≥ $150/mo, 3+ beds, Cleveland | the buy-and-hold input below |
| Wholesale / flip | 10%+ under Zestimate, motivated sellers, Akron | the wholesale / flip input below |

<details><summary>Buy-and-hold input</summary>

```json
{"locations": ["Cleveland, OH"], "listingGoal": "rental", "minMonthlyCashFlow": 150, "minBedrooms": 3,
 "minScore": 60, "enableAi": true, "maxDiscoveryChargeUsd": 0.5}
```

</details>

<details><summary>Wholesale / flip input</summary>

```json
{"locations": ["Akron, OH"], "listingGoal": "flip", "minDiscountToZestimatePct": 10,
 "motivatedSellerOnly": true, "minScore": 55, "writeOfferNote": true, "enableAi": true, "maxDiscoveryChargeUsd": 0.5}
```

</details>

### 🔌 Integrations, automation and API

- **Webhook** — `webhookUrl` POSTs `{"event": "deal.qualified", "deal": {…}, "runId": "…"}` per deal, or with
  `webhookBatchSize` > 1 `{"event": "deals.qualified", "deals": [{…}, …], "runId": "…"}`; 429 / 5xx retried once, never
  fails the run.
- **Google Sheets / Slack / HubSpot** — the **Integrations** tab; the Shortlist view maps onto a sheet.
- **AI agents / MCP** — plain typed inputs. **First call = the free trial:** `{"sourceMode": "list", "itemsList": [...]}` scores rows you send, no source run.

<details><summary>Python</summary>

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("rich_minds/zillow-deal-finder-ai").call(
    run_input={
        "sourceMode": "list",  # free trial on rows you send; use "locations" for a live search
        "itemsList": [{"zpid": "1", "propertyUrl": "https://www.zillow.com/homedetails/1_zpid/",
                       "listingPrice": {"amount": 120000}, "rentZestimate": 1500, "zestimate": 135000}],
        "maxDiscoveryChargeUsd": 0.5,  # spend cap on your account once you search live
    },
    timeout_secs=3600,  # sized for the AI path with your own key — see "How long does a run take?"
    # build="0.3",  # pin the build your pipeline was tested with (Changelog below)
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["address"], item["score"], item["monthlyCashFlow"], item["contactRoute"])
```

</details>

<details><summary>JavaScript</summary>

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('rich_minds/zillow-deal-finder-ai').call({
    locations: ['Cleveland, OH'],
    minScore: 60,
    maxDiscoveryChargeUsd: 0.5, // spend cap for the Zillow search on your account
}, { timeout: 3600 /* , build: '0.3' — pin the build your pipeline was tested with */ });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.address, i.score, i.monthlyCashFlow]));
```

</details>

**Use it from Claude, ChatGPT or any MCP client:**

```json
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=rich_minds/zillow-deal-finder-ai"}}}
```

Then ask: *"Run zillow-deal-finder-ai for Memphis, TN (maxDiscoveryChargeUsd 0.5) and list the A-grade deals."*

**Minimal agent input:** `{"locations": ["Memphis, TN"], "investorGoal": "…", "minScore": 60, "maxQualified": 25, "maxDiscoveryChargeUsd": 0.5}`

#### Run outcomes — what your integration sees

<details><summary>Every outcome: run status, dataset, <code>OUTPUT</code> field, charged?, what to do</summary>

| Outcome | Run status | Dataset | `OUTPUT` | Charged? | What to do |
|---|---|---|---|---|---|
| Free demo | SUCCEEDED | sample deals | `qualified`, `demo` | no | type your city or ZIP |
| Success | SUCCEEDED | qualified deals, best first | funnel, `chargedEvents`, `aiCoverage` | per qualified deal | — |
| Nothing matched / no watchlist change | SUCCEEDED | empty | `qualified: 0` | no | loosen `minScore` / criteria |
| Demo text still in place | SUCCEEDED | empty | `inputNeeded` | no | replace the field the status names |
| Invalid input | FAILED | empty | — | no | fix the field the status names |
| Source failed | FAILED | empty | `sourceError` | no | follow the reason (plan → List-mode rows, timeout) |
| AI unavailable | SUCCEEDED | rule-scored deals | `aiError`, `freeAiReserve` | free while your free deals last, then basic | `llmProvider: byok` with your own key |

</details>

### 👥 Who is it for?

| You are… | You run it to… | Start with |
|---|---|---|
| **Buy-and-hold / BRRRR investor** | see which listings cash-flow — an investment property finder | `locations` + `minMonthlyCashFlow` |
| **Wholesaler / flipper** | find motivated sellers and a max offer under the 70% rule | `listingGoal: flip`, `motivatedSellerOnly` |
| **Investor-friendly agent** | send clients a deal list and a ZIP market report | a schedule + `notifyEmail`, `REPORT`, `MARKET_REPORT` |
| **Proptech / AI agent** | feed typed, scored rows to a CRM or an agent | the API / MCP call, `webhookUrl` |

### 🧠 How the AI works

- **Grounded.** The model sees one listing, the math and your terms; a sentence with a number not in the row is dropped,
  seller phrases must be verbatim.
- **Your brief.** `fitScore` rates the listing against `investorGoal`; `score` blends it 40/60 with the rule score.
- **Model.** `anthropic/claude-haiku-4.5` through Apify's model access, or `llmProvider: "byok"`; only listings that
  passed every free filter reach it, and a failed call keeps the rule score (`assessedBy: ai-fallback`).

### 🔒 Data, compliance and limits

- Only what Zillow publishes; broker and agent contacts as published. No login, no skip tracing.
- The math is an **estimate** — **not financial advice**. ZIP medians need ≥ 3 listings of the ZIP.
- Keep your use within Zillow's terms and applicable law (GDPR, CCPA).

### ❓ FAQ

**How much will one run cost me?** One city × 200 listings: $0.46 for Zillow Search Scraper on your account, then $0.015
per qualified deal with AI (≈ 30 → $0.45) plus ≈ $0.06 tokens — ≈ $0.97 ($0.58 with AI off); the first 25 deals are free.

**What will my first real search cost?** At most 200 listings × $0.0023 = $0.46, capped by `maxDiscoveryChargeUsd` ($0.50); the first 25 qualified deals are free.

**Can I get only Zillow price reduced listings?** Yes — `minPriceCutPct` or `targetFlags: ["price_cut"]`; scheduled runs re-alert on a new cut.

**How long does a run take?** Demo: seconds. 200 listings: ~1–2 min of Zillow search, then ≈ 2–4 s per AI deal, 8 at a
time (estimate; `OUTPUT.timing`). Own key: paced to the provider's hint after a rate limit (`aiPaceSecs`); a used-up
quota is detected within ≈ 20 s ("the key's quota looks used up") and the deals keep their rule score. Own-key
throughput is not measured yet. Worst case ≈ 10 min per 100 deals — pass `timeoutSecs` 1800 per 100 deals.

**Which Apify plan do I need?** Any plan runs the demo. Live search, watchlist and built-in AI need a plan that runs Store Actors; free plan: `dataset` / `list` and `llmProvider: "byok"`.

**What happens if nothing matches my filters?** The run succeeds with 0 rows and charges nothing.

**Will I be charged for the same deal twice?** Only if its price dropped since (`alertOnPriceCut`, `isNewPriceCut`).

**Is the data public / is this legal?** Public Zillow listing data only, no login; use it within Zillow's terms.

<details><summary>More questions — Zillow Search Scraper, calculators, your own list, PropStream / DealCheck</summary>

**Is this a Zillow Search Scraper?** It runs **Zillow Search Scraper** (`maxcopell/zillow-scraper`) on your account and
adds the analysis; you can also score a dataset from it, Zillow ZIP Code Search Scraper or Zillow Detail Scraper.

**Is it a cap rate calculator and cash flow calculator for every listing?** Yes — every row carries mortgage, expenses, NOI, cap rate, cash flow and cash-on-cash, with the terms in `assumptions`.

**Can it do rental property analysis on my own list?** Yes — `sourceMode: list` with the rows in [List-mode rows](#list-mode-rows), or `dataset`.

**How is this different from PropStream or DealCheck?** DealCheck analyses one property you type in; here every listing of your search is analysed — see the seat table above.

</details>

### 🧩 More Actors from the same developer

Not quite your use case? The same pay-per-qualified-result model, closest to this Actor's buyers first:

- **[Booking Hotel Finder & Scraper](https://apify.com/rich_minds/booking-hotel-finder-ai)** — hotel price drop alert, hotel price tracker, hotel price comparison

### 🆘 Support

Something missing or wrong? Open an issue on the Actor's page — requests from buyers are shipped first.

### 📝 Changelog

What changed in each build, newest first — pin one with `build` in the API call.

- **0.3.2** (2026-09-27) — Store card says "no start fee"; runs and prices unchanged.
- **0.3.1** (2026-09-26) — `rentComps` (ZIP rent comps) and `soldComps` (sold-comp ARV); offer letter PDF (`offerLetterUrl`) on hot AI deals; memory kept per search, not per `investorGoal` wording; a used-up own key stops the AI within ≈ 20 s; the first live run offers a schedule (`OUTPUT.scheduleInput`); tidier status texts.
- **0.2.1** (2026-09-26) — shorter AI-on status (cause in the status, the fix in `nextSteps`), own-key calls paced to the provider's retry hint, one free tier with a 5-deal AI reserve said as "N of your 25 free deals left", rows without a price named in the status.
- **0.2** (2026-09-26) — city / ZIP input (`locations`), watchlist mode, flip math, `contactRoute`, `rentFallbackPct`, `MARKET_REPORT`; AI tier $0.015; **breaking:** `dealScore` → `score`, `aiScore` → `fitScore` (the twins are gone).
- **0.1.1** (2026-09-26) — first public release with deal math, ZIP comps, motivated-seller signals and the AI deal memo.
- **0.1** (2026-09-26) — initial release.

# Actor input Schema

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

One place per line, e.g. <code>Memphis, TN</code> or <code>44109</code> — the Actor builds the Zillow search with your price and bedroom filters. The live search runs Zillow Search Scraper on your Apify plan (no Store Actors on your plan? use a Zillow dataset). The free demo does not search it; typing a place starts the live search.

## `sourceMode` (type: `string`):

<b>Search Zillow live</b> for the places above (rows billed by Zillow Search Scraper, capped by <b>Max source spend</b>), score a Zillow <b>dataset</b>, paste a <b>list</b> of rows, or <b>watch</b> listings you follow. With nothing to search (<code>{}</code>) the free demo runs on 6 sample listings — nothing charged.

## `investorGoal` (type: `string`):

Describe the deal you want in plain words — the AI scores every listing against it (0-100, with reasons) and writes the deal memo. Leave empty to rank by the numbers only.

## `minScore` (type: `integer`):

The field that decides what you pay: listings whose deal score is below this are discarded and <b>not charged</b>. 60 keeps solid deals; raise it to 75+ for only the best, lower it to see more.

## `maxQualified` (type: `integer`):

Hard cap on results and on what <b>this Actor</b> charges: at most this many × $0.015 with AI on (× $0.004 off), e.g. 100 × $0.015 = $1.50. Best deals first.

## `maxDiscoveryChargeUsd` (type: `number`):

Hard cap on what the Zillow search may charge your account (≈ $0.0023 per listing) — $0.50 in the form and for API calls that leave it out. Raise it for bigger searches.

## `enableAi` (type: `boolean`):

Adds a grounded deal memo, red flags, upsides, condition, verbatim seller phrases and a fit score against your brief. <b>On = $0.015 per qualified deal + AI tokens; off = $0.004</b> (math and rule score only).

## `notifyEmail` (type: `string`):

After every run with new deals, the digest (top 10 with price, cash flow, cap rate, links) is e-mailed here. Schedule the run (Actions → Schedule) and only new deals and price cuts reach your inbox. Never sent for the free demo.

## `listingGoal` (type: `string`):

How the deal score is weighted. <b>Rental</b>: cap rate, cash flow, cash-on-cash, 1% rule. <b>Flip</b>: discount to Zestimate, $/sqft below the ZIP median, motivated-seller signals, price-cut size. <b>Any</b>: the better of both.

## `minCapRatePct` (type: `number`):

Only deals whose cap rate (NOI ÷ price) reaches this, e.g. 7. Listings without a rent estimate fail it.

## `minMonthlyCashFlow` (type: `number`):

Only deals that cash-flow at least this much per month after mortgage and expenses at your financing terms, e.g. 150.

## `minCashOnCashPct` (type: `number`):

Only deals whose yearly cash flow ÷ cash invested (down payment + closing costs) reaches this, e.g. 8.

## `minDiscountToZestimatePct` (type: `number`):

Only listings priced at least this far below Zillow's Zestimate, e.g. 10 for flips and wholesale.

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

Skip listings below this asking price.

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

Skip listings above this asking price.

## `minBedrooms` (type: `integer`):

Skip listings with fewer bedrooms.

## `homeTypes` (type: `array`):

Keep only these home types. Leave empty for all.

## `requireOnePercentRule` (type: `boolean`):

Only deals whose monthly rent estimate is at least 1% of the price.

## `motivatedSellerOnly` (type: `boolean`):

Only listings with a price cut, 60+ days on Zillow, FSBO, foreclosure, bank-owned or auction.

## `minPriceCutPct` (type: `number`):

Only listings whose last price cut is at least this share of the price before it, e.g. 5.

## `minDaysOnZillow` (type: `integer`):

Only listings on Zillow at least this long (stale listings negotiate), e.g. 45.

## `targetFlags` (type: `array`):

Only deliver deals that have at least one of these flags, and rank those with more of them higher. Use the flag names from the README, e.g. <code>price\_cut</code>, <code>fsbo</code>, <code>below\_zip\_median</code> (<code>priceCut</code> works too); an unknown name stops the run at once with the list of valid ones.

## `suppressionList` (type: `array`):

Zillow zpids, listing URLs or addresses to never output (e.g. deals you already offered on). Skipped before any processing, never charged.

## `downPaymentPct` (type: `number`):

Share of the price you pay in cash; the rest is the loan.

## `interestRatePct` (type: `number`):

Yearly mortgage rate.

## `loanTermYears` (type: `integer`):

Mortgage length.

## `closingCostPct` (type: `number`):

Added to the down payment as cash invested (for cash-on-cash).

## `propertyTaxRatePct` (type: `number`):

Applied to the tax-assessed value (else the price) when the listing has no tax amount.

## `insuranceUsdYear` (type: `integer`):

Homeowner's insurance used when the listing states none.

## `vacancyPct` (type: `number`):

Rent lost to empty months.

## `maintenancePct` (type: `number`):

Repairs and replacements set aside from the rent.

## `managementPct` (type: `number`):

Set 0 if you self-manage.

## `monthlyHoaUsd` (type: `integer`):

Used when the listing states no HOA fee (search cards rarely do — turn on the detail step for the real one).

## `rentFallbackPct` (type: `number`):

Listings without a Zillow rent Zestimate get the cash-flow math with rent = this share of the price per month, e.g. 0.8 (a $120k house → $960/mo). <code>rentSource</code> on every row says which rent was used. Empty = such listings get no cash-flow math.

## `fetchDetails` (type: `boolean`):

Runs Zillow Detail Scraper (maxcopell/zillow-detail-scraper, ≈ $0.0036 per listing, billed by that Actor on your account) for the deals that already passed your rules only, then recomputes the math with the real tax, HOA and insurance and gives the AI the full description.

## `maxDetailFetches` (type: `integer`):

Cap on how many shortlisted deals get the detail step per run (best deal score first).

## `rentComps` (type: `boolean`):

Runs one capped for-rent search per ZIP of your deals (Zillow Search Scraper on your account, ≈ $0.05 a ZIP, at most <code>maxCompZips</code> ZIPs). A listing without a rent Zestimate then gets the median rent of that ZIP's rentals with the same bedroom count (<code>rentSource: zip\_rent\_comps</code>, before <code>rentFallbackPct</code>), so its cash flow is market evidence, not a guess. Live search, dataset and list modes; not in the free demo.

## `soldComps` (type: `boolean`):

Runs one capped "sold in the last 6 months" search per ZIP of your deals (≈ $0.05 a ZIP on your account, at most <code>maxCompZips</code> ZIPs). <code>arv</code> becomes the ZIP's median sold $/sqft × the listing's sqft (<code>arvSource: sold\_comps</code>) — the ARV flippers price from, so <code>maxAllowableOffer</code> is an offer sheet. Not in the free demo.

## `maxCompZips` (type: `integer`):

Caps the comp searches: the ZIPs with the most deals first, 20 comps each. 5 ZIPs ≈ $0.23 per comp kind at most, also capped by maxDiscoveryChargeUsd.

## `writeOfferNote` (type: `boolean`):

With AI on, adds a short note (≤ 600 characters) to the listing agent or FSBO owner for warm and hot deals, using only numbers from the row — no financing promises. Hot deals also get a one-page letter of intent (PDF, blanks for your price and terms) linked in <code>offerLetterUrl</code>. Included in the AI price.

## `llmProvider` (type: `string`):

<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates (paid Apify plans include the model access). <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key is slower (2 calls at a time, one after a rate limit) — the AI stops before the run's timeout and the rest keep their rule score.

## `llmModel` (type: `string`):

Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>.

## `llmApiKey` (type: `string`):

Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged.

## `aiCandidateMultiplier` (type: `integer`):

The AI assesses the best rule-scored candidates first, up to this multiple of <b>Max qualified</b> (e.g. 2 × 100 = 200 listings). Higher = more thorough, slower, more tokens.

## `slackWebhookUrl` (type: `string`):

A Slack incoming-webhook URL (<code>https://hooks.slack.com/services/…</code>). After every run with at least one new deal, the digest (how many are new, the top 10 with links) is posted to that channel as a readable message — not raw JSON. Never sent for the free demo.

## `webhookUrl` (type: `string`):

Qualified deals are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path.

## `webhookHeaders` (type: `object`):

Extra HTTP headers for the webhook, e.g. <code>{"Authorization": "Bearer …"}</code>. Stored encrypted by Apify, never logged.

## `webhookBatchSize` (type: `integer`):

1 = one POST per deal the moment it is ready. Higher = one POST per N deals.

## `dedupeAcrossRuns` (type: `boolean`):

Remembers every deal you received (by Zillow zpid and the price it had, in a named key-value store on your account) and skips it in future runs.

## `alertOnPriceCut` (type: `boolean`):

A deal you already received comes back — and is charged again — only when its price dropped since, flagged <code>isNewPriceCut</code>.

## `dedupeStoreName` (type: `string`):

Key-value store used for cross-run memory. Left at the default, the memory is kept per search (places / search URLs / watchlist / dataset and <code>listingGoal</code>): rewording <code>investorGoal</code> keeps it, a different search starts its own list and the status says so. Give each client their own name here to keep their lists apart.

## `searchUrls` (type: `array`):

Instead of <b>Cities or ZIP codes</b>: a search from zillow.com with its map area and every filter, copied from the address bar (one URL per line). The live search runs Zillow Search Scraper on your Apify plan — no Store Actors on your plan? use a Zillow dataset. The free demo does not search it; typing a URL starts the live search.

## `watchlist` (type: `array`):

Zillow zpids or listing URLs (one per line). Each run re-checks them with Zillow Detail Scraper (≈ $0.0036 per listing on your Apify plan) and delivers — and charges — only a listing whose price or status changed (<code>watchChange</code>: price\_cut, back\_on\_market …); the first run delivers each once. Schedule it daily. The free demo does not search it; typing a listing starts the watchlist.

## `datasetId` (type: `string`):

Only for <b>dataset</b> mode: a dataset from Zillow Search Scraper, Zillow ZIP Code Search Scraper or Zillow Detail Scraper (same field names). Pick it so the Actor is granted read access.

## `itemsList` (type: `array`):

Only for <b>list</b> mode: a JSON array of Zillow listing objects in Zillow Search Scraper's format — needs <code>zpid</code> (or <code>propertyUrl</code>) and <code>listingPrice.amount</code>; <code>rentZestimate</code> switches on the cash-flow math (README → List-mode rows). Prefilled with 6 fictional sample listings — the free demo.

## `resultsLimit` (type: `integer`):

Most listings Zillow Search Scraper returns per URL (≈ $0.0023 each on your account, also capped by <b>Max source spend</b>).

## `extractionMethod` (type: `string`):

How Zillow Search Scraper walks the search. <b>Pagination with zoom-in</b> (default) finds the most listings in big areas; <b>Map markers</b> is faster for small ones.

## `discoveryActorId` (type: `string`):

Actor used in live-search mode. Any Zillow scraper whose output has Zillow Search Scraper's or the raw Zillow API's field names works.

## `discoveryInput` (type: `object`):

Only for live-search mode: extra input passed to the source Actor as-is; it overrides the fields built from the form. The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, use <b>dataset</b> mode.

## `maxToProcess` (type: `integer`):

Upper bound on how many listings are scored in one run (controls run time). Default = 3 × max qualified.

## Actor input object example

```json
{
  "sourceMode": "list",
  "investorGoal": "Cash-flowing 3+ bedroom single-family homes under $200k in Ohio; light rehab is fine, no condos with high HOA.",
  "minScore": 60,
  "maxQualified": 100,
  "maxDiscoveryChargeUsd": 0.5,
  "enableAi": true,
  "listingGoal": "rental",
  "requireOnePercentRule": false,
  "motivatedSellerOnly": false,
  "downPaymentPct": 25,
  "interestRatePct": 7,
  "loanTermYears": 30,
  "closingCostPct": 3,
  "propertyTaxRatePct": 1.1,
  "insuranceUsdYear": 1500,
  "vacancyPct": 5,
  "maintenancePct": 8,
  "managementPct": 8,
  "monthlyHoaUsd": 0,
  "fetchDetails": false,
  "maxDetailFetches": 50,
  "rentComps": false,
  "soldComps": false,
  "maxCompZips": 5,
  "writeOfferNote": false,
  "llmProvider": "apify",
  "aiCandidateMultiplier": 2,
  "webhookBatchSize": 1,
  "dedupeAcrossRuns": true,
  "alertOnPriceCut": true,
  "dedupeStoreName": "zillow-deal-finder-ai-seen",
  "itemsList": [
    {
      "zpid": "900000101",
      "propertyUrl": "https://www.zillow.com/homedetails/3418-Sample-Ave-Cleveland-OH-44109/900000101_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "3418 Sample Ave, Cleveland, OH 44109",
        "street": "3418 Sample Ave",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4461,
        "longitude": -81.7062
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 129000,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 1,
      "livingArea": 1344,
      "livingAreaUnit": "sqft",
      "lotArea": {
        "formatted": "4,356 sqft"
      },
      "zestimate": 142000,
      "rentZestimate": 1650,
      "taxAssessedValue": 98000,
      "daysOnZillow": 41,
      "priceChange": -6000,
      "priceChangedAt": "2026-09-14",
      "priceReduction": "$6,000 (Sep 14)",
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Realty Group",
        "phoneNumber": "(216) 555-0142"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000101-p_e.jpg",
      "photoCount": 24,
      "marketingTagline": "Updated 3-bed with new furnace, tenant-ready",
      "searchUrl": "https://www.zillow.com/cleveland-oh/",
      "attributionInfo": {
        "agentName": "Sample Agent (demo)",
        "agentPhoneNumber": "(216) 555-0199",
        "agentEmail": "agent@example.com"
      },
      "zipRentComp": 1600,
      "soldCompPricePerSqft": 102.5
    },
    {
      "zpid": "900000102",
      "propertyUrl": "https://www.zillow.com/homedetails/1207-Example-St-Cleveland-OH-44109/900000102_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "1207 Example St, Cleveland, OH 44109",
        "street": "1207 Example St",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4432,
        "longitude": -81.7101
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 89900,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 1,
      "livingArea": 1120,
      "livingAreaUnit": "sqft",
      "lotArea": {
        "formatted": "3,920 sqft"
      },
      "zestimate": 104500,
      "rentZestimate": 1350,
      "taxAssessedValue": 71000,
      "daysOnZillow": 96,
      "listingType": {
        "isFSBO": true,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Listed by owner"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000102-p_e.jpg",
      "photoCount": 9,
      "marketingTagline": "Investor special - sold as-is, cash only, needs TLC",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000103",
      "propertyUrl": "https://www.zillow.com/homedetails/2255-Demo-Rd-Cleveland-OH-44109/900000103_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "2255 Demo Rd, Cleveland, OH 44109",
        "street": "2255 Demo Rd",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4489,
        "longitude": -81.7015
      },
      "listingStatus": "foreclosure",
      "homeType": "MULTI_FAMILY",
      "listingPrice": {
        "amount": 165000,
        "currency": "USD"
      },
      "bedrooms": 4,
      "bathrooms": 2,
      "livingArea": 1850,
      "livingAreaUnit": "sqft",
      "zestimate": 188000,
      "rentZestimate": 2300,
      "taxAssessedValue": 132000,
      "daysOnZillow": 12,
      "listingType": {
        "isFSBO": false,
        "isForeclosure": true,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Asset Brokers",
        "phoneNumber": "(216) 555-0178"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000103-p_e.jpg",
      "photoCount": 4,
      "marketingTagline": "Up/down duplex, foreclosure, estate sale",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000104",
      "propertyUrl": "https://www.zillow.com/homedetails/77-Placeholder-Ct-4B-Cleveland-OH-44109/900000104_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "77 Placeholder Ct #4B, Cleveland, OH 44109",
        "street": "77 Placeholder Ct #4B",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "listingStatus": "forSale",
      "homeType": "CONDO",
      "listingPrice": {
        "amount": 149000,
        "currency": "USD"
      },
      "bedrooms": 2,
      "bathrooms": 2,
      "livingArea": 980,
      "livingAreaUnit": "sqft",
      "zestimate": 147000,
      "rentZestimate": 1150,
      "taxAssessedValue": 120000,
      "daysOnZillow": 8,
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Realty Group"
      },
      "photoCount": 31,
      "marketingTagline": "Move-in ready condo with lake view",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000105",
      "propertyUrl": "https://www.zillow.com/homedetails/560-Mock-Blvd-Columbus-OH-43207/900000105_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "560 Mock Blvd, Columbus, OH 43207",
        "street": "560 Mock Blvd",
        "city": "Columbus",
        "state": "OH",
        "zipCode": "43207"
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 219000,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 2,
      "livingArea": 1560,
      "livingAreaUnit": "sqft",
      "zestimate": 226000,
      "rentZestimate": 1950,
      "taxAssessedValue": 180000,
      "daysOnZillow": 30,
      "priceChange": -10000,
      "priceChangedAt": "2026-09-20",
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Example Homes LLC"
      },
      "photoCount": 18,
      "searchUrl": "https://www.zillow.com/columbus-oh/"
    },
    {
      "zpid": "900000106",
      "propertyUrl": "https://www.zillow.com/b/sample-lofts-cleveland-oh/",
      "cardType": "building",
      "isValid": true,
      "listingAddress": {
        "full": "Sample Lofts, Cleveland, OH 44113",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44113"
      },
      "listingStatus": "forRent"
    }
  ],
  "resultsLimit": 200,
  "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
  "discoveryActorId": "maxcopell/zillow-scraper",
  "discoveryInput": {}
}
```

# Actor output Schema

## `qualified` (type: `string`):

All qualified deals as JSON, best-scoring first.

## `sheet` (type: `string`):

The same deals as a spreadsheet.

## `runSummary` (type: `string`):

JSON record with the funnel (loaded -> filtered -> AI-assessed -> qualified), per-reason skip counts, charged events by type, free-tier deals used and remaining, whether a budget limit was reached, webhook delivery counts and the dedupe store size.

# 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 = {
    "sourceMode": "list",
    "investorGoal": "Cash-flowing 3+ bedroom single-family homes under $200k in Ohio; light rehab is fine, no condos with high HOA.",
    "maxDiscoveryChargeUsd": 0.5,
    "itemsList": [
        {
            "zpid": "900000101",
            "propertyUrl": "https://www.zillow.com/homedetails/3418-Sample-Ave-Cleveland-OH-44109/900000101_zpid/",
            "cardType": "home",
            "isValid": true,
            "listingAddress": {
                "full": "3418 Sample Ave, Cleveland, OH 44109",
                "street": "3418 Sample Ave",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109"
            },
            "coordinates": {
                "latitude": 41.4461,
                "longitude": -81.7062
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 129000,
                "currency": "USD"
            },
            "bedrooms": 3,
            "bathrooms": 1,
            "livingArea": 1344,
            "livingAreaUnit": "sqft",
            "lotArea": {
                "formatted": "4,356 sqft"
            },
            "zestimate": 142000,
            "rentZestimate": 1650,
            "taxAssessedValue": 98000,
            "daysOnZillow": 41,
            "priceChange": -6000,
            "priceChangedAt": "2026-09-14",
            "priceReduction": "$6,000 (Sep 14)",
            "listingType": {
                "isFSBO": false,
                "isForeclosure": false,
                "isBankOwned": false,
                "isForAuction": false,
                "isComingSoon": false
            },
            "broker": {
                "name": "Sample Realty Group",
                "phoneNumber": "(216) 555-0142"
            },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000101-p_e.jpg",
            "photoCount": 24,
            "marketingTagline": "Updated 3-bed with new furnace, tenant-ready",
            "searchUrl": "https://www.zillow.com/cleveland-oh/",
            "attributionInfo": {
                "agentName": "Sample Agent (demo)",
                "agentPhoneNumber": "(216) 555-0199",
                "agentEmail": "agent@example.com"
            },
            "zipRentComp": 1600,
            "soldCompPricePerSqft": 102.5
        },
        {
            "zpid": "900000102",
            "propertyUrl": "https://www.zillow.com/homedetails/1207-Example-St-Cleveland-OH-44109/900000102_zpid/",
            "cardType": "home",
            "isValid": true,
            "listingAddress": {
                "full": "1207 Example St, Cleveland, OH 44109",
                "street": "1207 Example St",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109"
            },
            "coordinates": {
                "latitude": 41.4432,
                "longitude": -81.7101
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 89900,
                "currency": "USD"
            },
            "bedrooms": 3,
            "bathrooms": 1,
            "livingArea": 1120,
            "livingAreaUnit": "sqft",
            "lotArea": {
                "formatted": "3,920 sqft"
            },
            "zestimate": 104500,
            "rentZestimate": 1350,
            "taxAssessedValue": 71000,
            "daysOnZillow": 96,
            "listingType": {
                "isFSBO": true,
                "isForeclosure": false,
                "isBankOwned": false,
                "isForAuction": false,
                "isComingSoon": false
            },
            "broker": {
                "name": "Listed by owner"
            },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000102-p_e.jpg",
            "photoCount": 9,
            "marketingTagline": "Investor special - sold as-is, cash only, needs TLC",
            "searchUrl": "https://www.zillow.com/cleveland-oh/"
        },
        {
            "zpid": "900000103",
            "propertyUrl": "https://www.zillow.com/homedetails/2255-Demo-Rd-Cleveland-OH-44109/900000103_zpid/",
            "cardType": "home",
            "isValid": true,
            "listingAddress": {
                "full": "2255 Demo Rd, Cleveland, OH 44109",
                "street": "2255 Demo Rd",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109"
            },
            "coordinates": {
                "latitude": 41.4489,
                "longitude": -81.7015
            },
            "listingStatus": "foreclosure",
            "homeType": "MULTI_FAMILY",
            "listingPrice": {
                "amount": 165000,
                "currency": "USD"
            },
            "bedrooms": 4,
            "bathrooms": 2,
            "livingArea": 1850,
            "livingAreaUnit": "sqft",
            "zestimate": 188000,
            "rentZestimate": 2300,
            "taxAssessedValue": 132000,
            "daysOnZillow": 12,
            "listingType": {
                "isFSBO": false,
                "isForeclosure": true,
                "isBankOwned": false,
                "isForAuction": false,
                "isComingSoon": false
            },
            "broker": {
                "name": "Sample Asset Brokers",
                "phoneNumber": "(216) 555-0178"
            },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000103-p_e.jpg",
            "photoCount": 4,
            "marketingTagline": "Up/down duplex, foreclosure, estate sale",
            "searchUrl": "https://www.zillow.com/cleveland-oh/"
        },
        {
            "zpid": "900000104",
            "propertyUrl": "https://www.zillow.com/homedetails/77-Placeholder-Ct-4B-Cleveland-OH-44109/900000104_zpid/",
            "cardType": "home",
            "isValid": true,
            "listingAddress": {
                "full": "77 Placeholder Ct #4B, Cleveland, OH 44109",
                "street": "77 Placeholder Ct #4B",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109"
            },
            "listingStatus": "forSale",
            "homeType": "CONDO",
            "listingPrice": {
                "amount": 149000,
                "currency": "USD"
            },
            "bedrooms": 2,
            "bathrooms": 2,
            "livingArea": 980,
            "livingAreaUnit": "sqft",
            "zestimate": 147000,
            "rentZestimate": 1150,
            "taxAssessedValue": 120000,
            "daysOnZillow": 8,
            "listingType": {
                "isFSBO": false,
                "isForeclosure": false,
                "isBankOwned": false,
                "isForAuction": false,
                "isComingSoon": false
            },
            "broker": {
                "name": "Sample Realty Group"
            },
            "photoCount": 31,
            "marketingTagline": "Move-in ready condo with lake view",
            "searchUrl": "https://www.zillow.com/cleveland-oh/"
        },
        {
            "zpid": "900000105",
            "propertyUrl": "https://www.zillow.com/homedetails/560-Mock-Blvd-Columbus-OH-43207/900000105_zpid/",
            "cardType": "home",
            "isValid": true,
            "listingAddress": {
                "full": "560 Mock Blvd, Columbus, OH 43207",
                "street": "560 Mock Blvd",
                "city": "Columbus",
                "state": "OH",
                "zipCode": "43207"
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 219000,
                "currency": "USD"
            },
            "bedrooms": 3,
            "bathrooms": 2,
            "livingArea": 1560,
            "livingAreaUnit": "sqft",
            "zestimate": 226000,
            "rentZestimate": 1950,
            "taxAssessedValue": 180000,
            "daysOnZillow": 30,
            "priceChange": -10000,
            "priceChangedAt": "2026-09-20",
            "listingType": {
                "isFSBO": false,
                "isForeclosure": false,
                "isBankOwned": false,
                "isForAuction": false,
                "isComingSoon": false
            },
            "broker": {
                "name": "Example Homes LLC"
            },
            "photoCount": 18,
            "searchUrl": "https://www.zillow.com/columbus-oh/"
        },
        {
            "zpid": "900000106",
            "propertyUrl": "https://www.zillow.com/b/sample-lofts-cleveland-oh/",
            "cardType": "building",
            "isValid": true,
            "listingAddress": {
                "full": "Sample Lofts, Cleveland, OH 44113",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44113"
            },
            "listingStatus": "forRent"
        }
    ],
    "discoveryInput": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("rich_minds/zillow-deal-finder-ai").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 = {
    "sourceMode": "list",
    "investorGoal": "Cash-flowing 3+ bedroom single-family homes under $200k in Ohio; light rehab is fine, no condos with high HOA.",
    "maxDiscoveryChargeUsd": 0.5,
    "itemsList": [
        {
            "zpid": "900000101",
            "propertyUrl": "https://www.zillow.com/homedetails/3418-Sample-Ave-Cleveland-OH-44109/900000101_zpid/",
            "cardType": "home",
            "isValid": True,
            "listingAddress": {
                "full": "3418 Sample Ave, Cleveland, OH 44109",
                "street": "3418 Sample Ave",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109",
            },
            "coordinates": {
                "latitude": 41.4461,
                "longitude": -81.7062,
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 129000,
                "currency": "USD",
            },
            "bedrooms": 3,
            "bathrooms": 1,
            "livingArea": 1344,
            "livingAreaUnit": "sqft",
            "lotArea": { "formatted": "4,356 sqft" },
            "zestimate": 142000,
            "rentZestimate": 1650,
            "taxAssessedValue": 98000,
            "daysOnZillow": 41,
            "priceChange": -6000,
            "priceChangedAt": "2026-09-14",
            "priceReduction": "$6,000 (Sep 14)",
            "listingType": {
                "isFSBO": False,
                "isForeclosure": False,
                "isBankOwned": False,
                "isForAuction": False,
                "isComingSoon": False,
            },
            "broker": {
                "name": "Sample Realty Group",
                "phoneNumber": "(216) 555-0142",
            },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000101-p_e.jpg",
            "photoCount": 24,
            "marketingTagline": "Updated 3-bed with new furnace, tenant-ready",
            "searchUrl": "https://www.zillow.com/cleveland-oh/",
            "attributionInfo": {
                "agentName": "Sample Agent (demo)",
                "agentPhoneNumber": "(216) 555-0199",
                "agentEmail": "agent@example.com",
            },
            "zipRentComp": 1600,
            "soldCompPricePerSqft": 102.5,
        },
        {
            "zpid": "900000102",
            "propertyUrl": "https://www.zillow.com/homedetails/1207-Example-St-Cleveland-OH-44109/900000102_zpid/",
            "cardType": "home",
            "isValid": True,
            "listingAddress": {
                "full": "1207 Example St, Cleveland, OH 44109",
                "street": "1207 Example St",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109",
            },
            "coordinates": {
                "latitude": 41.4432,
                "longitude": -81.7101,
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 89900,
                "currency": "USD",
            },
            "bedrooms": 3,
            "bathrooms": 1,
            "livingArea": 1120,
            "livingAreaUnit": "sqft",
            "lotArea": { "formatted": "3,920 sqft" },
            "zestimate": 104500,
            "rentZestimate": 1350,
            "taxAssessedValue": 71000,
            "daysOnZillow": 96,
            "listingType": {
                "isFSBO": True,
                "isForeclosure": False,
                "isBankOwned": False,
                "isForAuction": False,
                "isComingSoon": False,
            },
            "broker": { "name": "Listed by owner" },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000102-p_e.jpg",
            "photoCount": 9,
            "marketingTagline": "Investor special - sold as-is, cash only, needs TLC",
            "searchUrl": "https://www.zillow.com/cleveland-oh/",
        },
        {
            "zpid": "900000103",
            "propertyUrl": "https://www.zillow.com/homedetails/2255-Demo-Rd-Cleveland-OH-44109/900000103_zpid/",
            "cardType": "home",
            "isValid": True,
            "listingAddress": {
                "full": "2255 Demo Rd, Cleveland, OH 44109",
                "street": "2255 Demo Rd",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109",
            },
            "coordinates": {
                "latitude": 41.4489,
                "longitude": -81.7015,
            },
            "listingStatus": "foreclosure",
            "homeType": "MULTI_FAMILY",
            "listingPrice": {
                "amount": 165000,
                "currency": "USD",
            },
            "bedrooms": 4,
            "bathrooms": 2,
            "livingArea": 1850,
            "livingAreaUnit": "sqft",
            "zestimate": 188000,
            "rentZestimate": 2300,
            "taxAssessedValue": 132000,
            "daysOnZillow": 12,
            "listingType": {
                "isFSBO": False,
                "isForeclosure": True,
                "isBankOwned": False,
                "isForAuction": False,
                "isComingSoon": False,
            },
            "broker": {
                "name": "Sample Asset Brokers",
                "phoneNumber": "(216) 555-0178",
            },
            "mainImage": "https://photos.zillowstatic.com/fp/sample-900000103-p_e.jpg",
            "photoCount": 4,
            "marketingTagline": "Up/down duplex, foreclosure, estate sale",
            "searchUrl": "https://www.zillow.com/cleveland-oh/",
        },
        {
            "zpid": "900000104",
            "propertyUrl": "https://www.zillow.com/homedetails/77-Placeholder-Ct-4B-Cleveland-OH-44109/900000104_zpid/",
            "cardType": "home",
            "isValid": True,
            "listingAddress": {
                "full": "77 Placeholder Ct #4B, Cleveland, OH 44109",
                "street": "77 Placeholder Ct #4B",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44109",
            },
            "listingStatus": "forSale",
            "homeType": "CONDO",
            "listingPrice": {
                "amount": 149000,
                "currency": "USD",
            },
            "bedrooms": 2,
            "bathrooms": 2,
            "livingArea": 980,
            "livingAreaUnit": "sqft",
            "zestimate": 147000,
            "rentZestimate": 1150,
            "taxAssessedValue": 120000,
            "daysOnZillow": 8,
            "listingType": {
                "isFSBO": False,
                "isForeclosure": False,
                "isBankOwned": False,
                "isForAuction": False,
                "isComingSoon": False,
            },
            "broker": { "name": "Sample Realty Group" },
            "photoCount": 31,
            "marketingTagline": "Move-in ready condo with lake view",
            "searchUrl": "https://www.zillow.com/cleveland-oh/",
        },
        {
            "zpid": "900000105",
            "propertyUrl": "https://www.zillow.com/homedetails/560-Mock-Blvd-Columbus-OH-43207/900000105_zpid/",
            "cardType": "home",
            "isValid": True,
            "listingAddress": {
                "full": "560 Mock Blvd, Columbus, OH 43207",
                "street": "560 Mock Blvd",
                "city": "Columbus",
                "state": "OH",
                "zipCode": "43207",
            },
            "listingStatus": "forSale",
            "homeType": "SINGLE_FAMILY",
            "listingPrice": {
                "amount": 219000,
                "currency": "USD",
            },
            "bedrooms": 3,
            "bathrooms": 2,
            "livingArea": 1560,
            "livingAreaUnit": "sqft",
            "zestimate": 226000,
            "rentZestimate": 1950,
            "taxAssessedValue": 180000,
            "daysOnZillow": 30,
            "priceChange": -10000,
            "priceChangedAt": "2026-09-20",
            "listingType": {
                "isFSBO": False,
                "isForeclosure": False,
                "isBankOwned": False,
                "isForAuction": False,
                "isComingSoon": False,
            },
            "broker": { "name": "Example Homes LLC" },
            "photoCount": 18,
            "searchUrl": "https://www.zillow.com/columbus-oh/",
        },
        {
            "zpid": "900000106",
            "propertyUrl": "https://www.zillow.com/b/sample-lofts-cleveland-oh/",
            "cardType": "building",
            "isValid": True,
            "listingAddress": {
                "full": "Sample Lofts, Cleveland, OH 44113",
                "city": "Cleveland",
                "state": "OH",
                "zipCode": "44113",
            },
            "listingStatus": "forRent",
        },
    ],
    "discoveryInput": {},
}

# Run the Actor and wait for it to finish
run = client.actor("rich_minds/zillow-deal-finder-ai").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 '{
  "sourceMode": "list",
  "investorGoal": "Cash-flowing 3+ bedroom single-family homes under $200k in Ohio; light rehab is fine, no condos with high HOA.",
  "maxDiscoveryChargeUsd": 0.5,
  "itemsList": [
    {
      "zpid": "900000101",
      "propertyUrl": "https://www.zillow.com/homedetails/3418-Sample-Ave-Cleveland-OH-44109/900000101_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "3418 Sample Ave, Cleveland, OH 44109",
        "street": "3418 Sample Ave",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4461,
        "longitude": -81.7062
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 129000,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 1,
      "livingArea": 1344,
      "livingAreaUnit": "sqft",
      "lotArea": {
        "formatted": "4,356 sqft"
      },
      "zestimate": 142000,
      "rentZestimate": 1650,
      "taxAssessedValue": 98000,
      "daysOnZillow": 41,
      "priceChange": -6000,
      "priceChangedAt": "2026-09-14",
      "priceReduction": "$6,000 (Sep 14)",
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Realty Group",
        "phoneNumber": "(216) 555-0142"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000101-p_e.jpg",
      "photoCount": 24,
      "marketingTagline": "Updated 3-bed with new furnace, tenant-ready",
      "searchUrl": "https://www.zillow.com/cleveland-oh/",
      "attributionInfo": {
        "agentName": "Sample Agent (demo)",
        "agentPhoneNumber": "(216) 555-0199",
        "agentEmail": "agent@example.com"
      },
      "zipRentComp": 1600,
      "soldCompPricePerSqft": 102.5
    },
    {
      "zpid": "900000102",
      "propertyUrl": "https://www.zillow.com/homedetails/1207-Example-St-Cleveland-OH-44109/900000102_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "1207 Example St, Cleveland, OH 44109",
        "street": "1207 Example St",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4432,
        "longitude": -81.7101
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 89900,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 1,
      "livingArea": 1120,
      "livingAreaUnit": "sqft",
      "lotArea": {
        "formatted": "3,920 sqft"
      },
      "zestimate": 104500,
      "rentZestimate": 1350,
      "taxAssessedValue": 71000,
      "daysOnZillow": 96,
      "listingType": {
        "isFSBO": true,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Listed by owner"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000102-p_e.jpg",
      "photoCount": 9,
      "marketingTagline": "Investor special - sold as-is, cash only, needs TLC",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000103",
      "propertyUrl": "https://www.zillow.com/homedetails/2255-Demo-Rd-Cleveland-OH-44109/900000103_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "2255 Demo Rd, Cleveland, OH 44109",
        "street": "2255 Demo Rd",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "coordinates": {
        "latitude": 41.4489,
        "longitude": -81.7015
      },
      "listingStatus": "foreclosure",
      "homeType": "MULTI_FAMILY",
      "listingPrice": {
        "amount": 165000,
        "currency": "USD"
      },
      "bedrooms": 4,
      "bathrooms": 2,
      "livingArea": 1850,
      "livingAreaUnit": "sqft",
      "zestimate": 188000,
      "rentZestimate": 2300,
      "taxAssessedValue": 132000,
      "daysOnZillow": 12,
      "listingType": {
        "isFSBO": false,
        "isForeclosure": true,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Asset Brokers",
        "phoneNumber": "(216) 555-0178"
      },
      "mainImage": "https://photos.zillowstatic.com/fp/sample-900000103-p_e.jpg",
      "photoCount": 4,
      "marketingTagline": "Up/down duplex, foreclosure, estate sale",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000104",
      "propertyUrl": "https://www.zillow.com/homedetails/77-Placeholder-Ct-4B-Cleveland-OH-44109/900000104_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "77 Placeholder Ct #4B, Cleveland, OH 44109",
        "street": "77 Placeholder Ct #4B",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44109"
      },
      "listingStatus": "forSale",
      "homeType": "CONDO",
      "listingPrice": {
        "amount": 149000,
        "currency": "USD"
      },
      "bedrooms": 2,
      "bathrooms": 2,
      "livingArea": 980,
      "livingAreaUnit": "sqft",
      "zestimate": 147000,
      "rentZestimate": 1150,
      "taxAssessedValue": 120000,
      "daysOnZillow": 8,
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Sample Realty Group"
      },
      "photoCount": 31,
      "marketingTagline": "Move-in ready condo with lake view",
      "searchUrl": "https://www.zillow.com/cleveland-oh/"
    },
    {
      "zpid": "900000105",
      "propertyUrl": "https://www.zillow.com/homedetails/560-Mock-Blvd-Columbus-OH-43207/900000105_zpid/",
      "cardType": "home",
      "isValid": true,
      "listingAddress": {
        "full": "560 Mock Blvd, Columbus, OH 43207",
        "street": "560 Mock Blvd",
        "city": "Columbus",
        "state": "OH",
        "zipCode": "43207"
      },
      "listingStatus": "forSale",
      "homeType": "SINGLE_FAMILY",
      "listingPrice": {
        "amount": 219000,
        "currency": "USD"
      },
      "bedrooms": 3,
      "bathrooms": 2,
      "livingArea": 1560,
      "livingAreaUnit": "sqft",
      "zestimate": 226000,
      "rentZestimate": 1950,
      "taxAssessedValue": 180000,
      "daysOnZillow": 30,
      "priceChange": -10000,
      "priceChangedAt": "2026-09-20",
      "listingType": {
        "isFSBO": false,
        "isForeclosure": false,
        "isBankOwned": false,
        "isForAuction": false,
        "isComingSoon": false
      },
      "broker": {
        "name": "Example Homes LLC"
      },
      "photoCount": 18,
      "searchUrl": "https://www.zillow.com/columbus-oh/"
    },
    {
      "zpid": "900000106",
      "propertyUrl": "https://www.zillow.com/b/sample-lofts-cleveland-oh/",
      "cardType": "building",
      "isValid": true,
      "listingAddress": {
        "full": "Sample Lofts, Cleveland, OH 44113",
        "city": "Cleveland",
        "state": "OH",
        "zipCode": "44113"
      },
      "listingStatus": "forRent"
    }
  ],
  "discoveryInput": {}
}' |
apify call rich_minds/zillow-deal-finder-ai --silent --output-dataset

```

## MCP server setup

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

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/Su1kMwHIVJ8Sb9ie9/builds/XpjwOjgkZhjzobZLE/openapi.json
