LoopNet and Crexi commercial listings API

Search commercial listings by market on LoopNet or Crexi, or paste listing URLs. The `site` field picks the portal; Crexi is the default.

Record types
listing
Fields
45
From
$2.00 per 1,000 records

What you can request

Set mode in the request body to choose what comes back; without it the request runs as search. Each mode reads the inputs listed next to it.

ModeWhat comes backInputsBilled as
searchOne record per listing in the results for each location.

With fetchDetails: true, each listing's detail page is merged in and billed as listing-detail.

locations propertyTypes dealType sitelisting
listingThe detail page for each listing URL.listingUrlslisting-detail

Every request also takes maxItems (records for the whole request) and maxItemsPerInput (records per search, URL or name).

Example request and record

The request below is the one this example record answers. The names, usernames, photos and contact details of people in it are fictional. Long values in the record are shortened.

curl

curl -X POST https://api.urakimon.com/records/loopnet \
  -H "x-api-key: $URAKIMON_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "mode": "listing",
    "listingUrls": [
      "https://www.loopnet.com/Listing/11340-W-Olympic-Blvd-Los-Angeles-CA/29122043/",
      "https://www.loopnet.com/Listing/6565-W-Sunset-Blvd-Hollywood-CA/4109105/"
    ]
  }'

Python

import os
import requests

res = requests.post(
    "https://api.urakimon.com/records/loopnet",
    headers={"x-api-key": os.environ["URAKIMON_API_KEY"]},
    json={
        "mode": "listing",
        "listingUrls": [
            "https://www.loopnet.com/Listing/11340-W-Olympic-Blvd-Los-Angeles-CA/29122043/",
            "https://www.loopnet.com/Listing/6565-W-Sunset-Blvd-Hollywood-CA/4109105/"
        ]
    },
)
res.raise_for_status()
records = res.json()["records"]

Node

const res = await fetch("https://api.urakimon.com/records/loopnet", {
  method: "POST",
  headers: {
    "x-api-key": process.env.URAKIMON_API_KEY,
    "content-type": "application/json",
  },
  body: JSON.stringify({
    "mode": "listing",
    "listingUrls": [
      "https://www.loopnet.com/Listing/11340-W-Olympic-Blvd-Los-Angeles-CA/29122043/",
      "https://www.loopnet.com/Listing/6565-W-Sunset-Blvd-Hollywood-CA/4109105/"
    ]
  }),
});
const { records } = await res.json();
Example LoopNet recordDownload
{  "source": "loopnet",  "type": "listing",  "listingSite": "loopnet",  "id": "loopnet-4109105",  "url": "https://www.loopnet.com/Listing/6565-W-Sunset-Blvd-Hollywood-CA/4109105/",  "name": "Move-In Ready | 6565 W Sunset Blvd - 1,350 - 41,850 SF of 4-Star Office Space Available in Hollywood, CA 90028",  "status": null,  "dealType": "lease",  "price": 60,  "priceText": "60.00 (Rental Rate ($/SF/YR))",  "priceCurrency": "USD",  "capRate": null,  "propertyType": "Office",  "propertySubtypes": [],  "investmentType": null,  "spaceUse": null,  "buildingClass": "A",  "buildingSize": 75000,  "buildingSizeText": "75,000 SF",  "lotSize": null,  "lotSizeText": null,  "spaceAvailable": 41850,  "spaceAvailableText": "41,850 SF",  "yearBuilt": 1966,  "tenancy": null,  "zoning": null,  "units": null,  "occupancy": null,  "walkScore": 70,  "address": {    "street": "6565 W Sunset Blvd",    "city": "Hollywood",    "state": "CA",    "zip": "90028",    "country": "US",    "full": "6565 W Sunset Blvd, Hollywood, CA, 90028"  },  "coordinates": {    "latitude": 34.098427,    "longitude": -118.333114  },  "description": "CREATIVE BUILDING - Industry proclaimed \"gold standard\" WRITERS ROOMS\" --Networks', Studios', and Independents' favorite for decades. Ult…",  "amenities": [    "24 Hour Access",    "Atrium",    "Bus Line"  ],  "broker": {    "name": "Jordan Example",    "company": "Hollywood Offices",    "title": null,    "phone": null,    "image": "https://example.com/avatars/1.jpg",    "profileUrl": "https://example.com/people/2"  },  "brokers": [    {      "name": "Jordan Example",      "company": "Hollywood Offices",      "title": null,      "phone": null,      "image": "https://example.com/avatars/3.jpg",      "profileUrl": "https://example.com/people/4",      "city": "Hollywood",      "state": "CA"    },    {      "name": "Casey Example",      "company": "Hollywood Offices",      "title": null,      "phone": null,      "image": "https://example.com/avatars/5.jpg",      "profileUrl": "https://example.com/people/6",      "city": "Hollywood",      "state": "CA"    }  ],  "spaces": 9,  "brokerageName": "Hollywood Offices",  "brokerageLogoUrl": null,  "photos": [    "https://images1.loopnet.com/i2/17ishXWEWJUhjTHafBSH0eXvwEEkSeIPD6VQ1x3hwXY/112/image.png"  ],  "photoCount": 1,  "event": "listing-detail",  "collectedAt": "2026-09-20T19:42:25.296Z"}

Fields

Every record starts with the same envelope: source, type, event, id, url, collectedAt. What the envelope means. The tables below list the fields after it, read from real LoopNet records. Where a field does not apply to an item it is null or an empty list, not left out. "Present on" names the billed events a field comes with when it is not on every record of that type.

listing records

One commercial real estate listing sourced from LoopNet or Crexi, for sale or for lease. Billed as listing or listing-detail.

45 fields on listing records, besides the envelope
FieldTypeWhat it holdsPresent on
listingSitestringWhich source produced the record, loopnet or crexi.All
namestringThe listing's title or headline text.All
statusnull | stringThe listing's status text as reported by Crexi (for example On-Market); always null on LoopNet records.All
dealTypenull | stringWhether the listing is for sale or for lease, or null when it cannot be determined.All
priceinteger | numberThe asking price or rental rate as a number, in the unit named by priceText; null when not published.All
priceTextstringThe price exactly as displayed on the site, including any rate qualifier such as per square foot per year.All
priceCurrencystringISO 4217 currency code for price, or null when the source states none.All
capRatenullCapitalization rate as a percentage number; only published on detail records, null on search results.All
propertyTypestringThe primary property type, for example Office or Retail.All
propertySubtypesarrayList of Crexi subtype strings for the property; always empty on LoopNet records.All
investmentTypenull | stringCrexi's investment type label, or null; always null on LoopNet records.All
spaceUsenullAlways null; no parser currently populates this field.All
buildingClassnull | stringThe building's class rating (for example A), or null when not published.All
buildingSizeintegerThe building's rentable or total floor area as a number of square feet, or null.All
buildingSizeTextstringThe building size exactly as displayed on the site, including its unit.All
lotSizenullThe lot size as a number, or null when not published.All
lotSizeTextnullThe lot size exactly as displayed on the site, including its unit.All
spaceAvailableinteger | nullThe total leasable space available as a number of square feet, or null.All
spaceAvailableTextnull | stringThe available space exactly as displayed on the site, including its unit.All
yearBuiltinteger | nullFour digit year the building was built; only published on detail records, and null when auth masked.All
tenancynullThe tenancy description (for example Single or Multiple); only published on detail records.All
zoningnullThe zoning code; only published on detail records, null otherwise.All
unitsnullThe number of units in the building, or null.All
occupancynullCrexi's occupancy description, or null; always null on LoopNet records.All
walkScoreinteger | nullThe Walk Score value for the listing's address; only published on LoopNet detail records.All
addressobjectThe listing's address, with keys street, city, state, zip, country and a combined full string.All
coordinatesobjectThe listing's location, with keys latitude and longitude, both null when not available.All
descriptionnull | stringThe listing's marketing description text, or null.All
amenitiesarrayList of amenity label strings for the property; empty when none are listed.All
brokerobjectThe primary broker or contact, with keys name, company, title, phone, image and profileUrl.All
brokersarrayEvery broker or contact on the page; LoopNet entries add city and state, Crexi entries add licenses and website.All
spacesinteger | nullNumber of available spaces shown on a LoopNet for-lease listing (its Available Spaces count), or null.All
brokerageNamestringName of the brokerage handling the listing, or null.All
brokerageLogoUrlnull | stringURL of the brokerage's logo image, or null.All
photosarrayList of photo URLs for the listing; empty when none are shown.All
photoCountintegerNumber of photos in photos, or null when that count is not published separately.All
isOpportunityZoneboolean | nullWhether the property is in a designated opportunity zone; always null on LoopNet records.All
isNewboolean | nullWhether Crexi marked the listing as newly added; always null on LoopNet records.All
hasVideoboolean | nullWhether the listing includes a video; always null on LoopNet records.All
hasVirtualTourboolean | nullWhether the listing includes a virtual tour; always null on LoopNet records.All
isOffMarketboolean | nullWhether the listing is off market; only set on detail records, null on search results.All
factsnull | objectRaw label to value map of the page's additional property facts or detail rows; null when none were found.All
listedAtnull | stringISO 8601 timestamp of when the listing was first activated on Crexi; always null on LoopNet records.All
updatedAtstringISO 8601 timestamp of the listing's last update; null on LoopNet search results.All
searchLocationnullThe search location text the run searched for that produced this record; null when not run from a location search.Only listing

LoopNet data pricing

You pay once for each record you receive, at the price of the event it carries. A request that returns nothing costs nothing.

EventPer 1,000 recordsPer record
listing$2.00$0.00200
listing-detail$6.00$0.00600

Freshness and limits

  • Records are collected when you send the request. Each one carries collectedAt, the UTC time it was read.
  • POST /records/loopnet returns up to 500 records in one response. Ask for more and it answers 413; send the same body to POST /jobs/loopnet instead.
  • A request without maxItems returns up to 100 records.
  • Your key's rate limit and quotas apply to every source.

Next steps