Use case
Building a County-Level Commercial Inventory Map from Crexi
Every commercial listing in a set of markets, with county, coordinates and asking price on each row — and how to sweep past Crexi's 1,499-result paging ceiling.
“What is for sale in this market, and where?” is a question you cannot answer from a listing site one page at a time. You need every listing in the geography as rows, with a coordinate, a price and — where Crexi states one — a county, so you can put them on a map, group them, and see where inventory is concentrated and what it is asking.
Crexi publishes all of that. The work is getting it out in bulk, and the one thing that will quietly ruin your dataset if you do not plan for it is a paging ceiling.
The ceiling, and how to sweep past it
Crexi refuses any search where offset plus count reaches 1500. That is the platform’s limit, not a setting — so no single search can return more than 1,499 listings, out of a catalogue that held 242,488 on 7 September 2026.
That is easy to trip over without noticing. On the same day, “austin texas” with no property-type filter matched 2,367 listings: a single mid-sized metro already exceeds the window. A sweep that looks like it finished would have silently held about 63% of the city.
The fix is to slice the search until each slice fits, and the natural slices are the ones you probably want as columns anyway — geography and property type. Crexi’s eleven types and their live counts on 7 September 2026:
| Type | Listings |
|---|---|
Land | 118,855 |
Retail | 57,038 |
Office | 38,854 |
Industrial | 29,049 |
Multifamily | 28,964 |
MixedUse | 22,304 |
SpecialPurpose | 15,999 |
Hospitality | 5,711 |
SelfStorage | 2,367 |
MobileHomePark | 1,097 |
SeniorLiving | 838 |
So rather than one broad sweep, run city × type and let each one come back well inside the window:
{
"queries": [
"austin texas",
"san antonio texas",
"houston texas",
"dallas texas"
],
"types": ["Retail"],
"maxResults": 1499
}
maxResults applies per location, not per run, so four cities can each return up to their own
cap. That detail is the difference between four complete markets and one complete market followed
by three that look empty.
You do not have to guess whether a slice fit. When a search matches more than can be paged, the run returns a free row saying how many Crexi matched against how many it could reach — so a truncated sweep announces itself instead of looking like a finished one.
What each row gives you for the map
{
"listing_id": "2661656",
"name": "6229 Old Lockhart Road",
"property_types": ["Retail", "Industrial", "Land"],
"status": "On-Market",
"asking_price": 650000.0,
"city": "Buda",
"county": "Travis County",
"state": "TX",
"zip": "78610",
"latitude": 30.0733165,
"longitude": -97.7213696,
"brokerage_name": "John B. Sanford Real Estate",
"activated_on": "2026-08-13T18:35:24.429Z",
"market_url": "https://www.crexi.com/properties/2661656/texas-6229-old-lockhart-road"
}
county, latitude and longitude come from Crexi’s own listing record. Nothing is geocoded here
from an address string, which matters for exactly this use case: a geocoder handed “6229 Old
Lockhart Road” with no ZIP can land on a street centroid, or the middle of the city, and the pin
will look entirely reasonable while being wrong. Taking the point the source published avoids the
whole class of problem.
One caveat before you group by it: county is not on every listing. Across 40 Austin retail
listings checked on 7 September 2026 it was present on 33 — Crexi simply does not state it on all
of them. city, state and the coordinates were on all 40, so if you need every row to land
somewhere, group on city or derive the county from the coordinates yourself.
Note also that property_types is a list. A property can carry several — the row above is Retail,
Industrial and Land at once — so grouping by “type” means deciding whether a mixed listing counts
once or several times. Crexi’s own totals count it in each.
Grouping it
With those columns, the analysis is ordinary spreadsheet work:
- Inventory by county — count rows grouped by
county. - Price bands — bucket
asking_price, remembering that null is a real answer (“call for offers”) and not a gap. SettingminPriceormaxPriceon the run removes unpriced listings entirely, so leave them empty if you want to count them. - Newest first — sort on
activated_on, the date Crexi made the listing live. Run the same input weekly and diff onlisting_idto get what came to market since last time; the ids are Crexi’s own and stable, so the diff is exact rather than address matching. - Who is marketing it —
brokerage_nameis on every row without enrichment. Turn onincludeBrokersto get the individual broker, their profile link and how many listings they currently hold, which is a reasonable proxy for how active they are in that county.
What it costs
$0.003 per listing. A four-city retail sweep returning 1,000 listings is $3.00. A run that matches nothing, or that tells you it was truncated, costs nothing.
What this will not give you
Broker email addresses and phone numbers, because Crexi’s API publishes neither at any tier — the broker record is a name, a brokerage, a public profile and a listing count.
And a set of listing attributes that Crexi keeps behind its own paywall: Year Built, APN, Cap Rate,
Parking, Tenancy and Units among them. Those come back from Crexi as strings of asterisks rather
than as empty values, and this actor drops them rather than passing **** through as though it
were data. If your model needs cap rates, this is not the source for them.
If you only need a handful of comps in one submarket, Crexi’s own site is free and faster than any of this. The bulk route earns its place when you want several markets, kept current, in a form you can join to your own data.
Related
The full how-to guide covers the rest of the input, including the detail enrichment and what the run log tells you when a sweep is truncated.
The actor itself — Crexi Commercial Real Estate Listings & Broker Scraper — lists its live health, its nightly canary record and its current price.
For the residential side of the same map, the Zillow & Redfin Property Scraper covers individual addresses rather than what is for sale across a market.
Last updated 2026-09-07