# OnTheMarket Scraper - UK Property Listings & Agent Contacts (`abotapi/onthemarket-scraper`) Actor

Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price, address & geo, bedrooms/bathrooms, full description, key info, nearest stations & schools, area stats, floorplans, virtual tours and complete agent contacts. Search by location + filters or paste URLs.

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

## Pricing

from $1.00 / 1,000 property 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## OnTheMarket Scraper

Extract UK property listings from **onthemarket.com** - for sale, to rent and new homes - with prices, full address & geolocation, bedrooms/bathrooms, property features, media, and complete estate-agent contact details. Search by location and filters, or paste your own URLs.

### What it does

- **Three channels** - for-sale, to-rent, and new-homes listings.
- **Two ways to start** - search by location + filters, or paste search-result / property-details URLs.
- **Rich fields** - every search card carries ~28 fields. Turn on **Include full property details** to enrich each record to 85+ fields.
- **Agent contacts** - agent name, company, phone, website, contact URL and address, captured directly from the listing.
- **Filters & sort** - price, bedrooms, property type, radius, sort order, plus an include under-offer / SSTC toggle.

### Input

| Field | Description |
|---|---|
| **Mode** | `Search by location + filters` or `URL list`. |
| **Channel** | For sale · To rent · New homes (search mode). |
| **Locations** | Towns, cities, postcodes or areas - e.g. `London`, `Manchester`, `SW19`. |
| **Start URLs** | URL mode: OnTheMarket search or `/details/{id}/` URLs. |
| **Min / Max price** | Sale price, or monthly rent for to-rent. |
| **Min / Max bedrooms** | Bedroom range. |
| **Property types** | Flat, apartment, houses, detached, semi-detached, terraced, bungalows, town house, land, farms & land. |
| **Search radius** | Expand the search around the location (a quarter mile up to 40 miles). |
| **Sort order** | Recommended · Price low→high · Price high→low. |
| **Include under offer / SSTC** | Also include under-offer / sold-subject-to-contract listings. |
| **Include full property details** | Fetch each property's details page for description, key info, floorplans, nearby stations & schools, area stats and full agent contacts. |
| **Max items** | The run cap. Default 20. Set 0 for no item limit (stops at Max pages). |
| **Max pages** | No page limit by default (stops at Max items). Set a value to cap result pages walked. |
| **Proxy configuration** | Standard Apify proxy settings. |

#### Example

```json
{
  "mode": "search",
  "channel": "FOR-SALE",
  "locations": ["London"],
  "minPrice": 500000,
  "maxPrice": 1000000,
  "propertyTypes": ["houses"],
  "sortType": "price-asc",
  "includeDetails": true,
  "maxItems": 50
}
````

### Output

Each record is one property. Search-card fields include `id`, `url`, `channel`, `displayPrice`, `price`, `priceQualifier`, `bedrooms`, `bathrooms`, `humanisedPropertyType`, `propertyTitle`, `displayAddress`, `latitude`, `longitude`, `features`, `images`, `mainLabel`, `daysSinceAddedReduced`, `agentName`, `agentId`, plus the verbatim `rawAgent` object.

With **Include full property details** on, each record also carries `description`, `summary`, `keyInfo`, `rooms`, `priceRaw`, `stampDutyLabel`, `station`, `school`, `areaStats`, `poi`, `floorplans`, `videos`, `virtualtours`, `minimumAreaSqFt` / `minimumAreaSqM`, `canonicalUrl`, `agentCompanyName`, `agentPhone`, `agentPhoneEnquiries`, `agentWebsiteUrl`, `agentContactUrl`, `agentAddress`, `agentPostcode`, `agentBranchId`, and more.

A run **summary** (item count, pages fetched, details fetched, duration, throughput) is written to the key-value store under `OUTPUT`.

#### A note on agent reviews

OnTheMarket does **not** publish estate-agent reviews, ratings or testimonials, so none are included. (The only "rating" available anywhere in the data is a property's EPC energy rating, which is a property attribute - this actor surfaces it under the property's key info, not as an agent review.)

### Reliability & plan requirement

The run automatically rotates its connection and retries if a request is blocked, so large searches complete without manual intervention.

**Plan Requirement:** runs on any Apify plan.

### Pricing

You are billed per property listing returned, plus a small per-run start charge. Turning on **Include full property details** adds a small charge for each record enriched with its full details page. See the Store page for current rates.

### Send results into your apps (MCP connectors)

Results are standard Apify dataset items, so you can push them into your own tools, sheets, databases or notification channels via Apify integrations and MCP connectors.

# Actor input Schema

## `mode` (type: `string`):

How to start the scrape. 'Search' builds result pages from a location + filters. 'URL list' scrapes the search or property-details URLs you paste.

## `channel` (type: `string`):

Which listings to scrape (search mode).

## `locations` (type: `array`):

One or more places to search - a town, city, postcode or area (e.g. 'London', 'Manchester', 'SW19'). Each is resolved to its OnTheMarket search area.

## `startUrls` (type: `array`):

URL mode only. Paste OnTheMarket search-result URLs or property-details URLs (e.g. https://www.onthemarket.com/for-sale/property/london/ or https://www.onthemarket.com/details/12345678/).

## `minPrice` (type: `integer`):

Lowest price (sale price, or monthly rent for to-rent).

## `maxPrice` (type: `integer`):

Highest price (sale price, or monthly rent for to-rent).

## `minBedrooms` (type: `integer`):

Fewest bedrooms.

## `maxBedrooms` (type: `integer`):

Most bedrooms.

## `propertyTypes` (type: `array`):

Filter by property type. Leave empty for all types.

## `radius` (type: `string`):

Expand the search around the location by this many miles. Works with town / postcode locations.

## `sortType` (type: `string`):

How to order results.

## `includeUnderOffer` (type: `boolean`):

Also include listings that are under offer or sold subject to contract.

## `includeDetails` (type: `boolean`):

Fetch each property's details page for the full description, key info, floorplans, nearby stations & schools, area stats, and complete agent contact details. Slower and adds a per-record detail charge.

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

Maximum number of listings to return. This is the run cap. Set to 0 for no item limit (stops when Max pages is reached).

## `maxPages` (type: `integer`):

No page limit by default - the run stops at Max items. Set a value only to cap how many result pages are walked.

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

Proxy settings for the run. Runs on any Apify plan.

## Actor input object example

```json
{
  "mode": "search",
  "channel": "FOR-SALE",
  "locations": [
    "London"
  ],
  "sortType": "recommended",
  "includeUnderOffer": false,
  "includeDetails": false,
  "maxItems": 20,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Individual property records. Search cards carry ~28 fields; with 'Include full property details' enabled each record carries 85+ fields including full description, key info, nearest stations & schools, area stats, floorplans, virtual tours and complete agent contact details (phone, website, contact URL, address).

## `summary` (type: `string`):

Run statistics: total items, pages fetched, details fetched, blocks, proxy-tier health, duration and throughput.

# 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 = {
    "locations": [
        "London"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/onthemarket-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 = { "locations": ["London"] }

# Run the Actor and wait for it to finish
run = client.actor("abotapi/onthemarket-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 '{
  "locations": [
    "London"
  ]
}' |
apify call abotapi/onthemarket-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OnTheMarket Scraper - UK Property Listings & Agent Contacts",
        "description": "Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price, address & geo, bedrooms/bathrooms, full description, key info, nearest stations & schools, area stats, floorplans, virtual tours and complete agent contacts. Search by location + filters or paste URLs.",
        "version": "1.0",
        "x-build-id": "hiUqlfp7WrQGFHlcl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~onthemarket-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-onthemarket-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/abotapi~onthemarket-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-onthemarket-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/abotapi~onthemarket-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-onthemarket-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "How to start the scrape. 'Search' builds result pages from a location + filters. 'URL list' scrapes the search or property-details URLs you paste.",
                        "default": "search"
                    },
                    "channel": {
                        "title": "Channel",
                        "enum": [
                            "FOR-SALE",
                            "TO-RENT",
                            "NEW-HOMES"
                        ],
                        "type": "string",
                        "description": "Which listings to scrape (search mode).",
                        "default": "FOR-SALE"
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "One or more places to search - a town, city, postcode or area (e.g. 'London', 'Manchester', 'SW19'). Each is resolved to its OnTheMarket search area.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URL mode only. Paste OnTheMarket search-result URLs or property-details URLs (e.g. https://www.onthemarket.com/for-sale/property/london/ or https://www.onthemarket.com/details/12345678/).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "minPrice": {
                        "title": "Min price",
                        "type": "integer",
                        "description": "Lowest price (sale price, or monthly rent for to-rent)."
                    },
                    "maxPrice": {
                        "title": "Max price",
                        "type": "integer",
                        "description": "Highest price (sale price, or monthly rent for to-rent)."
                    },
                    "minBedrooms": {
                        "title": "Min bedrooms",
                        "type": "integer",
                        "description": "Fewest bedrooms."
                    },
                    "maxBedrooms": {
                        "title": "Max bedrooms",
                        "type": "integer",
                        "description": "Most bedrooms."
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Filter by property type. Leave empty for all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "flat",
                                "apartment",
                                "houses",
                                "detached",
                                "semi-detached",
                                "terraced",
                                "bungalows",
                                "town-house",
                                "land",
                                "farms-land"
                            ],
                            "enumTitles": [
                                "Flat",
                                "Apartment",
                                "Houses",
                                "Detached",
                                "Semi-detached",
                                "Terraced",
                                "Bungalows",
                                "Town house",
                                "Land",
                                "Farms & land"
                            ]
                        }
                    },
                    "radius": {
                        "title": "Search radius (miles)",
                        "enum": [
                            "0",
                            "0.25",
                            "0.5",
                            "1",
                            "3",
                            "5",
                            "10",
                            "15",
                            "20",
                            "30",
                            "40"
                        ],
                        "type": "string",
                        "description": "Expand the search around the location by this many miles. Works with town / postcode locations."
                    },
                    "sortType": {
                        "title": "Sort order",
                        "enum": [
                            "recommended",
                            "price-asc",
                            "price-desc"
                        ],
                        "type": "string",
                        "description": "How to order results.",
                        "default": "recommended"
                    },
                    "includeUnderOffer": {
                        "title": "Include under offer / SSTC",
                        "type": "boolean",
                        "description": "Also include listings that are under offer or sold subject to contract.",
                        "default": false
                    },
                    "includeDetails": {
                        "title": "Include full property details",
                        "type": "boolean",
                        "description": "Fetch each property's details page for the full description, key info, floorplans, nearby stations & schools, area stats, and complete agent contact details. Slower and adds a per-record detail charge.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to return. This is the run cap. Set to 0 for no item limit (stops when Max pages is reached).",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 0,
                        "type": "integer",
                        "description": "No page limit by default - the run stops at Max items. Set a value only to cap how many result pages are walked.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings for the run. Runs on any Apify plan.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
