# Crexi Scraper with Agents | Fast & Reliable (`fatihtahta/crexi-scraper`) Actor

Extract Crexi listings at scale with rich commercial property detail, broker contacts, deep listing metadata and market insights. Built for enterprise-grade commercial real estate intelligence, deal sourcing, and automated analytics pipelines.

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

## Pricing

from $0.70 / 1,000 property listings

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 Scraper

**Slug:** `fatihtahta/crexi-scraper`

### Overview

Crexi Scraper collects structured commercial real estate listing records from Crexi, including property details, pricing, location, listing status, asset categories, broker information, and optional enriched listing attributes. [Crexi](https://www.crexi.com) is a commercial real estate marketplace where public sale and lease listings can provide useful signals for market research, sourcing, valuation review, and broker coverage analysis. The actor converts public listing data into repeatable JSON records that are easier to query, compare, export, and load into operational systems. It is designed for dependable recurring data acquisition workflows where consistent inputs, predictable output fields, and automation-ready datasets matter. Use it to run focused one-time searches or scheduled monitoring jobs without manually copying marketplace results.

### Why Use This Actor

- **Market research and analytics teams:** build structured extraction workflows for commercial real estate supply, asking prices, cap rates, asset classes, locations, and listing freshness.
- **Product and content teams:** populate private directories, listing experiences, market pages, or editorial datasets with normalized public property information.
- **Developers and data engineering teams:** feed downstream systems with predictable JSON records that support ETL jobs, warehouse loads, enrichment pipelines, and operational reporting.
- **Lead generation and enrichment teams:** collect public listing, broker, brokerage, and property context to qualify prospects and improve CRM records.
- **Monitoring and competitive tracking teams:** schedule repeatable collection to observe changes in availability, pricing, categories, contacts, and geographic coverage over time.

### Common Use Cases

- **Market intelligence:** monitor commercial property supply, asking price, cap rate, building size, land area, listing status, and geography.
- **Lead generation:** build targeted prospect lists from public listings, brokers, brokerages, asset classes, and locations.
- **Competitive monitoring:** track changes in active, pending, and under-contract listings across specific markets or property segments.
- **Catalog and directory building:** populate owned databases with structured commercial property records and normalized location fields.
- **Data enrichment:** add current public Crexi attributes to existing CRM, BI, underwriting, or analytics datasets.
- **Recurring reporting:** schedule periodic runs for dashboards, alerts, market snapshots, and trend analysis.
- **Deal sourcing:** screen public sale and lease opportunities by price, property type, tenancy, lease type, size, and publication date.

### Quick Start

1. Choose a `location` such as a city, state, ZIP code, neighborhood, county, or market, or leave it blank for broader discovery.
2. Select `deal_type` as `buy` or `lease`, then add optional filters such as `property_type`, `publication_date`, price, cap rate, building size, or land area.
3. Set a small `limit` for the first validation run so you can quickly inspect the output shape.
4. Run the actor in Apify Console.
5. Review the first dataset records and confirm that the fields match your workflow.
6. Increase `limit`, refine filters, enable richer records, or schedule recurring runs after the initial output is validated.

### Input Parameters

The actor accepts an optional location, keyword, listing mode, listing filters, enrichment options, coverage option, and maximum result limit.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `location` | string | Optional city, state, ZIP code, neighborhood, county, or market, such as `Dallas, TX`, `Miami, FL`, or `10001`. Leave blank to search all listings. | - |
| `keyword` | string | Optional word or phrase used to narrow the search by theme, asset feature, tenant type, or other listing text. | - |
| `deal_type` | string | Listing mode. Allowed values: `buy`, `lease`. | `buy` |
| `property_type` | array of strings | One or more Crexi property categories or subcategories. Allowed values: `Retail`, `Multifamily`, `Office`, `Industrial`, `Hospitality`, `Mixed Use`, `Land`, `Self Storage`, `Mobile Home Park`, `Senior Living`, `Special Purpose`, `Note/Loan`, `Business for Sale`, `Bank`, `Convenience Store`, `Day Care/Nursery`, `QSR/Fast Food`, `Gas Station`, `Grocery Store`, `Pharmacy/Drug`, `Restaurant`, `Bar`, `Storefront`, `Shopping Center`, `Auto Shop`, `Student Housing`, `Single Family Rental Portfolio`, `RV Park`, `Apartment Building`, `Traditional Office`, `Executive Office`, `Medical Office`, `Creative Office`, `Distribution`, `Flex`, `Warehouse`, `R&D`, `Manufacturing`, `Refrigerated/Cold Storage`, `Hotel`, `Motel`, `Casino`, `Agricultural (Land)`, `Residential (Land)`, `Commercial (Land)`, `Industrial (Land)`, `Islands (Land)`, `Farm (Land)`, `Ranch (Land)`, `Timber (Land)`, `Hunting/Recreational (Land)`, `Telecom/Data Center`, `Sports/Entertainment`, `Marina`, `Golf Course`, `School`, `Religious/Church`, `Garage/Parking`, `Car Wash`, `Airport`, `Business Only`, `Business and Building`. Leave empty to include all supported property types. | - |
| `tenancy` | array of strings | One or more tenancy statuses. Allowed values: `Vacant`, `Single`, `Multi`. | - |
| `lease_type` | array of strings | One or more lease structures. Allowed values: `Net`, `NNN`, `Absolute Net`, `Gross`, `Modified`, `Ground`. | - |
| `opportunity_zone` | boolean | When enabled, keeps only listings marked as located in an Opportunity Zone. | `false` |
| `publication_date` | string | Listing recency filter. Allowed values: `24_hours`, `3_days`, `7_days`, `14_days`, `30_days`, `90_days`, `6_months`, `365_days`. | - |
| `building_quality_class` | array of strings | One or more building quality classes. Allowed values: `A`, `B`, `C`, `D`. | - |
| `listing_status` | array of strings | Listing statuses to include. Allowed values: `active_listing`, `contract_pending`, `under_contract`. | `["active_listing"]` |
| `min_cap_rate` | number | Minimum capitalization rate percentage to include. Allowed range: `0.1` to `15`. | - |
| `max_cap_rate` | number | Maximum capitalization rate percentage to include. Allowed range: `0.1` to `15`. | - |
| `min_remaining_term` | integer | Minimum remaining lease term, in years. Allowed range: `1` to `100`. | - |
| `max_remaining_term` | integer | Maximum remaining lease term, in years. Allowed range: `1` to `100`. | - |
| `min_price` | integer | Minimum asking price for sale listings, in listing currency where available. | - |
| `max_price` | integer | Maximum asking price for sale listings, in listing currency where available. | - |
| `min_price_per_sf` | integer | Minimum price per square foot. For sale searches, this represents sale price per square foot; for lease searches, annual base rent per square foot. | - |
| `max_price_per_sf` | integer | Maximum price per square foot. For sale searches, this represents sale price per square foot; for lease searches, annual base rent per square foot. | - |
| `min_building_area` | integer | Minimum building size in square feet. | - |
| `max_building_area` | integer | Maximum building size in square feet. | - |
| `min_land_area` | number | Minimum land area in acres. | - |
| `max_land_area` | number | Maximum land area in acres. | - |
| `enrich_data` | boolean | Collects richer listing details such as descriptions, highlights, property facts, suites, tenants, and location details when available. | `true` |
| `get_contacts` | boolean | Includes available listing broker and brokerage contact details when available. | `true` |
| `maximize_coverage` | boolean | Collects more matching sale listings for broad sale searches. Use `false` for faster exploratory runs or lease searches where standard collection is enough. | `true` |
| `limit` | integer | Maximum number of listings to save. Minimum: `1`. The input form may prefill `100`; leave empty to collect eligible results until no more matching records are available. | - |

### Choosing Inputs

Use `location` to define the target market and `keyword` when the market alone is too broad. Choose `deal_type` first because sale and lease workflows use different screening criteria in practice. Add `property_type`, `tenancy`, `lease_type`, `listing_status`, `publication_date`, and building quality filters when you need a more targeted dataset; leave optional filters empty when discovery is more important than precision. Price, cap rate, remaining term, building area, and land area fields control numeric scope and are useful for underwriting, sourcing, and reporting. Start with a small `limit`, confirm the dataset shape, then increase the limit or schedule the actor once the output matches your use case.

### Example Inputs

#### Example: Miami retail sale search

```json
{
  "location": "Miami, FL",
  "deal_type": "buy",
  "property_type": ["Retail", "Convenience Store"],
  "min_cap_rate": 4,
  "max_price": 15000000,
  "enrich_data": true,
  "get_contacts": true,
  "limit": 25
}
````

#### Example: Recently published lease opportunities

```json
{
  "location": "Dallas, TX",
  "deal_type": "lease",
  "property_type": ["Office", "Medical Office"],
  "publication_date": "30_days",
  "min_building_area": 5000,
  "enrich_data": true,
  "limit": 50
}
```

#### Example: Broad discovery with conservative output

```json
{
  "keyword": "industrial outdoor storage",
  "deal_type": "buy",
  "property_type": ["Industrial", "Land"],
  "listing_status": ["active_listing"],
  "maximize_coverage": true,
  "enrich_data": false,
  "get_contacts": false,
  "limit": 100
}
```

### Output

#### Output destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs with minimal post-processing.

The example output contains one listing record shape. If future runs return multiple entity shapes, document and validate each shape separately in downstream systems.

#### Record envelope and stable identifiers

Each dataset item represents one Crexi listing record with top-level listing fields, location fields, optional enriched detail fields, optional contact records, and run context. The recommended idempotency key is `id`; use `url` or `fingerprint` as a secondary deduplication key when syncing across systems. For upserts, merge records by `id` and update mutable fields such as status, asking price, timestamps, contacts, and enriched details. Stable identifiers make records easier to merge, deduplicate, and sync across repeated runs.

The `fingerprint` field is a compact record signature that can help detect duplicate or materially similar records. The `source_context` object provides collection context for the record, including the source seed value and page index when available.

#### Examples

##### Example: listing record

```json
{
  "id": 904218,
  "url": "https://www.crexi.com/properties/904218/texas-net-leased-retail-property",
  "title": "Net Leased Retail Property",
  "description": "Retail | 5.25% CAP | 6,120 SF",
  "status": "Active",
  "asking_price": 7850000.0,
  "price_per_sq_ft": 1282.6797385620914,
  "square_footage": 6120,
  "lot_size_acres": 1.35,
  "cap_rate": 5.25,
  "tenancy": "Single",
  "types": [
    "Retail"
  ],
  "brokerage_name": "Northstar Commercial Advisors",
  "thumbnail_url": "https://images.crexi.com/assets/904218/sample-retail-property_716x444.jpg",
  "activated_on": "2025-03-14T10:24:18.000Z",
  "updated_on": "2026-04-22T15:18:43.000Z",
  "is_in_opportunity_zone": false,
  "has_om": true,
  "has_flyer": false,
  "has_video": false,
  "has_virtual_tour": false,
  "address": "1000 Market Center Drive",
  "city": "Austin",
  "county": "Travis County",
  "state": "TX",
  "zip": "78701",
  "full_address": "1000 Market Center Drive, Austin, Travis County, TX 78701",
  "latitude": 30.267153,
  "longitude": -97.743057,
  "attributes": {
    "broker_team_logo_url": "https://images.crexi.com/user-accounts/70001/sample-brokerage-logo_150x100_resize.jpg",
    "number_of_gallery_items": 6,
    "number_of_images": 6,
    "price_per_acre_land": "$5,814,815/Acre",
    "show_countdown_as_date": false,
    "user_is_asset_owner": false,
    "recomm_id": "b421a9c17e8d4f2a90c3b6e5a1d7f804",
    "is_new": false,
    "lease_term": 12.0,
    "tenants": [
      "Sample Market"
    ],
    "earnest_deposit_amount_in_percent": false,
    "qual_form_required": false,
    "has_vault": false,
    "has_private_vault": false,
    "vault_access_status": "AuthRequired",
    "has_broker_of_record": false,
    "fee_agreement_is_required": false,
    "user_can_download_md": false,
    "user_executed_c_a": false,
    "is_saved_to_boards": false,
    "ca_principal_info_type": "None",
    "all_loi_fields_required": true,
    "has_closing": false,
    "use_print_view_as_flyer": false,
    "is_note_loan": false,
    "hide_property_history": false,
    "hide_valuation_calculator": false,
    "hide_climate_risk": false,
    "hide_placer_insights": false,
    "hide_demographic_insights": false,
    "deposit_option": "Credit Card",
    "broker_products": [
      "Professional"
    ],
    "has_default_summary_details": true,
    "is_private": false,
    "is_comp": false,
    "is_elite": false,
    "is_sell_subject_to": false,
    "has_auctioneer": false
  },
  "deal_type": "buy",
  "subtypes": [
    "Convenience Store"
  ],
  "investment_highlights": "Newer construction with long-term single-tenant occupancy and scheduled rent increases. High-visibility retail location near major commuter corridors and dense residential demand. Fee-simple ownership with limited landlord responsibilities and strong regional traffic drivers.",
  "details": {
    "Asking Price": "$7,850,000",
    "Property Type": "Retail",
    "Sub Type": "Convenience Store",
    "Lease Type": "NNN",
    "Tenant Credit": "Regional Credit",
    "Tenancy": "Single",
    "Brand/Tenant": "Sample Market",
    "Lease Term": "12 years",
    "Square Footage": "6,120",
    "Cap Rate": "5.25%",
    "Year Built": "2024",
    "Lot Size (acres)": "1.35",
    "Rent Bumps": "2% Annually",
    "Lease Options": "3, 5-Year Options"
  },
  "summary_details": [
    {
      "key": "Types",
      "value": [
        "Retail"
      ],
      "value_type": "Array",
      "label": "Property Type",
      "display": "Retail"
    },
    {
      "key": "Subtypes",
      "value": [
        "Convenience Store"
      ],
      "value_type": "Array",
      "label": "Sub Type",
      "display": "Convenience Store"
    },
    {
      "key": "SquareFootage",
      "value": 6120.0,
      "value_type": "DecimalType",
      "label": "Square Footage",
      "display": "6,120"
    },
    {
      "key": "CapRate",
      "value": 5.25,
      "value_type": "Percentage",
      "label": "Cap Rate",
      "display": "5.25%"
    },
    {
      "key": "Tenancy",
      "value": "Single",
      "value_type": "Text",
      "label": "Tenancy",
      "display": "Single"
    },
    {
      "key": "Tenants",
      "value": [
        "Sample Market"
      ],
      "value_type": "Array",
      "label": "Brand/Tenant",
      "display": "Sample Market"
    },
    {
      "key": "LeaseType",
      "value": "NNN",
      "value_type": "Text",
      "label": "Lease Type",
      "display": "NNN"
    },
    {
      "key": "LeaseTerm",
      "value": 12.0,
      "value_type": "DecimalType",
      "label": "Lease Term",
      "display": "12"
    },
    {
      "key": "RentBumps",
      "value": "Yes",
      "value_type": "Text",
      "label": "Rent Bumps",
      "display": "Yes"
    },
    {
      "key": "LeaseOptions",
      "value": "3, 5-Year Options",
      "value_type": "Text",
      "label": "Lease Options",
      "display": "3, 5-Year Options"
    },
    {
      "key": "YearBuilt",
      "value": "2024",
      "value_type": "Text",
      "label": "Year Built",
      "display": "2024"
    },
    {
      "key": "LotSize",
      "value": 1.35,
      "value_type": "DecimalType",
      "label": "Acreage",
      "display": "1.350"
    },
    {
      "key": "TenantCreditProfiles",
      "value": [
        "Regional Credit"
      ],
      "value_type": "Array",
      "label": "Tenant Credit",
      "display": "Regional Credit"
    }
  ],
  "created_on": "2025-03-14T09:42:12.000Z",
  "hide_address": false,
  "hide_street_view": false,
  "is_outdated": false,
  "is_paused": false,
  "is_sold": false,
  "is_unpriced": false,
  "property_location": {
    "city_verified": "Austin",
    "state_verified": {
      "code": "TX",
      "name": "Texas"
    },
    "address": "1000 Market Center Drive",
    "city": "Austin",
    "county": "Travis County",
    "state": {
      "code": "TX",
      "name": "Texas"
    },
    "zip": "78701",
    "latitude": 30.267153,
    "longitude": -97.743057
  },
  "contacts": [
    {
      "id": 70124,
      "global_id": "8b6f3d2e-0a42-4f1c-96bd-6c2a17f85011",
      "first_name": "Alex",
      "last_name": "Morgan",
      "full_name": "Alex Morgan",
      "phone": "512.555.0148",
      "email": "alex.morgan@example.com",
      "public_profile_id": "alexmorgan",
      "thumbnail_url": "https://images.crexi.com/users/70124/sample-contact-1_164x164.jpg",
      "licenses": [
        "TX 1234567"
      ],
      "license_details": [
        {
          "broker_id": 70124,
          "position": 0,
          "number": "TX 1234567",
          "created_on": "2024-02-12T14:30:00.000Z",
          "is_auctioneer": false
        }
      ],
      "brokerage": {
        "location": {
          "address": "2100 Commerce Street",
          "city": "Austin",
          "country": "United States",
          "state": {
            "code": "TX",
            "name": "Texas"
          },
          "zip": "78702",
          "apt_number": "300",
          "latitude": 0.0,
          "longitude": 0.0
        },
        "name": "Northstar Commercial Advisors",
        "logo_url": "https://images.crexi.com/user-accounts/70001/sample-brokerage-logo_150x100_resize.jpg",
        "website": "https://www.example-commercial.com/"
      },
      "number_of_assets": 118,
      "is_internal": false,
      "is_platinum": false,
      "is_auctioneer": false,
      "verification_method": "None",
      "badges": [
        {
          "title": "PRO"
        }
      ],
      "capabilities": [
        {
          "kind": "Chats"
        }
      ],
      "attributes": {
        "created_on": "2020-01-15T18:12:00.000Z"
      }
    },
    {
      "id": 70852,
      "global_id": "dd17f850-a3c9-4d70-a642-087c865c1e90",
      "first_name": "Taylor",
      "last_name": "Reed",
      "full_name": "Taylor Reed",
      "phone": "512.555.0194",
      "email": "taylor.reed@example.com",
      "public_profile_id": "taylorreed",
      "thumbnail_url": "https://images.crexi.com/users/70852/sample-contact-2_164x164.jpg",
      "licenses": [
        "TX 7654321"
      ],
      "license_details": [
        {
          "broker_id": 70852,
          "position": 1,
          "number": "TX 7654321",
          "created_on": "2024-05-20T11:45:00.000Z",
          "is_auctioneer": false
        }
      ],
      "brokerage": {
        "location": {
          "address": "2100 Commerce Street",
          "city": "Austin",
          "country": "United States",
          "state": {
            "code": "TX",
            "name": "Texas"
          },
          "zip": "78702",
          "apt_number": "300",
          "latitude": 0.0,
          "longitude": 0.0
        },
        "name": "Northstar Commercial Advisors",
        "logo_url": "https://images.crexi.com/user-accounts/70001/sample-brokerage-logo_150x100_resize.jpg",
        "website": "https://www.example-commercial.com/"
      },
      "number_of_assets": 204,
      "is_internal": false,
      "is_platinum": false,
      "is_auctioneer": false,
      "verification_method": "None",
      "badges": [
        {
          "title": "PRO"
        }
      ],
      "capabilities": [
        {
          "kind": "Chats"
        }
      ],
      "attributes": {
        "created_on": "2019-08-09T16:20:00.000Z"
      }
    },
    {
      "id": 72433,
      "global_id": "0fa4d2b6-b91d-45e1-8ad4-bbc36d3a8402",
      "first_name": "Jordan",
      "last_name": "Lee",
      "full_name": "Jordan Lee",
      "phone": "214.555.0127",
      "email": "jordan.lee@example.com",
      "public_profile_id": "jordanlee",
      "thumbnail_url": "https://images.crexi.com/users/72433/sample-contact-3_164x164.jpg",
      "licenses": [
        "TX 2468135",
        "OK 1357924",
        "NM 9753186",
        "LA 8642097",
        "AR 7531902",
        "CO 6420813",
        "AZ 5319724"
      ],
      "license_details": [
        {
          "broker_id": 72433,
          "position": 0,
          "number": "TX 2468135",
          "type_id": "Real Estate Broker",
          "created_on": "2023-06-10T13:15:00.000Z",
          "license_state_code": "TX",
          "broker_title": "Real Estate Broker",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        },
        {
          "broker_id": 72433,
          "position": 1,
          "number": "OK 1357924",
          "type_id": "Real Estate Broker",
          "created_on": "2025-01-18T09:05:00.000Z",
          "license_state_code": "OK",
          "is_auctioneer": false,
          "brokerage_license_phone": "2145550127"
        },
        {
          "broker_id": 72433,
          "position": 2,
          "number": "NM 9753186",
          "type_id": "Real Estate Broker",
          "created_on": "2023-06-10T13:15:00.000Z",
          "license_state_code": "NM",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        },
        {
          "broker_id": 72433,
          "position": 3,
          "number": "LA 8642097",
          "type_id": "Real Estate Broker",
          "created_on": "2025-01-18T09:05:00.000Z",
          "license_state_code": "LA",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        },
        {
          "broker_id": 72433,
          "position": 4,
          "number": "AR 7531902",
          "type_id": "Real Estate Broker",
          "created_on": "2025-01-18T09:05:00.000Z",
          "license_state_code": "AR",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        },
        {
          "broker_id": 72433,
          "position": 5,
          "number": "CO 6420813",
          "type_id": "Real Estate Broker",
          "created_on": "2025-01-18T09:05:00.000Z",
          "license_state_code": "CO",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        },
        {
          "broker_id": 72433,
          "position": 6,
          "number": "AZ 5319724",
          "type_id": "Real Estate Broker",
          "created_on": "2025-01-18T09:05:00.000Z",
          "license_state_code": "AZ",
          "is_auctioneer": false,
          "brokerage_license_phone": "214-555-0127"
        }
      ],
      "brokerage": {
        "location": {
          "address": "3500 North Central Avenue",
          "city": "Phoenix",
          "country": "United States",
          "state": {
            "code": "AZ",
            "name": "Arizona"
          },
          "zip": "85012",
          "apt_number": "420",
          "latitude": 0.0,
          "longitude": 0.0
        },
        "name": "Northstar Commercial Advisors",
        "logo_url": "https://images.crexi.com/user-accounts/70002/sample-brokerage-logo_150x100_resize.jpg",
        "website": "https://www.example-commercial.com/"
      },
      "number_of_assets": 86,
      "is_internal": false,
      "is_platinum": false,
      "is_auctioneer": false,
      "verification_method": "None",
      "badges": [
        {
          "title": "PRO"
        }
      ],
      "capabilities": [
        {
          "kind": "Chats"
        }
      ],
      "attributes": {
        "created_on": "2018-04-26T20:34:00.000Z"
      }
    },
    {
      "id": 73918,
      "global_id": "e7acb91f-4d80-4c5b-9cf2-7dd7ec927604",
      "first_name": "Casey",
      "last_name": "Bennett",
      "full_name": "Casey Bennett",
      "phone": "512.555.0166",
      "email": "casey.bennett@example.com",
      "public_profile_id": "caseybennett",
      "thumbnail_url": "https://images.crexi.com/users/73918/sample-contact-4_164x164.jpg",
      "licenses": [
        "TX 1123581"
      ],
      "license_details": [
        {
          "broker_id": 73918,
          "position": 1,
          "number": "TX 1123581",
          "created_on": "2024-09-03T12:25:00.000Z",
          "is_auctioneer": false
        }
      ],
      "brokerage": {
        "location": {
          "address": "2100 Commerce Street",
          "city": "Austin",
          "country": "United States",
          "state": {
            "code": "TX",
            "name": "Texas"
          },
          "zip": "78702",
          "apt_number": "300",
          "latitude": 0.0,
          "longitude": 0.0
        },
        "name": "Northstar Commercial Advisors",
        "logo_url": "https://images.crexi.com/user-accounts/70001/sample-brokerage-logo_150x100_resize.jpg",
        "website": "https://www.example-commercial.com/"
      },
      "number_of_assets": 39,
      "is_internal": false,
      "is_platinum": false,
      "is_auctioneer": false,
      "verification_method": "None",
      "attributes": {
        "created_on": "2021-11-05T17:10:00.000Z"
      }
    }
  ],
  "contact_count": 4,
  "fingerprint": "9f2c7a4d81b6e305c4a1",
  "source_context": {
    "seed_id": "a4c9e2b71f0d63842b5e",
    "seed_type": "search",
    "seed_value": "Austin, TX",
    "page_index": 1
  }
}
```

### Field Reference

#### Listing Record

**id** *(number, required)*: Stable Crexi listing identifier.

**url** *(string, required)*: Public listing URL.

**title** *(string, optional)*: Listing title.

**description** *(string, optional)*: Short listing summary.

**status** *(string, optional)*: Listing status, such as active.

**asking\_price** *(number, optional)*: Asking price when available.

**price\_per\_sq\_ft** *(number, optional)*: Price per square foot when available.

**square\_footage** *(number, optional)*: Building or listed area in square feet.

**lot\_size\_acres** *(number, optional)*: Land area in acres.

**cap\_rate** *(number, optional)*: Capitalization rate percentage.

**tenancy** *(string, optional)*: Tenancy status, such as single, multi, or vacant.

**types** *(array, optional)*: Property type categories.

**brokerage\_name** *(string, optional)*: Brokerage name associated with the listing.

**thumbnail\_url** *(string, optional)*: Listing thumbnail image URL.

**activated\_on / updated\_on / created\_on** *(string, optional)*: Listing timestamps in ISO 8601 format when available.

**is\_in\_opportunity\_zone** *(boolean, optional)*: Whether the listing is marked as in an Opportunity Zone.

**has\_om / has\_flyer / has\_video / has\_virtual\_tour** *(boolean, optional)*: Availability flags for listing media or materials.

**address / city / county / state / zip / full\_address** *(string, optional)*: Normalized listing address fields.

**latitude / longitude** *(number, optional)*: Listing coordinates.

**deal\_type** *(string, optional)*: Listing mode, such as `buy` or `lease`.

**subtypes** *(array, optional)*: Property subtype categories.

**investment\_highlights** *(string, optional)*: Listing highlights or marketing description when available.

**details** *(object, optional)*: Key-value listing facts as presented in the record.

**details.Asking Price** *(string, optional)*: Formatted asking price.

**details.Property Type** *(string, optional)*: Formatted property type.

**details.Sub Type** *(string, optional)*: Formatted property subtype.

**details.Lease Type** *(string, optional)*: Lease structure.

**details.Tenant Credit** *(string, optional)*: Tenant credit profile.

**details.Tenancy** *(string, optional)*: Formatted tenancy value.

**details.Brand/Tenant** *(string, optional)*: Tenant or brand name.

**details.Lease Term** *(string, optional)*: Formatted lease term.

**details.Square Footage** *(string, optional)*: Formatted square footage.

**details.Cap Rate** *(string, optional)*: Formatted cap rate.

**details.Year Built** *(string, optional)*: Year built.

**details.Lot Size (acres)** *(string, optional)*: Formatted lot size in acres.

**details.Rent Bumps** *(string, optional)*: Rent escalation information.

**details.Lease Options** *(string, optional)*: Lease option information.

**summary\_details** *(array, optional)*: Structured summary facts.

**summary\_details.key** *(string, optional)*: Source key for the summary fact.

**summary\_details.value** *(string, number, boolean, array, or object, optional)*: Raw summary value.

**summary\_details.value\_type** *(string, optional)*: Value type label.

**summary\_details.label** *(string, optional)*: Display label.

**summary\_details.display** *(string, optional)*: Human-readable display value.

**hide\_address / hide\_street\_view** *(boolean, optional)*: Visibility flags for address and street-view information.

**is\_outdated / is\_paused / is\_sold / is\_unpriced** *(boolean, optional)*: Listing state flags.

**contact\_count** *(number, optional)*: Number of contact records included.

**fingerprint** *(string, optional)*: Compact record fingerprint useful for duplicate detection.

#### Listing Attributes

**attributes.broker\_team\_logo\_url** *(string, optional)*: Broker team or brokerage logo URL.

**attributes.number\_of\_gallery\_items / attributes.number\_of\_images** *(number, optional)*: Media counts.

**attributes.price\_per\_acre\_land** *(string, optional)*: Formatted land price per acre.

**attributes.show\_countdown\_as\_date** *(boolean, optional)*: Countdown display flag.

**attributes.user\_is\_asset\_owner** *(boolean, optional)*: Asset-owner flag when present.

**attributes.recomm\_id** *(string, optional)*: Recommendation identifier.

**attributes.is\_new** *(boolean, optional)*: Whether the listing is marked new.

**attributes.lease\_term** *(number, optional)*: Lease term value when available.

**attributes.tenants** *(array, optional)*: Tenant names.

**attributes.earnest\_deposit\_amount\_in\_percent** *(boolean, optional)*: Earnest deposit display flag.

**attributes.qual\_form\_required** *(boolean, optional)*: Whether a qualification form is indicated.

**attributes.has\_vault / attributes.has\_private\_vault** *(boolean, optional)*: Vault availability flags.

**attributes.vault\_access\_status** *(string, optional)*: Vault access status label.

**attributes.has\_broker\_of\_record** *(boolean, optional)*: Broker-of-record flag.

**attributes.fee\_agreement\_is\_required** *(boolean, optional)*: Fee agreement requirement flag.

**attributes.user\_can\_download\_md** *(boolean, optional)*: Marketing document download flag.

**attributes.user\_executed\_c\_a** *(boolean, optional)*: Confidentiality agreement execution flag.

**attributes.is\_saved\_to\_boards** *(boolean, optional)*: Saved-to-board flag.

**attributes.ca\_principal\_info\_type** *(string, optional)*: Principal information type.

**attributes.all\_loi\_fields\_required** *(boolean, optional)*: Letter-of-intent field requirement flag.

**attributes.has\_closing** *(boolean, optional)*: Closing availability flag.

**attributes.use\_print\_view\_as\_flyer** *(boolean, optional)*: Flyer display flag.

**attributes.is\_note\_loan** *(boolean, optional)*: Whether the listing is a note or loan.

**attributes.hide\_property\_history / attributes.hide\_valuation\_calculator / attributes.hide\_climate\_risk / attributes.hide\_placer\_insights / attributes.hide\_demographic\_insights** *(boolean, optional)*: Visibility flags for listing insights.

**attributes.deposit\_option** *(string, optional)*: Deposit option label.

**attributes.broker\_products** *(array, optional)*: Broker product labels.

**attributes.has\_default\_summary\_details** *(boolean, optional)*: Whether default summary details are available.

**attributes.is\_private / attributes.is\_comp / attributes.is\_elite / attributes.is\_sell\_subject\_to / attributes.has\_auctioneer** *(boolean, optional)*: Listing classification flags.

#### Property Location

**property\_location.city\_verified** *(string, optional)*: Verified city value.

**property\_location.state\_verified.code** *(string, optional)*: Verified state code.

**property\_location.state\_verified.name** *(string, optional)*: Verified state name.

**property\_location.address** *(string, optional)*: Street address.

**property\_location.city** *(string, optional)*: City.

**property\_location.county** *(string, optional)*: County.

**property\_location.state.code** *(string, optional)*: State code.

**property\_location.state.name** *(string, optional)*: State name.

**property\_location.zip** *(string, optional)*: ZIP code.

**property\_location.latitude / property\_location.longitude** *(number, optional)*: Location coordinates.

#### Contacts

**contacts** *(array, optional)*: Listing broker and brokerage contact records when `get_contacts` is enabled and contacts are available.

**contacts.id** *(number, optional)*: Contact identifier.

**contacts.global\_id** *(string, optional)*: Global contact identifier.

**contacts.first\_name / contacts.last\_name / contacts.full\_name** *(string, optional)*: Contact name fields.

**contacts.phone / contacts.email** *(string, optional)*: Public contact details when available.

**contacts.public\_profile\_id** *(string, optional)*: Public profile identifier.

**contacts.thumbnail\_url** *(string, optional)*: Contact image URL.

**contacts.licenses** *(array, optional)*: License numbers.

**contacts.license\_details** *(array, optional)*: Detailed license records.

**contacts.license\_details.broker\_id** *(number, optional)*: Broker identifier for the license record.

**contacts.license\_details.position** *(number, optional)*: License ordering position.

**contacts.license\_details.number** *(string, optional)*: License number.

**contacts.license\_details.type\_id** *(string, optional)*: License type.

**contacts.license\_details.created\_on** *(string, optional)*: License record timestamp.

**contacts.license\_details.license\_state\_code** *(string, optional)*: License state code.

**contacts.license\_details.broker\_title** *(string, optional)*: Broker title.

**contacts.license\_details.is\_auctioneer** *(boolean, optional)*: Auctioneer flag.

**contacts.license\_details.brokerage\_license\_phone** *(string, optional)*: Brokerage license phone.

**contacts.brokerage.name** *(string, optional)*: Brokerage name.

**contacts.brokerage.logo\_url** *(string, optional)*: Brokerage logo URL.

**contacts.brokerage.website** *(string, optional)*: Brokerage website.

**contacts.brokerage.location.address** *(string, optional)*: Brokerage street address.

**contacts.brokerage.location.city** *(string, optional)*: Brokerage city.

**contacts.brokerage.location.country** *(string, optional)*: Brokerage country.

**contacts.brokerage.location.state.code** *(string, optional)*: Brokerage state code.

**contacts.brokerage.location.state.name** *(string, optional)*: Brokerage state name.

**contacts.brokerage.location.zip** *(string, optional)*: Brokerage ZIP code.

**contacts.brokerage.location.apt\_number** *(string, optional)*: Brokerage suite or apartment number.

**contacts.brokerage.location.latitude / contacts.brokerage.location.longitude** *(number, optional)*: Brokerage coordinates when available.

**contacts.number\_of\_assets** *(number, optional)*: Number of assets associated with the contact.

**contacts.is\_internal / contacts.is\_platinum / contacts.is\_auctioneer** *(boolean, optional)*: Contact classification flags.

**contacts.verification\_method** *(string, optional)*: Contact verification method label.

**contacts.badges** *(array, optional)*: Public badge records.

**contacts.badges.title** *(string, optional)*: Badge title.

**contacts.capabilities** *(array, optional)*: Public capability records.

**contacts.capabilities.kind** *(string, optional)*: Capability label.

**contacts.attributes.created\_on** *(string, optional)*: Contact creation timestamp.

#### Source Context

**source\_context.seed\_id** *(string, optional)*: Identifier for the input seed that produced the record.

**source\_context.seed\_type** *(string, optional)*: Seed type, such as search.

**source\_context.seed\_value** *(string, optional)*: User-facing seed value, such as the searched location.

**source\_context.page\_index** *(number, optional)*: Result page index associated with the record.

### Data Quality, Guarantees, And Handling

- **Structured records:** results are normalized into predictable JSON objects for downstream use.
- **Best-effort extraction:** fields may vary by region, session, availability, listing type, and target-side experiments.
- **Optional fields:** null-check optional fields in downstream code, especially enriched details, contact data, media flags, and location attributes.
- **Deduplication:** use `id` as the primary stable key, with `url` or `fingerprint` as a secondary key when needed.
- **Freshness:** results reflect the publicly available data at run time.
- **Repeated runs:** use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.

### Tips For Best Results

- Start with a small `limit` to validate the output shape before scaling up.
- Use one geography, property type, or market segment per run when you need cleaner segmentation.
- Leave optional filters empty when the goal is broad discovery.
- Add price, cap rate, area, tenancy, and publication filters gradually to understand how each field changes coverage.
- Use `enrich_data` when listing details, highlights, tenants, and property facts matter more than speed.
- Use `get_contacts` when broker and brokerage data is part of the workflow.
- Use stable identifiers such as `id`, `url`, and `fingerprint` when storing results over time.

### How to Run on Apify

1. Open the Actor in Apify Console.
2. Configure the available input fields for the target scope, such as location, listing mode, property type, recency, price, size, and enrichment options.
3. Set the maximum number of outputs to collect with `limit`.
4. Click **Start** and wait for the run to finish.
5. Open the dataset and inspect the first records.
6. Download results in JSON, CSV, Excel, or another supported Apify dataset format.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

Use Apify schedules to run Crexi Scraper on a recurring cadence and keep your commercial real estate dataset current. Scheduled runs are useful for market monitoring, lead enrichment, dashboard refreshes, and recurring reporting.

- Navigate to **Schedules** in Apify Console
- Create a new schedule, such as daily, weekly, or custom cron
- Configure input parameters
- Enable notifications for run completion
- Add webhooks for automated processing

#### Integration Options

- **CRM enrichment:** sync public listing, broker, brokerage, location, and property attributes into lead or account records.
- **BI dashboards:** monitor pricing, cap rates, availability, status changes, and market coverage over time.
- **Data warehouses:** load normalized listing records into Snowflake, BigQuery, Redshift, or another analytics store for historical analysis.
- **Google Sheets or Airtable:** review smaller market slices, qualification lists, and broker outreach queues in spreadsheet-style workflows.
- **Webhooks:** trigger ingestion, validation, alerting, or notification workflows after each completed run.
- **Data enrichment pipelines:** join Crexi listing records with proprietary property, parcel, CRM, or underwriting datasets.

### Export Formats And Downstream Use

Apify datasets can be exported from the Console or consumed programmatically by downstream systems. Use the format that best matches your workflow and data volume.

- **JSON:** for APIs, applications, and data pipelines
- **CSV or Excel:** for spreadsheet workflows and manual review
- **API access:** for automated ingestion into business systems
- **BI and warehouses:** for reporting, dashboards, and historical analysis

### Performance

Estimated run times:

- **Small runs (< 1,000 outputs):** ~3-5 minutes
- **Medium runs (1,000-5,000 outputs):** ~5-15 minutes
- **Large runs (5,000+ outputs):** ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

### Limitations

- Availability depends on what <https://www.crexi.com> publicly exposes at run time.
- Some optional fields may be missing on sparse listings, lease records, records without contacts, or listings with limited public details.
- Very broad searches may take longer or require higher `limit` values to collect the desired volume.
- Target-side changes can affect field availability, naming, or whether a specific detail is visible.
- Regional, account, or availability differences may change visible results.
- Contact details are included only when available in the public listing data and when `get_contacts` is enabled.

### Troubleshooting

- **No results returned:** check filter combinations, location spelling, property type selection, keyword specificity, and whether Crexi has matching public records.
- **Fewer results than expected:** broaden filters, raise `limit`, remove restrictive recency or numeric ranges, or verify that enough matching records exist.
- **Some fields are empty:** optional fields depend on what each listing publicly provides.
- **Run takes longer than expected:** reduce scope, lower `limit` for validation, or split broad collection into smaller market or property-type segments.
- **Output changed:** compare the current output with the field reference and include a small sample when requesting support.

### FAQ

#### What data does this actor collect?

It collects public Crexi commercial real estate listing records, including listing identifiers, URLs, titles, descriptions, pricing, property types, status, location fields, property facts, optional enrichment details, and optional broker contact information.

#### Can I filter by location, category, date, price, or other criteria?

Yes. The input supports `location`, `keyword`, `deal_type`, `property_type`, `publication_date`, listing status, tenancy, lease type, building quality, price, price per square foot, cap rate, remaining lease term, building area, land area, and Opportunity Zone filtering.

#### Why did I receive fewer results than my limit?

The actor can only save matching public records that are available for the configured scope. Restrictive filters, sparse markets, narrow recency windows, or limited public availability can produce fewer records than the requested `limit`.

#### Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or on a custom cron schedule with the same input configuration.

#### How do I avoid duplicates across runs?

Use `id` as the primary deduplication and upsert key. You can also store `url` and `fingerprint` as secondary identifiers for validation and change tracking.

#### Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support JSON, CSV, Excel, and other export formats from the Apify Console.

#### Does this actor collect private data?

No. It is intended to collect publicly available listing and contact information from Crexi. Users are responsible for using the data lawfully and respecting privacy requirements.

#### Should I enable enriched data and contacts?

Enable `enrich_data` when property facts, highlights, tenants, and detailed listing attributes are important. Enable `get_contacts` when broker and brokerage details are needed for review, enrichment, or outreach workflows.

#### What should I include when reporting an issue?

Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample when available.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available commercial real estate listing information from **https://www.crexi.com** for legitimate business purposes, including:

- **Commercial real estate** research and market analysis
- **Property sourcing, underwriting, and lead enrichment**
- **Market monitoring, reporting, and competitive intelligence**

Users are responsible for ensuring that their use of collected data complies with applicable laws, regulations, contractual obligations, and the target site's terms. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site's terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable, such as GDPR and CCPA

### Support

For help, use the actor page or Issues. Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample if it helps demonstrate the issue. Avoid including private credentials, confidential data, or unnecessary personal information in support requests.

# Actor input Schema

## `deal_type` (type: `string`):

Choose whether to collect commercial properties for sale or spaces available for lease. Some filters are more useful for one listing mode than the other.

## `location` (type: `string`):

Choose the market area to search. Use a city and state, ZIP code, neighborhood, county, or state; leave empty to include listings from any location.

## `property_type` (type: `array`):

Select one or more Crexi property types to include. Leave empty to keep all supported property types eligible.

## `tenancy` (type: `array`):

Select one or more tenancy statuses to include. Leave empty when vacant, single-tenant, and multi-tenant listings should all remain eligible.

## `lease_type` (type: `array`):

Select one or more lease types to include. Leave empty when any supported lease structure is acceptable.

## `opportunity_zone` (type: `boolean`):

Enable this to keep only listings marked as located in an Opportunity Zone. Leave it off to include listings regardless of Opportunity Zone status.

## `publication_date` (type: `string`):

Select how recently listings should have been published. Leave empty to include listings regardless of publication date.

## `building_quality_class` (type: `array`):

Select one or more building classes to include. Leave empty when all supported quality classes should remain eligible.

## `listing_status` (type: `array`):

Select one or more listing statuses to include. Keep the default for active listings, or add pending and under-contract statuses when they are useful for your workflow.

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

Enter an optional word or phrase to narrow the search. Leave empty when the location and selected filters are enough.

## `min_cap_rate` (type: `number`):

Enter the lowest cap rate percentage to include. Leave empty when there is no minimum cap rate requirement.

## `max_cap_rate` (type: `number`):

Enter the highest cap rate percentage to include. Leave empty when there is no maximum cap rate requirement.

## `min_remaining_term` (type: `integer`):

Enter the lowest remaining term, in years, to include. Leave empty when there is no minimum term requirement.

## `max_remaining_term` (type: `integer`):

Enter the highest remaining term, in years, to include. Leave empty when there is no maximum term requirement.

## `min_price` (type: `integer`):

Enter the lowest asking price to include for sale listings. Leave empty when there is no lower price requirement.

## `max_price` (type: `integer`):

Enter the highest asking price to include for sale listings. Leave empty when there is no upper price requirement.

## `min_price_per_sf` (type: `integer`):

Enter the lowest per-square-foot value to include. Leave empty when there is no lower per-square-foot requirement.

## `max_price_per_sf` (type: `integer`):

Enter the highest per-square-foot value to include. Leave empty when there is no upper per-square-foot requirement.

## `min_building_area` (type: `integer`):

Enter the smallest building size to include, in square feet. Leave empty when there is no minimum building-size requirement.

## `max_building_area` (type: `integer`):

Enter the largest building size to include, in square feet. Leave empty when there is no maximum building-size requirement.

## `min_land_area` (type: `number`):

Enter the smallest land area to include, in acres. Leave empty when there is no minimum land-area requirement.

## `max_land_area` (type: `number`):

Enter the largest land area to include, in acres. Leave empty when there is no maximum land-area requirement.

## `enrich_data` (type: `boolean`):

Enable this for more complete property listings. This may make the run slower because the actor may spend more time collecting details for each result. Turn it off for faster runs when the standard result fields are enough.

## `get_contacts` (type: `boolean`):

Enable this to include available broker and brokerage details for saved listings. This can make runs slower, so leave it off when listing-level data is enough.

## `maximize_coverage` (type: `boolean`):

Enable this when a large sale search needs broader collection. Turn it off for faster exploratory runs or lease searches where the standard collection flow is enough.

## `limit` (type: `integer`):

Enter the maximum number of listings to save. Leave empty to keep collecting matching listings until the run has no more eligible results to save.

## Actor input object example

```json
{
  "deal_type": "buy",
  "location": "SOHO Manhattan NY",
  "opportunity_zone": false,
  "listing_status": [
    "active_listing"
  ],
  "enrich_data": true,
  "get_contacts": true,
  "maximize_coverage": 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 = {
    "location": "SOHO Manhattan NY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/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 = { "location": "SOHO Manhattan NY" }

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/crexi-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "SOHO Manhattan NY"
}' |
apify call fatihtahta/crexi-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Crexi Scraper with Agents | Fast & Reliable",
        "description": "Extract Crexi listings at scale with rich commercial property detail, broker contacts, deep listing metadata and market insights. Built for enterprise-grade commercial real estate intelligence, deal sourcing, and automated analytics pipelines.",
        "version": "0.0",
        "x-build-id": "WZWMSDxO4ZHIjSAYD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~crexi-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-crexi-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/fatihtahta~crexi-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-crexi-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/fatihtahta~crexi-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-crexi-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": {
                    "deal_type": {
                        "title": "Choose Deal Type",
                        "enum": [
                            "buy",
                            "lease"
                        ],
                        "type": "string",
                        "description": "Choose whether to collect commercial properties for sale or spaces available for lease. Some filters are more useful for one listing mode than the other.",
                        "default": "buy"
                    },
                    "location": {
                        "title": "Enter an optional city, state, ZIP code, neighborhood, or county such as \"Dallas, TX\", \"Florida\", or \"10001\". Leave blank to search across all listings",
                        "type": "string",
                        "description": "Choose the market area to search. Use a city and state, ZIP code, neighborhood, county, or state; leave empty to include listings from any location."
                    },
                    "property_type": {
                        "title": "Choose Property Types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more Crexi property types to include. Leave empty to keep all supported property types eligible.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Retail",
                                "Multifamily",
                                "Office",
                                "Industrial",
                                "Hospitality",
                                "Mixed Use",
                                "Land",
                                "Self Storage",
                                "Mobile Home Park",
                                "Senior Living",
                                "Special Purpose",
                                "Note/Loan",
                                "Business for Sale",
                                "Bank",
                                "Convenience Store",
                                "Day Care/Nursery",
                                "QSR/Fast Food",
                                "Gas Station",
                                "Grocery Store",
                                "Pharmacy/Drug",
                                "Restaurant",
                                "Bar",
                                "Storefront",
                                "Shopping Center",
                                "Auto Shop",
                                "Student Housing",
                                "Single Family Rental Portfolio",
                                "RV Park",
                                "Apartment Building",
                                "Traditional Office",
                                "Executive Office",
                                "Medical Office",
                                "Creative Office",
                                "Distribution",
                                "Flex",
                                "Warehouse",
                                "R&D",
                                "Manufacturing",
                                "Refrigerated/Cold Storage",
                                "Hotel",
                                "Motel",
                                "Casino",
                                "Agricultural (Land)",
                                "Residential (Land)",
                                "Commercial (Land)",
                                "Industrial (Land)",
                                "Islands (Land)",
                                "Farm (Land)",
                                "Ranch (Land)",
                                "Timber (Land)",
                                "Hunting/Recreational (Land)",
                                "Telecom/Data Center",
                                "Sports/Entertainment",
                                "Marina",
                                "Golf Course",
                                "School",
                                "Religious/Church",
                                "Garage/Parking",
                                "Car Wash",
                                "Airport",
                                "Business Only",
                                "Business and Building"
                            ],
                            "enumTitles": [
                                "Retail",
                                "Multifamily",
                                "Office",
                                "Industrial",
                                "Hospitality",
                                "Mixed Use",
                                "Land",
                                "Self Storage",
                                "Mobile Home Park",
                                "Senior Living",
                                "Special Purpose",
                                "Note/Loan",
                                "Business for Sale",
                                "Bank",
                                "Convenience Store",
                                "Day Care/Nursery",
                                "QSR/Fast Food",
                                "Gas Station",
                                "Grocery Store",
                                "Pharmacy/Drug",
                                "Restaurant",
                                "Bar",
                                "Storefront",
                                "Shopping Center",
                                "Auto Shop",
                                "Student Housing",
                                "Single Family Rental Portfolio",
                                "RV Park",
                                "Apartment Building",
                                "Traditional Office",
                                "Executive Office",
                                "Medical Office",
                                "Creative Office",
                                "Distribution",
                                "Flex",
                                "Warehouse",
                                "R&D",
                                "Manufacturing",
                                "Refrigerated/Cold Storage",
                                "Hotel",
                                "Motel",
                                "Casino",
                                "Agricultural (Land)",
                                "Residential (Land)",
                                "Commercial (Land)",
                                "Industrial (Land)",
                                "Islands (Land)",
                                "Farm (Land)",
                                "Ranch (Land)",
                                "Timber (Land)",
                                "Hunting/Recreational (Land)",
                                "Telecom/Data Center",
                                "Sports/Entertainment",
                                "Marina",
                                "Golf Course",
                                "School",
                                "Religious/Church",
                                "Garage/Parking",
                                "Car Wash",
                                "Airport",
                                "Business Only",
                                "Business and Building"
                            ]
                        }
                    },
                    "tenancy": {
                        "title": "Choose Tenancy Statuses",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more tenancy statuses to include. Leave empty when vacant, single-tenant, and multi-tenant listings should all remain eligible.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Vacant",
                                "Single",
                                "Multi"
                            ],
                            "enumTitles": [
                                "Vacant | no current tenant",
                                "Single | single tenant",
                                "Multi | multiple tenants"
                            ]
                        }
                    },
                    "lease_type": {
                        "title": "Choose Lease Types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more lease types to include. Leave empty when any supported lease structure is acceptable.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Net",
                                "NNN",
                                "Absolute Net",
                                "Gross",
                                "Modified",
                                "Ground"
                            ],
                            "enumTitles": [
                                "Net | net lease",
                                "NNN | triple net",
                                "Absolute Net | absolute net",
                                "Gross | gross lease",
                                "Modified | modified lease",
                                "Ground | ground lease"
                            ]
                        }
                    },
                    "opportunity_zone": {
                        "title": "Require Opportunity Zone Listings",
                        "type": "boolean",
                        "description": "Enable this to keep only listings marked as located in an Opportunity Zone. Leave it off to include listings regardless of Opportunity Zone status.",
                        "default": false
                    },
                    "publication_date": {
                        "title": "Choose Listing Recency",
                        "enum": [
                            "24_hours",
                            "3_days",
                            "7_days",
                            "14_days",
                            "30_days",
                            "90_days",
                            "6_months",
                            "365_days"
                        ],
                        "type": "string",
                        "description": "Select how recently listings should have been published. Leave empty to include listings regardless of publication date."
                    },
                    "building_quality_class": {
                        "title": "Choose Building Quality Classes",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more building classes to include. Leave empty when all supported quality classes should remain eligible.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "A",
                                "B",
                                "C",
                                "D"
                            ],
                            "enumTitles": [
                                "Class A",
                                "Class B",
                                "Class C",
                                "Class D"
                            ]
                        }
                    },
                    "listing_status": {
                        "title": "Choose Listing Statuses",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more listing statuses to include. Keep the default for active listings, or add pending and under-contract statuses when they are useful for your workflow.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "active_listing",
                                "contract_pending",
                                "under_contract"
                            ],
                            "enumTitles": [
                                "Active Listing | currently active",
                                "Contract Pending | pending contract",
                                "Under Contract | under contract"
                            ]
                        },
                        "default": [
                            "active_listing"
                        ]
                    },
                    "keyword": {
                        "title": "Filter by Keyword",
                        "type": "string",
                        "description": "Enter an optional word or phrase to narrow the search. Leave empty when the location and selected filters are enough."
                    },
                    "min_cap_rate": {
                        "title": "Set Minimum Cap Rate",
                        "minimum": 0.1,
                        "maximum": 15,
                        "type": "number",
                        "description": "Enter the lowest cap rate percentage to include. Leave empty when there is no minimum cap rate requirement."
                    },
                    "max_cap_rate": {
                        "title": "Set Maximum Cap Rate",
                        "minimum": 0.1,
                        "maximum": 15,
                        "type": "number",
                        "description": "Enter the highest cap rate percentage to include. Leave empty when there is no maximum cap rate requirement."
                    },
                    "min_remaining_term": {
                        "title": "Set Minimum Remaining Term",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Enter the lowest remaining term, in years, to include. Leave empty when there is no minimum term requirement."
                    },
                    "max_remaining_term": {
                        "title": "Set Maximum Remaining Term",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Enter the highest remaining term, in years, to include. Leave empty when there is no maximum term requirement."
                    },
                    "min_price": {
                        "title": "Set Minimum Asking Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the lowest asking price to include for sale listings. Leave empty when there is no lower price requirement."
                    },
                    "max_price": {
                        "title": "Set Maximum Asking Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the highest asking price to include for sale listings. Leave empty when there is no upper price requirement."
                    },
                    "min_price_per_sf": {
                        "title": "Set Minimum Price per Square Foot",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the lowest per-square-foot value to include. Leave empty when there is no lower per-square-foot requirement."
                    },
                    "max_price_per_sf": {
                        "title": "Set Maximum Price per Square Foot",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the highest per-square-foot value to include. Leave empty when there is no upper per-square-foot requirement."
                    },
                    "min_building_area": {
                        "title": "Set Minimum Building Size",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the smallest building size to include, in square feet. Leave empty when there is no minimum building-size requirement."
                    },
                    "max_building_area": {
                        "title": "Set Maximum Building Size",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the largest building size to include, in square feet. Leave empty when there is no maximum building-size requirement."
                    },
                    "min_land_area": {
                        "title": "Set Minimum Land Area",
                        "minimum": 0,
                        "type": "number",
                        "description": "Enter the smallest land area to include, in acres. Leave empty when there is no minimum land-area requirement."
                    },
                    "max_land_area": {
                        "title": "Set Maximum Land Area",
                        "minimum": 0,
                        "type": "number",
                        "description": "Enter the largest land area to include, in acres. Leave empty when there is no maximum land-area requirement."
                    },
                    "enrich_data": {
                        "title": "Collect Richer Property Listing Details",
                        "type": "boolean",
                        "description": "Enable this for more complete property listings. This may make the run slower because the actor may spend more time collecting details for each result. Turn it off for faster runs when the standard result fields are enough.",
                        "default": true
                    },
                    "get_contacts": {
                        "title": "Collect Listing Broker Contacts",
                        "type": "boolean",
                        "description": "Enable this to include available broker and brokerage details for saved listings. This can make runs slower, so leave it off when listing-level data is enough.",
                        "default": true
                    },
                    "maximize_coverage": {
                        "title": "Collect More Matching Listings",
                        "type": "boolean",
                        "description": "Enable this when a large sale search needs broader collection. Turn it off for faster exploratory runs or lease searches where the standard collection flow is enough.",
                        "default": true
                    },
                    "limit": {
                        "title": "Set Maximum Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the maximum number of listings to save. Leave empty to keep collecting matching listings until the run has no more eligible results to save."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
