# OnTheMarket Scraper: UK Property Listings for Sale & Rent (`bogdiehard/onthemarket-property-scraper`) Actor

Extracts UK property listings from OnTheMarket for sale and to rent: price, qualifier, beds, type, tenure, agent branch and coordinates, per area, as rows.

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

## Pricing

from $0.70 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## OnTheMarket Scraper: UK Property Listings for Sale & Rent

Extracts UK property listings from OnTheMarket (onthemarket.com) for sale and to rent, one row per listing, with price, price qualifier, bedrooms, property type, tenure, agent branch, coordinates and postcode district, for proptech teams, mortgage and insurance lead generators, and estate-agency analysts.

### Use cases

- **Proptech and portals:** refresh a UK for-sale or to-rent feed by area every day, using the stable listing `id` to add new listings and drop old ones.
- **Mortgage and insurance lead generation:** find new listings by postcode district and property type, with the agent branch name to contact.
- **Investors and analysts:** track asking prices, guide prices and reductions by area, and check leasehold years remaining or freehold tenure.
- **Rental market research:** compare monthly and weekly rents (`priceFrequency`) and bedroom counts across UK areas.
- **New-home tracking:** flag listings a developer branch sells (`isNewHome`) and see which developers are building in an area, with the branch in `agentName`.

### Sample output

Three rows from a live run of the prefill search (London, for sale):

| id | title | priceText | bedrooms | postcodeOutward | agentName |
| --- | --- | --- | --- | --- | --- |
| 20168357 | 1 bedroom apartment for sale | £415,000 | 1 | SE8 | Peabody - Frankham Walk Market Sale |
| 20526798 | 1 bedroom flat for sale | £865,000 | 1 | E14 | James Nightingall - London |
| 19763428 | 2 bedroom apartment for sale | £1,115,000 | 2 | NW1 | Hanover - St Johns Wood |

One item as JSON, from the same run (the dataset has 29 fields; `description`, `epcRating`, `epcDate` and `chainFree` are filled only when `fetchDetails` is on):

```json
{
    "id": "20168357",
    "title": "1 bedroom apartment for sale",
    "address": "Frankham Walk Market Sale at Frankham Walk, Frankham Street, Deptford, Lewisham SE8",
    "postcodeOutward": "SE8",
    "price": 415000,
    "priceText": "£415,000",
    "priceFrequency": null,
    "priceQualifier": null,
    "bedrooms": 1,
    "bathrooms": 1,
    "propertyType": "Apartment",
    "tenure": "Leasehold",
    "agentName": "Peabody - Frankham Walk Market Sale",
    "agentId": 62755,
    "latitude": 51.478112,
    "longitude": -0.026391,
    "addedOrReduced": "Added > 14 days",
    "label": "Spotlight Property",
    "isSpotlight": true,
    "isNewHome": true,
    "hasVirtualTour": true,
    "imageUrl": "https://media.onthemarket.com/properties/20168357/1638306801/image-0-480x320.jpg",
    "description": null,
    "epcRating": null,
    "epcDate": null,
    "chainFree": null,
    "listingUrl": "https://www.onthemarket.com/details/20168357/",
    "sourceUrl": "https://www.onthemarket.com/details/20168357/",
    "scrapedAt": "2026-10-12T23:27:16.471Z"
}
```

### Pricing

**$1.00 per 1,000 results.** A 500-result run costs about $0.50. You pay only for results saved to your dataset, plus Apify's standard start fee of $0.00005 per run. Apify Silver and Gold plan users get lower per-result prices automatically.

Set **Max results** to cap what a run can cost. The Actor stops cleanly when it reaches your spending limit.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array | Required. OnTheMarket for-sale or to-rent search pages, for example https://www.onthemarket.com/for-sale/property/london/ . Allowed filters are the path forms robots.txt permits (house or flat type, bedroom count in the path, sub-areas) plus ?page=N. Other URLs are ignored and listed in the log. |
| `maxPagesPerStart` | integer | Results pages to read for each search URL, 30 listings per page. Default 5, maximum 34. |
| `fetchDetails` | boolean | Also open each listing page to add the description, EPC rating and date, and the chain-free flag. Default off. |
| `maxItems` | integer | Maximum number of listings to return. Default 100. |
| `proxyConfiguration` | object | Apify datacenter proxy by default. |

Example input:

```json
{
    "startUrls": [{ "url": "https://www.onthemarket.com/for-sale/property/london/" }],
    "maxItems": 30
}
```

### Integrations

- **API:** run the Actor and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients.
- **AI agents:** call it as a tool through the [Apify MCP server](https://mcp.apify.com).
- **No-code:** connect it to Make, Zapier or n8n, or export results straight to Google Sheets.
- **Scheduling:** run it daily or hourly with Apify Schedules and get only fresh data.

### FAQ

**What are the limits?** Each search ends at page 34, about 1,020 listings. OnTheMarket shows "50,000+" for London for sale, so split a large area into searches by property type (houses, flats), bedroom count (for example 3-bed houses) or sub-area (for example east-london), and pass each one as a start URL. Filters that robots.txt disallows (price and bedroom query parameters, map view, radius, sort order) are refused. `isNewHome` marks listings a developer branch sells or the site lists in its new-homes block. A listing that gives no price or bedroom count has those fields empty. The detail fields need `fetchDetails` and add one page request per listing.

**Is this legal?** The Actor collects public listing data only, with no login, no account cookies and no CAPTCHA solving. It crawls at a polite rate, two requests at a time and at most 40 per minute. It is not affiliated with, endorsed by or connected to OnTheMarket. You are responsible for how you use the data.

**What is never collected?** Agent telephone numbers, contact forms and person names are never output. Only the agent branch name and ID, as published on the listing, appear in `agentName` and `agentId`. E-mail addresses and phone numbers are removed from listing descriptions.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. We answer within one business day and usually ship a fix within 48 hours.

### Related Actors

- [SUUMO Rental Scraper: Japan Apartment Listings & Rents](https://apify.com/bogdiehard/suumo-rental-scraper) — the same kind of listing data for Japan rentals.

### Changelog

- **0.1** (2026-10-12) — First release.

# Actor input Schema

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

OnTheMarket for-sale or to-rent search pages, for example https://www.onthemarket.com/for-sale/property/london/. Allowed filters are the path forms robots.txt permits (house or flat type, bedroom count in the path, sub-areas) plus ?page=N. Other URLs are ignored and listed in the log.

## `maxPagesPerStart` (type: `integer`):

Results pages to read for each search URL, 30 listings per page. OnTheMarket ends every search at page 34, so one search gives at most about 1,020 listings.

## `fetchDetails` (type: `boolean`):

Also open each listing page to add the description, EPC rating and date, and the chain-free flag. Slower and uses one more request per listing. Off by default.

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

Maximum number of listings to return. You are charged per result.

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

Apify datacenter proxy is used by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.onthemarket.com/for-sale/property/london/"
    }
  ],
  "maxPagesPerStart": 5,
  "fetchDetails": false,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `stats` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.onthemarket.com/for-sale/property/london/"
        }
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bogdiehard/onthemarket-property-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 = {
    "startUrls": [{ "url": "https://www.onthemarket.com/for-sale/property/london/" }],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("bogdiehard/onthemarket-property-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.onthemarket.com/for-sale/property/london/"
    }
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call bogdiehard/onthemarket-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bogdiehard/onthemarket-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4guvSvWmYpnYosasc/builds/5RJ0SEzf7RjgsClYa/openapi.json
