LoopNet Scraper icon

LoopNet Scraper

Scrape LoopNet commercial listings across the US, including office, retail, industrial, multifamily, land and hotels. Search by city or URL and extract…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

LoopNet Scraper at a glance

LoopNet Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, change type (incremental mode), url, title and type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Automation, Developer Tools
Pricing
$1.80 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
31 options

Scrape LoopNet commercial listings across the US, including office, retail, industrial, multifamily, land and hotels. Search by city or URL and extract 25+ fields including price, size, address, broker contacts and photos, with optional detail enrichment.

What LoopNet Scraper can do

  • Two markets, one actor. Choose loopnet.com (US / Canada) or loopnet.co.uk (UK / international), and URL mode auto-detects the site per pasted link.
  • Two modes. Search by location and filters, or paste specific search or listing URLs, with multiple URLs supported in one run.
  • 30+ fields per listing. Address, price, size, year built, building class, broker contacts, photos, coordinates and more.
  • One normalised deal sourcing contract. Every listing also carries a commercial block with the same column names on both LoopNet edges, so a downstream pipeline never has to branch on which site a row came from.
  • Optional detail enrichment. Turn on fetchDetails to add coordinates, street address, broker phone, cap rate and occupancy per listing, only when you need them.
  • Built for schedules. Incremental mode returns only new and changed listings on recurring runs, and Resume continues one interrupted run without re-collecting what it already saved.

Choose what to collect

These inputs let you configure LoopNet Scraper - Commercial Properties, Prices & Brokers. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredsearch = build URLs from the search fields below; url = pass through your own LoopNet URLs. The price, size and sort filters apply in both modes.

Choices: search, url

locationsarraySearch mode only. Type a plain name, "London", "Los Angeles", "New York", "Paris", "Toronto" and other major markets resolve automatically per site. Not recognized yet? Paste the exact LoopNet slug instead: for loopnet.com a city slug like "los-angeles-ca" or "new-york-ny" (or "usa" for nationwide); for loopnet.co.uk a full slug like "london-england--united-kingdom" (or "united-kingdom" for nationwide). A name that resolves to nothing is logged as a warning and passed through as-is, which is likely to return 0 results, use URL mode with a pasted LoopNet search URL as the reliable fallback. Multi-location supported. In URL mode this field is ignored, because each pasted URL carries its own location.
listingTypestringSearch mode only. For Sale, For Lease (For Rent on the UK site), or Auction (US site only). In URL mode this field is ignored and the listing type is read from each pasted URL instead.

Choices: for-sale, for-lease, auction

propertyTypestringSearch mode only. Choose All Types for every category. In URL mode this field is ignored and the property type is read from each pasted URL instead.

Choices: all-commercial, office-space, retail-space, industrial-properties, multifamily, land, hotels, restaurants, healthcare-properties, special-purpose, sports-and-entertainment

urlsarrayURL mode only. Paste loopnet.com or loopnet.co.uk search or listing URLs. The site is auto-detected per URL. The search-mode fields above (Locations, Listing type, Property type) are ignored here, but the price, size and sort fields below still apply to every pasted search URL. A pasted individual listing URL is saved as-is (and always billed as a detail fetch, whether or not "Fetch detail pages" is on, since a pasted listing URL is itself the detail page). Results continue from the page number in the URL onward. The default and prefill below carry one example of every supported URL shape, see the README's URL shapes table for the full list, including auctions and sort/price/size query params. Leaving this field untouched (or omitting it) in URL mode scrapes these 12 examples, one per shape, in order until Max listings is reached (default 20), so later examples may be cut or return no rows.
minPriceintegerApplies in both search mode and URL mode, including a pasted search URL. Keeps listings priced at or above this value. Listings whose results page shows no total price (a per sq ft or per month rent, for example) are kept. A pasted individual listing URL is always saved as-is.
maxPriceintegerApplies in both search mode and URL mode, including a pasted search URL. Keeps listings priced at or below this value. Listings whose results page shows no total price (a per sq ft or per month rent, for example) are kept. A pasted individual listing URL is always saved as-is.
Show 24 more inputs
More input fields
InputWhat it controls
minSqftintegerApplies in both search mode and URL mode, including a pasted search URL. Keeps listings with size at or above this value. Listings whose results page shows no size are kept. A pasted individual listing URL is always saved as-is.
maxSqftintegerApplies in both search mode and URL mode, including a pasted search URL. Keeps listings with size at or below this value. Listings whose results page shows no size are kept. A pasted individual listing URL is always saved as-is.
sortBystringApplies in both search mode and URL mode, including a pasted search URL. On loopnet.com for-sale and for-lease searches in search mode the site applies newest, price and size orders across the whole results walk; in URL mode and on loopnet.co.uk listings are ordered within each results page.

Choices: default, most-recent, price-asc, price-desc, size-asc, size-desc

listedInLastDaysintegerOnly listings put on the market within this many days. loopnet.com applies this on the site itself in search mode (a pasted results URL keeps its own filters). The site serves four windows, 24 hours, 7 days, one month, three months, so your number walks the smallest window that contains it (1-7 -> last 7 days, 8-31 -> last month, 32+ -> last 3 months) and results may include slightly older listings than requested.
priceTypestringFor-sale searches on loopnet.com. Whether Minimum/Maximum price above is the total asking price (default), or a price per sq ft, per acre or per unit. A per-unit filter is applied by the site; this actor does not re-filter it against the card's total price.

Choices: total, per-sqft, per-acre, per-unit

minCapRatenumberFor-sale searches on loopnet.com. Only listings with a published cap rate at or above this percentage, e.g. 5.5.
maxCapRatenumberFor-sale searches on loopnet.com. Only listings with a published cap rate at or below this percentage.
portfolioFilterstringFor-sale searches on loopnet.com. Include multi-property portfolio sales (default), show only them, or leave them out.

Choices: include, only, exclude

condosFilterstringFor-sale searches on loopnet.com. Include condo units (default), show only condos, or leave them out. Applied by the site in search mode (a pasted results URL keeps its own filters) and enforced again on every row the run parses.

Choices: include, only, exclude

keywordstringSearch mode on loopnet.com. Free-text keyword the site matches against the listing text, e.g. "parking" or "drive-in".
subTypestringNarrow a loopnet.com for-sale search to one sub-type of property: warehouses, data centers, medical offices, strip malls, hotels, self-storage and more. Search mode only; it replaces the Property type above (each sub-type belongs to one property type). The site has no sub-types for lease, auction or loopnet.co.uk searches, so it is ignored there with a warning. Leave on Any for no sub-type filter.

Choices: any, live-work-space, loft-space, medical-offices, mixed-use-properties, data-centers, flex-space, refrigeration-and-cold-storage-properties, research-and-development-properties, service-properties, showrooms, telecom-facilities, truck-stops-and-truck-terminals, warehouses, auto-shops, banks, day-care-centers-and-nurseries, drug-stores, gas-stations, grocery-convenience-stores, retail-buildings, storefront-properties, outlet-malls, shopping-malls, strip-malls, dormitories, mobile-home-parks, assisted-living-facilities, hospitals, nursing-homes, rehabilitation-centers, senior-housing-facilities, hostel, hotels, amusement-parks, baseball-fields, casinos, golf-courses-and-driving-ranges, horse-stables, race-tracks, skating-rinks, theaters-and-concert-halls, commercial-land, farms, industrial-land, residential-land, car-washes, churches, marinas, parking-lots-and-garages, schools, self-storage-facilities

fetchDetailsbooleanAdds extra fields per listing (coordinates, street address, broker phone, JSON-LD). The UK site already returns title, address, size, full description and broker names on the results page, so leaving this off is faster and cheaper.
maxPagesintegerSafety ceiling on results pages walked per location/URL. Leave empty to walk every result page. Pages stop early once Max listings is reached.
maxListingsintegerStop after this many listings across all searches. 0 = unlimited.
splitLargeSearchesbooleanloopnet.com lists at most 750 results for one search. When a for-sale search hits that cap and Max listings asks for more, walk it again in price bands (splitting any band that is still capped) to reach listings beyond the first 750. Listings with no published price fall in no band. Off by default.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by listing id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. This continues ONE specific interrupted run, for recurring monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily/weekly or other recurring monitoring of the SAME search. The first run returns every matching listing as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those returned (and billed). State is kept separately per site/location/filter/fetchDetails setup; use State key to name or deliberately share a monitoring campaign. Defaults off, so existing schedules are unaffected. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the site/locations/filters/fetchDetails, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max pages/Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayOptional, incremental mode only. Field names that should never, by themselves, mark a listing UPDATED, the field still comes back in every row, it is just excluded from change detection. Use a plain field name (e.g. "exposureLevel") or a dotted path into the nested commercial block (e.g. "commercial.primaryImage"), or "commercial." to ignore every field inside that block. Leave empty for the default: this actor's own fields measured stable across repeat scrapes are already excluded automatically, so you only need this for noise you personally observe.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
changeTypeChange type (incremental mode) (text)
urlURL (link)
titleTitle (text)
listingTypeType (text)
propertyTypeProperty (text)
propertyTypeNameProperty type name (text)
spaceUseSpace use (text)
listingTypeNameListing type name (text)
exposureLevelExposure level (text)
addressRawAddress (raw) (text)
streetStreet (text)
Show 142 more fields
cityCity (text)
stateState (text)
zipCodeZip (text)
countryCountry (text)
marketIdMarket ID (text)
propertyIdProperty ID (text)
pricePrice (number)
priceRawPrice (raw) (text)
priceUnitPrice unit (text)
priceLabelPrice label (text)
listedAtListed at (date)
searchPositionPosition on results page (number)
currencyCurrency (text)
sizeSize (text)
sizeSqftSize (sqft) (number)
sizeSqftMinSize min (sqft) (number)
sizeSqftMaxSize max (sqft) (number)
sizeAcresSize (acres) (number)
yearBuiltYear Built (number)
buildingClassClass (text)
capRateCap Rate (number)
occupancyOccupancy (text)
brokerNameBroker (text)
brokerNamesBrokers (array)
brokerCompanyBrokerage (text)
brokerCompanyUrlBrokerage URL (link)
brokerPhonePhone (text)
descriptionDescription (text)
latitudeLat (number)
longitudeLng (number)
primaryPhotoPhoto (image)
photosPhotos (array)
scrapedAtScraped At (date)
changedFieldsChanged fields (incremental mode) (array)
previousPricePrevious price (incremental mode) (number)
previousSiteListingStatusPrevious site status (incremental mode) (text)
firstSeenAtFirst seen at (incremental mode) (date)
lastSeenAtLast seen at (incremental mode) (date)
commercial.contractVersionContract version (text)
commercial.recordKeyRecord key (text)
commercial.listingIdListing ID (text)
commercial.sourceSiteSource site (text)
commercial.sourceUrlSource URL (link)
commercial.assetClassAsset class (text)
commercial.assetClassRawAsset class (raw) (text)
commercial.assetClassSourceAsset class source (text)
commercial.dealTypeDeal type (text)
commercial.listingStatusStatus (text)
commercial.askingPriceAsking price (number)
commercial.askingPriceCurrencyCurrency (text)
commercial.askingPriceBasisPrice basis (text)
commercial.askingPriceRawAsking price (raw) (text)
commercial.priceAvailabilityPrice availability (text)
commercial.financialsMaskedFinancials masked (boolean)
commercial.maskedFinancialFieldsMasked fields (array)
commercial.capRateCap rate (number)
commercial.occupancyOccupancy (text)
commercial.buildingSizeSqftBuilding size (sqft) (number)
commercial.buildingSizeSqftMinBuilding size min (sqft) (number)
commercial.buildingSizeSqftMaxBuilding size max (sqft) (number)
commercial.landSizeAcresLand size (acres) (number)
commercial.sizeDisplaySize display (text)
commercial.addressAddress (text)
commercial.cityCity (text)
commercial.regionState / region (text)
commercial.postalCodePostal code (text)
commercial.countryCountry (text)
commercial.latitudeLat (number)
commercial.longitudeLng (number)
commercial.hasCoordinatesHas coordinates (boolean)
commercial.listedAtListed at (date)
commercial.brokerNameBroker (text)
commercial.brokerNamesBrokers (array)
commercial.brokerageNameBrokerage (text)
commercial.brokerageUrlBrokerage URL (link)
commercial.brokerPhoneBroker phone (text)
commercial.hasBrokerContactHas broker contact (boolean)
commercial.descriptionDescription (text)
commercial.imageCountImages (number)
commercial.primaryImagePhoto (image)
commercial.imagesImages (array) (array)
detailStatusDetail status (text)
summaryResults-card summary (text)
propertySubTypeProperty subtype (text)
saleTypeSale type (text)
saleConditionSale condition (text)
siteListingStatusStatus on site (text)
dateUpdatedLast updated (date)
pricePerSqftPrice per sq ft (number)
pricePerUnitPrice per unit (number)
unitsUnits (number)
storiesStories / floors (number)
lotSizeLot size (text)
zoningZoning (text)
opportunityZoneOpportunity Zone (boolean)
grossRentMultiplierGross rent multiplier (number)
noiNet operating income (number)
parkingRatioParking ratio (text)
totalSpaceAvailableSqftTotal space available (sq ft) (number)
maxContiguousSqftMax contiguous (sq ft) (number)
tenureTenure (UK) (text)
tenancyTenancy (text)
epcRatingEPC rating (UK) (text)
serviceChargeService charge (UK) (text)
businessRatesBusiness rates (UK) (text)
parcelIdParcel number (text)
assessedValueTotal assessed value (number)
brokerTitleBroker title (text)
brokerProfileUrlBroker profile (link)
isPortfolioPortfolio sale (boolean)
portfolioPropertyCountProperties in portfolio (number)
auctionStartDateAuction starts (date)
auctionEndDateAuction ends (date)
auctionStartingBidStarting bid (number)
highlightsHighlights (array)
amenitiesAmenities (array)
unitAmenitiesUnit amenities (array)
siteAmenitiesSite amenities (array)
transportationNearby transport (array)
spacesAvailable spaces (array)
documentsBrochures & links (array)
brokersBrokers (detail) (array)
tenantsTenants (array)
locationScoresLocation scores (object)
propertyTaxesProperty taxes (object)
propertyFactsAll property facts (object)
portfolioPropertiesPortfolio properties (array)
brokers.nameBroker (text)
brokers.titleTitle (text)
brokers.phonePhone (text)
brokers.companyBrokerage (text)
brokers.companyUrlBrokerage URL (link)
brokers.profileUrlBroker profile (link)
spaces.nameSpace / unit (text)
spaces.sizeSize (text)
spaces.sizeSqftSize (sqft) (number)
spaces.termTerm (text)
spaces.rentalRateRental rate (text)
spaces.spaceUseSpace use (text)
spaces.buildOutBuild-out (text)
spaces.availableAvailable (text)
spaces.factsAll facts on the card (object)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": "00000001",
  "url": "https://www.loopnet.co.uk/listing/sample-road-london/00000001/",
  "title": "Sample Logistics Park, Unit 1",
  "listingType": "for-lease",
  "propertyType": "industrial-properties",
  "propertyTypeName": null,
  "spaceUse": null,
  "listingTypeName": "Industrial to Let",
  "exposureLevel": "featured",
  "addressRaw": "London, AA0 0AA",
  "street": null,
  "city": "London",
  "state": null,
  "zipCode": "AA0 0AA",
  "country": "GB",
  "marketId": null,
  "propertyId": null,
  "latitude": null,
  "longitude": null,
  "price": 13.25,
  "priceRaw": "£13.25 - £15.25 sq ft pa",
  "priceUnit": "per_sqft_year",
  "priceLabel": null,
  "listedAt": null,
  "currency": "USD",
  "size": "1,000 - 25,000 sq ft",
  "sizeSqft": 25000,
  "sizeSqftMin": 1000,
  "sizeSqftMax": 25000,
  "sizeAcres": null,
  "yearBuilt": null,
  "buildingClass": null,
  "capRate": null,
  "occupancy": null,
  "brokerNames": [
    "Sample Agency",
    "Example Partners"
  ],
  "brokerCompanyUrl": null,
  "brokerName": "Sample Agency",
  "brokerCompany": null,
  "brokerPhone": null,
  "description": "Full listing description text appears here.",
  "primaryPhoto": "https://images.loopnet.co.uk/i2/000000000/117/sample.jpg",
  "photos": [
    "https://images.loopnet.co.uk/i2/000000000/117/sample.jpg"
  ],
  "scrapedAt": "2026-01-01T00:00:00.000Z",
  "detailStatus": "not_requested",
  "commercial": {
    "contractVersion": "cre-1.0",
    "recordKey": "loopnet.co.uk:00000001",
    "listingId": "00000001",
    "sourceSite": "loopnet.co.uk",
    "sourceUrl": "https://www.loopnet.co.uk/listing/sample-road-london/00000001/",
    "assetClass": "industrial",
    "assetClassRaw": "Industrial to Let",
    "assetClassSource": "listingTypeName",
    "dealType": "lease",
    "listingStatus": "active",
    "askingPrice": 13.25,
    "askingPriceCurrency": "GBP",
    "askingPriceBasis": "per_sqft_year",
    "askingPriceRaw": "£13.25 - £15.25 sq ft pa",
    "priceAvailability": "disclosed",
    "financialsMasked": false,
    "maskedFinancialFields": [
      "capRate",
      "occupancy"
    ],
    "capRate": null,
    "occupancy": null,
    "buildingSizeSqft": 25000,
    "buildingSizeSqftMin": 1000,
    "buildingSizeSqftMax": 25000,
    "landSizeAcres": null,
    "sizeDisplay": "1,000 - 25,000 sq ft",
    "address": "London, AA0 0AA",
    "city": "London",
    "region": null,
    "postalCode": "AA0 0AA",
    "country": "GB",
    "latitude": null,
    "longitude": null,
    "hasCoordinates": false,
    "listedAt": null,
    "brokerName": "Sample Agency",
    "brokerNames": [
      "Sample Agency",
      "Example Partners"
    ],
    "brokerageName": null,
    "brokerageUrl": null,
    "brokerPhone": null,
    "hasBrokerContact": false,
    "description": "Full listing description text appears here.",
    "primaryImage": "https://images.loopnet.co.uk/i2/000000000/117/sample.jpg",
    "images": [
      "https://images.loopnet.co.uk/i2/000000000/117/sample.jpg"
    ],
    "imageCount": 1
  }
}

Ways to use this data

  • Deal sourcing and acquisitions teams: build a normalised feed of for-sale and for-lease listings across markets and property types to find on-market and off-market deals.
  • Commercial brokers and analysts: track competing listings, asking prices and size ranges for a city, submarket or property type.
  • Site selection for retailers and franchises: filter available retail and industrial space by size and location to shortlist candidate sites.
  • Investment research: aggregate asking prices, cap rates and occupancy where the source discloses them, to build market comparables.
  • Real estate tech and CRM pipelines: feed listings straight into your own database or CRM, or push them into Notion, Airtable or Linear through the MCP connector.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does LoopNet Scraper return?

The documented output for LoopNet Scraper includes id, change type (incremental mode), url, title, type, property, property type name and space use. Availability of each field depends on the source page and the selected mode.

How much does LoopNet Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. The first scheduled run returns everything as NEW; every later run returns only NEW, UPDATED and REAPPEARED listings, and unchanged listings are not billed unless you turn on emitUnchanged.

What is the difference between Resume and Incremental mode?

resumeFromRunId continues ONE specific interrupted run: paste a previous run or dataset id and this run skips every listing id already saved there. incrementalMode is for running the SAME search again and again on a schedule; it keeps its own state between runs and classifies each listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. Use Resume to finish an interrupted one-off pull, and Incremental mode for ongoing monitoring.

Are there limitations I should know about?

No login or paywall gates any field this actor reads - everything documented above is public. Several filters are sale-only or lease-only and say so in their own description: minCapRate/maxCapRate/priceType/keyword/portfolioFilter/condosFilter/subType apply to for-sale searches on loopnet.com only, auction listings exist on loopnet.com only (the UK site has no auction surface), and spaces (per-unit availability) only appears on lease listings. Pricing is sometimes withheld by the listing itself rather than by this actor: priceAvailability and commercial.financialsMasked/maskedFinancialFields tell you, per row, whether a figure was published at all.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with LoopNet Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.