{
  "openapi": "3.0.1",
  "info": {
    "title": "LoopNet UK Scraper [$0.5/1k💰] | Office & Retail | Market Data",
    "description": "Scrape LoopNet UK commercial property listings for lease and for sale - office, industrial, retail and coworking space. Get asking rents, prices, sq ft, broker contacts and photos for lead generation, rent monitoring and market research.",
    "version": "1.0",
    "x-build-id": "cgPCmC8l2R8I2G7n2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ahmed_jasarevic~loopnet-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ahmed_jasarevic-loopnet-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/ahmed_jasarevic~loopnet-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ahmed_jasarevic-loopnet-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/ahmed_jasarevic~loopnet-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ahmed_jasarevic-loopnet-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "locationSlug": {
            "title": "Location Slug",
            "type": "string",
            "description": "LoopNet URL slug for the target location. US examples: 'new-york-ny', 'los-angeles-ca', 'chicago-il', 'san-francisco-ca'. UK examples (with site=co-uk): 'london-england--united-kingdom', 'manchester-gtm--united-kingdom', or the whole country: 'united-kingdom'."
          },
          "batches": {
            "title": "Batch Locations",
            "type": "array",
            "description": "OPTIONAL. Scrape several locations in ONE run (one container, one cold start, shared memory — faster and cheaper than N runs). Each batch item: 'locationSlug' (required), optional 'listingMode' ('for-lease'/'for-sale'), optional 'site' ('com'/'co-uk'), optional 'maxItems'/'maxPages'. Per-location values default to the top-level ones. When this is set, the top-level 'locationSlug' is ignored."
          },
          "urls": {
            "title": "Direct URLs",
            "type": "array",
            "description": "OPTIONAL. Paste LoopNet SERP search URLs (e.g. https://www.loopnet.co.uk/search/commercial-property/london-england--united-kingdom/for-lease/) or single listing URLs. Each URL is handled independently (site auto-detected from the host; search URLs resume from the pasted page). When set, locationSlug/batches are ignored. minPrice/maxPrice/minSqft/maxSqft/sortBy still apply to search-URL results.",
            "items": {
              "type": "string"
            }
          },
          "listingMode": {
            "title": "Listing Mode",
            "enum": [
              "for-lease",
              "for-sale"
            ],
            "type": "string",
            "description": "Search for lease or sale listings.",
            "default": "for-lease"
          },
          "site": {
            "title": "LoopNet Site",
            "enum": [
              "com",
              "co-uk"
            ],
            "type": "string",
            "description": "Which LoopNet portal to scrape. 'com' = loopnet.com (US), 'co-uk' = loopnet.co.uk (United Kingdom). For co-uk, the fast reliable path is the plain-HTTP walk with the Apify UNBLOCKER proxy (verified working). Apify RESIDENTIAL (any pool) gets hard 403 on the co.uk search pages, so don't use it for co-uk search.",
            "default": "com"
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 1,
            "maximum": 750,
            "type": "integer",
            "description": "Maximum number of listings to scrape (max 750 per query).",
            "default": 200
          },
          "maxPages": {
            "title": "Max Pages",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Maximum number of result pages to crawl (25 items per page, max 30 pages).",
            "default": 30
          },
          "minPrice": {
            "title": "Min Price (total)",
            "minimum": 0,
            "type": "integer",
            "description": "OPTIONAL. Only keep listings whose total asking price/sale price is at least this value. Listings without a known total price (per-sqft rates, Price Upon Request) are kept, matching industry behavior."
          },
          "maxPrice": {
            "title": "Max Price (total)",
            "minimum": 0,
            "type": "integer",
            "description": "OPTIONAL. Only keep listings whose total price is at most this value."
          },
          "minSqft": {
            "title": "Min Size (sq ft)",
            "minimum": 0,
            "type": "integer",
            "description": "OPTIONAL. Only keep listings of at least this size in square feet (metric sizes are converted)."
          },
          "maxSqft": {
            "title": "Max Size (sq ft)",
            "minimum": 0,
            "type": "integer",
            "description": "OPTIONAL. Only keep listings of at most this size in square feet."
          },
          "sortBy": {
            "title": "Sort Results",
            "enum": [
              "default",
              "most-recent",
              "price-asc",
              "price-desc",
              "size-asc",
              "size-desc"
            ],
            "type": "string",
            "description": "OPTIONAL. Sort each page's results before saving: most-recent (default order), price-asc, price-desc, size-asc, size-desc.",
            "default": "default"
          },
          "incrementalMode": {
            "title": "Incremental Mode (monitoring)",
            "type": "boolean",
            "description": "When enabled, the Actor compares this run's SERP results against the previous run's snapshot (stored in a key-value store, keyed per location+mode) and only pushes listings that are NEW or CHANGED (price, size, type, or contact). A listing is output only when something changed — the dataset becomes a change feed for monitoring. Disable for full snapshot scraping.",
            "default": false
          },
          "cacheTtlHours": {
            "title": "SERP Cache TTL (hours) — CHEAP MODE",
            "minimum": 0,
            "maximum": 168,
            "type": "integer",
            "description": "CHEAP MODE: how long a scraped location's results stay reusable before a fresh walk is needed. When a run starts and a cache from the last run is younger than this value, the Actor serves those results straight from the key-value store with 0 UNBLOCKER requests (log says 'CHEAP MODE'). If a fresh walk fails (e.g. a dead UNBLOCKER window), an older cached copy is served as a fallback instead of returning nothing. Set 0 to disable caching and always walk live. Caches are keyed per site+location+mode, and a change in minPrice/maxPrice/minSqft/maxSqft/sortBy automatically invalidates them.",
            "default": 6
          },
          "maxWalkAttempts": {
            "title": "Max Walk Attempts (UNBLOCKER recovery)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many times to re-run the SERP walk with a short cooldown if the first attempt yields nothing (typically a bad UNBLOCKER window). 1 = try once (fast fail), 2 = one re-try after ~30s, 3 = two re-tries. Helps ride out brief UNBLOCKER outages.",
            "default": 2
          },
          "delayMs": {
            "title": "Delay Between Requests (ms)",
            "minimum": 500,
            "maximum": 10000,
            "type": "integer",
            "description": "Delay in milliseconds between fetched SERP pages. Lower settings are fine with UNBLOCKER (it rotates per request); raise it if you are using your own slower residential proxies.",
            "default": 800
          },
          "debugProbeUrls": {
            "title": "Debug Probe URLs",
            "type": "array",
            "description": "DEBUG: fetch these URL(s) over a pinned Apify proxy session and log status/bytes/flags/cookies. Plain URL = GET. 'POST;{json};{url}' = POST. Overrides normal scraping (returns immediately). Format: 'https://...' or 'POST;{};https://...'.",
            "items": {
              "type": "string"
            }
          },
          "debugProbeHeaders": {
            "title": "Debug Probe Headers",
            "type": "object",
            "description": "DEBUG: extra headers sent with each debug probe request."
          },
          "debugDumpBody": {
            "title": "Debug Dump Body",
            "type": "boolean",
            "description": "DEBUG: when debugProbeUrls is set, store the first probe response body to KVS key 'probe-body.html'.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings to avoid IP-based blocking. Works with the plain-HTTP SERP walk. For loopnet.co.uk use UNBLOCKER; for loopnet.com use RESIDENTIAL (US) - if LoopNet still blocks it, supply your own residential proxy URLs in a batch or URL input."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}