Crexi Scraper [💰$3.5/1K] | Commercial CRE | Broker Leads
Pricing
from $3.47 / 1,000 results
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
Maintained by CommunityActor stats
2
Bookmarked
69
Total users
7
Monthly active users
7 days ago
Last modified
Categories
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-on | Adds |
|---|---|
| Fetch listing details | Full marketing description, year built, zoning, APN, lease type, occupancy, amenities |
| Include listing brokers | Every broker on the listing, with license numbers and phone/email where Crexi publishes them |
| Include photo gallery | Full-size URL of every photo |
Tutorial
- Open the Actor in Apify Console and press Start. The defaults collect 10 listings so you can check the output shape before spending anything.
- In ① For sale or for lease, pick the deal type.
- In ① Property types and ① States, select what you want. Leave both empty for a nationwide search.
- Use ③ Filter results to set an asking price or cap rate range. Anything left empty is ignored.
- Raise ⑤ How many listings? when you are happy with the output.
- Open the Output tab and export as JSON, CSV or Excel.
Reproducing an exact Crexi search
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:
| Filter | Applied by |
|---|---|
| Property types, states, keyword, asking price, cap rate | Crexi, server-side |
| Map area (city, county, ZIP) | Crexi, server-side, from a resolved placeIds[] |
| Building size, price per sq ft | The 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.
| Item | Price |
|---|---|
| Listing collected | billed per row saved to the dataset |
| Listing details add-on | billed per listing that returns details |
| Broker record add-on | billed per listing that returns brokers |
| Photo gallery add-on | billed 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 Actorasync 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 Actor | Typical 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-on | sometimes |
| 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.
Is scraping Crexi legal?
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.