# Crexi Commercial Real Estate Scraper (`solidcode/crexi-scraper`) Actor

\[💰 $1.30 / 1K] Extract commercial real estate listings from Crexi.com — addresses, asking prices and rents, square footage, cap rates, broker contacts and full-resolution photos. Search any city, county, ZIP or state, and filter by deal type, property type, price or lease rate.

- **URL**: https://apify.com/solidcode/crexi-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 77 total users, 28 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Commercial Real Estate Scraper

Pull commercial real estate listings from Crexi.com at scale — addresses and coordinates, asking prices and asking rents, square footage, lot size, broker and brokerage identity, cap rates, occupancy, and full-resolution photo galleries across for-sale, for-lease, and auction inventory in all 50 US states plus Washington DC. Built for commercial real estate investors, lenders, brokers, market researchers, and lead-generation agencies who need structured Crexi data without manually clicking through thousands of search pages.

### Why This Scraper?

- **10 property categories for sale, 6 for lease** — Office, Retail, Industrial, Land, Special Purpose and Healthcare work on both sides; Multifamily, Hospitality, Self Storage and Mobile Home Park are sale-side only because Crexi does not carry them for lease. Picking Healthcare sweeps up both medical office and senior living inventory in one pass.
- **68 distinct property subtypes come back labelled** — Warehouse, Flex, Distribution, Apartment Building, Storefront, Medical Office, Auto Shop, Manufacturing and 60 more, measured across a 4,704-listing sample.
- **All 50 US states + Washington DC** — one nationwide hotel run returned listings from 45 different states in a single 240-row pull. No per-state configuration.
- **The location box understands more than city names** — type a county (`Travis County, TX`), a ZIP (`78702`), several places at once (`Miami, Orlando, Tampa` or `Austin, TX; Dallas, TX`), or a short form like `NYC` or `Washington DC`. Every name is checked against Crexi's own place index and repaired before the search runs, so a spelling that would return nothing gets corrected instead.
- **Broker identity on 100% of sale and auction rows** — name, Crexi broker ID and a direct link to the broker's profile page, filled on 3,577 of 3,577 sale and auction listings measured, with the brokerage company on 99.5%. Lease listings carry the brokerage on 95%.
- **Photo galleries averaging 15 images per listing at 3000×2000** — median 10 shots, largest gallery 117. Sale and auction rows return the whole array; lease rows return the lead photo.
- **Asking rents unit-tagged so monthly and yearly quotes never blur** — of 504 published lease rents measured, 323 came back `$/SF/YR` and 164 `$/SF/MO`, plus per-acre monthly and yearly quotes. A rent Crexi publishes ambiguously is flagged as ambiguous rather than guessed at.
- **Two range filters matched to how Crexi actually quotes** — a total asking price for sale and auction listings, and a separate $/SF/YR rate for lease. Monthly rents are converted for you, so a $20–$40 rate band also catches a $2.50/SF/MO suite. Setting either range drops the contact-for-pricing listings so every row you get back carries a number you can screen on.
- **Paste any Crexi search URL and keep its filters** — property type, price, lease rate, city, county, ZIP and state all carry across, including multi-city and multi-ZIP links.

### Use Cases

**Investment Sourcing**

- Screen hundreds of NNN retail deals by cap rate and asking price in one run
- Find value-add multifamily assets below a price ceiling in target markets
- Identify industrial listings with high occupancy across Sun Belt states
- Pull auction listings to build a distressed-asset opportunity pipeline

**Market Research**

- Map commercial inventory by state, county, and property type
- Track average asking prices and cap rates across MSAs
- Benchmark property subtypes (flex vs. warehouse vs. manufacturing) within a market
- Monitor new listing activity over time by running on a schedule

**Lead Generation**

- Build broker contact lists by market and property type (name + brokerage + profile URL)
- Identify active listing agents in target geographies for outreach campaigns
- Find owner-represented listings (no brokerage listed) for direct approaches

**Portfolio Monitoring**

- Watch specific markets for new inventory matching your buy-box
- Cross-reference listings against your existing portfolio addresses
- Track price reductions by comparing runs over time

**Lender Underwriting**

- Pull comparable sales and lease comps by property type, subtype, and geography
- Gather occupancy and year-built data for underwriting models
- Collect cap rate data points to calibrate discount-rate assumptions

**Competitive Analysis**

- Benchmark competitor brokerages by listing volume and geography
- Identify which property categories dominate inventory in a given state
- Analyze listing age distribution to spot slow-moving product types

### Getting Started

#### Simplest — Browse by State and Deal Type

```json
{
    "dealType": "sale",
    "state": "CA"
}
```

Returns all for-sale commercial listings in California (up to the default 200-result cap).

#### Mid-level — Add Property Type and Price Filters

```json
{
    "dealType": "sale",
    "state": "TX",
    "propertyTypes": ["Office", "Retail"],
    "priceMin": 1000000,
    "maxResults": 100
}
```

Returns Texas office and retail listings priced at $1M or above, capped at 100 results.

#### Location-Level — Target a City, County, ZIP, or Several

```json
{
    "dealType": "sale",
    "city": "Travis County, TX",
    "propertyTypes": ["Multifamily"],
    "maxResults": 50
}
```

Returns multifamily listings across Travis County, Texas. The same field accepts `"Austin"`, `"78702"`, `"NYC"`, or a list like `"Miami, Orlando, Tampa"`. Add the **State** filter for an extra layer of precision.

#### Lease with a Rate Band

```json
{
    "dealType": "lease",
    "state": "IL",
    "propertyTypes": ["Office"],
    "leaseRateMin": 15,
    "leaseRateMax": 35,
    "maxResults": 200
}
```

Returns Illinois office space asking $15–$35 per square foot per year. Suites quoted per month are converted before the comparison, so nothing is missed.

#### Advanced — Paste a Crexi URL Directly

```json
{
    "startUrls": ["https://www.crexi.com/properties?states=CA&types=Office"],
    "maxResults": 500
}
```

Any filters you applied in the Crexi UI are preserved. Paste the URL from your browser and the scraper inherits your exact search configuration.

### Input Reference

#### Search

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `city` | String | *(none)* | **Location.** A city (`Austin`, `Austin, TX`), a county (`Travis County, TX`), a ZIP (`78702`), or several separated by commas or semicolons (`Miami, Orlando, Tampa`). Short forms like `NYC` and `Washington DC` work. Ignored when `startUrls` is provided. |
| `startUrls` | List | *(empty)* | One or more Crexi.com search result URLs. Whatever you filtered on Crexi (property type, price, lease rate, city, county, ZIP, state) is honoured. When provided, these replace **Location** and every **Filters** setting, which are then ignored; only `maxResults` still applies. |

#### Filters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `dealType` | Select | `For Sale` | **For Sale**, **For Lease**, **Auction**, or **All Deal Types**. "All Deal Types" returns up to `maxResults` Sale AND up to `maxResults` Lease rows (up to 2× total); it does not add auctions. Only a few dozen auctions are live at any moment, so an auction run finishes well under your `maxResults` — that is the whole auction market, not a truncated run. |
| `propertyTypes` | Multi-select | *(all)* | Limit to one or more of: Multifamily, Office, Retail, Industrial, Land, Hospitality, Special Purpose, Healthcare, Self Storage, Mobile Home Park. Leave empty to include all types. Crexi lists Multifamily, Hospitality, Self Storage and Mobile Home Park for sale only, and the run says so instead of returning nothing. |
| `state` | Select | *(all states)* | Limit results to a specific US state (Alabama through Wyoming + Washington DC). Leave blank to search nationwide. |
| `priceMin` | Integer | *(none)* | Minimum asking price in USD. Applies to **sale and auction listings only**. Leave blank for no minimum. |
| `priceMax` | Integer | *(none)* | Maximum asking price in USD. Applies to **sale and auction listings only**. Leave blank for no maximum. |
| `leaseRateMin` | Integer | *(none)* | Minimum asking rent in dollars per square foot per year, **for lease listings only**. Monthly quotes are converted automatically. Leave blank for no minimum. |
| `leaseRateMax` | Integer | *(none)* | Maximum asking rent in dollars per square foot per year, **for lease listings only**. Monthly quotes are converted automatically. Leave blank for no maximum. |

Sale and lease are quoted in different units, so they get their own range fields: a total asking price for sale and auction listings, a per-square-foot annual rent for lease. Set a range on the wrong side and the run tells you it could not apply it rather than dropping it in silence. Setting either range also excludes listings with no published number, because an undisclosed figure cannot be matched against your range. Leave them blank to include contact-for-price listings.

#### Limits

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `maxResults` | Integer | `200` | Maximum listings to collect. The last page is kept whole, so the final count may slightly exceed this. Set to `0` for no cap. |

### Output

Each row represents one commercial listing. Below is a representative for-sale record:

```json
{
  "id": 751699,
  "name": "T-Mobile Outparcel to Walmart",
  "status": "On-Market",
  "dealType": "Sale",
  "listingUrl": "https://www.crexi.com/properties/751699/california-walmart-plaza-outparcel",
  "propertyType": "Retail",
  "propertySubType": "Shopping Center",
  "description": "<p>The <strong>Walmart Plaza Shopping Center</strong>...</p>",
  "activatedAt": "2022-02-01T05:40:50.2Z",
  "updatedAt": "2026-04-04T20:08:42.857Z",
  "address": "2920 Main St",
  "city": "Susanville",
  "state": "CA",
  "zip": "96130",
  "county": "Lassen County",
  "latitude": 40.40804333639934,
  "longitude": -120.6347412391219,
  "price": 1140000.0,
  "priceFormatted": "$1,140,000",
  "pricePerSqft": 175.38,
  "leaseRate": null,
  "sqft": 6500,
  "lotSizeAcres": 1.38,
  "units": 3,
  "yearBuilt": 1997,
  "capRate": null,
  "occupancy": 50.0,
  "brokerName": "Heath Charamuga",
  "brokerId": 7123,
  "brokerProfileUrl": "https://www.crexi.com/brokers/heathc",
  "brokerageName": "Epic Real Estate Advisors, Inc",
  "brokerageLogoUrl": "https://images.crexi.com/user-accounts/...",
  "primaryImageUrl": "https://images.crexi.com/assets/751699/...jpg",
  "imageUrls": ["https://images.crexi.com/assets/751699/...jpg", "..."]
}
```

**Coverage figures below are real fill rates**, measured over 4,704 listings collected across dozens of live runs — 3,265 for sale, 1,127 for lease, 312 at auction. Brokers choose which numbers to publish, so no field except the core identity set is on every row.

#### Core & Identity Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `id` | Integer | 100% | Crexi listing ID |
| `name` | String | 100% | Listing title as shown on Crexi |
| `status` | String | 100% | `On-Market`, `Active`, `Auction`, `Call For Offers` or `Highest & Best` |
| `dealType` | String | 100% | `Sale`, `Lease`, or `Auction` |
| `listingUrl` | String | 100% | Full URL to the listing on Crexi |
| `description` | String | 99%+ | Full listing description (may include HTML) |
| `activatedAt` | String | 100% | ISO 8601 date when listing went live |
| `updatedAt` | String | Sale & auction only | ISO 8601 date of last update |

#### Address & Location Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `address` | String | 100% | Street address |
| `city` | String | 100% | City |
| `state` | String | 100% | 2-letter state code |
| `zip` | String | 100% | ZIP code |
| `county` | String | 83% sale · 54% lease · 95% auction | County name |
| `latitude` | Float | 99.9% | Latitude coordinate |
| `longitude` | Float | 99.9% | Longitude coordinate |

#### Pricing & Financial Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `price` | Float | 59% sale · 100% auction | Asking price in USD. The rest are contact-for-pricing. |
| `priceFormatted` | String | matches `price` | Human-readable price (e.g. `$1,140,000`) |
| `pricePerSqft` | Float | 25% of sale listings | Price per square foot exactly as the broker published it. Sale listings only — Crexi does not publish it on auction or lease rows. |
| `leaseRate` | String | 45% of lease listings | Published asking rent with its unit and period (e.g. `$14.40/SF/YR`, `$1.85/SF/MO`, `$3,950/AC/MO`). Ranges appear as `$18 - $24/SF/YR`. Where the broker filed some suites yearly and others monthly at the same figure, the period is marked unknown (`$2.05/SF (YR or MO)`) instead of being guessed. Null on sale listings. |
| `capRate` | Float | 20% sale · 2% auction | Capitalization rate as a percentage |
| `occupancy` | Float | 30% sale · 59% auction | Occupancy percentage |

#### Property Details Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `propertyType` | String | 100% | Top-level category (e.g. `Retail`, `Industrial`) |
| `propertySubType` | String | 95% sale · 92% auction | One of 68 observed subtypes (`Shopping Center`, `Warehouse`, `Medical Office`, `Flex`, …). Not published on lease listings. |
| `sqft` | Integer | 88% sale · 99.6% lease · 64% auction | Rentable square footage |
| `lotSizeAcres` | Float | 87% sale · 100% auction | Lot size in acres. Listings that quote the lot in square feet are converted, so the column is always acres. |
| `units` | Integer | 26% sale · 24% auction | Number of rentable units or suites — apartments, storefronts, office suites, flex bays. Published on every property category, not just multifamily. |
| `yearBuilt` | Integer | 57% sale · 49% auction | Year of construction. Roughly two sale listings in five do not publish it at all. |

#### Broker Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `brokerName` | String | 100% sale & auction | Listing broker's name |
| `brokerId` | Integer | 100% sale & auction | Crexi internal broker ID |
| `brokerProfileUrl` | String | 100% sale & auction | URL to the broker's Crexi profile |
| `brokerageName` | String | 99.5% sale · 95% lease | Brokerage company name |
| `brokerageLogoUrl` | String | 86% | URL to the brokerage logo image |

#### Media Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `primaryImageUrl` | String | 99.4% sale · 100% lease & auction | Main listing photo (3000×2000 resolution) |
| `imageUrls` | Array | 99.4% sale · 100% auction | Every photo on the listing at full resolution — 15 per listing on average, up to 117. Lease listings publish only the lead photo. |

**Lease rows are a thinner record than sale rows, because Crexi publishes less on them.** `propertySubType`, `yearBuilt`, `capRate`, `occupancy`, `units`, `lotSizeAcres`, `price`, `updatedAt`, the broker name/ID/profile URL and the full photo array are sale-and-auction only; `pricePerSqft` is sale-only. Lease listings make up for it with near-perfect square footage (99.6%), the asking rent, and the lead photo on every row.

### Tips for Best Results

- **For lease searches, set `dealType` to `For Lease`** — lease results are not included in the default For Sale run. If you need both deal types, select **All Deal Types**; note that this adds lease rows, not auction rows.
- **Type a county or ZIP into the location box, not just a city** — `Travis County, TX` covers Austin, Pflugerville, Manor, Buda and Spicewood in one search, which a city name alone would miss. `78702` narrows to a single neighbourhood.
- **Paste a pre-filtered Crexi URL for complex searches** — apply all your location, property type, and price filters directly on Crexi.com, then paste the resulting URL into `startUrls`. This is the most reliable method for highly specific queries.
- **Set `maxResults` to `0` for full market pulls** — the default cap of 200 is designed for quick test runs. Removing the cap lets you collect every matching listing across hundreds of pages.
- **Set a price or rate range to drop contact-for-price listings** — roughly 4 in 10 sale listings and better than half of lease listings are quoted only on request. Any `priceMin`/`priceMax` on sale, or `leaseRateMin`/`leaseRateMax` on lease, removes them, so every row you get back carries a figure you can screen on. Leave the fields blank when you want the full market.
- **Cap rate and occupancy are publisher-dependent, and thinner than you might expect** — measured across live runs, `capRate` lands between 12% and 52% of sale rows depending on property type and market, and `occupancy` between 20% and 73%. Filter on them after the fact rather than assuming every row has them.
- **Four categories are sale-side only** — Crexi carries Multifamily, Hospitality, Self Storage and Mobile Home Park for sale but not for lease. Pair those with **For Sale** or **All Deal Types**. Office, Retail, Industrial, Land, Special Purpose and Healthcare are available on both sides.
- **For multifamily deals, filter by `propertyTypes: ["Multifamily"]`** — then divide `price` by `sqft`, or by `units` for a per-door figure, for quick screening across apartment listings.
- **Schedule recurring runs to track new inventory** — pair this actor with Apify's scheduling feature to pull fresh listings daily or weekly, then compare against your previous dataset to surface new additions.

### Pricing

**From $1.30 per 1,000 results — no compute charges. You only pay per result returned.**

Your rate depends on your Apify discount tier. Tiered rates take effect on **6 September 2026**; until then every plan pays $1.30 per 1,000 results.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.15 | $0.14 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

### Integrations

Connect your Crexi data to the tools you already use:

- **Zapier** — trigger workflows when new listings are collected (CRM updates, Slack alerts, email notifications)
- **Make (formerly Integromat)** — route listing data into Google Sheets, Airtable, Notion, or any custom pipeline
- **Google Sheets** — use the Apify Google Sheets integration to stream results directly into a spreadsheet
- **Apify API** — call the actor programmatically and retrieve results via the Apify REST API or client SDKs
- **Webhooks** — configure a webhook to POST results to your own endpoint as soon as each run completes

### Legal & Ethical Use

This actor collects publicly available listing data from Crexi.com. Use it in accordance with Crexi's Terms of Service and all applicable laws. Do not use collected data for spam, harassment, or any purpose that violates the privacy or rights of brokers or property owners. The actor does not collect any login-gated or private information — broker phone numbers and email addresses are not available to unauthenticated users and are not included in the output.

# Actor input Schema

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

Filter by city, county or ZIP code (e.g. "Austin", "Austin, TX", "Travis County, TX" or "78702"). Common short forms work too, like "NYC" or "Washington DC". Add more than one by separating them with commas or semicolons, e.g. "Austin, TX; Dallas, TX" or "Miami, Orlando, Tampa". Combine with the State filter below for the most precise results. Ignored when you paste URLs.

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

Paste one or more Crexi.com search result URLs. Any filters you applied on Crexi (property type, price, lease rate, city, county, ZIP, state) are respected. When provided, these replace the Location and Filters settings — those fields are ignored.

## `dealType` (type: `string`):

Whether to collect sale listings, lease listings, auction listings, or all types. When 'All Deal Types' is selected, the actor returns up to maxResults Sale listings AND up to maxResults Lease listings (up to 2× total rows). Auction listings are rare on Crexi (a few dozen live at any time), so an auction run usually finishes well below your Max Results — that is the whole auction market, not a short run.

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

Only collect listings of these commercial property types. Leave empty to include all types. Crexi lists Multifamily, Hospitality, Self Storage and Mobile Home Park for sale only, so pairing one of those with Deal Type "For Lease" has nothing to return.

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

Limit results to a specific US state. Leave empty to search nationwide.

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

Only include listings at or above this asking price. Applies to sale and auction listings only — Crexi prices space for lease by the square foot per year, so use the Lease Rate range below for lease searches. Setting any price range also leaves out listings whose broker did not publish a price, since there is no way to tell whether they fall inside your range. Leave empty for no minimum.

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

Only include listings at or below this asking price. Applies to sale and auction listings only — use the Lease Rate range below for lease searches. Setting any price range also leaves out listings whose broker did not publish a price, since there is no way to tell whether they fall inside your range. Leave empty for no maximum.

## `leaseRateMin` (type: `integer`):

For lease searches only: include listings asking at or above this rate, in dollars per square foot per year (a typical office suite runs $15-$45). Listings quoted per month are converted for you, so a $20-$40 range finds both a $30/sq ft/year suite and a $2.50/sq ft/month one. Listings priced per acre cannot be compared against a per-square-foot rate and are left out; the run tells you how many. Setting any rate range also leaves out listings marked "contact for pricing", since there is no published rate to compare against. Leave empty for no minimum.

## `leaseRateMax` (type: `integer`):

For lease searches only: include listings asking at or below this rate, in dollars per square foot per year. Listings quoted per month are converted for you; listings priced per acre are left out and counted for you. Setting any rate range also leaves out listings marked "contact for pricing", since there is no published rate to compare against. Leave empty for no maximum.

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

Maximum number of listings to collect. The actor stops requesting new pages once this number is reached (the last page is kept whole, so the final count may slightly exceed this). Set to 0 for no cap.

## Actor input object example

```json
{
  "startUrls": [],
  "dealType": "sale",
  "propertyTypes": [],
  "state": "",
  "maxResults": 200
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped listings with key fields: address, price, property type, deal type, broker, and listing URL.

## `detail` (type: `string`):

All fields per listing including coordinates, media URLs, broker contacts, and property characteristics.

# 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 = {
    "startUrls": [],
    "dealType": "sale",
    "propertyTypes": [],
    "state": "",
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "startUrls": [],
    "dealType": "sale",
    "propertyTypes": [],
    "state": "",
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/crexi-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 '{
  "startUrls": [],
  "dealType": "sale",
  "propertyTypes": [],
  "state": "",
  "maxResults": 200
}' |
apify call solidcode/crexi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/crexi-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/rUT0mbDeLzoyCtX0m/builds/bRPVq46hb4jyZqeM1/openapi.json
