Crexi Scraper — Commercial Properties for Sale & Lease
Pricing
from $1.90 / 1,000 properties
Crexi Scraper — Commercial Properties for Sale & Lease
Extract US commercial real estate from Crexi search results. Each row is one property for sale or lease with asking price or lease rate, size, brokerage, and address.
Pricing
from $1.90 / 1,000 properties
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
20 days ago
Last modified
Categories
Share
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by Commercial Real Estate Exchange, Inc. or its affiliates. Data is read from publicly accessible property search results only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
Crexi scraper for US commercial real estate for sale and for lease. Each row is one property: asking price or lease rate, size, brokerage, address, and whether a sale card lists an offering memorandum. Export the dataset as JSON. Use it as a Crexi API alternative from Python, Node.js, cURL, or Apify MCP.
Best for: sale and lease comps in one city, brokerage names from public search cards, and a scheduled check that saves only new property ids.
| Actor | Role |
|---|---|
| Crexi Scraper ◄── you are here | US commercial sale and lease |
| LoopNet Scraper | US commercial sale, lease, and auctions |
When to use this Actor
- City, state, county, or ZIP —
Austin, TX,TX, or78701. - A filtered search you already built — Paste a search URL that includes a city, state, county, or ZIP.
- One property — Paste a single property URL.
- New-listing monitor — Schedule the same search. Later runs save property ids that were not stored last time. A quiet tick writes zero rows.
- Broker names — Turn on broker names when you want the public name and brokerage. The default row does not call that extra record.
When not to use this Actor
- Email, phone, or a downloaded offering memorandum — Those are not on the public search record. This Actor does not log in. A sale row can say that a memorandum or flyer exists. It does not download the file.
- The other US commercial marketplace — For LoopNet sale, lease, and auction cards, use LoopNet Scraper.
- A national dump in one run — Cap
maxItems. Split by city or state instead of paging the whole country.
Key features
- One property per row — Sale and lease search cards. Default 256 MB. No proxy.
- Price or lease rate — Asking price on sales. Rate, suite count, and rentable size on leases.
- Address and brokerage — Street, city, state, ZIP, coordinates, and the brokerage on the card.
- Offering memorandum flag —
hasOfferingMemorandumis true or false on sale cards. The PDF stays on the site. - Monitor — Named key-value store of property ids already saved for that search. New runs sort by activation date.
Input
| Field | Required | Default | What it does |
|---|---|---|---|
| Location | No | Austin, TX | City and state, state code, county, or ZIP. Ignored when Start URLs is set. |
| Sale or lease | No | For sale | Search type for the location. |
| Property types | No | all types | Optional types such as Office, Retail, Industrial, Multifamily, or Land. |
| Minimum / maximum asking price | No | none | Sale searches only. |
| Start URLs | No | empty | Search or property URLs. Overrides the fields above. |
| Max properties | No | 25 | Cap across all searches. Maximum 500. |
| Include broker names | No | off | Public broker name and brokerage. No email or phone. |
| Monitor mode | No | off | Save only property ids not seen on the previous run of this search. |
{"location": "Austin, TX","transaction": "sale","propertyTypes": ["Retail"],"maxItems": 25,"includeBrokers": false,"monitorMode": false}
Output
One dataset row per property.
| Field | Meaning |
|---|---|
listingId | Property id |
url | Property URL |
name | Listing name |
transaction | sale or lease |
propertyType | Types on the card |
description | Short public description |
status | Listing status |
investmentType | Investment type when the sale card states one |
askingPrice, currency | Sale asking price, USD |
squareFootage | Building size, or minimum rentable size on a lease |
rateMin, rateMax, rateType | Lease rate per square foot per year, and how it is quoted |
rateYearly, rateMonthly | Yearly and monthly lease rate as shown |
rentableSqftMin, rentableSqftMax, suiteCount | Lease size range and suite count |
brokerage | Brokerage on the search card |
brokerName | Public broker name when broker names are on |
address, city, county, state, zip | Location |
latitude, longitude | Map point |
hasOfferingMemorandum, hasFlyer | Sale card says a memorandum or flyer exists |
isInOpportunityZone | Sale card marks an opportunity zone |
image | Primary photo |
activatedOn | When the listing was activated |
scrapedAt | UTC timestamp |
{"listingId": "2669174","url": "https://www.crexi.com/properties/2669174/texas-7-eleven-retail-building---austin-tx","name": "7-Eleven Retail Building - Austin, TX","city": "Austin","state": "TX","zip": "78759","transaction": "sale","propertyType": "Retail","askingPrice": 5200000,"currency": "USD","squareFootage": 3650,"brokerage": "Matthews","hasOfferingMemorandum": true}
Use cases
- Pull retail and office listings for sale in one metro and compare asking price and size for commercial real estate comps.
- Export lease spaces with rate and rentable square feet for a tenant search.
- Schedule a morning run in monitor mode and keep only property ids that were not in yesterday’s file.
- Feed address, price, and brokerage into an internal comps sheet. For the other major US commercial marketplace, continue with LoopNet Scraper.
Integration examples
Replace APIFY_TOKEN. The slug below is the Store name.
Node.js
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor("crawloop/crexi-scraper").call({location: "Austin, TX",transaction: "sale",maxItems: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("crawloop/crexi-scraper").call(run_input={"location": "Austin, TX","transaction": "lease","maxItems": 25,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(len(items))
cURL
curl -X POST "https://api.apify.com/v2/acts/crawloop~crexi-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"location":"Austin, TX","transaction":"sale","maxItems":10}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP.
Connect your Apify account, then call this Actor by its Store name crawloop/crexi-scraper.
Example prompts:
- "Run Crexi Scraper for Austin, TX for-sale retail and return the top 20 rows as JSON"
- "Scrape Crexi lease spaces in Dallas and summarize rate, size, and brokerage"
- "Run Crexi Scraper in monitor mode for Houston offices, then use LoopNet Scraper for the same city"
Suite next step
This Actor covers Crexi sale and lease cards. For LoopNet sale, lease, and auction cards in the same market, run LoopNet Scraper.
FAQ
Does this download the offering memorandum?
No. Sale rows include hasOfferingMemorandum when the public card says a memorandum exists. The file requires a login, and this Actor does not log in or charge for a download.
Are broker emails included? No. Broker names, when you turn them on, are the public name and brokerage. Email and phone are not on that record.
Does a row include cap rate or NOI? No. Cap rate and NOI are not on the public search card this Actor saves.
Why was my search URL skipped? A link that only contains a place id cannot be sent as a public search filter. Use a city, state, county, or ZIP, or a search URL that already includes one of those.
What does monitor mode skip? Property ids already stored for that same search. Change the city or the transaction and it is a new cursor. A run with no new ids writes zero rows.