# Crexi Commercial Property Scraper by Cap Rate and Price (`talcoe/crexi-commercial`) Actor

Pull for sale commercial listings from Crexi filtered by state, property type, keyword, asking price and minimum cap rate, with broker and details, billed per result.

- **URL**: https://apify.com/talcoe/crexi-commercial.md
- **Developed by:** [M Usama](https://apify.com/talcoe) (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 $5.00 / 1,000 results

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

### What does Crexi Commercial Property Scraper do?

You want every warehouse in Texas under $2 million, or every retail listing in Florida with a cap rate over 7%, in a spreadsheet instead of forty browser tabs. This Actor reads Crexi's public search and returns for sale commercial listings with asking price, property type, square footage, address, brokerage, listing dates, description and more. Filters keep each run small, and you pay per result.

### Data source

The Actor calls the same public JSON search that the Crexi website uses, so listings are as fresh as the site, and it needs no login.

### Why use it?

- Build a weekly list of new listings in your market and send it to Slack or Google Sheets.
- Find brokers who hold the most listings in a property type and state, then reach out.
- Track asking prices and price per square foot across a county or a whole state.
- Replace manual browsing and copy paste with a scheduled export.

### How to use it

1. Open the Actor and set the filters.
2. Click Start. Download results as JSON, CSV or Excel, or read them through the API.
3. Add a Schedule and an Integration (Slack, Google Sheets, webhook) to get new records automatically.

### Input

| Field | Description |
|---|---|
| `keywords` | Free text search, for example `warehouse` or `medical`. |
| `states` | Two letter US state codes, for example `["TX", "FL"]`. |
| `propertyTypes` | Crexi property types such as Office, Retail, Industrial, Multifamily, Land, Hospitality, Mixed Use. |
| `minPrice`, `maxPrice` | Asking price range in USD. |
| `minCapRate` | Only listings at or above this cap rate, in percent. |
| `includeDetails` | Open each listing for description, zoning, lot size and more. On by default. |
| `maxResults` | Hard stop for the run. You are billed per result, so this caps the cost. |
| `proxyConfiguration` | Apify proxy is recommended for larger runs. |

Example input:

```json
{
    "keywords": "warehouse",
    "states": ["TX"],
    "propertyTypes": ["Industrial"],
    "maxResults": 30
}
```

### Output

Every record has the same shape:

```json
{
    "id": "1745156",
    "title": "Penner",
    "url": "https://www.crexi.com/properties/1745156/texas-penner",
    "askingPrice": 423500,
    "propertyTypes": ["Industrial", "Mixed Use", "Retail"],
    "capRate": null,
    "squareFootage": 3850,
    "address": "1315 S Mechanic St",
    "city": "El Campo",
    "state": "TX",
    "zip": "77437",
    "brokerage": "The Real Estate Service",
    "status": "On-Market",
    "listedAt": "2025-01-10T01:05:43.614Z",
    "updatedAt": "2026-09-13T03:27:58.18Z",
    "subtypes": ["Distribution", "Flex", "Warehouse"],
    "stories": 1,
    "lotSize": "32,108",
    "zoning": "Commercial",
    "isOpportunityZone": true,
    "latitude": 29.18,
    "longitude": -96.26
}
```

| Field | Meaning |
|---|---|
| `id` | Stable Crexi listing id, safe for deduplication between runs |
| `askingPrice` | Asking price in USD, empty when the listing is unpriced |
| `capRate` | Cap rate in percent when Crexi shows it publicly, otherwise empty |
| `brokerage` | Listing brokerage, empty when Crexi does not show one |
| `listedAt`, `updatedAt` | ISO timestamps |
| `description`, `highlights` | Listing text, with HTML removed (needs `includeDetails`) |

### Pricing

Pay per event: a fixed price per result returned. You only pay for records that pass your filters. Set `maxResults` to cap any run.

### Limitations

- Crexi serves at most 1,499 listings per search. For bigger pulls, run one search per state or property type.
- Crexi hides cap rate, NOI, occupancy and similar fields from visitors who are not logged in, so those fields are empty on most records. The `minCapRate` filter still works.
- Only for sale listings are returned. Lease listings are not covered.
- No broker names, phone numbers or emails are returned, only the brokerage name Crexi shows publicly.

### FAQ

**Is this legal?** The Actor reads listings the site publishes for any visitor without a login and stores only business information published for that purpose. You are responsible for how you use the data.

**Something is missing or broken?** Open an issue in the Issues tab; response time is usually under a day.

# Actor input Schema

## `keywords` (type: `string`):

Free text search across listings, for example warehouse, medical, or a street name. Leave empty for all listings.

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

Two letter US state codes, for example TX or FL. Leave empty for the whole country.

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

Crexi property types: Office, Retail, Industrial, Multifamily, Land, Hospitality, Mixed Use, Self Storage, Special Purpose, Senior Living, Mobile Home Park, Note.

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

Only return listings asking at least this much.

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

Only return listings asking at most this much.

## `minCapRate` (type: `number`):

Only return listings with a cap rate at or above this percentage.

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

Open each listing to add description, year built, cap rate, NOI and zoning. Slower, but a much richer record.

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

Hard stop for the run. You are billed per result, so this caps the cost. Crexi serves at most 1,499 listings per search, so split bigger pulls by state or type.

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

Apify proxy is recommended for larger runs.

## Actor input object example

```json
{
  "keywords": "warehouse",
  "states": [
    "TX"
  ],
  "propertyTypes": [
    "Industrial"
  ],
  "includeDetails": true,
  "maxResults": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "keywords": "warehouse",
    "states": [
        "TX"
    ],
    "propertyTypes": [
        "Industrial"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("talcoe/crexi-commercial").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 = {
    "keywords": "warehouse",
    "states": ["TX"],
    "propertyTypes": ["Industrial"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("talcoe/crexi-commercial").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 '{
  "keywords": "warehouse",
  "states": [
    "TX"
  ],
  "propertyTypes": [
    "Industrial"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call talcoe/crexi-commercial --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,talcoe/crexi-commercial"
        }
    }
}
```

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/OVCnaJ3eDC4b2Mb1R/builds/O6igXvII6eChrNPNj/openapi.json
