LoopNet API

US commercial property as JSON, by market, submarket, county or ZIP

The LoopNet API returns the largest US commercial property marketplace as clean JSON in four actions.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a LoopNet endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
L
/loopnet/v1

4 active endpoints, on 0, 1 and 2 credit tiers.

  • POST/loopnet/v1/search
  • POST/loopnet/v1/property_detail
  • POST/loopnet/v1/listings
  • POST/loopnet/v1/location_search

What LoopNet endpoints does ReefAPI ship?

4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

4 endpoints

search

2 cr

Commercial listings in a market.

required
—
optional
location, location_id, transaction, property_type, page, limit, sort, min_price, max_price, min_rent, max_rent, min_building_size, max_building_size, size_unit, min_space_available, max_space_available, min_lot_size, max_lot_size, lot_size_unit, min_year_built, max_year_built, min_cap_rate, max_cap_rate, min_units, max_units, keywords, sublease_only, net_leased_only

property_detail

2 cr

One listing by id or URL.

required
listing_id
optional
—

listings

1 cr

Up to 30 listing ids in ONE upstream call.

required
listing_ids
optional
—

location_search

0 cr

Turn a typed place into the geography LoopNet's search takes.

required
query
optional
limit

Every parameter, every allowed value →

LoopNet API

4 of 4 endpoints, ready to run

View docs ↗

US commercial listings in a market: the asking figure with its shape and rate term, property type, size band, address, description, photos, broker and brokerage. 25 a page, up to 100 rows in one call, plus every listing id in the result set.

2 credits0 required · 28 optional
POST/loopnet/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the LoopNet API works

LoopNet is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 294 engines.

02
Call
POST /loopnet/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
0 or 1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Resolve the place first, because it is free and it is where searches go wrong quietly

A LoopNet search scoped to the wrong geography still returns listings and a total, and it looks entirely healthy. Typing a ZIP code or a neighbourhood name can match a single building rather than an area. Checking it costs nothing.

01location_search
POST/loopnet/v1/location_search
{"query": "78704"}

Zero credits. Returns the ranked matches with their type and their location_id. Only area types (state, city, postal_code, submarket, county, country) carry a bounding box, and searchable says so. A property, address or building row has none.

02search
POST/loopnet/v1/search
{"location": "Austin, TX", "location_id": "<the row you want>", "transaction": "for_lease", "property_type": ["office"]}

2 credits for 25 rows. Read total_results and total_is_capped before you page: a big metro reports 750 and that means 750 or more. all_listing_ids hands back every id in the set on this first call, up to 750.

03listings
POST/loopnet/v1/listings
{"listing_ids": ["<30 ids from all_listing_ids>"]}

1 credit for up to 30 ids in one upstream call. The compact record: address, property type, the asking figure and the lead photo. This is how you re-price a saved watchlist cheaply, and missing names the ids that have been retired.

04property_detail
POST/loopnet/v1/property_detail
{"listing_id": "<a row that looks worth it>"}

2 credits. The facts table, every available space with its own rate, the coordinates and the brokers, none of which is on the results card. detail_level tells you whether the deep record came back as full or whether you got the listing-card record as placard.

A geography you can prove, a market total you can budget against, every id in the set from one call, and the facts table for the handful of listings that earn a second look.

request
curl -X POST https://api.reefapi.com/loopnet/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"location":"Austin, TX","transaction":"for_lease","property_type":["office"],"limit":25}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "loopnet",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What the LoopNet price field actually means

A US commercial asking figure is often not a number. It can be a band, a rate per square foot per year, a flat annual amount, or nothing at all. Every price comes back with a shape and a rate_term so two listings quoting 30 are never compared by accident. Counts below are from 669 live search rows read on 2026-09-25.

shapeWhat LoopNet showsWhat it meansWhat comes back
single$2,750,000, or $30.00 SF/YRone published figurevalue_min equals value_max, and rate_term says which term it is. 343 of 669 rows
range$21.50 - $27.00 SF/YRthe listing quotes a bandboth ends kept, in value_min and value_max. 99 of 669 rows
nonenothing at all on the cardthe listing publishes no asking figure on this surfacedisplay is null and every number is null, never a zero. 227 of 669 rows, 34 percent
on_requestUpon Requestthe figure sits behind an enquirythe wording is kept in display and no number is invented
multipleseveral units priced separately under one idnot seen in the measured sample, carried as a guardflagged, with no single number invented

rate_term is one of per_sf_per_year, per_sf_per_month, amount_per_year, amount_per_month, per_acre_per_year, or total for a sale price. On the detail record each available space carries its own rate, because LoopNet renders four rate displays for the same suite at once and flattening them produces one nonsense figure.

United States only, three sides of the market, and the fields that are honestly not there

Measured 2026-09-25 across a 69-call live sweep in ten US markets, both sides of the market and nine property types, with 669 search rows read field by field. Four of these lines go against us.

US commercial property, priced in USD

Offices, retail, industrial, flex, medical, restaurant, lab, land and coworking for lease; offices, industrial, retail, shopping centres, multifamily, specialty, health care, hospitality, sports and entertainment, land, residential income, restaurant and lab for sale; plus a third side, auction, which a nationwide search returned 171 of. Searchable by market, submarket, county, state, ZIP code, street address, or the word usa for the whole country.

The location input is LoopNet's own geography, not free text

Typing a ZIP code or a neighbourhood can match a single building rather than an area, and a search scoped to one building still looks healthy. location_search is free and reports each match's type (state, city, postal_code, submarket, county, country, or property, address and building for a single site) and whether an area search can be scoped to it. Only the area types carry a bounding box. 'Downtown Austin' matched buildings only, because LoopNet has no such neighbourhood.

Fifteen filter blocks, each proven against a same-run control

Run in Austin, TX with the unfiltered control re-measured immediately before and after each block. On the lease side, 750 fell to office 502, retail 302, industrial 195, flex 115, medical 61, land 41 and lab 6; asking rent of 40 and up to 499; space of 20,000 SF and up to 291; sublease to 94; 'warehouse' as a keyword to 227. On the sale side, 548 fell to 47 above 5 million dollars, 34 below 500,000, 122 above 5 acres, 92 built 2015 or later, 58 built 1960 or earlier, 27 at 20 units or more, 17 net leased, 5 at a cap rate of 8 percent or higher and 1 at 4 percent or lower. Filters LoopNet accepts and then ignores are not offered at all.

The filter set differs by side of the market

Rent, space available and sublease exist only for lease. Price, cap rate, unit count, lot size and year built exist only for sale. The two sides also use different property-type trees, so a type that does not exist on the chosen side is rejected rather than ignored, and filters_applied echoes what was actually sent.

The reported total stops at 750, and paging stops in the same place

Los Angeles, New York and Houston all report exactly 750 on both sides, which means 750 or more, and total_is_capped says when the ceiling was hit. Smaller markets report the true figure: Boise 205 for lease and 119 for sale, Laramie 6 and 13. Page 31 renders nothing, so 30 pages of 25 is the end. all_listing_ids returns every id in the set on the first call, so the cap limits rows, not id discovery. Narrow by submarket, type or price band to reach the rest.

The asking figure is a shape, never coerced into a number

Over 669 live rows: 343 published a single figure, 99 published a range such as $21.50 - $27.00 SF/YR, and 227 published nothing. Every price carries value_min, value_max, currency and a rate_term of per_sf_per_year, per_sf_per_month, amount_per_year, amount_per_month, per_acre_per_year or total, because two listings quoting 30 are not comparable unless the term matches.

Against us: a third of listings publish no asking figure

227 of 669 rows, 34 percent, carried no price at all on the search surface, and 14 of 25 rows on the measured Austin lease page published no rent. That is an absence at the source, returned as shape none with every number null. It also means a rent filter silently excludes the listings that stay quiet about price, because they cannot match one.

Against us: the street address is on about half the cards

Street address on 358 of 669 rows, 54 percent, and year_built on 313, 47 percent, both varying by market and by the listing's exposure tier. Everything else on those same rows is filled: listing_id, url and images 669 of 669, city, state and property type 666, brokerage 655, postal code and description 654, the named broker 630. property_detail carries the full address for every listing whose document opens.

Against us: cap rate, NOI, units and price per SF have not been seen on a live document

These four are in the property_detail schema and the parser reads the labels LoopNet's own pages use for them, but no sampled live document has published those rows, so they come back null rather than guessed. The filters, by contrast, are proven: an Austin for-sale set of 548 drops to 5 at a cap rate of 8 percent or higher, to 1 at 4 percent or lower and to 27 at 20 units or more, so LoopNet holds the values and will screen on them. Build the screen today; do not build a column that expects a cap-rate number back on every record.

Against us: the deep record is not guaranteed, and the response says which one you got

property_detail returns detail_level of full when the listing document came back, and placard when only the listing-card record was available, in which case every field that only the document publishes is null and is never filled in from a neighbouring listing. On a live sweep the split was roughly half and half over seven ids. Coordinates are also absent from some documents and are returned null rather than interpolated from the address.

Freshness lives on the detail record

property_detail carries last_updated, and it is the only published freshness stamp on this source. Search rows carry no date at all, so a change is detected by diffing on listing_id and on the price shape rather than by reading a timestamp. Sold prices and comparable-sale history are not published on LoopNet's open pages at any depth; sale history is a CoStar subscription product.

Price

location_search is free. search and property_detail are 2 credits each, and listings is 1 credit for up to 30 ids. A 25-row page and a single listing cost the same, so ask for the page, then batch the ids you kept.

What people build with LoopNet

The jobs this data is most often used for.

4

endpoints

0/1/2

credits per call

01

Build a daily pipeline of on-market offices, retail or industrial in a target metro and diff it on listing_id.

02

Benchmark asking rent per square foot by submarket and property type, using rate_term so per-year and per-month quotes never mix.

03

Screen for-sale inventory by cap rate, unit count, lot size or year built, then pull the full record for the survivors.

04

Track nationwide auction inventory, which Austin-level searches will not show you.

What LoopNet data costs

The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 294 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/loopnet/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"location":"Austin, TX","transaction":"for_lease","property_type":["office"],"limit":25}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/loopnet/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "location": "Austin, TX",
  "transaction": "for_lease",
  "property_type": [
    "office"
  ],
  "limit": 25
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up LoopNet.

Get a free key →
How do I tell LoopNet where to search?▾

Pass location as text. It accepts a US market such as Austin, TX, a LoopNet submarket such as CBD - Austin, TX, a county such as Travis County, TX, a state such as Texas, a ZIP code such as 78704, a street address, or the word usa for a nationwide search. It is resolved through LoopNet's own geography service, which knows its own submarket names rather than every local nickname, so run location_search first if you are unsure what a phrase matches. That action is free and returns the id, the type, the coordinates and the bounding box of each match. When a place name has several matches, pass the winning row's location_id alongside the same location text: the text is still required and the id only decides which match wins.

What is the difference between for_lease, for_sale and auction?▾

They are three different sides of the LoopNet market and they do not carry the same filters. Rent, space available and sublease exist only on the lease side. Price, cap rate, unit count, lot size and year built exist only on the sale side. The property type trees also differ: office, industrial, retail, flex, medical, restaurant, lab, land and coworking for lease, and office, industrial, retail, shopping-center, multifamily, specialty, health-care, hospitality, sports-entertainment, land, residential-income, restaurant and lab for sale. A property type that does not exist on the chosen side is rejected rather than quietly ignored, and filters_applied echoes what was actually sent.

Does the API return cap rate and NOI?▾

Not today, and it is worth being exact about this because cap rate is the field commercial buyers ask for first. cap_rate, noi, units and price_per_sf are in the property_detail schema and the parser reads the labels LoopNet's own pages use for them, but no sampled live document has published those rows yet, so they come back null rather than filled with a guess. What does work is the filtering. min_cap_rate, max_cap_rate, min_units and max_units are proven to narrow against a same-run control: an Austin for-sale search of 548 listings drops to 5 at a cap rate of 8 percent or higher, to 1 at 4 percent or lower, and to 27 at 20 units or more. So LoopNet plainly holds these values and will screen on them, and you can build an investment screen today. Do not build a spreadsheet column that expects a cap-rate number back on every detail record.

Why does a listing come back with no price?▾

Because the listing did not publish one. Over 669 live rows, 227 of them, 34 percent, carried no asking figure at all on the search surface, and on the measured Austin lease page 14 of 25 rows published no rent. That is an absence at the source, not a parse failure, so it comes back as shape none with every number null. It also has a practical consequence: a listing with no published rent cannot match min_rent or max_rent, so a rent filter quietly excludes the third of the market that stays silent about price.

How many LoopNet listings can one search return?▾

25 a page, and LoopNet's own total saturates at 750. A market such as Los Angeles, New York or Houston reports exactly 750 on both sides, which means 750 or more, and total_is_capped says when the number hit that ceiling. Paging stops in the same place: page 31 renders nothing, so 30 pages of 25 is the hard end. limit fetches up to 100 rows in a single call, which is four upstream pages. You rarely need to walk them, because all_listing_ids hands back every id in the result set, up to 750, on the first call. Narrow by submarket, property type or price band to reach inventory beyond the cap.

Do I get the broker's phone number?▾

No. Each listing returns the broker's name, their brokerage, their city and state and their public LoopNet profile link, which are business facts published on the logged-out page. The direct phone number and e-mail sit behind a contact form that this API never touches. Some lower-tier listings publish no broker at all, and those come back as an empty brokers array with brokerage null rather than with a neighbouring listing's agent copied in.

Can I get sold comps or sale history?▾

No, and not because of a gap here. LoopNet does not publish sold prices or comparable-sale history on its open pages at all. Sale history is a CoStar subscription product. What is available is the live on-market side: for lease, for sale and at auction. Auctions are a real result set, not a stub. A nationwide auction search returned 171 listings, while Austin alone returned zero, which comes back as a clean not-found with the count rather than as an empty success.

Why is the street address missing on some rows?▾

Because LoopNet prints it on only about half of the search cards. Measured over 669 live rows, the street address was present on 358 of them, 54 percent, and year_built on 313, 47 percent, and both vary by market and by the listing's exposure tier. The same rows carry everything else, so this is a source absence returned as null, not a parse gap. property_detail carries the full address for every listing whose document opens, together with the coordinates. Coordinates are themselves absent from some documents and are returned as null rather than interpolated from the address.

What is the LoopNet API?▾

LoopNet API is a ReefAPI endpoint group for us commercial property for lease, for sale and at auction: offices, retail, industrial, land, multifamily and shopping centres. It returns live JSON through POST requests under /loopnet/v1.

Is the LoopNet API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. LoopNet calls use the same shared credit balance as every other ReefAPI engine.

Do I need a LoopNet login or account?▾

No login to LoopNet is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the LoopNet data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the LoopNet API use?▾

LoopNet actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call LoopNet from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call loopnet actions with the same key, credit pool and JSON envelope used by normal REST requests.

16 Real Estate APIs on the same key

One key, one credit pool, one response envelope. If you are pulling LoopNet, you are one call away from the rest of the category — no second contract, no second integration.

Already paying for something else?LoopNet vs Bright Data

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 293 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-25.