Crexi Scraper [💰$3.5/1K] | Commercial CRE | Broker Leads avatar

Crexi Scraper [💰$3.5/1K] | Commercial CRE | Broker Leads

Pricing

from $3.47 / 1,000 results

Go to Apify Store
Crexi Scraper [💰$3.5/1K] | Commercial CRE | Broker Leads

Crexi Scraper [💰$3.5/1K] | Commercial CRE | Broker Leads

Extract commercial real estate listings and broker data from Crexi for investment research and lead generation. Build CRE deal pipelines and broker contact datasets.

Pricing

from $3.47 / 1,000 results

Rating

5.0

(6)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

2

Bookmarked

69

Total users

7

Monthly active users

7 days ago

Last modified

Share

Crexi Commercial Real Estate Scraper

Extract commercial property listings from Crexi, the largest US marketplace for commercial real estate. Filter by asset class, state, price band and cap rate, then push clean JSON straight into Sheets, Airtable, your CRM or a data warehouse.

No cookies. No API key. No Crexi account. Filter with dropdowns instead of hand-building search URLs, and run it on a schedule or through the API.

What this Actor extracts

One dataset row per property, with the fields CRE analysts actually filter on:

  • Pricing — asking price, price per square foot, price per acre, cap rate, net operating income
  • Property — asset class, building size, unit count, lot size, year built, listing status, investment classification
  • Location — full address, city, county, state, ZIP, latitude and longitude
  • Broker — broker name, brokerage firm, brokerage office address
  • Media — cover photo, photo count, offering memorandum / flyer / video / virtual tour flags
  • Timeline — listed date, last updated, days on market

Add-on data, billed separately, only when you ask for it:

Add-onAdds
Fetch listing detailsFull marketing description, year built, zoning, APN, lease type, occupancy, amenities
Include listing brokersEvery broker on the listing, with license numbers and phone/email where Crexi publishes them
Include photo galleryFull-size URL of every photo

Tutorial

  1. Open the Actor in Apify Console and press Start. The defaults collect 10 listings so you can check the output shape before spending anything.
  2. In ① For sale or for lease, pick the deal type.
  3. In ① Property types and ① States, select what you want. Leave both empty for a nationwide search.
  4. Use ③ Filter results to set an asking price or cap rate range. Anything left empty is ignored.
  5. Raise ⑤ How many listings? when you are happy with the output.
  6. Open the Output tab and export as JSON, CSV or Excel.

If you already found the listings you want on crexi.com, copy the search page URL into ② Search URLs. Filters carried in that URL — map area, price, cap rate, asset class — take priority over the fields above, and you get exactly the result set you saw in the browser.

Map areas (a URL containing placeIds[]) are resolved automatically: the place id is looked up and sent to Crexi as the matching city, county, ZIP or state, so the results stay inside the area you picked on the map.

Single property pages (https://www.crexi.com/properties/12345678/name) can be pasted into the same field. Those are fetched one by one instead of being run through search, so a list of known listings gives you exactly those listings.

About the States filter

State codes are sent to Crexi, so it returns matching listings directly and does not spend the run's page budget on other states. Every record is still checked before it is saved, so a listing outside your selection can never reach the dataset. For precise city-level targeting, paste a search URL with placeIds[] instead.

Filters that Crexi applies vs. filters the Actor applies

Crexi's search endpoint accepts some parameters and then ignores them, so the Actor never forwards a filter that would not narrow anything:

FilterApplied by
Property types, states, keyword, asking price, cap rateCrexi, server-side
Map area (city, county, ZIP)Crexi, server-side, from a resolved placeIds[]
Building size, price per sq ftThe Actor, per record, before saving

For the size and price-per-sq-ft filters the run log reports how many listings it skipped.

How many listings you can actually get

Crexi reports a total that is much larger than the number of listings it will serve. A search reporting 2,211 matches stops serving results after about 1,460 of them, so raising How many listings? past that point collects nothing extra. The run detects this and says so in the log instead of quietly returning a short result set.

Add a state or property-type filter to reach deeper into the market - each filter has its own result pool.

About the deal type

Crexi's search endpoint has no working sale/lease filter, so For sale or for lease labels the dealType column rather than narrowing the result set. Price and cap-rate filters only ever match sale listings.

Input example

{
"dealType": "buy",
"propertyTypes": ["Office", "Multifamily"],
"states": ["TX", "OK"],
"askingPriceMin": 1000000,
"capRateMin": 5,
"maxItems": 250
}

Output example

[
{
"id": 2145883191,
"url": "https://www.crexi.com/properties/2145883191/retail-shop-dallas-tx",
"name": "Wattercoat Plaza",
"description": null,
"dealType": "buy",
"status": "active",
"investmentType": "Core",
"propertyType": "Retail",
"propertyTypes": ["Retail"],
"askingPrice": 4250000,
"pricePerSqFt": 138.5,
"capRate": 6.25,
"netOperatingIncome": null,
"squareFootage": 30686,
"unitCount": null,
"yearBuilt": null,
"fullAddress": "4501 Wateka Cir, Dallas, TX 75209",
"city": "Dallas",
"county": "Dallas",
"state": "TX",
"stateName": "Texas",
"zipCode": "75209",
"country": "US",
"latitude": 32.8082,
"longitude": -96.8253,
"brokerName": "Jane Doe",
"brokerageName": "Marcus & Millichap",
"thumbnailUrl": "https://images.crexi.com/property/2145883191/thumb.jpg",
"photoCount": 18,
"hasOfferingMemorandum": true,
"isInOpportunityZone": false,
"activatedOn": "2026-08-14T09:12:00.000Z",
"updatedOn": "2026-09-02T17:45:00.000Z",
"daysOnMarket": 19,
"scrapedAt": "2026-10-01T12:00:00.000Z"
}
]

Fields shown as null are only populated when you enable the matching add-on.

The Output tab has four views: Overview for general use, 📍 Location for mapping and territory analysis, 💰 Financials for comps and underwriting, and 📇 Brokers for lead lists.

Pricing

Pay only for what you collect — there is no subscription.

ItemPrice
Listing collectedbilled per row saved to the dataset
Listing details add-onbilled per listing that returns details
Broker record add-onbilled per listing that returns brokers
Photo gallery add-onbilled per listing that returns photos

Each listing costs a fraction of a cent, so a 1,000-listing market screen costs a few dollars. The How many listings? field is pre-filled with 10 so your first test run stays small — raise it once you are happy with the output shape. Add-ons are always off by default, so a plain search run is never billed for enrichment it did not request.

Full price list is on the Pricing tab of the Actor page.

Using the API

from apify import Actor
async def main():
run = await Actor.call(
"ahmed_jasarevic/crexi-property-broker-data-scraper-pro",
input={
"dealType": "buy",
"propertyTypes": ["Industrial"],
"states": ["CA"],
"askingPriceMax": 20000000,
"maxItems": 500,
},
)
items = await Actor.call(
"apify/dataset-items",
{"datasetId": run.default_dataset_id, "clean": True, "view": "financials"},
)

Set a Task to re-run the same search on a schedule, which is the usual way to track a market over time. Compare runs using the activatedOn, updatedOn and daysOnMarket fields.

What the Apify platform adds

Runs are monitored in a dashboard, exportable to JSON, CSV, Excel or XML, and connectable to Google Sheets, Airtable, HubSpot, Salesforce, Zapier, Make and anything that speaks the Apify API. Requests go through Apify Proxy, so you do not manage proxies yourself.

How this compares

This ActorTypical Crexi scraper
Filter by state / asset class / price without building a URL✅often URL-only
Listing details, brokers, gallery as separate add-ons✅bundled, always billed
Broker phone and email✅ with add-onsometimes
Property records, tax history, demographics✕some competitors
Pre-collected broker directory✕some competitors
No Crexi account or cookies needed✅varies

If you need parcel-level property records, tax history or a pre-built broker directory, competitors such as Crexi.com intelligence or LoopNet + Crexi Scraper cover that. This Actor focuses on fast, cheap, well-structured listing and broker data.

FAQ

How much does scraping Crexi cost?

You are billed per listing collected, so a run that returns 300 listings costs 300 times the per-listing price. Add-ons are billed separately and only for listings that actually return data.

Do I need a Crexi account or cookies?

No. The Actor reads Crexi's public search API. Broker phone numbers and email addresses are only available where Crexi publishes them publicly.

Can I scrape a specific property or a single city?

Yes. Paste the Crexi search URL into ② Search URLs, or use the state, asset class and keyword inputs together. Single property pages such as https://www.crexi.com/properties/12345678/name are also supported.

Why did my run return nothing?

Usually the filters are too narrow. Remove the price or cap-rate range, widen the state selection, or turn off Include listings without a price. The run log states how many listings Crexi reported as matching, which makes this easy to diagnose.

Why are description, yearBuilt and netOperatingIncome empty?

They are only available with the Fetch listing details add-on, because they need one extra request per listing. Turn it on under ④ Add-on data.

How do I avoid collecting the same listings twice?

Every record has a stable id. Use it as the primary key when you append to a warehouse, and compare updatedOn between runs to detect price or status changes.

This Actor is intended for legitimate research, analytics and lead generation. You are responsible for complying with Crexi's Terms of Service and all applicable laws, and for having a lawful basis when you contact brokers. Do not use collected data for unsolicited outreach.

Support

Found a bug or need a filter that does not exist? Open an issue on the Issues tab of the Actor page — it is public, so other users benefit from the answer too.