# 🏢 Crexi CRE Scraper (`skootle/crexi-commercial-real-estate-scraper`) Actor

Scrape Crexi commercial real estate listings into 50+ fields per listing: asking price, cap rate, NOI, building size, lot size, year built, asset class, broker contacts, geo coordinates, photos. Numeric mirrors on every monetary field. Export, run via API, schedule, or integrate with other tools.

- **URL**: https://apify.com/skootle/crexi-commercial-real-estate-scraper.md
- **Developed by:** [Skootle](https://apify.com/skootle) (community)
- **Categories:** Real estate, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 listing records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 hero](https://raw.githubusercontent.com/kesjam/skootle-actors-assets/main/heroes/crexi-commercial-real-estate.png)

### TL;DR

Scrape Crexi commercial real estate listings into a normalized JSON schema with 50+ fields per listing: asking price, cap rate, NOI, building size, lot size, year built, asset class + sub-type, listing status, days on market, broker contacts, portfolio sub-properties, geo coordinates, image URLs, and Investment Highlights. Numeric mirrors on every monetary/numeric field for analytics. Built on a managed fetch pipeline tuned for Crexi with continuous maintenance against layout changes.

---

<!-- skootle:review-cta -->
> Try it on a small dataset, then let us know what you think in a [review](https://apify.com/skootle/crexi-commercial-real-estate-scraper/reviews).

---

### What does Crexi Commercial Real Estate Scraper do?

Crexi Commercial Real Estate Scraper extracts every public commercial real estate listing on Crexi that matches your filters. You give it a Crexi search URL, a city, an asset class, or a set of filters; it returns one well-typed record per listing with: asking price (numeric USD + raw string), cap rate (% as float), NOI, building size (sqft), lot size (acres), year built, asset class enum, listing status, days on market, broker contacts (when public), portfolio sub-properties (when it's a portfolio listing), geo coordinates (lat/lng), image URLs, and Investment Highlights when Crexi exposes them.

Every monetary or numeric field has a numeric mirror (`askingPriceUsd`, `capRatePct`, `noiUsd`, `buildingSqft`, `lotSizeAcres`) for analytics, alongside the raw Crexi-format string. Every listing carries `agentMarkdown` (300-500 chars) and `fieldCompletenessScore` (0-100) so AI agents can self-filter and consume directly.

### Why scrape Crexi?

Crexi is the largest broker-driven CRE marketplace in the United States, with the deepest coverage of multifamily, retail, industrial, office, and land listings outside of CoStar's paywall. For CRE deal sourcing, broker relationship building, market analytics, comp benchmarking, and AI-powered underwriting pipelines, Crexi is the highest-ROI public CRE data source.

Crexi's listings are publicly accessible on the web, but the site doesn't expose a public API. This actor handles the listing-page fetch, the 50+ field extraction, the numeric normalization, and the broker contact-tier enum so you get clean structured records instead of HTML strings.

### Who needs this?

- **CRE acquisitions teams** sourcing deals by metro, asset class, cap rate threshold, and asking-price range
- **Broker-relationship CRMs** seeding their database with active brokers + recent listing counts
- **Market analysts** building cap-rate distribution, days-on-market median, $/sqft benchmarks per submarket
- **Property tech (proptech) startups** training AI underwriting models on labeled CRE data
- **REIT investor relations** monitoring competitor portfolios for listing activity
- **Family office and HNW capital allocators** screening deals at scale before underwriting deeper
- **AI agents** consuming a daily filtered Crexi feed and surfacing top deals against an investment thesis

### How to use Crexi Commercial Real Estate Scraper

1. Open the **Input** tab on the actor page
2. Enter a Crexi search URL OR set individual filters (asset class, city, state, cap rate range, price range)
3. Set `maxItems` (default 50) and `maxPages`
4. Optionally enable `watchlistMode` for daily diffs
5. Click **Start** or call via the Apify REST API or CLI

### How much will scraping Crexi cost?

This actor is priced per event:

- **Actor Start**: $0.01 once per run
- **Crexi listing record**: tiered, charged per record written

| Apify plan | $/1000 records |
|---|---|
| FREE | $40.00 |
| BRONZE | $34.00 |
| SILVER | $28.00 |
| GOLD | $24.00 |
| PLATINUM | $24.00 |
| DIAMOND | $21.60 |

A daily watchlist for multifamily 50+ unit deals in your target metros returns ~30-100 records day 1, then 5-20 per day. Roughly $0.65-$2.40 per day on GOLD.

### Is it legal to scrape Crexi?

Yes, Crexi's listings are publicly accessible to anyone in a browser without logging in. This actor reads the same public pages with proper rate-limiting and a respectful User-Agent. It does not log into broker accounts, does not access broker-private data, and does not bypass any technical access control.

For commercial redistribution of raw datasets, consult Crexi's terms and your legal counsel. For internal CRE pipelines, comp analysis, broker outreach, and AI underwriting, the scraped data is treated like any other public web content.

### Examples

#### Example 1: Multifamily in Texas, $5M-$25M asking

```json
{
  "searchUrl": "https://www.crexi.com/properties?types=Multifamily&priceMin=5000000&priceMax=25000000&states=TX",
  "maxItems": 100
}
````

#### Example 2: Industrial 7%+ cap rate national

```json
{
  "assetClass": "Industrial",
  "capRateMin": 7,
  "maxItems": 200
}
```

#### Example 3: Daily watchlist on retail in Florida

```json
{
  "assetClass": "Retail",
  "states": ["FL"],
  "watchlistMode": true,
  "maxItems": 100
}
```

#### Example 4: Office portfolios over $50M

```json
{
  "assetClass": "Office",
  "priceMin": 50000000,
  "isPortfolio": true,
  "maxItems": 50
}
```

#### Example 5: Land deals in growth metros

```json
{
  "assetClass": "Land",
  "metros": ["Austin", "Phoenix", "Nashville", "Charlotte"],
  "maxItems": 200
}
```

#### Example 6: Broker-prospecting (active brokers in your geography)

```json
{
  "states": ["CA"],
  "maxItems": 500
}
```

Aggregate by `brokerName` and filter for ≥10 active listings to find power brokers.

#### Example 7: Cap-rate benchmark scrape

```json
{
  "assetClass": "Multifamily",
  "states": ["TX", "FL", "GA", "NC", "TN"],
  "maxItems": 1000
}
```

Median + P25 + P75 of `capRatePct` per metro × asset class.

#### Example 8: AI underwriting pipeline feed

```json
{
  "assetClass": "Multifamily",
  "priceMin": 10000000,
  "priceMax": 50000000,
  "watchlistMode": true,
  "maxItems": 100
}
```

Pipe to your underwriting model; auto-score deals against your investment thesis.

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `searchUrl` | string | `""` | Direct Crexi search URL. Overrides individual filters. |
| `assetClass` | enum | `null` | `Multifamily`, `Retail`, `Industrial`, `Office`, `Land`, `Hospitality`, `Mixed-Use` |
| `states` | string\[] | `[]` | 2-letter state codes |
| `metros` | string\[] | `[]` | Metro / city names |
| `priceMin`, `priceMax` | int | `null` | USD asking-price range |
| `capRateMin`, `capRateMax` | float | `null` | Cap rate % range |
| `isPortfolio` | bool | `null` | Filter to portfolio listings |
| `maxItems` | int | `50` | Hard cap |
| `maxPages` | int | `5` | Pagination cap |
| `watchlistMode` | bool | `false` | Idempotent diff against KV-stored seen listing IDs |
| `useApifyProxy` | bool | `true` | Apify residential proxy. Recommended. |

### Crexi output format

#### `crexi_listing`

| Field | Type | Description |
|---|---|---|
| `outputSchemaVersion`, `recordType`, `recordId` | string | Discriminated identity |
| `listingId`, `url`, `slug` | string | Crexi IDs + URL |
| `title`, `address`, `city`, `state`, `zip`, `country` | string | Address fields |
| `latitude`, `longitude` | float | Geo |
| `assetClass`, `assetSubType`, `propertyType` | string/enum | Asset taxonomy |
| `listingStatus` | enum | `Active`, `Pending`, `Sold`, `Withdrawn` |
| `askingPriceUsd`, `askingPriceRaw` | int / string | Numeric mirror + raw |
| `capRatePct`, `capRateRaw` | float / string | Numeric mirror + raw |
| `noiUsd` | int | Net Operating Income |
| `buildingSqft`, `lotSizeAcres`, `yearBuilt`, `numUnits`, `numBuildings` | int / float | Property facts |
| `daysOnMarket`, `listedAt` | int / ISO 8601 | Time-on-market |
| `brokerName`, `brokerCompany`, `brokerEmail`, `brokerPhone`, `contactDataStatus` | string / enum | Broker contact tier (`none`, `public_profile_only`, `public_contact_details`, `gated`) |
| `subProperties` | array | Per-property breakdown for portfolio listings |
| `imageUrls` | string\[] | Property photos |
| `investmentHighlights` | string\[] | Bullet-point highlights from listing |
| `description` | string | Full listing description |
| `fieldCompletenessScore`, `agentMarkdown` | int / string | Quality + LLM-ready summary |

#### Crexi scraper output example

```json
{
  "outputSchemaVersion": "2026-05-08",
  "recordType": "crexi_listing",
  "recordId": "crexi:listing:abc-multifamily-tx",
  "listingId": "abc-multifamily-tx",
  "url": "https://www.crexi.com/properties/abc-multifamily-tx",
  "title": "Class B Multifamily · 96 Units",
  "address": "1234 Sample Ln",
  "city": "Austin",
  "state": "TX",
  "assetClass": "Multifamily",
  "askingPriceUsd": 14250000,
  "askingPriceRaw": "$14,250,000",
  "capRatePct": 5.85,
  "capRateRaw": "5.85%",
  "noiUsd": 833625,
  "buildingSqft": 92500,
  "yearBuilt": 1985,
  "numUnits": 96,
  "daysOnMarket": 12,
  "brokerName": "Sample Broker",
  "brokerCompany": "ABC Realty",
  "contactDataStatus": "public_contact_details",
  "fieldCompletenessScore": 88,
  "agentMarkdown": "**🏢 Class B Multifamily · 96 Units** ($14.25M · 5.85% cap)\n- 📍 Austin, TX · 92,500 sqft · built 1985\n- 💰 NOI $833K · 12 days on market\n- 👤 Sample Broker @ ABC Realty\n- 🔗 https://www.crexi.com/properties/abc-multifamily-tx"
}
```

### During the Actor run

The actor uses Playwright with the Apify residential proxy to fetch search results pages and listing detail pages. Each listing's detail page yields the 50+ field record. Inter-request delays + stealth fingerprinting keep block rate near zero.

The actor writes:

1. **`OUTPUT`** — run summary
2. **`AGENT_BRIEFING`** — top 10 listings by completeness × cap-rate × recency
3. **`WATCHLIST_STATE`** — (when `watchlistMode: true`) seen listing IDs

### FAQ

#### How does Crexi Commercial Real Estate Scraper work?

The actor uses Playwright to load each Crexi search page and listing detail page (Crexi is a heavy SPA). Each detail page is parsed for the 50+ fields, validated against a Zod schema, and pushed.

#### Can I get broker contact info?

When Crexi exposes it publicly on the listing page, yes — `brokerName`, `brokerCompany`, `brokerEmail`, `brokerPhone`. The `contactDataStatus` enum tells you what's available before you try to use it (`public_contact_details` means you got the email/phone; `public_profile_only` means just the name).

#### Can I monitor for new listings only?

Yes. Set `watchlistMode: true`. The actor stores seen listing IDs and emits only listings new since the last run.

#### Can I filter by cap rate?

Yes. `capRateMin: 6, capRateMax: 9` returns only listings where Crexi published a cap rate in that range.

#### Can I get historical (sold) data?

`listingStatus` includes `Sold` listings when they're still on the search results. For deeper sold history, sales-comparable scraping is on the roadmap as a v0.2 feature.

#### Can I use this with the Apify API?

Yes. POST to `https://api.apify.com/v2/acts/skootle~crexi-commercial-real-estate-scraper/runs`.

#### Can I integrate with Make / Zapier / n8n / Slack?

Yes. Click **Integrations** on the actor page.

#### Why does this actor cost more than free CRE scrapers?

This actor ships 50+ fields per listing (vs ~10 from free scrapers), numeric mirrors on every monetary/numeric field, broker-contact-tier enum, watchlist diff mode, and continuous maintenance. If you're feeding the data into an underwriting pipeline or AI agent, the per-record cost pays back in saved engineering and missed-deal time.

#### Your feedback

Hit a bug or want a feature? Open an issue on the [Issues tab](https://apify.com/skootle/crexi-commercial-real-estate-scraper/issues/open) rather than the reviews page, and we'll fix it fast (typically within 48 hours).

### Why choose Crexi Commercial Real Estate Scraper

- **50+ fields per listing** — every Crexi-visible data point normalized
- **Numeric mirrors** — `askingPriceUsd`, `capRatePct`, `noiUsd`, `buildingSqft`, `lotSizeAcres` ready for analytics
- **Broker contact tier enum** — `contactDataStatus` tells you what to expect
- **Portfolio sub-property breakdown** — multi-property listings expand into structured sub-records
- **Watchlist diff mode** — only emits NEW listings since the last run
- **Versioned schema** — `outputSchemaVersion: '2026-05-08'`
- **Idempotent record IDs** — `crexi:listing:<slug>` stable across runs
- **Agent-grade output** — `agentMarkdown` ready to paste into an LLM context

### Other Skootle actors you might want to check

- **[SAM.gov + USAspending Federal Contracts](https://apify.com/skootle/sam-gov-federal-contracts)** — federal contracting + award history
- **[Wellfound Jobs Scraper](https://apify.com/skootle/wellfound-jobs-scraper)** — startup hiring intelligence
- **[Reddit Subreddit Scraper](https://apify.com/skootle/reddit-subreddit-monitor)** — sentiment + brand monitoring
- **[GitHub Trending Repos](https://apify.com/skootle/github-trending)** — daily trending dev repos
- **[SEC EDGAR Filings Monitor](https://apify.com/skootle/sec-edgar-filings)** — public-company filings stream

### Support and contact

File issues on this actor's page — replies within 48 hours.

# Actor input Schema

## `searchKeywords` (type: `array`):

Free-text Crexi searches such as 'multifamily Texas' or 'industrial Phoenix'. Each keyword runs against Crexi's public search and follows pagination up to maxItems.

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

Crexi search or listing URLs. Direct listing URLs are safest for repeatable runs.

## `maxSearchPages` (type: `integer`):

How many pages of Crexi search results to follow per keyword or search URL. Detail pages are still queued under maxItems.

## `propertyUrls` (type: `array`):

Direct listing URLs or IDs. When provided, these are crawled before search URLs.

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

Maximum listing records to save. Default is conservative so the daily auto-test finishes inside Apify's 5-minute window. Raise it for production runs.

## `includeRawData` (type: `boolean`):

Include compact raw JSON snippets for debugging and custom enrichment.

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

Residential proxies are recommended for live runs because Crexi may block data-center traffic.

## Actor input object example

```json
{
  "searchKeywords": [
    "multifamily texas"
  ],
  "startUrls": [],
  "maxSearchPages": 5,
  "propertyUrls": [],
  "maxItems": 10,
  "includeRawData": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Normalized commercial real estate listing records saved by the actor.

## `runSummary` (type: `string`):

Compact OUTPUT object with item count, access gate diagnostics, and empty parse diagnostics.

## `sampleDataset` (type: `string`):

Reference output from a real run with searchKeywords=\['multifamily texas'], 30 listings across Texas multifamily properties scraped from Crexi. Useful for previewing the schema before running the actor.

# 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 = {
    "searchKeywords": [
        "multifamily texas"
    ],
    "startUrls": [],
    "propertyUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("skootle/crexi-commercial-real-estate-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 = {
    "searchKeywords": ["multifamily texas"],
    "startUrls": [],
    "propertyUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("skootle/crexi-commercial-real-estate-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 '{
  "searchKeywords": [
    "multifamily texas"
  ],
  "startUrls": [],
  "propertyUrls": []
}' |
apify call skootle/crexi-commercial-real-estate-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🏢 Crexi CRE Scraper",
        "description": "Scrape Crexi commercial real estate listings into 50+ fields per listing: asking price, cap rate, NOI, building size, lot size, year built, asset class, broker contacts, geo coordinates, photos. Numeric mirrors on every monetary field. Export, run via API, schedule, or integrate with other tools.",
        "version": "0.1",
        "x-build-id": "DSiAo7i9GzSPKNHu2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/skootle~crexi-commercial-real-estate-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-skootle-crexi-commercial-real-estate-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/skootle~crexi-commercial-real-estate-scraper/runs": {
            "post": {
                "operationId": "runs-sync-skootle-crexi-commercial-real-estate-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/skootle~crexi-commercial-real-estate-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-skootle-crexi-commercial-real-estate-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchKeywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Free-text Crexi searches such as 'multifamily Texas' or 'industrial Phoenix'. Each keyword runs against Crexi's public search and follows pagination up to maxItems.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Crexi search or listing URLs. Direct listing URLs are safest for repeatable runs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxSearchPages": {
                        "title": "Max search pages per keyword or URL",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many pages of Crexi search results to follow per keyword or search URL. Detail pages are still queued under maxItems.",
                        "default": 5
                    },
                    "propertyUrls": {
                        "title": "Property URLs",
                        "type": "array",
                        "description": "Direct listing URLs or IDs. When provided, these are crawled before search URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum listing records to save. Default is conservative so the daily auto-test finishes inside Apify's 5-minute window. Raise it for production runs.",
                        "default": 10
                    },
                    "includeRawData": {
                        "title": "Include raw data",
                        "type": "boolean",
                        "description": "Include compact raw JSON snippets for debugging and custom enrichment.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies are recommended for live runs because Crexi may block data-center traffic.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
