Crexi Scraper - Commercial Property Listings for Sale avatar

Crexi Scraper - Commercial Property Listings for Sale

Pricing

from $1.00 / 1,000 listing results

Go to Apify Store
Crexi Scraper - Commercial Property Listings for Sale

Crexi Scraper - Commercial Property Listings for Sale

Scrape crexi.com commercial listings: asking price, cap rate, square footage, units, year built, lot size, APN, zoning, address, coordinates, status, photos plus agent and brokerage contacts and 100+ fields. Search by city, ZIP or keyword with type, price and sort filters, or paste URLs.

Pricing

from $1.00 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

Crexi Commercial Listings Scraper

Pull structured commercial property listings from crexi.com at scale. Search any city, ZIP or keyword with property type, price and sort filters, or paste listing URLs directly, and get a clean JSON record per listing: asking price, cap rate, square footage, units, year built, lot size, APN, zoning, full address with coordinates, status, the complete photo gallery, and the listing agent plus brokerage contact details. Over 100 fields per listing, with optional one-click export into Notion, Linear, Airtable and other apps.

Why This Scraper?

  • Two ways to start: search by location and filters, or paste crexi.com listing URLs.
  • Deep per-listing detail: square footage, units, year built, stories, lot size, cap rate, net operating income, APN, zoning and the full marketing description.
  • Agent and brokerage contact cluster on every listing, including license numbers and the public profile.
  • The complete image gallery, not just the thumbnail.
  • Filter by property type, asking-price band, priced-only, and four sort orders in either direction.
  • One finite cap (Max items) keeps every run predictable and on budget.
  • Resume an interrupted crawl, or turn on Incremental mode for daily/recurring monitoring that returns only what's new, changed, or gone.
  • Optional export into the apps you already use via MCP connectors.

Data You Get

Sample shape - values are illustrative placeholders, not from a live listing.

FieldExample
id1000000
nameMaple Court Apartments
property_typeMultifamily
askingPrice4250000
capRate6.25
squareFootage48000
specifications.units64
yearBuilt1998
stories3
lotSize2.4
netOperatingIncome265000
apn000-000-000
zoningR-4
statusActive
fullAddress100 Main St, Austin, Travis County, TX 78701
cityAustin
stateTX
zip78701
latitude30.267200
longitude-97.743100
urlhttps://www.crexi.com/properties/1000000/austin-maple-court-apartments
imageUrlhttps://images.crexi.com/assets/1000000/placeholder_3000x2000_resize.jpg
brokerageNameExample Commercial Realty
agent_info.nameJane Doe
agent_info.phone+10000000000
publicProfileIdjanedoe

How to Use

Search by location and property type:

{
"mode": "search",
"locations": ["Austin, TX"],
"propertyTypes": ["Multifamily"],
"maxItems": 20,
"fetchDetails": true
}

Search a price band, priced listings only, sorted by cap rate:

{
"mode": "search",
"locations": ["Dallas, TX"],
"priceMin": 1000000,
"priceMax": 25000000,
"includeUnpriced": false,
"sortBy": "capRate",
"sortDirection": "Descending",
"maxItems": 50
}

Paste listing URLs directly:

{
"mode": "url",
"urls": [
"https://www.crexi.com/properties/1000000/austin-maple-court-apartments",
"https://www.crexi.com/properties/1000001/dallas-oak-plaza"
],
"fetchDetails": true
}

Monitor a search daily and get only what changed:

{
"mode": "search",
"locations": ["Austin, TX"],
"propertyTypes": ["Multifamily"],
"maxItems": 200,
"incrementalMode": true
}

Resume & Recurring Updates

Two different things, both under one input section:

  • Resume from a previous run (resumeFromRunId) continues ONE specific interrupted crawl. Paste a previous run ID or dataset ID and the actor skips every listing already collected there, so a large pull that got cut off can finish without duplicating or re-charging what it already returned.
  • Incremental mode (incrementalMode) is for running the SAME search again and again (e.g. daily). The actor remembers what it saw last time in its own key-value store — no id to paste. The first run returns everything as NEW. Later runs return only NEW, UPDATED and REAPPEARED listings by default. Each output record gets changeType, changedFields, firstSeenAt and lastSeenAt. Turn on emitUnchanged or emitExpired only when you also want those rows back (and billed) too. State is tracked separately per distinct search/URL and filter combination; set stateKey to name or deliberately share a monitoring campaign. EXPIRED rows are only produced after a run that fully scanned the tracked search (not when Max items capped it, and not together with Resume).

Input Parameters

ParameterTypeDescription
modeselectsearch builds searches from your locations and filters; url loads the listing URLs you paste.
locationsarrayLocations or keywords to search (e.g. Austin, TX, 90001). Each entry is its own search. Search mode only.
propertyTypesarrayProperty types to narrow the search (e.g. Multifamily, Office, Retail, Industrial, Land). Search mode only.
priceMinintegerOnly return listings with an asking price at or above this amount.
priceMaxintegerOnly return listings with an asking price at or below this amount.
includeUnpricedbooleanInclude listings without a published asking price. Default true.
sortByselectResult order: rank (best match), price, activatedOn (newest), capRate.
sortDirectionselectDescending or Ascending.
urlsarraycrexi.com listing detail URLs to load. URL mode only; filter fields are ignored.
fetchDetailsbooleanLoad each listing for full size, units, cap rate, gallery and agent contact. Default true; adds a small per-item charge.
maxItemsintegerThe single cap on the run: stop after this many listings. Default 20. 0 = unlimited.
maxPagesintegerOptional safety bound on result pages per search. Defaults to unlimited and does not cap the run; defers to Max items.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl without returning or re-charging for listings already collected there. For recurring daily monitoring of the same search, use Incremental mode instead.
incrementalModebooleanTurn on for daily/recurring monitoring. Returns only NEW/UPDATED/REAPPEARED listings after the first run; state is remembered by the actor itself. Default false.
stateKeystringOptional. Name the monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to derive a key automatically from the search/URL and detail settings. Incremental mode only.
emitUnchangedbooleanOff by default. Also return listings unchanged since the last run, marked UNCHANGED. Returns and bills extra rows. Incremental mode only.
emitExpiredbooleanOff by default. Also return listings no longer found, marked EXPIRED. Only produced after a complete scan (not when Max items capped the run or Resume was used). Returns and bills extra synthetic rows. Incremental mode only.
proxyobjectApify Proxy configuration. The datacenter default is the lowest-cost option and works on every plan.
maxResidentialMBintegerWhen using a Residential proxy group, cap residential traffic at this many MB, then auto-downgrade to the lower-cost tier. 0 = unlimited.
mcpConnectorsarrayOptional MCP connectors to pipe results into (Notion, Linear, Airtable, Apify). Never changes the dataset.
notionParentPageUrlstringNotion page URL or id under which item pages are created. Notion connector only.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Export to your apps (MCP connectors)

Optionally send results into the tools you already use through Model Context Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API & Integrations, then select it in mcpConnectors. Notion receives a rich page per listing (set notionParentPageUrl); other connectors get a best-effort write or digest. This step is fully optional, runs after scraping, and never changes the dataset output. Supported connectors: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

Output Example

Sample shape - values are illustrative placeholders, not from a live listing.

{
"id": 1000000,
"name": "Maple Court Apartments",
"url": "https://www.crexi.com/properties/1000000/austin-maple-court-apartments",
"property_type": "Multifamily",
"subtypes": ["Apartment Building"],
"status": "Active",
"askingPrice": 4250000,
"capRate": 6.25,
"squareFootage": 48000,
"specifications": { "units": 64, "year_built": 1998 },
"yearBuilt": 1998,
"stories": 3,
"lotSize": 2.4,
"netOperatingIncome": 265000,
"apn": "000-000-000",
"zoning": "R-4",
"marketingDescription": "Well-maintained 64-unit garden-style community in central Austin.",
"fullAddress": "100 Main St, Austin, Travis County, TX 78701",
"city": "Austin",
"state": "TX",
"zip": "78701",
"latitude": 30.2672,
"longitude": -97.7431,
"images": [
"https://images.crexi.com/assets/1000000/placeholder_3000x2000_resize.jpg"
],
"brokerageName": "Example Commercial Realty",
"agent_info": { "name": "Jane Doe", "company": "Example Commercial Realty", "phone": "+10000000000" },
"firstName": "Jane",
"lastName": "Doe",
"publicProfileId": "janedoe",
"licenseNumbers": ["TX 000000"],
"numberOfAssets": 12,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

With incrementalMode on, every record also carries:

FieldExampleDescription
changeTypeUPDATEDNEW, UPDATED, UNCHANGED (only with emitUnchanged), REAPPEARED, or EXPIRED (only with emitExpired).
changedFields["askingPrice", "status"]Which fields changed since the last run. Empty for NEW/UNCHANGED/REAPPEARED.
firstSeenAt2026-01-01T00:00:00.000ZWhen this listing was first seen by this monitoring campaign.
lastSeenAt2026-01-08T00:00:00.000ZWhen this listing was last seen.

Plan Requirement

This actor runs on any Apify plan. The default datacenter proxy is the lowest-cost option and works on the free tier. A residential proxy group is optional and supported if you prefer it; set a residential traffic budget to cap spend and auto-downgrade.