# Commercial Real Estate Deal Finder: LoopNet + Crexi Deal Score (`nextgenmedia/cre-deal-finder`) Actor

Find underpriced US commercial properties for sale. Combines LoopNet and Crexi, removes duplicates and scores every listing 0-100 on below-market price per sqft, cap rate spread, price cuts, days on market and motivated-seller language. Daily alerts for new deals and price drops.

- **URL**: https://apify.com/nextgenmedia/cre-deal-finder.md
- **Developed by:** [SHUBHAM SRIVASTAVA](https://apify.com/nextgenmedia) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 scored deals

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Commercial Real Estate Deal Finder: LoopNet + Crexi Deal Score

**CRE Deal Finder** finds **underpriced commercial properties for sale in the US**. It pulls listings from **LoopNet and Crexi**, removes duplicates of the same building, and gives every property a **Deal Score from 0 to 100**. The score explains in plain English **why** a listing is interesting: priced below the local **$/sqft**, a **higher cap rate** than similar properties, **price cuts**, **long days on market** or **motivated-seller language**.

Stop scrolling two portals and building spreadsheets. Get a ranked list of the best **commercial real estate deals** in your markets, and turn on **daily alerts for new listings and price drops**.

### 🚀 What does CRE Deal Finder do?

- ✅ **Searches LoopNet and Crexi together** for commercial properties for sale
- ✅ **Removes duplicates**: the same building listed on both portals becomes one row with both links
- ✅ **Calculates price per square foot** and compares it with the **market median** of similar properties
- ✅ **Compares cap rates** with the local median (cap rate spread)
- ✅ **Detects price cuts**, from price history and between your runs
- ✅ **Counts days on market** to find stale listings and tired sellers
- ✅ **Reads the listing text** for "motivated seller", "value-add", "below appraisal", "bank-owned", "owner financing" and more
- ✅ **Deal Score 0–100** with tiers 🔥 **hot**, **warm**, **watch**, and the reasons behind every score
- ✅ **Daily deal alerts:** schedule it, and later runs return only **new listings and new price drops**
- ✅ **Pay only for deals delivered**: filtered-out listings are free

### 👥 Who is it for?

| You are… | Use it to… |
|---|---|
| **CRE investor / syndicator** | Find below-market multifamily, retail, industrial and office deals before others |
| **Commercial broker** | Spot stale listings and price cuts, the owners most open to a new broker or buyer |
| **Acquisitions analyst** | Replace hours of spreadsheet comps with a ranked deal list every morning |
| **1031 exchange buyer** | Screen replacement properties quickly by cap rate and $/sqft |
| **PropTech / data team** | Feed clean, scored CRE listings into your CRM, dashboard or AI agent |

### 📊 How the Deal Score works

| Signal | What it measures | Max points |
|---|---|---|
| **Below market $/sqft** | Discount vs median $/sqft of the same property type in the same city | 35 |
| **Cap rate spread** | Cap rate above the local median for the property type | 20 |
| **Price cuts** | Reduction from the previous or original price, or since your last run | 20 |
| **Days on market** | 90+, 180+ and 365+ days listed | 15 |
| **Motivated-seller language** | "Must sell", "value-add", "bank-owned", "owner financing", "below appraisal"… | 15 |
| **Listed on several portals** | Seller pushing hard on both LoopNet and Crexi | 5 |

**60+ = 🔥 hot · 35–59 = warm · below 35 = watch.**

Benchmarks are built from **at least 5 comparable listings** in the same run. With fewer comps the Actor never invents a market median: it falls back to all markets in the run, or leaves that signal out.

### 🛠️ How to find commercial real estate deals (step by step)

1. Add one or more **markets**, e.g. `Austin, TX`, `Phoenix, AZ`, `Columbus, OH`.
2. Choose a **property type** (multifamily, retail, industrial, office, land…) or keep *Any*.
3. Optionally set a **price range** and a **minimum Deal Score** (e.g. 35 to get warm and hot deals only).
4. Click **Start**. Results come sorted with the best deals first.
5. For **daily alerts**, turn on *Monitor mode*, save the input as a Task and schedule it every morning.

💡 **Tip:** Already have LoopNet or Crexi searches with your exact filters? Paste those URLs in the *Advanced* section.

### ⬇️ Input example

```json
{
  "markets": ["Austin, TX", "San Antonio, TX"],
  "propertyType": "multifamily",
  "sources": ["loopnet", "crexi"],
  "minPrice": 1000000,
  "maxPrice": 10000000,
  "minDealScore": 35,
  "monitorMode": true
}
```

### ⬆️ Output example

```json
{
  "dealScore": 100,
  "dealTier": "hot",
  "dealReasons": [
    "30% below median $/sqft ($140 vs $200, market)",
    "Cap rate 8% is 2 pts above median 6% (market)",
    "Price cut 17.6% from $1,700,000",
    "On market 257 days",
    "Seller says motivated / must sell",
    "Value-add opportunity",
    "Listed on 2 portals"
  ],
  "title": "Retail Building – Main Street",
  "propertyGroup": "retail",
  "address": "150 Main Street, Austin, TX 78701",
  "city": "Austin",
  "state": "TX",
  "askingPrice": 1400000,
  "buildingSqft": 10000,
  "pricePerSqft": 140,
  "marketMedianPricePerSqft": 200,
  "discountToMarketPct": 30,
  "capRate": 8,
  "marketMedianCapRate": 6,
  "capRateSpread": 2,
  "previousPrice": 1700000,
  "priceCutPct": 17.6,
  "daysOnMarket": 257,
  "sources": ["loopnet", "crexi"],
  "sourceUrls": { "loopnet": "https://www.loopnet.com/Listing/...", "crexi": "https://www.crexi.com/properties/..." },
  "monitorStatus": "new"
}
```

Two ready-made views: **Deals** (score, price, $/sqft vs market, cap rate, cuts, reasons) and **Property & broker details**.

### 💰 Pricing

**$8 per 1,000 deals delivered**, which is under 1 cent per scored property. You pay only for listings you receive after your filters. Listings below your minimum Deal Score, or already sent in monitor mode, cost nothing.

CRE Deal Finder collects listings with the [LoopNet](https://apify.com/memo23/loopnet-scraper-ppe) and [Crexi](https://apify.com/memo23/crexi-ppe) scrapers. Their usage (about $1.50–$1.90 per 1,000 listings) is billed to your Apify account separately. **Example:** checking 1,000 listings and receiving the 150 best deals costs about $3–4 in total.

### 🔗 Integrations

- **Google Sheets:** export new deals automatically
- **Slack, email, Telegram:** send 🔥 hot deals via Make, Zapier or n8n
- **CRMs** (HubSpot, Pipedrive, Airtable) via webhooks
- **Apify API:** run from Python, JavaScript, or an AI agent

### ❓ FAQ

**Which property types are supported?**
Multifamily, retail, office, industrial, land, hospitality, self-storage, mixed-use and special-purpose properties for sale anywhere in the US.

**Why do some listings have no $/sqft or cap rate?**
Land often has no building size, and many listings show "price on request" or no cap rate. Those signals are skipped for that listing, and it can still score on cuts, days on market and seller language.

**How is "market median" calculated?**
From comparable listings in the same run: same city and state, same property type, with at least 5 comps. Search a whole metro or several nearby cities for better benchmarks.

**How does monitor mode work?**
The first run returns everything that matches. Each later run with the **same input** returns only listings that are new or whose price dropped since the previous run.

**Is a high Deal Score investment advice?**
No. The score is a screening tool that ranks listings for further review. Always do your own due diligence before making an offer.

**Is scraping LoopNet and Crexi legal?**
This Actor works with publicly listed property information. You are responsible for using the data in line with the portals' terms and applicable laws. See [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

**Found a bug or need a new signal?** Open an issue on the **Issues** tab.

***

*Keywords: commercial real estate deals, CRE deal finder, LoopNet scraper, Crexi scraper, underpriced commercial property, cap rate, price per square foot, motivated seller, price reduced commercial property, multifamily deals, off-market style deals, CoStar alternative, real estate investor tool.*

# Actor input Schema

## `markets` (type: `array`):

US cities to search, as "City, ST". One per line, e.g. Austin, TX.

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

Type of commercial property to find. "Any commercial" searches all types.

## `sources` (type: `array`):

Which portals to search. Using both finds more deals and removes duplicates between them.

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

Only include listings with an asking price at or above this amount (USD). Leave empty for no minimum.

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

Only include listings with an asking price at or below this amount (USD). Leave empty for no maximum.

## `minDealScore` (type: `integer`):

35+ = warm, 60+ = hot. You only pay for listings you receive.

## `onlyBelowMarket` (type: `boolean`):

Keep only listings whose price per sqft is below the median of similar properties in the same market.

## `monitorMode` (type: `boolean`):

Schedule the same input daily. After the first run you only receive NEW listings and listings whose price dropped since the last run.

## `maxListingsPerSource` (type: `integer`):

How many listings to collect from each portal per market before scoring. More listings give better market benchmarks but take longer (50 ≈ 2–3 minutes).

## `includeBrokerContacts` (type: `boolean`):

Fetches broker name, company and phone where public. Slower, and adds the source Actors' detail-page charges.

## `loopnetStartUrls` (type: `array`):

Paste LoopNet for-sale search URLs to use your exact filters instead of Markets.

## `crexiStartUrls` (type: `array`):

Paste Crexi property search URLs to use your exact filters instead of Markets.

## `sourceTimeoutSecs` (type: `integer`):

LoopNet and Crexi runs are stopped after this time and whatever they collected is scored. Raise it for very large searches.

## `sourceMemoryMbytes` (type: `integer`):

Memory for each LoopNet / Crexi run. The default works for most searches.

## Actor input object example

```json
{
  "markets": [
    "Austin, TX"
  ],
  "propertyType": "any",
  "sources": [
    "loopnet",
    "crexi"
  ],
  "minDealScore": 0,
  "onlyBelowMarket": false,
  "monitorMode": false,
  "maxListingsPerSource": 50,
  "includeBrokerContacts": false,
  "sourceTimeoutSecs": 200,
  "sourceMemoryMbytes": 4096
}
```

# Actor output Schema

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

No description

## `details` (type: `string`):

No description

## `summary` (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 = {
    "markets": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nextgenmedia/cre-deal-finder").call(input);

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = { "markets": ["Austin, TX"] }

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

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

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

```

## CLI example

```bash
echo '{
  "markets": [
    "Austin, TX"
  ]
}' |
apify call nextgenmedia/cre-deal-finder --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

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