# Distressed Property Scraper — Tax Delinquent & Pre-Foreclosure (`dominvo/distressed-property-ai-scraper`) Actor

Pull a tax delinquent properties list, pre-foreclosure list, sheriff sale list, code violations, vacant property & probate leads from US county/city records — fused per property, scored for distress, and skip-traced to a callable owner. Motivated seller leads, pay-per-event, first 20 rows free.

- **URL**: https://apify.com/dominvo/distressed-property-ai-scraper.md
- **Developed by:** [Domin Vo](https://apify.com/dominvo) (community)
- **Categories:** Agents, Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $60.00 / 1,000 enriched leads

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

**Distressed Property AI Scraper turns every public distress signal into clean motivated seller leads — a tax delinquent properties list, pre-foreclosure list, sheriff sale list, code violations, and probate leads — fused per property, scored, and enriched to a callable owner.**

Pull a **tax delinquent properties list**, a **pre-foreclosure list**, a **sheriff sale list**, a **tax lien properties list**, code violations, vacant property registries, and probate filings from official county and city sources across 17+ US metros. The Actor deduplicates every signal onto one property, computes a **DISTRESS-SCORE**, and optionally does **skip tracing** to find the owner's phone — giving real estate wholesalers and fix-and-flip investors a motivated seller lead list that rivals PropStream credits at a fraction of the cost.

It's a real **PropStream alternative / API** for the automation buyer: pulled **direct from county and city open data** (Socrata SODA, ArcGIS REST, county recorder feeds), not a reseller feed that can vanish or raise prices.

### What does Distressed Property AI Scraper do?

It scrapes pre-public distress triggers, fuses them per property, and scores motivation. Pick the mode that matches the list you want:

| Lead list you want | Mode to start with | What you get |
|---|---|---|
| **Tax delinquent properties list** / tax lien properties list | `tax_delinquent` | Unpaid-tax & tax-lien parcel rows by county |
| **Pre-foreclosure list** | `pre_foreclosure` | Notice-of-default rows from the county recorder |
| **Sheriff sale list** / trustee sale list / foreclosure auction list | `foreclosure_auctions` | Sheriff & trustee sale dates and parcels |
| **Code violation property list** | `code_violations` | Address + violation type, 13–17 metros |
| **Vacant property list** / condemned property list | `vacant_registry` | Registered vacant / blighted / condemned parcels |
| **Probate leads** (real estate) | `probate_filings` | Decedent + parcel from county probate |
| **Absentee owner list** | `absentee_owner` | Deed-vs-mailing mismatch owners |
| **High equity property list** | `high_equity` | Assessment-vs-mortgage equity headroom |
| **Fused distress score** | `distress_match` | One row per property, all stacked signals, scored |
| **Enriched callable lead** | `enriched_lead` | Distress match + owner name, mailing, phone |

All data is pulled **direct from free public sources** — Socrata SODA, ArcGIS REST, county recorder feeds — not from a reseller that can vanish or raise prices.

### Why use this motivated seller leads scraper?

- **Beat the market.** Catch motivated sellers before they list publicly. Tax-delinquent, pre-foreclosure, and sheriff-sale owners are weeks to months ahead of the MLS.
- **One API, every trigger.** Tax delinquent list + tax liens + code violations + vacant property list + pre-foreclosure + probate, all in one run. No juggling five subscriptions.
- **The fusion moat.** Other tools dump raw events. This Actor deduplicates signals onto a single parcel key and hands you a ranked distress score — so your dialer works the hottest leads first.
- **Built-in skip tracing for real estate.** Optionally enrich any distress match to a callable owner phone and mailing address — no separate skip-trace subscription.
- **Price vs incumbents.** **$0.06 per enriched lead** (owner + phone) vs $0.12+ per PropStream credit. First 20 result rows per run are always free.
- **AI-first output.** Clean structured JSON with a distress score, ready for a wholesaler's dialer, an LLM workflow, or a spreadsheet.
- **No reseller dependency.** Data is fetched directly from official city/county open-data portals — a true source-direct **PropStream alternative**, not a third-party feed that can vanish.

#### Who is this for?

| Persona | Best modes |
|---|---|
| P1 — Real estate wholesalers (wholesale real estate leads) | `enriched_lead`, `distress_match`, `pre_foreclosure`, `tax_delinquent`, `probate_filings` |
| P2 — Fix-and-flip / buy-and-hold investors | `distress_match`, `code_violations`, `vacant_registry`, `high_equity`, `absentee_owner` |

### How to use Distressed Property AI Scraper

1. Open the Actor on Apify and click **Try for free**.
2. Pick a `mode`: start with `code_violations` or `tax_delinquent` for the fastest signal.
3. Set `cities` (e.g. `["Chicago", "Philadelphia"]`) or `counties` for county-based modes.
4. For `enriched_lead`, provide a skip-trace Actor ID or API key in the input.
5. Click **Save & Start** and download results from the Output tab.

**Quickest first test:** leave the default `mode` as `code_violations`, set `cities` to `["Chicago"]`, and run. You'll get signal rows in under 2 minutes.

### Input example

```json
{
  "mode": "distress_match",
  "cities": ["Chicago", "Philadelphia"],
  "signals": ["code_violations", "tax_delinquent", "vacant_registry"],
  "output_format": "json"
}
````

For enriched leads with skip tracing:

```json
{
  "mode": "enriched_lead",
  "cities": ["Chicago"],
  "skip_trace_actor_id": "YOUR_SKIP_TRACE_ACTOR_ID",
  "output_format": "json"
}
```

### Output

#### signal\_record (raw distress signal)

```json
{
  "sha256": "a3f9c1...",
  "mode": "code_violations",
  "parcel_key": "1420-N-CLARK-ST-CHICAGO-IL-60610",
  "address": "1420 N Clark St, Chicago, IL 60610",
  "signal_date": "2026-05-01",
  "payload": {
    "violation_type": "FAILED EXTERIOR",
    "status": "OPEN",
    "source": "chicago_socrata",
    "dataset_id": "wvhk-k5uv"
  }
}
```

#### distress\_match (fused + scored)

```json
{
  "sha256": "b7d2e8...",
  "mode": "distress_match",
  "parcel_key": "1420-N-CLARK-ST-CHICAGO-IL-60610",
  "address": "1420 N Clark St, Chicago, IL 60610",
  "signal_date": "2026-05-01",
  "payload": {
    "distress_score": 7.4,
    "signal_count": 3,
    "signals": ["code_violations", "tax_delinquent", "vacant_registry"],
    "absentee_owner": true,
    "days_since_oldest_signal": 42
  }
}
```

#### enriched\_lead (callable owner)

```json
{
  "sha256": "c9a4f2...",
  "mode": "enriched_lead",
  "parcel_key": "1420-N-CLARK-ST-CHICAGO-IL-60610",
  "address": "1420 N Clark St, Chicago, IL 60610",
  "signal_date": "2026-05-01",
  "payload": {
    "distress_score": 7.4,
    "signal_count": 3,
    "signals": ["code_violations", "tax_delinquent", "vacant_registry"],
    "owner_name": "JAMES R EXAMPLE",
    "owner_mailing": "500 W Madison St, Chicago, IL 60661",
    "phone": "+13125550123",
    "absentee_owner": true
  }
}
```

You can download results as JSON, CSV, Excel, or NDJSON. JSON streams to the Apify dataset; other formats are saved as files in the key-value store.

### Data fields

| Field | Meaning |
|---|---|
| `sha256` | Stable fingerprint per record — use for change detection between runs |
| `mode` | The signal or composite mode that produced this row |
| `parcel_key` | Normalized USPS Pub-28 address key — stable dedup identifier across sources |
| `address` | Raw address string from the source |
| `signal_date` | Date the signal was recorded at the source |
| `payload.distress_score` | Computed DISTRESS-SCORE (see explainer below) — only on `distress_match` / `enriched_lead` |
| `payload.signal_count` | Number of distinct distress signals stacked on this parcel |
| `payload.signals` | List of signal modes that fired on this parcel |
| `payload.owner_name` | Skip-traced owner name — only on `enriched_lead` |
| `payload.phone` | Skip-traced phone number — only on `enriched_lead` |

### DISTRESS-SCORE explainer

The DISTRESS-SCORE is a weighted sum of all signals stacked on one parcel, with owner-state multipliers.

**Signal weights (additive):**

| Signal | Base weight | Why |
|---|---|---|
| `tax_delinquent` | 3.0 | Financial default — highest urgency |
| `pre_foreclosure` | 3.0 | Active foreclosure timeline — time-critical |
| `foreclosure_auctions` | 2.5 | Sheriff/trustee sale date set — near-term forced sale |
| `probate_filings` | 2.0 | Estate/heir — motivated to liquidate |
| `code_violations` | 1.5 | Deferred maintenance — can't or won't fix |
| `vacant_registry` | 1.5 | Abandoned / blighted — owner disengaged |
| `demolition_permits` | 1.0 | City has given up — owner likely motivated |

**Owner-state multipliers:**

| Condition | Multiplier |
|---|---|
| `absentee_owner` (deed vs mailing mismatch) | ×1.3 |
| `high_equity` (assessment vs mortgage headroom) | ×1.2 |

**Score = sum of signal weights × applicable multipliers.** A Chicago property with `tax_delinquent` + `code_violations` + `vacant_registry` and an absentee owner scores `(3.0 + 1.5 + 1.5) × 1.3 = 7.8`.

Scores above 5 are strong leads for a wholesaler's dialer. Scores above 8 suggest multiple financial defaults — prioritize these.

### PropStream alternative: vs PropStream, BatchLeads & DealMachine

Looking for a **PropStream alternative**, a **PropStream API**, or a **BatchLeads / DealMachine alternative** you can automate? This Actor steals the enterprise vocabulary — motivated seller, distress signals, skip trace, absentee owner, high equity — and undercuts on per-lead price with a pure API.

| | This Actor | PropStream | BatchLeads | DealMachine |
|---|---|---|---|---|
| Access | **API-first** (Apify) | Web app + limited API | Web app + API | App (driving for dollars) |
| Pricing | **$0.06 / enriched lead**, 20 free/run | ~$100/mo seat + credits | ~$100/mo + skip credits | ~$60–120/mo + credits |
| Data source | **Source-direct** county/city open data | Aggregated third-party feed | Aggregated feed | Aggregated feed |
| Cross-signal fusion | **Yes — scored distress match** | No (filter flags) | No | No |
| Pre-public triggers | **Yes** (tax, NOD, probate, sheriff sale) | Partial | Partial | Limited |

**Why it wins:** PropStream charges **$0.12+ per phone-enriched lead** on credits; this Actor delivers the same callable lead for **$0.06**, source-direct, on your own schedule and format. No seat fee, no monthly minimum.

### How much does it cost to pull motivated seller leads?

This Actor uses **pay-per-event pricing**. The first 20 result rows per run are free.

| Output type | Price per row | What you get |
|---|---|---|
| Raw signal record | $0.002 | One address + signal event |
| Owner attribute | $0.003 | Absentee owner / high-equity flag |
| Distress match (fused) | $0.02 | One property, all signals stacked, scored |
| Enriched lead (callable) | **$0.06** | Distress match + owner name, mailing, phone |

**vs PropStream credits:** PropStream charges $0.12+ per phone-enriched lead. This Actor delivers the same callable lead for $0.06 — and you control the data source, schedule, and format.

For full pricing, check the Pricing tab on the Actor page.

### Tips for best results

- Start with `code_violations` in Chicago — dense, daily-updated, fast to verify.
- Run `distress_match` before `enriched_lead` — filter by `distress_score > 4` before paying for skip tracing.
- For county modes (`pre_foreclosure`, `tax_delinquent`, `foreclosure_auctions`), the quality varies by county. NYC, Cook County (Chicago), and Philadelphia are the most reliable starting points.
- Use `output_format: "csv"` to open results directly in Excel or import to your dialer.

### Use from Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("dominvo/distressed-property-ai-scraper").call(run_input={
    "mode": "distress_match",
    "cities": ["Chicago"],
    "signals": ["code_violations", "tax_delinquent"],
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["payload"]["distress_score"], row["address"])
```

### FCRA Disclaimer

**This Actor is intended for making real estate purchase offers and investment research only.**

Data from this Actor may NOT be used for:

- Tenant screening or rental decisions
- Credit decisions or creditworthiness evaluation
- Employment screening or background checks
- Any other purpose regulated by the Fair Credit Reporting Act (FCRA), 15 U.S.C. § 1681 et seq.

Using this data for FCRA-regulated purposes without complying with FCRA requirements is illegal. You are solely responsible for your use of the output.

### FAQ and support

#### Is this a PropStream alternative?

Yes — it's a source-direct, API-first PropStream alternative for the automation buyer. Instead of a monthly seat plus credits, you pay per result ($0.06 per enriched lead) and pull data straight from county/city open-data portals. It also serves as a **PropStream API**, **BatchLeads API**, or **DealMachine alternative** for anyone who wants motivated seller leads inside their own workflow.

#### Is this legal to use?

The source data is pulled from official public government portals (city open-data APIs, county recorder sites). Accessing public records for investment research is legal in the US. You are responsible for how you use the results — see the FCRA disclaimer above.

#### Does this scrape PropStream or BatchLeads?

No. Data is pulled directly from official city/county open-data sources (Socrata, ArcGIS, county recorder feeds). No third-party reseller is involved.

#### Which cities and counties are covered?

Socrata cities: NYC, Chicago, Los Angeles, Dallas, Austin, Fort Worth, San Francisco, Seattle.
ArcGIS cities: San Jose, Columbus, Charlotte, Indianapolis, Washington DC, Philadelphia.
County modes (`pre_foreclosure`, `tax_delinquent`, `foreclosure_auctions`, `probate_filings`) coverage varies — NYC, Cook County (Chicago), and Philadelphia are the gold tier with most reliable data.

#### What is skip tracing and why is it separate?

Skip tracing is the process of finding a property owner's phone number and mailing address from public deed/assessment records. It requires a paid third-party API. This Actor isolates skip tracing behind the `enriched_lead` mode — you only pay for it when you need a callable number, not for every raw signal.

#### Can I schedule a daily tax delinquent or pre-foreclosure list?

Yes. Use Apify schedules to run the Actor daily, weekly, or on any cron. Each record carries a stable SHA-256 fingerprint, so you can dedupe against your prior pulls on your side.

#### Where do I get help?

Open the Issues tab on the Actor page for bugs, missing cities, or feature requests.

# Actor input Schema

## `mode` (type: `string`):

Which mode to run. Each mode reads a subset of the fields below — see each field's note.

## `cities` (type: `array`):

City names to pull (e.g. Chicago, Philadelphia, Washington DC). Used by city-signal modes: code\_violations, vacant\_registry, demolition\_permits, fire\_incidents, and distress\_match. Leave empty to pull all verified cities for the chosen signal.

## `counties` (type: `array`):

County names to pull. Used by county modes: pre\_foreclosure, probate\_filings, absentee\_owner, high\_equity.

## `county` (type: `string`):

A single county name. Used by single-county modes: foreclosure\_auctions, tax\_delinquent.

## `metros` (type: `array`):

Metro/city names to fuse and enrich. Used by enriched\_lead.

## `signals` (type: `array`):

Subset of Tier 1 signal modes to fuse per property. Omit to fuse all defaults (code\_violations, vacant\_registry, demolition\_permits, fire\_incidents). Used by distress\_match.

## `signal_types` (type: `array`):

Subset of Tier 1 signal modes to fuse before enrichment. Omit to fuse all available signals. Used by enriched\_lead.

## `min_signals` (type: `integer`):

Minimum distinct signals on one parcel to qualify as a distress match. Used by distress\_match and enriched\_lead.

## `min_equity_pct` (type: `string`):

Minimum equity headroom as a fraction (e.g. 0.5 = 50%). Used by high\_equity.

## `min_assessed_value` (type: `integer`):

Minimum assessed property value to include. Used by high\_equity.

## `address_filter` (type: `string`):

Optional substring to filter parcels by address. Used by tax\_delinquent.

## `date_from` (type: `string`):

Earliest signal date (YYYY-MM-DD). Optional. Used by city-signal modes, distress\_match, high\_equity, enriched\_lead.

## `date_to` (type: `string`):

Latest signal date (YYYY-MM-DD). Optional. Used by city-signal modes, distress\_match, high\_equity, enriched\_lead.

## `since_date` (type: `string`):

Incremental floor (YYYY-MM-DD) — pull records on or after this date. Used by county modes: pre\_foreclosure, foreclosure\_auctions, tax\_delinquent, probate\_filings, absentee\_owner.

## `limit` (type: `integer`):

Cap on rows pulled per source. Omit for the adapter default (unlimited). Used by every mode.

## `socrata_app_token` (type: `string`):

Optional Socrata app token (raises the throttle ceiling). If omitted, the actor reads APIFY\_SOCRATA\_APP\_TOKEN from env. Used by Socrata-backed signal modes.

## `skiptrace_actor_id` (type: `string`):

Apify Actor ID to chain for skip-trace enrichment. Paid (~$0.007/result); billed to the actor publisher via DOMIN\_APIFY\_TOKEN resale token, not to the buyer. No match = 0 items = $0. Override with any Actor accepting street\_citystatezip input. Used by enriched\_lead.

## `max_signals_per_source` (type: `integer`):

Caps raw signals scanned per Tier 1 source before fusion, bounding cost and compute. Each child signal mode fetches at most this many rows. Used by distress\_match and enriched\_lead. Increase for broader coverage; decrease to limit compute cost.

## `skiptrace_api_key` (type: `string`):

Optional paid skip-trace API key. Alternative to chaining an Apify Actor. Used by enriched\_lead.

## `output_format` (type: `string`):

json streams to the default dataset. ndjson/csv/xlsx flush to the key-value store at end of run.

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

Proxy settings. Defaults to Apify Proxy (US) — several open-data portals block non-US or datacenter egress IPs, so US routing keeps runs reliable. Switch country or add residential groups if a source still blocks you.

## Actor input object example

```json
{
  "mode": "code_violations",
  "cities": [
    "Philadelphia"
  ],
  "counties": [],
  "metros": [],
  "signals": [],
  "signal_types": [],
  "min_signals": 2,
  "limit": 50,
  "skiptrace_actor_id": "one-api/skip-trace",
  "max_signals_per_source": 2000,
  "output_format": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "mode": "code_violations",
    "cities": [
        "Philadelphia"
    ],
    "limit": 50,
    "skiptrace_actor_id": "one-api/skip-trace"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dominvo/distressed-property-ai-scraper").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 = {
    "mode": "code_violations",
    "cities": ["Philadelphia"],
    "limit": 50,
    "skiptrace_actor_id": "one-api/skip-trace",
}

# Run the Actor and wait for it to finish
run = client.actor("dominvo/distressed-property-ai-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "code_violations",
  "cities": [
    "Philadelphia"
  ],
  "limit": 50,
  "skiptrace_actor_id": "one-api/skip-trace"
}' |
apify call dominvo/distressed-property-ai-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dominvo/distressed-property-ai-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Distressed Property Scraper — Tax Delinquent & Pre-Foreclosure",
        "description": "Pull a tax delinquent properties list, pre-foreclosure list, sheriff sale list, code violations, vacant property & probate leads from US county/city records — fused per property, scored for distress, and skip-traced to a callable owner. Motivated seller leads, pay-per-event, first 20 rows free.",
        "version": "0.0",
        "x-build-id": "s0WGVIyrlZeMEbSaW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dominvo~distressed-property-ai-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dominvo-distressed-property-ai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dominvo~distressed-property-ai-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dominvo-distressed-property-ai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dominvo~distressed-property-ai-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dominvo-distressed-property-ai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "code_violations",
                            "vacant_registry",
                            "demolition_permits",
                            "fire_incidents",
                            "pre_foreclosure",
                            "foreclosure_auctions",
                            "tax_delinquent",
                            "probate_filings",
                            "absentee_owner",
                            "high_equity",
                            "distress_match",
                            "enriched_lead"
                        ],
                        "type": "string",
                        "description": "Which mode to run. Each mode reads a subset of the fields below — see each field's note.",
                        "default": "code_violations"
                    },
                    "cities": {
                        "title": "Cities",
                        "type": "array",
                        "description": "City names to pull (e.g. Chicago, Philadelphia, Washington DC). Used by city-signal modes: code_violations, vacant_registry, demolition_permits, fire_incidents, and distress_match. Leave empty to pull all verified cities for the chosen signal.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "counties": {
                        "title": "Counties",
                        "type": "array",
                        "description": "County names to pull. Used by county modes: pre_foreclosure, probate_filings, absentee_owner, high_equity.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "county": {
                        "title": "County (single)",
                        "type": "string",
                        "description": "A single county name. Used by single-county modes: foreclosure_auctions, tax_delinquent."
                    },
                    "metros": {
                        "title": "Metros",
                        "type": "array",
                        "description": "Metro/city names to fuse and enrich. Used by enriched_lead.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "signals": {
                        "title": "Signals to fuse (distress_match)",
                        "type": "array",
                        "description": "Subset of Tier 1 signal modes to fuse per property. Omit to fuse all defaults (code_violations, vacant_registry, demolition_permits, fire_incidents). Used by distress_match.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "signal_types": {
                        "title": "Signal types (enriched_lead)",
                        "type": "array",
                        "description": "Subset of Tier 1 signal modes to fuse before enrichment. Omit to fuse all available signals. Used by enriched_lead.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "min_signals": {
                        "title": "Min stacked signals (distress_match / enriched_lead)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum distinct signals on one parcel to qualify as a distress match. Used by distress_match and enriched_lead.",
                        "default": 2
                    },
                    "min_equity_pct": {
                        "title": "Min equity % (high_equity)",
                        "type": "string",
                        "description": "Minimum equity headroom as a fraction (e.g. 0.5 = 50%). Used by high_equity."
                    },
                    "min_assessed_value": {
                        "title": "Min assessed value (high_equity)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum assessed property value to include. Used by high_equity."
                    },
                    "address_filter": {
                        "title": "Address filter (tax_delinquent)",
                        "type": "string",
                        "description": "Optional substring to filter parcels by address. Used by tax_delinquent."
                    },
                    "date_from": {
                        "title": "From date",
                        "type": "string",
                        "description": "Earliest signal date (YYYY-MM-DD). Optional. Used by city-signal modes, distress_match, high_equity, enriched_lead."
                    },
                    "date_to": {
                        "title": "To date",
                        "type": "string",
                        "description": "Latest signal date (YYYY-MM-DD). Optional. Used by city-signal modes, distress_match, high_equity, enriched_lead."
                    },
                    "since_date": {
                        "title": "Since date (county modes)",
                        "type": "string",
                        "description": "Incremental floor (YYYY-MM-DD) — pull records on or after this date. Used by county modes: pre_foreclosure, foreclosure_auctions, tax_delinquent, probate_filings, absentee_owner."
                    },
                    "limit": {
                        "title": "Max rows",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Cap on rows pulled per source. Omit for the adapter default (unlimited). Used by every mode."
                    },
                    "socrata_app_token": {
                        "title": "Socrata app token",
                        "type": "string",
                        "description": "Optional Socrata app token (raises the throttle ceiling). If omitted, the actor reads APIFY_SOCRATA_APP_TOKEN from env. Used by Socrata-backed signal modes."
                    },
                    "skiptrace_actor_id": {
                        "title": "Skip-trace Actor ID (enriched_lead)",
                        "type": "string",
                        "description": "Apify Actor ID to chain for skip-trace enrichment. Paid (~$0.007/result); billed to the actor publisher via DOMIN_APIFY_TOKEN resale token, not to the buyer. No match = 0 items = $0. Override with any Actor accepting street_citystatezip input. Used by enriched_lead.",
                        "default": "one-api/skip-trace"
                    },
                    "max_signals_per_source": {
                        "title": "Max signals per source (distress_match / enriched_lead)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Caps raw signals scanned per Tier 1 source before fusion, bounding cost and compute. Each child signal mode fetches at most this many rows. Used by distress_match and enriched_lead. Increase for broader coverage; decrease to limit compute cost.",
                        "default": 2000
                    },
                    "skiptrace_api_key": {
                        "title": "Skip-trace API key (enriched_lead)",
                        "type": "string",
                        "description": "Optional paid skip-trace API key. Alternative to chaining an Apify Actor. Used by enriched_lead."
                    },
                    "output_format": {
                        "title": "Output format",
                        "enum": [
                            "json",
                            "ndjson",
                            "csv",
                            "xlsx"
                        ],
                        "type": "string",
                        "description": "json streams to the default dataset. ndjson/csv/xlsx flush to the key-value store at end of run.",
                        "default": "json"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Defaults to Apify Proxy (US) — several open-data portals block non-US or datacenter egress IPs, so US routing keeps runs reliable. Switch country or add residential groups if a source still blocks you.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
