# LoopNet Scraper - Commercial Real Estate Listings (`solidcode/loopnet-com-scraper`) Actor

\[💰 $1.3 / 1K] Extract US commercial real estate listings from LoopNet - for sale, for lease, or at auction across 17 property types. Addresses, sale prices, per-SF lease rates, named brokers with profile links, zoning, lot size, Walk Score and photos, as clean JSON or CSV rows.

- **URL**: https://apify.com/solidcode/loopnet-com-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LoopNet Scraper - Commercial Real Estate Listings

Pull commercial real estate listings from LoopNet at scale — sale prices, per-square-foot lease rates, named brokers with profile links, zoning, lot size, and Walk Score in one clean dataset. Built for CRE brokers, acquisition analysts, and proptech teams who need current US inventory without building and maintaining their own scraper.

Office, industrial, retail, multifamily, land and twelve more categories, for sale, for lease, or at auction. Pick a market and a category, or paste a search URL, and get structured rows back.

### Why This Scraper?

- **17 property-type categories, and the one you pick is the one you get** — office, industrial, retail, flex, land, multifamily, hotel & hospitality, health care, medical office, restaurant, laboratory, shopping center, warehouse, self-storage, specialty, and coworking, each resolved to the right LoopNet category for the listing type you chose. Measured on Hyattsville, MD, for lease: 58 listings unfiltered narrow to 16 office, 17 industrial, 23 retail, 5 land, 4 flex, 3 medical office, 1 coworking — never a silently widened all-categories search.
- **Sale prices and per-square-foot lease rates never land in the same column** — LoopNet publishes both under one price key. Here they are `salePrice` (a whole-property USD total) and `leaseRate` (per square foot per year, with the site's own unit label alongside it). Measured across 331 listings in five metros: 168 sale prices from $92,900 up, 78 lease rates between $3.00 and $80.00/SF/YR, zero overlap. A $16.00/SF office lease can never contaminate your sale-price averages.
- **Named brokers with profile links on 100% of listings with full details on** — measured across 100 detail records: every one carried at least one broker, and 53 carried more than one (up to 8 on a single listing). Name, brokerage, and LoopNet profile URL stay grouped per broker, so on a multi-broker listing you still know who works where.
- **52 distinct property facts, as LoopNet publishes them** — measured across 100 detail records: Walk Score on 95, Property Type on 88, Amenities on 73, Building Class on 65, Year Built on 61, Rentable Building Area on 51, Zoning on 38, Lot Size on 33, Cap Rate on 14 — plus price per unit, parking ratio, number of stories, opportunity-zone flag, and sale type.
- **Auctions are a first-class listing type** — for sale, for lease, and auction are three separate inventories, not one list with a badge: measured in Houston, for-sale and for-lease share none of the first 21 and 25 rows, and auction was a distinct 117-listing set nationwide the day it was measured. Auction rows carry a closing time on every row and their reserve figure with full details on — neither exists on an ordinary listing.
- **Full street address, city, state, and ZIP on 95 of every 100 enriched listings** — search rows carry one address line; enriched rows break it into components, with the ZIP kept as text so a leading-zero code like 01960 survives the export instead of arriving as 1960.
- **Prices stay honest when the source is not** — 24 of 78 priced lease rows quote a band ("$20.00 - $60.00 SF/YR") and report no single figure rather than an invented midpoint. The 6 sale rows in 168 where LoopNet glues both ends of a price range into one 13-digit number are dropped from `salePrice` instead of shipping a $9.45 trillion listing. The published string survives verbatim in `priceText` and `summary` either way, so nothing is lost.
- **33 fields per listing, and 100 listings in about 22 seconds** — 12 fields on every search row, 21 more when full details are on. A 707-listing New York sweep finished in 72 seconds.

### Use Cases

**Investment & Acquisition**

- Screen a market on cap rate, price per unit, and price per SF straight from the published property facts
- Build a buy box on building class, year built, lot size, and zoning
- Track auction inventory and closing times to plan bidding
- Flag opportunity-zone assets from the facts LoopNet already tags

**Brokerage & Comparables**

- Assemble sale comparables by sub-market with building size, sale type, and cap rate attached
- Benchmark asking rents per square foot by property type before pricing a new listing
- Diff runs on the last-updated date to catch re-priced and refreshed inventory
- Pull the full marketing description and photo for a pitch deck in one pass

**Lead Generation**

- Build broker and brokerage lists by market, property type, and listing volume
- Identify the firms holding the deepest inventory in a target sub-market
- Route new listings to the right desk using the brokerage on every row
- Prospect the brokerages behind a specific asset class — medical office, self-storage, laboratory

**Market Research & Analytics**

- Measure inventory mix across metros — office versus industrial versus retail
- Compare per-SF asking rents across states and sub-markets on a like-for-like unit
- Test walkability against asking rent using Walk Score on 95 of every 100 enriched listings
- Track how much of a market withholds its price, by category and by metro

**Data Enrichment & Integration**

- Enrich an internal CRE database with addresses, ZIP codes, photos, and descriptions
- Power a listings UI with a fresh commercial inventory feed
- Push rows into Google Sheets, a warehouse, or a CRM through the Apify API and webhooks
- Attach broker profile links to records you already hold, without a second lookup

### Getting Started

#### Simplest run

```json
{
  "propertyType": "commercial-real-estate",
  "location": "houston-tx",
  "transactionType": "for-sale",
  "maxItems": 100
}
```

#### Paste a filtered search URL from the site

Set your filters on the site, then copy the address bar URL — every filter in it is
carried through.

```json
{
  "searchUrls": [
    "https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"
  ],
  "maxItems": 750
}
```

#### Everything, with full details

```json
{
  "searchUrls": [
    "https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"
  ],
  "maxItems": 750,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | LoopNet search-result URLs, e.g. https://www.loopnet.com/search/office-space/houston-tx/for-lease/. Any /search/<property-type>/<location>/\<for-sale|for-lease|auctions>/ address works, including US neighbourhoods, states and non-US markets. Paste the FIRST page of a search, not a numbered one, and drop any ?sk= saved-search token -- LoopNet serves that token from your own logged-in session, so it is ignored here and the search would come back wider than the one you saved. Listing, property, broker and business-for-sale pages are not search URLs and are skipped. When you paste anything here, the Listing type and Property type below are ignored -- the URL carries its own. |
| `location` | string | `houston-tx` | Area to search. Used only when Search URLs is empty. |
| `transactionType` | string | `for-sale` | For sale, for lease, or auction. Used only when Search URLs is empty -- a pasted URL already carries its own /for-sale/, /for-lease/ or /auctions/ segment. Measured on houston-tx: the three return completely different listings (for-sale and for-lease share 0 of 21/25 rows on page 1), and auctions is a genuinely separate, much smaller inventory (3 in Houston, 117 nationwide). |
| `propertyType` | string | `commercial-real-estate` | Narrow to one LoopNet property category. Measured on a market small enough to report a real total (Hyattsville, MD, for lease): 58 listings unfiltered becomes 16 office, 17 industrial, 23 retail, 5 land, 4 flex, 4 laboratory, 3 medical office, 3 restaurant, 1 coworking. Some categories only exist on one listing type and say so in their name -- picking a for-sale-only category with Listing type "For lease" stops the run with a message instead of quietly searching every property type. |
| `maxItems` | integer | `100` | Maximum listings per search URL (0 = collect everything each search returns). Loopnet.com pages through at most 750 listings per search, so use several narrower searches to collect more. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every listing is one dataset row. Enabling `enrichDetails` adds 21 further fields to the same row — there is no second record type to join. Fields with no value are left off the row entirely, so a for-sale listing carries `salePrice` and no `leaseRate`, and a for-lease listing the other way round.

This is a real listing, trimmed to 8 of its 17 property facts. The two brokers' names, photos, and profile links are replaced with placeholders — your dataset carries the published values.

```json
{
  "url": "https://www.loopnet.com/Listing/6610-6618-S-Kenwood-Ave-Chicago-IL/41425953/",
  "name": "6610-6618 S Kenwood Ave, Chicago, IL 60637",
  "summary": "27,600 SF Multifamily Building Offered at $6,950,000 at a 7.27% Cap Rate in Chicago, IL 60637",
  "transactionType": "For Sale",
  "imageUrl": "https://images1.loopnet.com/i2/nKvJluRIW16ZcBbtHszu-39Tyy6kPUX8MHlu2rue2mk/106/multifamily-property-for-sale-6610-6618-s-kenwood-ave-chicago-il-60637.jpg",
  "priceText": "6950000",
  "salePrice": 6950000,
  "brokerName": "A. Reyes",
  "brokerageName": "Kiser Group",
  "searchRank": 17,
  "headline": "6610-6618 S Kenwood Ave",
  "fullDescription": "Kiser group is pleased to exclusively present for purchase 6610 S. Kenwood, a rarely available thirty-five (35) unit, center entrance courtyard in Chicago's East Woodlawn neighborhood.",
  "propertyFacts": [
    { "name": "Price", "value": ["$6,950,000"], "@type": "PropertyValue" },
    { "name": "Price Per Unit", "value": ["$198,571"], "@type": "PropertyValue" },
    { "name": "Cap Rate", "value": ["7.27%"], "@type": "PropertyValue" },
    { "name": "No. Units", "value": ["35"], "@type": "PropertyValue" },
    { "name": "Property Type", "value": ["Multifamily"], "@type": "PropertyValue" },
    { "name": "Building Class", "value": ["C"], "@type": "PropertyValue" },
    { "name": "Lot Size", "value": ["0.38 AC"], "@type": "PropertyValue" },
    { "name": "Year Built", "value": ["1924"], "@type": "PropertyValue" },
    { "name": "Zoning", "value": ["RM-5"], "@type": "PropertyValue" },
    { "name": "Walk Score", "value": 60, "@type": "PropertyValue" }
  ],
  "streetAddress": "6610-6618 S Kenwood Ave",
  "city": "Chicago",
  "state": "IL",
  "postalCode": "60637",
  "country": "US",
  "detailPriceText": "6950000",
  "brokers": [
    {
      "name": "A. Reyes",
      "memberOf": { "name": "Kiser Group", "@type": "Organization" },
      "address": { "addressLocality": "Chicago", "addressRegion": "IL", "@type": "PostalAddress" },
      "@id": "https://www.loopnet.com/commercial-real-estate-brokers/profile/a-reyes/0000aaaa/41425953#RealEstateAgent",
      "@type": "RealEstateAgent"
    },
    {
      "name": "M. Doyle",
      "memberOf": { "name": "Kiser Group", "@type": "Organization" },
      "address": { "addressLocality": "Chicago", "addressRegion": "IL", "@type": "PostalAddress" },
      "@id": "https://www.loopnet.com/commercial-real-estate-brokers/profile/m-doyle/0000bbbb/41425953#RealEstateAgent",
      "@type": "RealEstateAgent"
    }
  ],
  "brokerNames": ["A. Reyes", "M. Doyle"],
  "brokerageNames": ["Kiser Group", "Kiser Group"],
  "brokerProfileUrls": [
    "https://www.loopnet.com/commercial-real-estate-brokers/profile/a-reyes/0000aaaa/41425953#RealEstateAgent",
    "https://www.loopnet.com/commercial-real-estate-brokers/profile/m-doyle/0000bbbb/41425953#RealEstateAgent"
  ],
  "heroImageUrl": "https://images1.loopnet.com/i2/nKvJluRIW16ZcBbtHszu-39Tyy6kPUX8MHlu2rue2mk/112/image.jpg",
  "heroImageCaption": "6610-6618 S Kenwood Ave",
  "lastUpdated": "2026-07-30T00:00:00",
  "categoryUrls": [
    "https://www.loopnet.com/search/apartment-buildings/chicago-il/for-sale/#CollectionPage",
    "https://www.loopnet.com/search/apartment-buildings/il/for-sale/#CollectionPage",
    "https://www.loopnet.com/search/apartment-buildings/usa/for-sale/#CollectionPage"
  ]
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `url` | string | Listing URL |
| `name` | string | Address / Listing Name |
| `summary` | string | Listing Summary |
| `transactionType` | string | Transaction Type |

#### Price, Broker & Media

| Field | Type | Description |
|-------|------|-------------|
| `priceText` | string | Price (as shown) |
| `salePrice` | number | Sale Price (USD) |
| `leaseRate` | number | Lease Rate ($/SF/YR) |
| `brokerName` | string | Listing Broker |
| `brokerageName` | string | Brokerage |
| `imageUrl` | string | Primary Photo |
| `searchRank` | number | Search Result Rank |
| `auctionEndsAt` | string | Auction Ends |

#### With `enrichDetails` — Description & Property Facts

| Field | Type | Description |
|-------|------|-------------|
| `headline` | string | Full Listing Title |
| `fullDescription` | string | Full Description |
| `propertyFacts` | array | Property Facts — name/value pairs as published: Walk Score, Property Type, Amenities, Building Class, Year Built, Zoning, Lot Size, Cap Rate and up to 52 named entries in total |

#### With `enrichDetails` — Address

| Field | Type | Description |
|-------|------|-------------|
| `streetAddress` | string | Street Address |
| `city` | string | City |
| `state` | string | State |
| `postalCode` | string | ZIP Code |
| `country` | string | Country |

#### With `enrichDetails` — Price & Brokers

| Field | Type | Description |
|-------|------|-------------|
| `detailPriceText` | string | Detail Page Price (as shown) |
| `leaseRateUnit` | string | Lease Rate Unit |
| `auctionPrice` | number | Auction Price |
| `brokers` | array | Brokers — one entry per broker with name, brokerage, office city and state, profile URL and photo |
| `brokerNames` | array | Broker Names |
| `brokerageNames` | array | Brokerage Names |
| `brokerProfileUrls` | array | Broker Profile URLs |

#### With `enrichDetails` — Media & Dates

| Field | Type | Description |
|-------|------|-------------|
| `heroImageUrl` | string | Hero Photo |
| `heroImageCaption` | string | Hero Photo Caption |
| `videoUrls` | array | Video / 3D Tour URLs |
| `videoThumbnails` | array | Video Thumbnails |
| `lastUpdated` | string | Last Updated |
| `categoryUrls` | array | LoopNet Category Pages |

### Tips for Best Results

- **Plan around the 750-per-search ceiling** — LoopNet pages through at most 750 listings for any single search, however many match. A New York for-sale sweep returns about 700 rows and stops cleanly. To collect more, split the market by property type or sub-market and paste every URL into `searchUrls`; the run de-duplicates across them, so a listing matching two searches is collected and billed once.
- **Narrow by property type to reach inventory a broad search cannot** — a citywide search hits the ceiling long before the market runs out, but the same city split into office, industrial, retail, and land returns each category's own full set. This is the single most effective way to get complete coverage of a large metro.
- **Filter on the site first, then paste the URL** — price band, size, sub-market, and category are all encoded in the address bar and carried through. Drop any `?sk=` token from a saved search: that token is tied to your own LoopNet login, so the search would come back wider than the one you saved.
- **Read `propertyFacts` by name, never by position** — it is a list of name/value pairs and the order changes from listing to listing. `value` is usually a list of strings, a bare number for Walk Score, and a bare string on auction rows, so handle all three shapes when you flatten it into columns.
- **Turn on `enrichDetails` for anything contact, spec, or location related** — brokers with profile links, zoning, lot size, year built, Walk Score, the full marketing description, and the broken-out street address and ZIP only exist on the detail record. Leave it off for a fast price-and-address sweep at the lower rate.
- **Treat a missing `salePrice` as meaningful, not broken** — about a quarter of search rows carry no price at all, and lease rows quoting a range deliberately report no single number. `priceText` and `summary` still carry LoopNet's published wording verbatim ("Offered at $945,000 - $2,370,000"), so read those when you need the range.
- **Auction rows are shaped differently on purpose** — they carry no broker and no price at search level. Their deadline arrives in `auctionEndsAt` on every row, and their figure in `auctionPrice` once full details are on.

### Pricing

**From $1.30 per 1,000 results** (search only) or **from $2.30 per 1,000 results** (with full
details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.13 | $0.23 |
| 1,000 | $1.30 | $2.30 |
| 10,000 | $13.00 | $23.00 |
| 100,000 | $130.00 | $230.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $1.55 | $2.75 |
| Bronze | $1.45 | $2.60 |
| Silver | $1.40 | $2.45 |
| **Gold and above** | **$1.30** | **$2.30** |

Per 1,000 results.

A "result" is any listing row in the output dataset. When you run several searches at once, a listing matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same listing. The full-details rate applies only to rows that actually came back enriched — if a listing's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Loopnet.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Loopnet.com's Terms of Service.

Results may include personal data such as broker names, profile links, and contact details. Treat
them accordingly: do not use them for spam, harassment, or any unlawful purpose, and follow
applicable privacy rules when storing or processing them. Property listings may also be subject to
fair-housing rules — do not use this data to discriminate in the sale, rental, or financing of
housing.

# Actor input Schema

## `searchUrls` (type: `array`):

LoopNet search-result URLs, e.g. https://www.loopnet.com/search/office-space/houston-tx/for-lease/. Any /search/<property-type>/<location>/\<for-sale|for-lease|auctions>/ address works, including US neighbourhoods, states and non-US markets. Paste the FIRST page of a search, not a numbered one, and drop any ?sk= saved-search token -- LoopNet serves that token from your own logged-in session, so it is ignored here and the search would come back wider than the one you saved. Listing, property, broker and business-for-sale pages are not search URLs and are skipped. When you paste anything here, the Listing type and Property type below are ignored -- the URL carries its own.

## `location` (type: `string`):

Area to search. Used only when Search URLs is empty.

## `transactionType` (type: `string`):

For sale, for lease, or auction. Used only when Search URLs is empty -- a pasted URL already carries its own /for-sale/, /for-lease/ or /auctions/ segment. Measured on houston-tx: the three return completely different listings (for-sale and for-lease share 0 of 21/25 rows on page 1), and auctions is a genuinely separate, much smaller inventory (3 in Houston, 117 nationwide).

## `propertyType` (type: `string`):

Narrow to one LoopNet property category. Measured on a market small enough to report a real total (Hyattsville, MD, for lease): 58 listings unfiltered becomes 16 office, 17 industrial, 23 retail, 5 land, 4 flex, 4 laboratory, 3 medical office, 3 restaurant, 1 coworking. Some categories only exist on one listing type and say so in their name -- picking a for-sale-only category with Listing type "For lease" stops the run with a message instead of quietly searching every property type.

## `maxItems` (type: `integer`):

Maximum listings per search URL (0 = collect everything each search returns). Loopnet.com pages through at most 750 listings per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

## `proxyConfiguration` (type: `object`):

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"
  ],
  "location": "houston-tx",
  "transactionType": "for-sale",
  "propertyType": "commercial-real-estate",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each listing.

## `financial` (type: `string`):

Price & Value for each listing.

## `location` (type: `string`):

Location for each listing.

## `contact` (type: `string`):

Contacts for each listing.

## `media` (type: `string`):

Media for each listing.

## `meta` (type: `string`):

Details & Timestamps for each listing.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchUrls": [
        "https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/loopnet-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchUrls": ["https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"] }

# Run the Actor and wait for it to finish
run = client.actor("solidcode/loopnet-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.loopnet.com/search/commercial-real-estate/houston-tx/for-sale/"
  ]
}' |
apify call solidcode/loopnet-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/loopnet-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cgysOMduxiHyankht/builds/abcAjK9e1Md7jxBNI/openapi.json
