# Rightmove  $1💰 URL Search | Keyword Filtering | Rich Output (`abotapi/rightmove-scraper`) Actor

From $1/1K. Fast, reliable Rightmove.co.uk scraper for sale, rent, and sold-price listings. Search by location or direct URL and extract 80+ structured fields per property.

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

## Pricing

from $1.00 / 1,000 property records

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?

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

## Rightmove Scraper - UK Property Listings & Sold Prices

Fast, reliable, low-cost scraper for **rightmove.co.uk**. Extract properties
**for sale**, **to rent**, and **sold-price history**, by location search or
direct URL, with **80+ structured fields per property**.

### Highlights

- **Three channels**: for sale (BUY), to rent (RENT), and **sold prices** (SOLD).
- **Two input modes**: build a search from a location plus filters, or paste any
  Rightmove URL (search page, property page, or sold-price page).
- **80+ fields per property** when detail enrichment is enabled, including
  full description, key features, **council tax band**, **ground rent**,
  **service charge**, **EPC graphs**, **nearest stations and airports**,
  **broadband speeds**, **floorplans**, **lease years remaining**, price per
  sq ft, full postcode, and complete **agent contact** (company, branch
  address, phone, logo).
- **Server-side filters**: price, bedrooms, property type, radius, sort order,
  include Let Agreed / Sold STC.
- **Monitoring mode**: return only listings not seen in previous runs.
- **Predictable proxy use**: uses exactly the proxy you configure (datacenter by
  default), with automatic retries if a request is blocked. Residential is never auto-enabled.

### Quick start

#### Search by location

```json
{
  "mode": "search",
  "channel": "BUY",
  "locations": ["London", "Manchester"],
  "minPrice": 200000,
  "maxPrice": 500000,
  "minBedrooms": 2,
  "includeDetails": true,
  "maxItems": 1000
}
```

#### Rent

```json
{
  "mode": "search",
  "channel": "RENT",
  "locations": ["Leeds"],
  "maxPrice": 1500
}
```

#### Sold prices for an area

```json
{
  "mode": "search",
  "channel": "SOLD",
  "locations": ["SW19"],
  "maxItems": 200
}
```

#### Direct URLs

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" },
    { "url": "https://www.rightmove.co.uk/properties/123456789" },
    { "url": "https://www.rightmove.co.uk/house-prices/sw1a.html" }
  ]
}
```

### Input reference

| Field | Type | Description |
|---|---|---|
| `mode` | string | `search` (location plus filters) or `url` (direct URLs). |
| `channel` | string | `BUY`, `RENT`, or `SOLD` (search mode). |
| `locations` | array | Location names / areas / postcodes, e.g. `["London","SW19"]`. |
| `startUrls` | array | Direct Rightmove URLs (URL mode). |
| `maxItems` | integer | Max records (0 = unlimited, capped by Rightmove's ~1000/search). |
| `maxPages` | integer | Max result pages per location (24 listings/page). **Default 1** (first page); raise to scrape deeper. |
| `includeDetails` | boolean | Adds 40+ extra fields per property from its detail page. |
| `monitoringMode` | boolean | Return only listings not seen in previous runs. |
| `minPrice` / `maxPrice` | integer | Price range (RENT uses monthly pcm). |
| `minBedrooms` / `maxBedrooms` | integer | Bedroom range. |
| `propertyTypes` | array | `houses`, `flats`, `bungalows`, `land`, `detached`, ... |
| `radius` | string | Search radius in miles around the location. |
| `sortType` | string | Result ordering (newest / price). |
| `includeLetAgreed` / `includeSSTC` | boolean | Include agreed / under-offer. |
| `proxyConfiguration` | object | Apify proxy settings (used exactly as set; no auto-residential). |
| `proxyCountry` | string | Pin exit country (default GB). |

### Output

Each property is one dataset record. Search results carry ~48 fields; with
`includeDetails: true` each record carries 80+ fields.

```json
{
  "id": 123456789,
  "channel": "BUY",
  "url": "https://www.rightmove.co.uk/properties/123456789",
  "displayPrice": "£325,000",
  "price": 325000,
  "priceQualifier": "",
  "pricePerSqFt": "£853 per sq ft",
  "bedrooms": 1,
  "bathrooms": 1,
  "propertySubType": "Flat",
  "displayAddress": "Example Road, London, SW1",
  "postcode": "SW1A 1AA",
  "outcode": "SW1A",
  "incode": "1AA",
  "ukCountry": "England",
  "latitude": 51.5,
  "longitude": -0.12,
  "description": "<p>Offering approximately 381 sq.ft of well-presented accommodation ...</p>",
  "keyFeatures": ["Share of Freehold", "Modern One Bedroom Apartment", "..."],
  "sizeSqFt": 381,
  "tenureType": "SHARE_OF_FREEHOLD",
  "yearsRemainingOnLease": 118,
  "councilTaxBand": "C",
  "annualGroundRent": 250,
  "annualServiceCharge": 1071,
  "nearestStations": [{ "name": "Example Station", "distance": 0.11, "unit": "miles" }],
  "epcGraphs": ["https://media.rightmove.co.uk/property-epc/...png"],
  "floorplans": ["https://media.rightmove.co.uk/property-floorplan/...png"],
  "images": ["https://media.rightmove.co.uk/...jpeg"],
  "agentName": "Example Estate Agents, London",
  "agentCompanyName": "Example Estate Agents Ltd",
  "agentDisplayAddress": "1 Example Street, London, EC1A 1BB",
  "agentPhone": "020 0000 0000",
  "agentLogo": "https://media.rightmove.co.uk/partner-logo/...jpg",
  "detailScraped": true
}
```

Sold-price records:

```json
{
  "channel": "SOLD",
  "address": "Flat 1, Example Court, Example Road, London SW1A 1AA",
  "propertyType": "FLAT",
  "bedrooms": 1,
  "lastSoldPrice": 620000,
  "lastSoldDate": "21 Jun 2023",
  "transactionCount": 2,
  "transactions": [
    { "displayPrice": "£620,000", "soldPrice": 620000, "dateSold": "21 Jun 2023", "tenure": "LEASEHOLD", "newBuild": false }
  ],
  "detailUrl": "https://www.rightmove.co.uk/house-prices/details/..."
}
```

A run **summary** (totals, pages, proxy-tier health, throughput) is saved to the
key-value store under `OUTPUT`.

### Cost and performance

- **Search mode** (`includeDetails: false`) is the cheapest way to harvest large
  result sets and runs in a small memory footprint.
- **Detail mode** adds the deep 80+ field set per property, fetched concurrently
  for speed.

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

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape; the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Proxy strategy

Datacenter proxies are the default (cheapest) and work well for Rightmove. The
actor uses **exactly the proxy you configure** and never switches to residential
on its own. It retries automatically if a request is blocked.

- **Need residential?** Select it in `proxyConfiguration` yourself; the actor
  will use it. It is never auto-enabled.
- **Country targeting**: pin an exit country with `proxyCountry` (default GB).

> 💡 For the lowest cost, keep `includeDetails: false` and use datacenter
> proxies. Enable details only when you need the deep fields.

### Monitoring new listings

Set `monitoringMode: true` and schedule the actor. Each run returns only
properties not seen in previous runs, ideal for lead generation and price
tracking.

### Notes and limits

- Rightmove caps deep pagination at ~1000 results (~42 pages) **per search**.
  Split a large area into sub-areas / postcodes to exceed this.
- Sold-price areas are addressed by slug; pass a postcode or area name, or a
  direct `/house-prices/<area>.html` URL.
- Respect Rightmove's Terms of Use and applicable laws; scrape responsibly.

### Use cases

Property market research, lead generation (agent contacts), price and sold-comp
analysis, portfolio monitoring, relocation tools, data enrichment.

### Verified live (2026-09-04)

Re-checked against the live site: all four documented URL shapes (for-sale search,
to-rent search, sold-price history, a single listing page) return real, non-empty
records, and every documented search filter genuinely narrows the server-side result
set (not a silent no-op) - price range, bedroom range, property type, radius,
include Let Agreed / Sold STC, and sort order (lowest/highest price, newest listed).
No defects found in filter or URL-mode behavior.

# Actor input Schema

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

How to find properties: build a search from a location + filters, or paste direct Rightmove URLs.

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

What to scrape: properties for sale, to rent, or sold-price history by area.

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

Location names, areas, or postcodes. Each is resolved automatically, e.g. 'London', 'Manchester', 'SW19', 'Wimbledon'.

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

Minimum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount.

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

Maximum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount.

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

Minimum bedrooms (BUY/RENT).

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

Maximum bedrooms (BUY/RENT).

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

Filter by property type (BUY/RENT). Options: houses, flats, bungalows, land, detached, semi-detached, terraced, park-home.

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

Expand the search around the location. E.g. 0.25, 0.5, 1.0, 3.0, 5.0, 10.0. Default 0 (this area only).

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

Result ordering. Newest listed, lowest price, or highest price first.

## `includeLetAgreed` (type: `boolean`):

Include 'Let Agreed' properties in rental searches.

## `includeSSTC` (type: `boolean`):

Include 'Sold STC' / 'Under Offer' properties in sale searches.

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

Direct Rightmove URLs to scrape.

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

Maximum number of records to return. Set 0 for unlimited (capped by Rightmove's ~1000-result deep-pagination limit per search). The number of pages walked is governed by 'Max pages per search'.

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

Maximum result pages to walk per location (24 listings/page). Default 1 (first page only) keeps runs small and predictable; raise it to scrape deeper (Rightmove caps deep pagination at ~42 pages).

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

Fetch each property's detail page for 40+ extra fields (full description, key features, council tax band, ground rent, service charge, EPC, nearest stations/airports, broadband, floorplans, lease years, agent address). Off = faster & cheaper (search cards only).

## `monitoringMode` (type: `boolean`):

Only return listings not seen in previous runs of this actor. Useful for tracking newly-added properties.

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

Proxy settings. Datacenter (the default) is cheapest and works well for Rightmove. The actor uses exactly what you select here and does not auto-enable residential. Select residential here only if you need it.

## `proxyCountry` (type: `string`):

Pin the proxy exit country (default GB for the UK site). Leave empty to let residential rotate a GB-led pool.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "channel": "BUY",
  "locations": [
    "London"
  ],
  "sortType": "",
  "includeLetAgreed": false,
  "includeSSTC": false,
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "maxItems": 100000,
  "maxPages": 1,
  "includeDetails": false,
  "monitoringMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

Individual property records. SERP cards carry ~48 fields; with 'Scrape full property details' enabled each record carries 80+ fields including description, key features, council tax band, ground rent, service charge, EPC graphs, nearest stations/airports, broadband, floorplans and agent 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"
    ],
    "startUrls": [
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/rightmove-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"],
    "startUrls": [{ "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/rightmove-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 '{
  "locations": [
    "London"
  ],
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/rightmove-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/rightmove-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/zpL6MrlZpHDocLt1v/builds/J0RraxRAQCLq2BmEY/openapi.json
