# US Multifamily Distress Deals — Scored & Underwritten (`dwelldata/us-multifamily-distress-deals`) Actor

Deal-level US multifamily listings with typed underwriting (NOI, DSCR, HUD-underwritten cap) + Hot/Warm/Pass scoring. Every field typed; empty is explained; you never pay for a blank.

- **URL**: https://apify.com/dwelldata/us-multifamily-distress-deals.md
- **Developed by:** [Sean](https://apify.com/dwelldata) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## US Multifamily Distress Deals — Scored & Underwritten

**Every field typed. Empty = explained. You never pay for a blank.**

Deal-level US multifamily (small apartment) listings, each with independent
underwriting and a transparent score — not a scraped listing dump. Built for
investors, wholesalers, and the agents that work for them.

### What each record contains

- **Identity & listing**: address, city, state, ZIP, source, listing URL, list price, units, sqft, year built
- **Underwriting (typed, auditable)**: advertised cap rate vs. an independent **HUD-SAFMR-underwritten** cap and NOI, **DSCR** under declared assumptions, and the gap between claimed and underwritten numbers
- **Scoring**: a 0–100 composite `deal_score`, plus independent Hot/Warm/Pass rationales for rental, wholesale, and creative-finance paths — each a machine-readable explanation, not a black box
- **Signals**: motivation score, priority signals, red flags, and any matched county distress records

#### No silent nulls

Every absent value carries a **typed reason** instead of a blank. `dscr_status` is
`computed | insufficient_data | not_applicable`; `noi_source` tells you whether a
number was stated, derived, or independently underwritten. You always know what a
value *is* and why it isn't there.

#### You never pay for a blank

Pricing is **pay-per-event: one charge per record delivered.** If your filters
match nothing, the run delivers a typed reason and **bills you $0.** There is no
"paid empty response."

### Input (all filters optional, AND-combined)

| Field | Meaning |
|---|---|
| `state` | Two-letter state code, e.g. `OH` |
| `city` | Full city name |
| `min_price` / `max_price` | List price bounds (USD) |
| `min_cap` | Minimum advertised cap rate (whole %) |
| `min_units` / `max_units` | Unit-count bounds |
| `min_score` | Minimum composite `deal_score` (0–100) |
| `status` | `Hot`, `Warm`, or `Pass` |
| `maxItems` | Cap on records delivered (and therefore on the charge) |

Leave everything blank to pull the full active feed.

### Output

One dataset item per deal, with the full typed field set above. See the
**Overview** view for the key underwriting + scoring columns.

### Coverage & freshness

Small multifamily across ~20 US metros (Midwest + Sun Belt). Listings refreshed
daily; underwriting recomputed every two days.

***

*Data provided by the DwellData real-estate data engine. Sibling Actors cover county
tax-delinquency distress signals, sheriff-sale foreclosure auctions, and scored
off-market seller leads.*

# Actor input Schema

## `state` (type: `string`):

Two-letter state code, e.g. OH.

## `city` (type: `string`):

Full city name, e.g. Dayton.

## `min_price` (type: `integer`):

Only deals listed at or above this price. Leave blank for no floor.

## `max_price` (type: `integer`):

Only deals listed at or below this price. Leave blank for no ceiling.

## `min_cap` (type: `integer`):

Whole-percent floor on the advertised cap rate, e.g. 8 keeps only 8%+ listings.

## `min_units` (type: `integer`):

Only buildings with at least this many units.

## `max_units` (type: `integer`):

Only buildings with at most this many units.

## `min_score` (type: `integer`):

Composite score: yield + DSCR + motivation + distress cross-reference.

## `status` (type: `string`):

Filter to a single scored bucket.

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

Caps records delivered, and therefore the maximum charge for the run. Defaults to 100 (about $5.00 at $0.05 per record) so an unfiltered call cannot run away. Raise it when you want a fuller pull. Zero records delivered is always free.

## Actor input object example

```json
{
  "state": "OH",
  "maxItems": 100
}
```

# Actor output Schema

## `deals` (type: `string`):

Every matching deal with its underwriting, scoring and source listing URL.

## `summary` (type: `string`):

Record count, the filters as applied, and the data guarantee.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dwelldata/us-multifamily-distress-deals").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dwelldata/us-multifamily-distress-deals").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 '{}' |
apify call dwelldata/us-multifamily-distress-deals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dwelldata/us-multifamily-distress-deals"
        }
    }
}

```

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/121Ie5vfMeScA6pAL/builds/tcqdQLyQ7YY2jxPJV/openapi.json
