How to Scrape LoopNet Commercial Real Estate Listings
LoopNet is the largest commercial real estate marketplace, which makes it a rich public source of CRE listing data: property, address, asking rent or price, size, type, and broker across markets nationwide. This guide covers what a listing holds, where the data lives, why the site is defended, and how to turn it into a clean CRE feed without babysitting a scraper. The worked example uses a real LoopNet search.
What data a LoopNet listing holds
Each listing carries the property and the space on offer. On a real search for office space for lease in Austin, the market returned more than 750 properties, with asking rents ranging from about 12 to 40 dollars per square foot per year and spaces up to roughly 48,797 square feet. One listing was 515 Congress Ave, Austin, TX 78701, an office space for lease. The address, property type, asking rent, size, and listing type are the fields that matter, and each listing also carries a stable id you dedupe on.
Where the data actually lives
LoopNet serves its search results through an internal JSON endpoint, loopnet.com/services/search, whose payload carries the listing placards along with rich per-listing attributes: city, state, ZIP, property type, exposure tier, and a listing id, held in structured fields rather than only in the rendered map. Reading that JSON is cleaner than scraping the map view, since it gives you the address, type, and location for every result in one response.
Skip the build, get the feed
Send us your LoopNet target and we will scrape a real sample and send it back, no signup.
Get a free sampleThe anti-bot reality
LoopNet is a CoStar property, and it sits behind Akamai. In our own testing a proxied browser could not load the site at all, and only a normal Chrome session returned the data. That protection is the real barrier: the listing data is public and structured, but automated and proxied access is blocked, so a naive request gets a challenge rather than properties. Reliable collection means handling that layer with the right session behaviour and keeping it working as the protection changes.
Turning it into a CRE feed
For commercial real estate work you want one row per listing id, captured per market and property type, keeping the address, asking rent, size, space available, type, and broker. Refresh on a schedule so you catch new listings and price changes, and store each run with a date so you can see how long a space sits and how asking rents move, which is often the intelligence that matters more than a single snapshot.
Build it yourself or have it delivered
For one market, a careful session against the search endpoint can get you a sample. At scale and over time, the Akamai layer, the paging, and the markup changes turn it into a standing maintenance job. Once you need several markets refreshed on a schedule, a done-for-you feed is usually cheaper than the upkeep. You tell us the markets and property types, and we deliver a clean CRE feed keyed on the listing id and keep it running.
Where each field lives in the services/search JSON
LoopNet's search response is a single JSON payload with everything the results page needs. MetaState.TotalResultCount gives the size of the market, in our search more than 750 office properties in Austin. The listings themselves sit in SearchPlacards.Html, and each placard is tagged with rich per-listing attributes: a listing id, the city, state, and ZIP, the property type name (Office, Retail, Industrial and so on), the space use, and an exposure tier that reflects how prominently the listing is promoted. The listing id is the stable key you deduplicate on across pages and refreshes. Paging walks the result set to pull every property rather than the first screen, and because the whole thing is behind Akamai, the real engineering is reaching this response at all, not reading it once you have it.
Step by step: reading a LoopNet search
LoopNet serves its search results through an internal JSON endpoint that its own frontend calls, so the cleanest read is that response. Here it is on a real search, office space for lease in Austin, which returned more than 750 properties. The catch, covered right after, is that the site is behind Akamai and will not load for a proxied browser at all.
import requests
# LoopNet's frontend loads results from this internal JSON endpoint.
url = "https://www.loopnet.com/services/search"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
data = requests.get(url, headers=headers).json()
print(data["MetaState"]["TotalResultCount"], "properties")
# Each placard carries the address, property type, asking rent, and size.| Property | 515 Congress Ave |
|---|---|
| Location | Austin, TX 78701 |
| Property type | Office |
| Listing type | For lease |
| Market results | 750+ properties |
| Asking rents (market) | ~$12 to $40 / SF / year |
A sample of the clean data we deliver for one product.
The response is clean, but reaching it is the problem: LoopNet is a CoStar site behind Akamai, and in our testing a proxied browser could not load it at all, only a normal Chrome session returned the data. Getting a real, complete result means handling that protection, paging through each market and property type, and keeping it working as the defence changes. We run that for you and deliver a clean CRE feed keyed on the listing id.
Fields worth capturing from LoopNet
- Property name / title
- Full address
- City / state / ZIP
- Asking rent or price
- Rent basis (per SF / year)
- Space available (SF)
- Property type
- Listing type (lease / sale)
- Broker / company
- Listing ID
- Images
Frequently asked questions
Related service: Catalog & Assortment Tracking
Want a LoopNet feed without the build?
Send us the products or pages you need, and we will deliver a clean feed and maintain it. Start with a free sample.
Get a Free Sample