# Crexi Commercial Real Estate Listings & Broker Scraper (`scrapersdelight/crexi-scraper`) Actor

Scrape commercial real-estate for-sale listings from Crexi: property name, type, address, city/state/zip, asking price, cap rate, building SF, lot size, units, zoning, APN, plus the listing broker name & brokerage. Filter by state, property type, price or keyword. No login.

- **URL**: https://apify.com/scrapersdelight/crexi-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Automation, Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 per commercial listing returneds

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

## 🏢 Crexi Commercial Real Estate Listings & Broker Scraper

**Scrape commercial real-estate for-sale listings from Crexi: property name, type, full address, asking price, cap rate, building SF, lot size, units, NOI, zoning, APN — plus the listing broker name & brokerage. Filter by state, property type, price or keyword. No login, no API key.**

> 🕒 Updated: 2026-07-12 · 🇺🇸 240,000+ active US for-sale listings · 🏢 Office · Retail · Industrial · Multifamily · Land · 💰 Asking price, cap rate, NOI, SF, units · 👤 Listing broker + brokerage · 🚫 No login

Crexi is the leading US commercial real-estate marketplace. **This actor turns its live for-sale inventory into a clean, structured dataset** — every listing with the address, the investment economics an acquirer prices a deal on (asking price, cap rate, NOI, price/SF), the building & land specs, and the **listing broker + brokerage**. Point it at a state, a property type, a price range or a keyword and export to JSON, CSV, Excel or Google Sheets, or pull it via API.

Built for **CRE investors, funds, 1031 buyers, lenders, brokers running comps, and PropTech / CRE-SaaS teams** who need the commercial pipeline in a spreadsheet, refreshed on a schedule.

***

### What it does

- 🏢 **Full commercial for-sale inventory** — every active for-sale listing on Crexi, tagged by `property_types` (Office / Retail / Industrial / Multifamily / Land / …) and `sub_type`.
- 📍 **Full location** — address, city, county, state, ZIP, latitude/longitude and an opportunity-zone flag.
- 💰 **The investment economics** — `asking_price`, `cap_rate`, `proforma_cap_rate`, `noi`, `price_per_sqft`, `occupancy`, `tenancy`, `lease_type`.
- 🏗️ **Building & land specs** — `building_sqft`, `net_rentable_area`, `units`, `lot_size`, `year_built`, `year_renovated`, `buildings`, `stories`, `parking_spots`, `zoning`, `apn`, `property_class`.
- 👤 **The listing broker lead** — `broker_name`, all `broker_names`, `brokerage_name`, `broker_profile_id` + profile URL, platinum flag. *(Crexi masks the broker's direct phone/email behind a login, so those are not returned — enrich the brokerage downstream if you need them.)*
- 🎯 **Filter server-side** — by `states`, `propertyTypes`, `askingPriceMin/Max`, and a free-text `searchTerm` (city / address / keyword). Or paste specific Crexi property URLs.
- ⚡ **Fast & reliable** — reads Crexi's own structured data feed (not fragile HTML), so runs come back complete, not blocked.

### 📊 Output — one flat record per listing

| Field | Type | Example |
|---|---|---|
| 🏢 `name` | text | `Walgreens - Newark, OH` |
| 🏷️ `property_types` / `sub_type` | text | `Retail` / `Drug Store` |
| 📍 `address` / `city` / `state` / `zip` | text | `1425 N 21st St` / `Newark` / `OH` / `43055` |
| 💵 `asking_price` | number | `3725000` |
| 📈 `cap_rate` | text | `8.00%` |
| 📐 `building_sqft` / `units` | number | `14560` / `null` |
| 🏛️ `zoning` / `apn` | text | `C-4` / `054-...` |
| 🏢 `brokerage_name` | text | `Marcus & Millichap` |
| 👤 `broker_name` | text | `Jane Broker` |
| 🔗 `url` | link | `https://www.crexi.com/properties/2622616/...` |

Plus `listing_id`, `description`, `investment_type`, `property_class`, `status`, `is_sold`, `is_unpriced`, `county`, `state_name`, `full_address`, `latitude`, `longitude`, `is_opportunity_zone`, `proforma_cap_rate`, `noi`, `price_per_sqft`, `occupancy`, `tenancy`, `lease_type`, `net_rentable_area`, `lot_size`, `year_built`, `year_renovated`, `buildings`, `stories`, `parking_spots`, `broker_names`, `broker_profile_id`, `broker_is_platinum`, `broker_profile_url`, `thumbnail_url`, `num_images`, `has_offering_memorandum`, `has_flyer`, `has_video`, `marketing_description`, `activated_on`, `updated_on`, `scraped_at`.

<details><summary>🏢 Sample record</summary>

```json
{
  "listing_id": "2622616",
  "url": "https://www.crexi.com/properties/2622616/new-york-855-route-28",
  "name": "855 Route 28",
  "sale_type": "For Sale",
  "property_types": "Business for Sale, Retail",
  "sub_type": "Business Only, Restaurant, QSR/Fast Food, Bar",
  "status": "On-Market",
  "address": "855 Route 28", "city": "Kingston", "county": "Ulster County",
  "state": "NY", "zip": "12401",
  "asking_price": 779000,
  "building_sqft": null, "lot_size": "3 acres", "year_built": "2007", "zoning": "MU-1",
  "apn": "3000-038.004-0001-017.200-0000",
  "brokerage_name": "BHHS Nutshell Realty",
  "broker_name": "Zachary Jarvis",
  "broker_profile_url": "https://www.crexi.com/profiles/zacharyjarv",
  "scraped_at": "2026-07-12T00:00:00.000Z"
}
```

</details>

***

### Input

| Field | What it does |
|---|---|
| **Search term** | Free-text city / address / keyword, e.g. `Dallas`. Matches Crexi's own search box. |
| **States** | Two-letter US state codes, e.g. `["TX","FL"]`. Leave empty to scan the whole country. |
| **Property types** | Limit to Office / Retail / Industrial / Multifamily / Land / … Leave empty for all. |
| **Min / Max asking price** | Optional price band, in USD. |
| **Start URLs** | Optional. Specific Crexi property URLs to scrape directly. |
| **Fetch full property details** | On = cap rate, SF, units, NOI, zoning, APN… Off = faster/cheaper search-row fields only. |
| **Fetch listing broker** | On = broker name + brokerage per listing. |
| **Max results** | Cap per run. `0` = pull everything (up to a safety cap). |
| **Proxy** | Default Apify Proxy is fine — the data feed is not IP-blocked. |

### Typical uses

- 📋 Build a **statewide commercial acquisition pipeline** refreshed daily.
- 🎯 Filter for **8%+ cap-rate net-lease retail** under a price threshold in target states.
- 🏷️ Feed listings + the listing broker into a **CRM, comps model or CRE deal dashboard**.

***

*Public listing data. You are responsible for complying with Crexi's Terms of Service and applicable laws. Not affiliated with CREXi, Inc. Broker direct phone/email are login-gated on Crexi and are not collected.*

# Actor input Schema

## `searchTerm` (type: `string`):

Optional free-text search, e.g. "Dallas", "Miami retail", or a street name. Matches how Crexi's own search box works. Leave empty to scan by state / property type / price only.

## `states` (type: `array`):

Two-letter US state codes to scan, e.g. \["TX", "FL", "CA"]. Leave EMPTY to scan the whole country.

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

Optional. Limit to these commercial property types. Leave empty for all types.

## `askingPriceMin` (type: `integer`):

Optional. Only listings at or above this asking price.

## `askingPriceMax` (type: `integer`):

Optional. Only listings at or below this asking price.

## `startUrls` (type: `array`):

Optional. Paste Crexi property URLs, e.g. https://www.crexi.com/properties/2622616/new-york-855-route-28 . Each specific listing is scraped. Use this OR the search filters above.

## `includeDetails` (type: `boolean`):

Fetch the per-listing detail page for cap rate, building SF, units, NOI, occupancy, year built, zoning, APN, etc. Turn OFF for a faster, cheaper run that returns only the search-row fields (name, type, address, asking price, brokerage).

## `includeBroker` (type: `boolean`):

Fetch the listing broker name + brokerage for each property. (Crexi masks the broker's direct phone/email behind a login, so those are NOT returned.)

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

Cap on the number of listings returned this run (cost/speed guard). Default 100; set 0 to pull every matching listing (up to a safety cap).

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

Proxy settings. Crexi's data API is not IP-blocked, so the default Apify Proxy is fine.

## Actor input object example

```json
{
  "searchTerm": "Austin",
  "includeDetails": true,
  "includeBroker": true,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `records` (type: `string`):

The dataset of scraped Crexi commercial for-sale listings (one item per property).

# 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 = {
    "searchTerm": "Austin",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/crexi-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 = {
    "searchTerm": "Austin",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/crexi-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 '{
  "searchTerm": "Austin",
  "maxResults": 20
}' |
apify call scrapersdelight/crexi-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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