Crexi Property Scraper · Sale & lease · $1.52/1K
Pricing
$1.52 / 1,000 results
Crexi Property Scraper · Sale & lease · $1.52/1K
Extract Crexi commercial property listings for sale or lease for CRE investment, broker prospecting and market research: pricing, location, property details, optional broker info. $1.52/1K listings.
Pricing
$1.52 / 1,000 results
Rating
0.0
(0)
Developer
MLG Data
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Crexi Scraper
Scrape Crexi commercial property listings for sale or lease and export the results to JSON or CSV. This Crexi data extractor provides a practical API alternative for public listing searches, pricing, locations, property descriptions, and the brokers attached to individual listings.
Search by property type, state, ZIP code, or keyword. You can also supply a public property URL for a direct lookup. Each result is one flat listing row, so sale and lease results can be compared in a spreadsheet or loaded into a database without unpacking nested objects. Optional detail and broker requests add information that is absent from a search card.
What data can you extract from Crexi?
Availability varies by listing type and by what the owner published. A field is null when the source does not provide it or when its enrichment option is off. The actor keeps the same column names for sale and lease listings.
| Field | Description | Example |
|---|---|---|
listingId | Numeric property listing identifier. | 2629138 |
listingUrl | Direct public property link. | https://www.crexi.com/properties/2629138/alaska-9836-w-aircraft-court |
listingType | Sale or lease search source. | Sales |
name | Listing title. | 9836 W Aircraft Court |
description | Short search result summary. | 9836 W Aircraft Court, Wasilla, AK 99623 |
marketingDescription | Longer public description when property details are enabled. | Rare opportunity to own a 5.14-acre homesite... |
status | Status reported for the listing. | On-Market |
propertyTypes | Comma-separated primary property types. | Land |
subtypes | Comma-separated subtypes from property details. | Residential |
address | Public full address when supplied. | 9836 W Aircraft Court, Wasilla, AK 99623 |
city | City. | Wasilla |
state | Two-letter state code. | AK |
postalCode | ZIP code. | 99623 |
latitude | Listing latitude. | 61.531812 |
longitude | Listing longitude. | -149.698174 |
askingPrice | Sale asking price in US dollars, if disclosed. | 245000 |
pricePerSqFtLand | Land price per square foot, converted from the source display. | 2.7 |
pricePerAcreLand | Land price per acre, converted from the source display. | null |
squareFootage | Sale listing area in square feet, if provided. | null |
lotSizeAcres | Lot size in acres from property details. | 5.14 |
yearBuilt | Building year from property details. | null |
propertyClass | Class displayed in property details. | null |
capRate | Capitalization rate number displayed in property details. | null |
rentableSqftMin | Minimum rentable lease area in square feet. | null |
rentableSqftMax | Maximum rentable lease area in square feet. | null |
baseRateSqFtPerYearMin | Minimum annual base rate per square foot. | null |
baseRateSqFtPerYearMax | Maximum annual base rate per square foot. | null |
numberOfSuites | Available lease suite count. | null |
buildingHighlights | Public building highlights when details are enabled. | null |
brokerageName | Brokerage displayed with the listing. | null |
brokerName | First public broker attached to the listing. | null |
brokerId | First public broker's numeric identifier. | null |
brokerProfileUrl | First public broker's profile link. | null |
brokerLicenseNumbers | First public broker's displayed license numbers. | null |
brokerNumberOfAssets | Asset count attributed to the first broker. | null |
brokerCount | Number of brokers attached to the listing. | null |
activatedOn | Listing activation timestamp. | 2026-07-21T09:25:55.244Z |
updatedOn | Last listing update timestamp. | 2026-07-21T09:25:55.244Z |
thumbnailUrl | Main public listing image URL. | https://crexi.com/images/... |
hasOM | Whether an offering memorandum is indicated. | false |
hasFlyer | Whether a flyer is indicated. | true |
hasVideo | Whether video is indicated. | false |
hasVirtualTour | Whether a virtual tour is indicated. | false |
isInOpportunityZone | Opportunity zone flag when supplied. | false |
isNew | New listing flag when supplied. | false |
The broker fields describe the first public broker in the listing's broker block. brokerCount reports how many broker entries were returned. This actor does not provide broker phone numbers, private email addresses, a statewide broker directory, property records, or downloadable documents.
How to scrape Crexi
- Select For sale or For lease. For a targeted search, enter state codes, ZIP codes, a property type, or a keyword. A broad search with no filters is allowed.
- Set Maximum listings to control the size of the dataset. The default is 100. If you want a specific property, enter its public property URL in Property or search URLs.
- Enable Include property details to add the long description and detail fields. Enable Include broker details when you need the public broker name, profile, license numbers, and asset count attached to each listing.
- Run the actor and inspect the dataset. Export the result as JSON or CSV, or use the dataset link in a scheduled workflow.
A start URL takes precedence over the search controls. For example, when a search URL is provided, the actor reads the supported filters from that URL rather than combining it with the separate state and property-type inputs. Direct property URLs are fetched one at a time and count toward the same maximum.
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | URL list | Empty | Public property URLs or supported search URLs. Direct property IDs and supported search query filters are accepted. |
listingType | Select | Sales | Select Sales or Lease for a search without start URLs. |
searchTerm | Text | Empty | Keyword or place name for a search without start URLs. |
propertyTypes | Text list | Empty | Exact property type labels such as Land, Office, Retail, or Multifamily. |
states | Text list | Empty | Two-letter state codes. Multiple values widen the search. |
zips | Text list | Empty | ZIP code filters. |
maxItems | Integer | 100 | Maximum rows across the run. Zero collects the available window for each search. |
includeListingDetails | Boolean | false | Fetch one additional public property record per result. |
includeBrokerDetails | Boolean | false | Fetch one additional public broker block per result. |
proxyConfiguration | Object | Default routing | Optional routing override. |
A realistic input for public Alaska land listings is:
{"listingType": "Sales","states": ["AK"],"propertyTypes": ["Land"],"maxItems": 30,"includeListingDetails": true,"includeBrokerDetails": true}
A direct lookup uses startUrls instead of the separate search inputs:
{"startUrls": ["https://www.crexi.com/properties/2629138/alaska-9836-w-aircraft-court"],"includeListingDetails": true,"includeBrokerDetails": true,"maxItems": 1}
Search URLs may include term, types[], states[], or zips[] parameters. A URL containing placeIds[] is rejected because that location format cannot be translated reliably by this public search path. Use the explicit state or ZIP inputs instead. Unsupported page paths are rejected with an error so a broad, unrelated result set cannot silently replace a narrow request.
Output example
This excerpt is from a successful 30-listing run with detail and broker enrichment enabled. The long marketing text and identifying broker values are omitted here; the actual dataset retains every field listed above.
{"listingId": 2629138,"listingUrl": "https://www.crexi.com/properties/2629138/alaska-9836-w-aircraft-court","listingType": "Sales","name": "9836 W Aircraft Court","description": "9836 W Aircraft Court, Wasilla, AK 99623","status": "On-Market","propertyTypes": "Land","subtypes": "Residential","address": "9836 W Aircraft Court, Wasilla, AK 99623","city": "Wasilla","state": "AK","postalCode": "99623","latitude": 61.531812,"longitude": -149.698174,"askingPrice": 245000,"lotSizeAcres": 5.14,"brokerId": 39038,"brokerCount": 1,"hasOM": false,"hasFlyer": true,"isNew": false}
The row reflects what was public at run time. Price, availability, and marketing copy may change later. Store listingId as the stable key when comparing repeated runs; use updatedOn as one clue that a listing has changed. A single property may appear in more than one search, and the actor removes duplicate listing IDs within a run.
Use cases
- Acquisition screening: collect public asking prices and addresses for a selected property type and state. Sort or filter the resulting rows before opening the most relevant listings.
- Market inventory tracking: schedule repeated searches for a ZIP code and compare listing IDs, status, asking prices, and update timestamps between runs.
- Lease availability research: export lease area ranges, base rate ranges, suite counts, and listing links for a defined market or property type.
- Broker attribution: add public broker names, profile links, license numbers, and the brokerage shown on listings when the optional broker setting is enabled.
- Location analysis: use the latitude and longitude fields to plot available properties or join the rows to your own geographic reference data.
- Property enrichment: pass a direct property URL to obtain its public detail description, subtype, lot size, class, and highlights when those fields are present.
The actor is designed for listing rows. It does not create a standalone bulk broker database. Broker details are retrieved only for listings in the run, and only the first broker's identity fields are flattened into each row.
How much does it cost to scrape Crexi?
The configured event price is $0.00152 per delivered listing, equivalent to $1.52 per 1,000 results. Charges are based on items written to the dataset. A 30-result run is $0.0456 in result events; 100 results are $0.152; 1,000 results are $1.52. Multiple filtered searches totaling 5,000 delivered rows would be $7.60 in result events.
The platform may also report resource usage for a run. The 30-result enriched validation run took about 42 seconds and showed roughly $0.004 of resource usage in its run statistics; the 40-result search-only run took about 9 seconds and showed roughly $0.001. Those observations are examples, not speed or total-cost guarantees. Additional detail and broker requests increase run time and network use, but they do not create separate result events. The current price is shown before you run the actor.
Use maxItems to cap the number of result events. For a small exploratory search, start with 30 or 100. When you need a larger sample, narrow the search by type, state, ZIP, or keyword so each filter set stays inside the site's search window.
Tips for best results
Begin with a search-only run to confirm that the filter returns the properties you expect. Then enable property or broker enrichment for the subset you actually need. A search card already includes title, property type, address, location, thumbnail, status, and many price fields, so enrichment is optional for simple inventory work.
Use the site's property type labels as they appear in search, including capitalization. Land and Office were observed to work in the public search endpoint. State codes should be two letters; the actor converts entries such as ak to AK. ZIP filters are useful for a focused neighborhood or local market. A keyword can be broad: inspect the first sample before raising the limit.
When you monitor a market over time, keep the same filters and compare listingId across runs. New IDs indicate new listings in the captured window; missing IDs may reflect removal, filter changes, ranking changes, or the search window limit. Do not treat a missing row alone as proof that a property sold.
For multiple direct property URLs, set maxItems at least as high as the number of URLs. The actor deduplicates repeated listing IDs within a run. Direct URLs retrieve the property record even when the detail option is off because that record is required to create the row.
Limits
The public search endpoint rejects requests where offset + count reaches 1,500. This actor stops each filter set at 1,499 listings. If a state or property type contains more results, divide the work into narrower searches. A broad result count is not a promise that every matching listing is reachable through one query. Filtering by state, ZIP, property type, or keyword can expose more distinct results across separate searches, subject to what the site returns.
Some fields are naturally absent. Sale listings usually do not have lease rate fields; lease listings may not have an asking price. Owners can omit prices, hide addresses, or leave detail fields empty. Document and media flags indicate availability; this actor does not download the files. Detail fields appear only when includeListingDetails is enabled, except for a direct property URL, which already requires the property record.
Broker enrichment uses the public broker block attached to a listing. It does not unlock contact details, produce private email addresses or phone numbers, or search the entire broker directory. The first broker is represented in the flat broker fields; brokerCount shows how many were attached. If a listing has no public broker block, those fields remain empty. Public property records, tax history, ownership history, demographics, and group pages are outside this actor's current scope.
Main website pages were blocked during source discovery, but the public JSON listing and detail endpoints served the validated runs. Site changes or new access controls can affect future runs. If an endpoint fails, the actor reports an error rather than making up rows.
Use in automated workflows
Example request: “Collect 30 public land listings for sale in Alaska, include full descriptions and the public broker profile associated with each listing, and return the dataset as JSON.” The input example above expresses that request directly.
Another request: “Collect office space for lease in a chosen ZIP code, then compare listing IDs and rate ranges with last week's dataset.” Use listingType: "Lease", a ZIP filter, and a consistent maximum for each scheduled run. Compare the two datasets after both runs finish.
The dataset can be read through the actor's output link and passed to downstream reporting, mapping, or monitoring steps. Keep your own copy of run dates and filter inputs when producing a time series.
FAQ
Is it legal to use the data?
This actor reads publicly available listing and broker information. You are responsible for complying with site terms, applicable data protection rules, and the requirements of your own use case. Avoid using personal broker information for unwanted contact or other misuse.
Do I need to provide my own proxy?
No. The default routing works for the validated public JSON requests. You can provide a routing override through the optional proxy input if your environment requires it.
How fast is a run?
In validation, 40 search-only listings took about 9 seconds and 30 listings with property and broker enrichment took about 42 seconds. Network conditions, the number of results, proxy routing, and source response times can change that. Enrichment adds two requests per listing when both options are enabled.
Can I schedule and monitor searches?
Yes. Run the same input on a schedule and compare dataset rows by listingId. Keep the original filter settings with each snapshot so changes in the result set are interpretable.
Can I export to a spreadsheet?
Yes. Export the dataset in CSV format and open it in a spreadsheet. The flat field names are stable across sale and lease rows, while fields that do not apply remain empty.
Why is a field empty?
The source may not provide that value, or the relevant enrichment option may be off. A hidden asking price, an absent broker block, and a sale listing without lease rates are all normal cases. Check the public listing page before interpreting a missing value.
Can I use a copied search URL with a location ID?
Not currently. Location IDs in copied URLs require a request format that is not supported by this actor. Use the state or ZIP inputs for location filtering. The actor rejects such URLs explicitly.
Use with AI agents (MCP)
Add this actor to any MCP client (Claude, Cursor, VS Code, n8n and others) with one URL:
https://mcp.apify.com?tools=mlg14/crexi-scraper
The actor returns one dataset item per commercial property listing (asking price, address, property type, size, optional broker). Keep maxItems small so the answer arrives in seconds and costs cents.
Prompt 1: "Get 50 commercial properties for sale in Texas from Crexi."
{"listingType": "Sales","states": ["TX"],"maxItems": 50}
Prompt 2: "Find office space for lease in ZIP 78701 with broker details."
{"listingType": "Lease","zips": ["78701"],"propertyTypes": ["Office"],"includeBrokerDetails": true,"maxItems": 20}
Prompt 3: "Collect 20 retail listings for sale in California with full property details."
{"listingType": "Sales","states": ["CA"],"propertyTypes": ["Retail"],"includeListingDetails": true,"maxItems": 20}
Integrations
Use the dataset URL after each run to feed reporting, alerting, mapping, or internal storage. Scheduled runs can create periodic market snapshots. Webhooks can notify a downstream workflow when a run finishes, and the flat output can be imported into a spreadsheet or database without a nested-data conversion step.
Support
Open an issue on the Issues tab; we reply within 24h and add fields on request.