How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
crexiin Site. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Give this Actor a US place and it returns commercial property listings from Crexi and LoopNet in one table: price, cap rate, size, address, coordinates and broker company. You need no login and no account on these sites.
- It reads Crexi, LoopNet or both in one run.
- It covers listings for sale, for lease and at auction.
- It filters by price, size, cap rate, lot, year built, units, rent, keyword and date.
- It can also read each listing page for more fields, such as cap rate, NOI, year built and zoning.
- It saves the broker company. It has no fields for people's contacts, and it removes emails and phone numbers in common formats from listing text.
Good for
- You watch a US market and want new listings in a table.
- You compare asking prices and price per square foot across sites.
- You need a list of properties with coordinates for a map or a model.
Who uses it
Market watchers
Get new listings for a US market in a table.
Investors
Compare asking prices and price per square foot across sites.
Analysts
Build a list of properties with coordinates for a map or model.
Price
Prices will be shown after release.
Questions
Do I need a login on Crexi or LoopNet?
No. The tool reads public pages only. You need only an Apify account.
Does it give broker names, phones or emails?
No. It saves the broker company only.
Why is capRate empty in some rows?
On Crexi it needs a login. On LoopNet many listings do not show it on the search page.
Why does a run with no results cost money?
A run start is always charged. On LoopNet, each page read is charged too, because filters are applied after the page is read. Set a Max charge if you use narrow filters.
How complete and how fresh are the rows?
The rows show what the site showed at fetchedAt. A field is null when the site does not show it. In one test on 300 LoopNet sale rows, 284 had a price and 41 had a cap rate from search pages only.
Which site should I start with?
Start with Crexi for most cases: a run is faster and cheaper, and you get price, size and coordinates in most rows. Use LoopNet for cap rate, year built and lot size on search pages, and for lease rates.
Details
Step by step on Apify
- In Site, keep
Crexi(box 1). - In Purpose, keep
For sale(box 2). - In Location, keep
Phoenix, AZor type your own US place (box 3). - In Max listings, keep
10(box 4). - Click Start, wait for the run to end and open the Output tab.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Find properties for sale in a market | site, purpose: sale, location | Listing | price, pricePerSqft, capRate, address | Sheet or CRM |
| Compare lease rates in a city | purpose: lease, location, propertyType | Listing | rentPerSqftYearMin, rentPerSqftYearMax, sqftMin, sqftMax | Sheet or BI tool |
| Watch new deals by schedule | site: crexi, listedWithinDays, sort: newest | Listing | listingId, activatedOn, price, url | Apify schedule, Slack or Notion |
| Screen investment deals | minCapRate, includeDetails: true | Listing with details | capRate, noi, yearBuilt, zoning | Financial model |
| Refresh a list of known listings | startUrls | One listing per link | status, price, listingStatus | Your database |
Tips for better results
- Start with Crexi. It is faster and cheaper than LoopNet.
- Crexi cap rate and NOI need a login, so they stay empty. Use LoopNet with listing pages for them.
- A search shows up to 1,500 listings on Crexi and 750 on LoopNet. Split by city or type for more.
Limits and good to know
- One run: up to 1,500 listings. To get more, start several runs
- One search: Crexi shows up to 1,500 listings and LoopNet shows up to 750. To get more, split the search by city or by type. The run tells you with
SOURCE_CAPwhen a search was cut - Time: the default timeout is 300 seconds. In our tests, 700 to 1,500 Crexi rows took 9 to 17 seconds. 750 LoopNet rows took 141 to 195 seconds. Over 1,300 LoopNet rows from three places took about 280 seconds, and one such run reached the time limit at 1,350 rows. For the largest LoopNet runs, raise the timeout to 600 seconds
- Listing pages: 100 LoopNet listings with
includeDetailstook 247 seconds. For more than 100, raise the timeout - Narrow LoopNet filters over many places: a run with 20 places and a filter that matched nothing reached the 300-second limit, failed with
DEADLINEand read 61 pages. Use fewer places or filters that match - Crexi fields:
capRate, NOI and year built need a Crexi login, so they staynull. Lot size comes only from listing pages. Crexi links have no broker company - Links: a Crexi search link is not read, and it saves an error row. Use a place or links to single listings
- LoopNet fields: search pages do not show every field. A LoopNet search page has no price on auction listings. Read listing pages to get more
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"listingId": "2749151",
"site": "crexi",
"purpose": "sale",
"status": "complete",
"title": "Jiffy Lube",
"price": 2323000,
"pricePerSqft": 795.55,
"pricePerSqftBasis": "computed",
"capRate": null,
"propertyType": "Retail",
"buildingSqft": 2920,
"lotSize": null,
"address": "4848 East Warner Road, Phoenix, Maricopa County, AZ 85044",
"lat": 33.3316876,
"lng": -111.9793332,
"broker": "Matthews",
"url": "https://www.crexi.com/properties/2749151/arizona-jiffy-lube",
"source": "api.crexi.com/assets/search",
"fetchedAt": "2026-11-07T09:29:31.606Z"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
listingId | string | Listing ID on the source site. Empty on service rows. |
site | string | Source site. |
purpose | string | sale, lease or auction. Empty when a LoopNet page does not say. |
status | string | complete: all fields of the chosen route. partial: the detail page failed, search fields are kept. not_found: the search or link has nothing. error: this search or link failed or cannot run. |
statusReason | string | Why a row is not complete. |
errorCode | string | Machine-readable error, for example SOURCE_BLOCKED or UNSUPPORTED_FILTER. |
title | string | Listing title. |
price | number | Asking price in USD. Empty when the listing shows none: empty never means zero. |
priceText | string | Price as the source shows it when it is not one number, for example a range, a rent or Unpriced. |
pricePerSqft | number | Price per square foot in USD. |
pricePerSqftBasis | string | source: shown by the site. computed: price divided by building size. |
capRate | number | Cap rate in percent, for example 6.5. |
propertyType | string | Property type as the source names it. |
propertySubType | string | Property subtype as the source names it. |
buildingSqft | number | Building size in square feet. |
sqftMin | number | Smallest space for lease in square feet. |
sqftMax | number | Largest space for lease in square feet. |
rentPerSqftYearMin | number | Lowest rent in USD per square foot per year. |
rentPerSqftYearMax | number | Highest rent in USD per square foot per year. |
rentType | string | Rent basis as the source names it. |
lotSize | number | Lot size in acres. |
units | number | Number of units. |
spaces | number | Number of spaces or suites for lease. |
properties | number | Number of properties in a portfolio listing. |
yearBuilt | number | Year built. |
address | string | Address as shown. |
city | string | City. |
state | string | US state code. |
zip | string | ZIP code. |
lat | number | Latitude. |
lng | number | Longitude. |
broker | string | Brokerage company from the listing. The dataset has no fields for people's contacts. |
url | string | Listing page. |
imageUrl | string | Main photo. |
imageUrls | array | Photos found on the page used. |
description | string | Listing description. |
listingStatus | string | Listing status on Crexi, for example On-Market or Auction. |
activatedOn | string | Date the listing went live on Crexi. |
noi | number | Net operating income in USD. |
zoning | string | Zoning. |
Input settings (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Site | site | string | "crexi" |
| Purpose | purpose | string | "sale" |
| Location | location | string | "Phoenix, AZ" |
| Property type | propertyType | string | "any" |
| Max listings | maxItems | integer | 10 |
| Open each listing page | includeDetails | boolean | false |
| More locations | locations | array | |
| Links | startUrls | array | |
| Min price, USD | minPrice | number | |
| Max price, USD | maxPrice | number | |
| Min size, sq ft | minSqft | number | |
| Max size, sq ft | maxSqft | number | |
| Min cap rate, % | minCapRate | number | |
| Max cap rate, % | maxCapRate | number | |
| Min lot, acres | minLotAcres | number | |
| Max lot, acres | maxLotAcres | number | |
| Built from | minYearBuilt | integer | |
| Built until | maxYearBuilt | integer | |
| Min units | minUnits | integer | |
| Max units | maxUnits | integer | |
| Min rent, USD per sq ft per year | minRentPerSqft | number | |
| Max rent, USD per sq ft per year | maxRentPerSqft | number | |
| Keyword | keyword | string | |
| Include listings with no price | includeUnpriced | boolean | true |
| Listed in the last days | listedWithinDays | integer |








