Crexi Real Estate Scraper avatar

Crexi Real Estate Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Crexi Real Estate Scraper

Crexi Real Estate Scraper

Scrapes commercial real estate listings from Crexi.com including property details, pricing, location, images, and investment metrics.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(2)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

6

Bookmarked

152

Total users

16

Monthly active users

3.5 hours

Issues response

5 days ago

Last modified

Share

Extract commercial real estate listings from Crexi.com — the largest US marketplace for commercial property. Get property names, addresses, prices, square footage, property types, listing URLs, and high-resolution images, ready for analysis, lead generation, market research, or CRM imports.

The scraper covers all 51 US states (50 + DC) and every commercial asset class — Office, Retail, Industrial, Multifamily, Land, Hotel, Hospitality, Mixed Use, Special Purpose, Healthcare, Self Storage, Mobile Home Park, Senior Housing, Student Housing.

Data path (Aug 2026): Crexi moved its search behind session-gated frontend pages — anonymous browsers no longer receive the /assets/search call. This actor now calls Crexi's public search API directly (api.crexi.com/assets/search), which needs no cookies, no browser, and no proxy. The browser fallback path remains only for resilience if the API is ever blocked.

What you get

For each property listing:

FieldDescription
property_idUnique Crexi asset identifier
nameListing title (e.g., "Multi-Tenant Office Building")
property_typeAsset class(es) (e.g., Office, Retail, Land)
addressFull street address
cityCity name
stateTwo-letter state code
zip_codePostal code
priceAsking / sale price (formatted with $ and commas)
square_footageBuilding or unit size
imagesArray of listing photos (thumbnail URL from the API)
property_urlDirect link to the Crexi detail page
descriptionListing description (when available)
brokerageListing brokerage name
listing_statusStatus (e.g. On-Market)
investment_typeInvestment classification (e.g. Value Add)
latitude / longitudeGeocoordinates (when disclosed)
sourceOrigin (api)

Empty fields are omitted from each record so the dataset stays clean.

Input

ParameterTypeDefaultDescription
maxPropertiesInteger100Maximum properties to return across all locations / filters.
scrapeDetailsBooleanfalseWhen true, enriches each listing via the public detail API (/assets/{id}): details key/value map, full description, net_operating_income, subtypes.
propertyTypesArray[]Pick one or more from the 14 asset classes. Empty = all types.
locationsArray[]Pick one or more US state codes (e.g., CA) or names (e.g., California). Empty = nationwide.
minPriceIntegerMinimum asking price in USD.
maxPriceIntegerMaximum asking price in USD.
proxyObjectoptionalNOT required — the primary path uses Crexi's public API and works from datacenter IPs. Only needed if you want the browser fallback path (Apify Residential, US).

Example input — start small

{
"maxProperties": 5,
"scrapeDetails": false
}

Example input — Multifamily, $500K-$5M, full details

{
"maxProperties": 50,
"scrapeDetails": true,
"propertyTypes": ["Multifamily"],
"minPrice": 500000,
"maxPrice": 5000000
}

Example input — Land in UT (the Aug-2026 regression case)

{
"maxProperties": 200,
"scrapeDetails": false,
"propertyTypes": ["Land"],
"locations": ["UT"]
}

Example input — Office + Retail in TX and CA

{
"maxProperties": 200,
"propertyTypes": ["Office", "Retail"],
"locations": ["TX", "CA"]
}

Example output

{
"property_id": "2553937",
"name": "1476 Major Street",
"property_type": "Retail, Office, Land",
"address": "1476 South Major Street, Salt Lake City, Salt Lake County, UT 84115",
"city": "Salt Lake City",
"state": "UT",
"zip_code": "84115",
"price": "$1,050,000",
"square_footage": "3,500 SF",
"images": ["https://map-images.crexi.com/map-images/UT/Salt%20Lake%20City"],
"property_url": "https://www.crexi.com/properties/utah-1476-major-street",
"brokerage": "Newmark Mountain West",
"listing_status": "On-Market",
"investment_type": "Value Add",
"description": "Fantastic Owner/User or Investment opportunity",
"source": "api"
}

Use cases

  • Lead generation — Build prospect lists of for-sale CRE inventory by city, state, asset class, or price band.
  • Market research — Track inventory volume, price ranges, and asset-class mix across markets.
  • Investment analysis — Pull cap-rate-published listings for underwriting comparisons.
  • CRM enrichment — Augment broker / owner records with currently listed properties.
  • Geographic targeting — Run state-level pulls (e.g., FL, TX, CA) to feed regional dashboards.
  • Price-range monitoring — Set minPrice / maxPrice to capture only assets inside your buy box.

FAQ

Do I need a proxy? No. The primary data path calls Crexi's public search API directly and works from datacenter IPs with no proxy, cookies, or browser. The browser fallback (only used if the API is unreachable) does require the RESIDENTIAL group.

Can I filter by city? Filtering is at the state level (locations: ["FL"]). To narrow by city, run a state-level scrape and post-filter on the city field.

Why does propertyTypes sometimes return mixed types? Crexi tags many listings with multiple asset classes — for example, a building can be both Office and Land. The scraper returns properties that include the requested type in their tag list, and always applies a strict client-side confirmation so every record actually contains the requested type and state.

Why are some listings priced "Negotiable" or missing a number? Crexi lets sellers hide the asking price. Records without a numeric price are still emitted, with the price field omitted, when no price filter is set. If minPrice or maxPrice is provided, listings without a numeric price are excluded so the price filter remains accurate.

Is there a run timeout to configure? No. The primary path (public API) typically finishes in seconds; the actor manages its own internal safety budget — there is nothing to configure.

What if the Crexi API is ever blocked? The actor falls back to the browser path (up to three residential sessions, when a proxy is configured). If all attempts fail it exits successfully and writes a single record { "type": "crexi_blocked", "reason": "...", "scrapedAt": "..." } so downstream pipelines can detect the block and re-run.

How current is the data? Live — every run hits Crexi at request time. Schedule the actor on the Apify platform for daily / hourly refreshes.

Can I scrape closed / sold / off-market properties? The actor returns currently active for-sale listings on Crexi. Sold or off-market properties are not exposed publicly.

Limitations

  • Only publicly listed properties are scraped — no auth-gated or off-market data.
  • Crexi can change its API or page structure; if a particular field disappears the actor will continue but may emit fewer columns.
  • City-level URL filtering is not supported (state level is). Filter on city after the fact.
  • Sold / closed listing history is not in scope.