# Crexi Listings Scraper (`piotrv1001/crexi-listings-scraper`) Actor

Scrape Crexi.com commercial real estate listings for sale, auction or lease: asking price, $/sq ft, size, address, brokerage and dates. Optional broker phones and licenses, cap rate, descriptions, auction terms and photos. Filters or search URLs, no 1,500-result cap.

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

## Pricing

from $2.00 / 1,000 listings

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

### 🏢 Crexi Listings Scraper

**Crexi Listings Scraper** extracts commercial real estate listings from **[Crexi.com](https://www.crexi.com/)**, one of the largest US marketplaces for commercial property, with no login and no API key. It covers **properties for sale (including auctions)** and **spaces for lease**. Search with simple filters (property type, state, city, price, cap rate, size, sale type) or paste any Crexi search URL. You get clean JSON with **asking price, price per sq ft, size, address with GPS, brokerage and listing dates**. You can also add the **listing brokers with phone numbers and licenses, cap rate, full description, property facts, auction terms and all photos**.

Run it on the **[Apify platform](https://apify.com/)** to get scheduling, an API, webhooks and exports to Google Sheets, Excel or CSV.

### ✨ Features

- 🏷️ **Sale and lease.** Over 250,000 properties for sale and 175,000 lease listings across every US state: retail, multifamily, office, industrial, hospitality, land, self storage, mobile home parks, notes and businesses for sale.
- 📞 **Broker contacts.** Turn on **Include details** to add each listing broker's name, brokerage, brokerage website and address, license numbers and phone number where one is on record (about half of brokers).
- 💰 **Investment data.** Asking price, price per sq ft, cap rate, lot size, investment type, opportunity zone flag, tenant brand, zoning, and auction terms (starting bid, bidding end, deposits, closing period).
- 🔍 **Filters or URLs.** Use the built-in filters, or set up a search on crexi.com and paste the URL. Filters, sort and page are kept.
- 📦 **No 1,500-result cap.** Crexi stops at 1,500 results per search. The Actor splits large searches automatically, so you can collect a whole state or the entire marketplace. Each listing appears once, even when searches overlap.
- 🗓️ **Fresh listings.** Sort by newest and use **Listed within (days)** for a daily or weekly feed of new listings.

### 💡 Use cases

- **Deal sourcing.** Track new NNN, multifamily or industrial listings in your target markets every morning.
- **Broker lead lists.** Build lists of active CRE brokers and brokerages by state and property type, with phones and licenses.
- **Market research.** Compare asking prices, price per sq ft and cap rates by market and asset class.
- **Lease comps.** Collect asking rents and available spaces by city and property type.
- **Auction monitoring.** Follow upcoming auctions with starting bids and bidding deadlines.

### 🛠️ How to use

1. **Choose what to search.** Pick **For sale** or **For lease** and fill in the filters (for example Property types `Retail`, States `Texas`), or paste one or more Crexi search URLs.
2. **Set Max listings.** The default is 50. Use 0 for every result.
3. **(Optional) Turn on Include details** to get brokers, cap rate, the description and photos.
4. **Run** the Actor, then export the dataset as JSON, CSV or Excel, or read it through the API.

With empty input the Actor returns the 50 newest properties for sale.

### 📥 Input

| Field                       | Type    | Description                                                                                                                                   |
| --------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchUrls`                | array   | Crexi search URLs (`/properties?...` or `/lease/properties?...`). When set, the filter fields are ignored.                                    |
| `listingType`               | string  | `sale` (default, includes auctions) or `lease`                                                                                                |
| `propertyTypes`             | array   | `Retail`, `Multifamily`, `Office`, `Industrial`, `Hospitality`, `Mixed Use`, `Land`, `Self Storage`, `Mobile Home Park`, `Senior Living`, ... |
| `states`                    | array   | US state codes, e.g. `TX`, `FL`                                                                                                               |
| `cities`                    | array   | `City, ST`, e.g. `Austin, TX`. A city without a state is combined with the selected states.                                                   |
| `keyword`                   | string  | Free-text search, e.g. `walgreens`                                                                                                            |
| `saleTypes`                 | array   | For sale only: `Auction`, `On-Market`, `Call For Offers`, `Highest & Best`                                                                    |
| `priceMin` / `priceMax`     | integer | For sale only: asking price range in USD                                                                                                      |
| `capRateMin` / `capRateMax` | number  | For sale only: cap rate range in %                                                                                                            |
| `sqFtMin` / `sqFtMax`       | integer | Building size (or space size for lease) in sq ft                                                                                              |
| `postedWithinDays`          | integer | Only listings that went live in the last N days                                                                                               |
| `sort`                      | string  | `newest` (default), `recommended`, `updated`, `priceAsc`, `priceDesc`, `sizeDesc`, `capRateDesc`, `auctionEnding`                             |
| `maxItems`                  | integer | Maximum listings to save. Default `50`, `0` = no limit.                                                                                       |
| `includeDetails`            | boolean | Add brokers, cap rate, description, property facts, auction terms, photos and lease spaces. Default `false`.                                  |

Example:

```json
{
    "listingType": "sale",
    "propertyTypes": ["Retail"],
    "states": ["TX", "FL"],
    "capRateMin": 6,
    "priceMax": 5000000,
    "maxItems": 200,
    "includeDetails": true
}
```

Or paste a URL:

```json
{
    "searchUrls": ["https://www.crexi.com/properties?types%5B%5D=Multifamily&states%5B%5D=TX&sort=New%20Listings"],
    "maxItems": 0
}
```

### 📤 Output

Each listing is one dataset item:

```json
{
    "id": "2734960",
    "url": "https://www.crexi.com/properties/2734960/new-york-128-fahy-avenue",
    "listingType": "sale",
    "name": "128 Fahy Avenue",
    "subtitle": "Multifamily | 1 Unit",
    "status": "On-Market",
    "propertyTypes": ["Multifamily"],
    "address": "128 Fahy Avenue",
    "city": "Staten Island",
    "county": null,
    "state": "NY",
    "zip": "10314",
    "latitude": 40.618868,
    "longitude": -74.164932,
    "fullAddress": "128 Fahy Avenue, Staten Island, NY 10314",
    "locationCount": 1,
    "brokerageName": "Re/Max Edge",
    "brokerName": "Chu Chu Chen",
    "thumbnailUrl": "https://crexi.com/images/format=auto,width=716,height=444,fit=cover/assets/2734960/2310178dd65a4aa2a073f7ae0ba73161.JPG",
    "imageCount": 34,
    "isNew": true,
    "activatedOn": "2026-10-05T12:02:40.319Z",
    "updatedOn": "2026-10-05T12:02:48.431Z",
    "askingPrice": 875000,
    "pricePerSqFt": 332.45,
    "squareFootage": 2632,
    "investmentType": null,
    "isInOpportunityZone": false,
    "offersDueOn": null,
    "hasOfferingMemorandum": false,
    "hasFlyer": true
}
```

Lease listings have `numberOfSpaces`, `rentableSqFtMin`, `rentableSqFtMax`, `rateYearly`, `rateMonthly` and `rateType` instead of the sale price fields. Portfolio listings also have a `locations` array with every property.

With **Include details** on, each item also has:

```json
{
    "propertySubtypes": ["Sports/Entertainment"],
    "marketingDescription": "The Orpheum at 216 State Street, Madison, WI 53703 offers a rare opportunity to acquire ...",
    "investmentHighlights": "Cresa is pleased to present the opportunity to acquire the Orpheum Theatre ...",
    "propertyDetails": {
        "Property Type": "Retail, Special Purpose",
        "Class": "A",
        "Square Footage": "41,930",
        "Stories": "3",
        "Zoning": "Downtown Core (DC), Designated Landmark (HIST-L)",
        "Lot Size (SqFt)": "19,469",
        "Ground Lease": "No"
    },
    "capRate": 8,
    "lotSizeAcres": null,
    "brokers": [
        {
            "name": "Tim Rikkers",
            "brokerage": "Cresa Madison",
            "brokerageWebsite": "https://www.cresa.com/madison-wi",
            "brokerageAddress": "613 Williamson St, Madison, WI, 53703",
            "phone": "608-467-0720",
            "licenses": ["WI 72972-94"],
            "isAuctioneer": false,
            "listingsCount": 14,
            "photoUrl": "https://crexi.com/images/format=auto,width=164,height=164,fit=cover/users/382866/8ca740f0200a4fbeba6de6298ce04302.jpg"
        }
    ],
    "imageUrls": [
        "https://crexi.com/images/format=auto,width=3000,height=2000/assets/2734805/cdb8783a304543e59ff3d57e4dd5994f.JPG"
    ],
    "isSold": false,
    "auction": null,
    "createdOn": "2026-10-04T13:51:18.022Z"
}
```

Auction listings have `auction` with `startingBid`, `biddingEndsOn`, `participationDeposit`, `earnestDeposit`, `closingDays` and `auctioneer`. Lease listings have a `spaces` array with each available suite (rate, size, monthly rent, lease type and description).

Fields the broker left empty are `null`. Some facts (NOI, occupancy, year built, APN) are shown by Crexi only to signed-in users and are not included.

### 💰 How much does it cost to scrape Crexi?

The Actor uses pay-per-event pricing, so you pay only for listings you get:

| Event           | Price                     | When it's charged                                                |
| --------------- | ------------------------- | ---------------------------------------------------------------- |
| Actor start     | **$0.00005**              | Once per run                                                     |
| Listing         | **$0.002** ($2 per 1,000) | For every saved listing                                          |
| Listing details | **$0.003** ($3 per 1,000) | On top of the listing price, for each listing saved with details |

For example, 1,000 listings cost about **$2.00**, or **$5.00** with brokers, cap rates, descriptions and photos. Set a maximum cost per run in Apify, and the Actor stops when it reaches that cost.

### ⚙️ Tips

- **Large runs:** searches with more than 1,500 results are collected in slices by listing date, so the output is grouped by listing date rather than by your sort order.
- **Daily monitoring:** schedule a run with `sort: newest` and `postedWithinDays: 1` to collect only new listings.
- **Map locations in URLs:** a pasted URL keeps whole-state locations. For a city, county or map area, use the `states` and `cities` fields (or the `zips[]`, `cities[]` URL parameters).
- **Skip details when you don't need them.** Listing rows already include price, size, address, brokerage and dates.

### ❓ FAQ

**Is it legal to scrape Crexi?**
The Actor collects only publicly visible listing information. Broker names and phone numbers are business contact data published by the brokers. You are responsible for using it lawfully and for respecting Crexi's terms.

**Do I need a proxy or a Crexi account?**
No. The default Apify proxy is preselected and works, and no login is needed.

**Is there a result limit?**
No. The Actor works around Crexi's 1,500-result limit per search. `maxItems` and your maximum cost per run are the only limits.

**Why did a run return fewer listings than requested?**
Either the search had fewer results, or some listings went off the market between the search and the detail visit. Those are skipped and not charged. The run's status message explains any shortfall.

### 🛟 Support

Missing a field or a filter? Open an issue in the **Issues** tab. Feedback and feature requests are welcome.

# Actor input Schema

## `searchUrls` (type: `array`):

Crexi search result URLs copied from your browser after setting filters on crexi.com, e.g. https://www.crexi.com/properties?types%5B%5D=Retail\&states%5B%5D=TX or https://www.crexi.com/lease/properties?types%5B%5D=Office. Filters, sort and page in the URL are kept. Locations picked on the map are kept for whole states only - for cities use the fields below. When you add URLs, the filter fields below are ignored.

## `listingType` (type: `string`):

Search properties for sale or spaces for lease.

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

One or more property types (any of them matches). Lease searches support Retail, Office, Industrial, Land, Restaurant and Special Purpose.

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

One or more US states.

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

Cities as "City, ST", e.g. "Austin, TX". A city without a state is combined with the states selected above.

## `keyword` (type: `string`):

Free-text search, e.g. "walgreens", "NNN" or "cold storage".

## `saleTypes` (type: `array`):

For-sale only: auctions, regular listings or offer processes.

## `priceMin` (type: `integer`):

For-sale only.

## `priceMax` (type: `integer`):

For-sale only.

## `capRateMin` (type: `number`):

For-sale only, e.g. 6.5.

## `capRateMax` (type: `number`):

For-sale only.

## `sqFtMin` (type: `integer`):

Smallest building size (or space size for lease).

## `sqFtMax` (type: `integer`):

Largest building size (or space size for lease).

## `postedWithinDays` (type: `integer`):

Only listings that went live in the last N days, e.g. 7 for a weekly feed. Also applies to search URLs. Empty = any time.

## `sort` (type: `string`):

Order of results (lease searches support newest, recommended and recently updated). Runs over 1,500 listings are collected in listing-date slices, so their order is by listing date.

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

Maximum number of listings to save across all searches. 0 = no limit (every listing of the search, past the site's 1,500-result limit).

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

Also load every listing's details: listing brokers with brokerage, licenses and phone where published, cap rate, lot size, full marketing description and investment highlights, property facts, auction terms, all photo URLs and (for lease) every available space. Costs an extra detail event per listing.

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

The default Apify proxy works for Crexi.

## Actor input object example

```json
{
  "listingType": "sale",
  "propertyTypes": [
    "Retail"
  ],
  "states": [
    "TX"
  ],
  "sort": "newest",
  "maxItems": 50,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "propertyTypes": [
        "Retail"
    ],
    "states": [
        "TX"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/crexi-listings-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 = {
    "propertyTypes": ["Retail"],
    "states": ["TX"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/crexi-listings-scraper").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 '{
  "propertyTypes": [
    "Retail"
  ],
  "states": [
    "TX"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/crexi-listings-scraper --silent --output-dataset

```

## MCP server setup

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

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/5FR7b116DNiUrYKjp/builds/PklGJSL3quhHVg2as/openapi.json
