# Rightmove UK Property & London Real Estate Scraper API (MCP) (`amygraphics/rightmove-uk-property-scraper`) Actor

Rightmove scraper & data API: UK real estate — property for sale & to rent in London and nationwide, houses & apartments. Price with Rightmove's own new / reduced flag, bedrooms, GPS, photos + agent phone. Beats the 1 008-result cap. Monitor mode = only new, price-changed & sold listings.

- **URL**: https://apify.com/amygraphics/rightmove-uk-property-scraper.md
- **Developed by:** [Zakaria el bouami](https://apify.com/amygraphics) (community)
- **Categories:** Real estate, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Rightmove UK Property Scraper — Rent, Sale & Agent Leads (MCP)

Scrape **Rightmove.co.uk**, the UK's biggest property portal (**60 000+ homes for sale in London
alone**): for sale, to rent and new homes. Every row already contains what most UK property
datasets charge extra for — above all the **estate agent's phone number**, Rightmove's own
**new / price-reduced flag**, and the tenure, subtype, GPS coordinates, key features and photo URLs.

No browser, no proxies, no Rightmove account: the Actor reads the same data your browser receives
from the search page and normalises it into a clean dataset.

### What you get per property

| Field group | Examples |
|---|---|
| Identity | `rightmoveId`, `url` |
| Price | `price`, `priceDisplay`, `priceQualifier` (*Guide Price*, *Offers Over*…), `priceFrequency` |
| Property | `bedrooms`, `bathrooms`, `propertySubType`, `tenure` (FREEHOLD / LEASEHOLD), `propertyType` |
| Address & map | `displayAddress`, `latitude`, `longitude`, `countryCode` |
| Content | `summary`, `keyFeatures[]`, `images[]` (up to 20 hi-res), `numberOfImages`, `numberOfFloorplans` |
| Timing | `listingUpdateReason` (**new** / **price_reduced**), `listingUpdateDate`, `firstVisibleDate`, `updateDate`, `addedOrReduced` |
| Flags | `premiumListing`, `featuredProperty`, `auction`, `newHome`, `onlineViewingsAvailable`, `productLabel` |
| **Agent (leads)** | `agencyName`, `agencyBranch`, `agencyBrand`, **`agencyPhone`**, `agencyBranchId`, `agencyUrl` |
| Optional detail (`fetchDetails`) | `epcImageUrl` (EPC certificate image), `floorplanUrls[]` |
| Monitor | `isNew`, `isUpdated`, `changeType` (new / updated / unchanged / closed), `oldPrice`, `firstSeenAt`, `closedAt` |

### Hard problems this Actor solves for you

1. **Rightmove's 1 008-result cap.** Every search on Rightmove is silently truncated after
   index 1008 (~42 pages). A naïve scraper returns the first 1 008 homes and misses the rest.
   This Actor detects the cap and **splits the query recursively: price bands → property types
   → bedrooms**, then merges everything with a unique-id filter. A city-wide scan really is the
   whole market. You see each split in the run log, e.g. *“Cambridge: 1 286 results > 1 032 cap
   → splitting this query → 1 200 unique properties”*.
2. **Locations without hunting for internal IDs.** Pass plain names the way Rightmove writes them
   (`London`, `Manchester`, `Cambridge`), postcode districts (`SW1W`, `EH1`, `M20`), a Rightmove
   identifier (`REGION^87490`), or paste any full Rightmove search URL (filters, map searches,
   estate-agent pages) — the Actor builds the right request for every case.
3. **Change monitoring that does not guess.** `monitor` mode keeps a per-search history in the
   Apify key-value store and returns only **new**, **updated** (price cuts included, with `oldPrice`)
   and **closed** properties. Closed detection only runs when the scan was complete and error-free —
   it never flags a property as gone because a request failed or the pagination was truncated.

### Typical uses

- **Estate-agent & mortgage lead generation** — every listing with its agency phone number.
- **UK house-price tracking** — daily runs with `onlyChanges` produce a clean price-cut feed
  (`listingUpdateReason: price_reduced`, `oldPrice` → `price`).
- **Buy-to-let sourcing** — filter by price band, bedrooms, property type and city.
- **Market analytics** — supply per postcode district, asking-price distribution, tenure mix,
  time-on-market (from `firstVisibleDate` / `updateDate`).
- **Relocation & investment research** — full inventory of a city with photos, floorplans and EPC.

### Input tips

- `mode`: **search** for a one-off extraction, **monitor** for a daily schedule.
- `channel`: `buy`, `rent` or `new-homes` (rent mode splits by rent bands and returns monthly prices).
- `sortType`: `6` = newest first (default) — ideal for fresh listings and monitoring.
- `maxResults`: global cap on rows returned (and billed). The Actor stops cleanly as soon as it is
  reached, so a cheap first run costs only a few rows.
- `fetchDetails`: adds EPC image + floorplan URLs.
- `stateKey`: leave empty; the monitor key is derived from your search scope, so each search keeps
  its own history.

### Automation, MCP & scheduling

- **Schedule**: run `monitor` every day (or hourly) on the Apify platform; unchanged properties are
  not returned and not charged — only your deltas land in the dataset.
- **Webhooks / integrations**: connect the dataset to Google Sheets, Airtable, Slack, Zapier, n8n or
  your own API through the Apify platform.
- **MCP-ready for AI agents**: this Actor is exposed through Apify's Model Context Protocol server
  (`https://mcp.apify.com`) as `amygraphics/rightmove-uk-property-scraper`, so an AI agent (Claude,
  Cursor, custom agent) can search, call it and pipe the properties straight into its own workflow.
  Tools: *search-actors*, *fetch-actor-details*, *call-actor*.

### Pricing

Pay-per-event: a small start fee per run, then one unit per property returned
(`property-extracted`). You only pay for what the run actually produces — and monitor mode does not
charge for unchanged properties.

### Notes & fair use

This Actor collects publicly available listing data from Rightmove search and detail pages. Use it
in line with Rightmove's terms, the UK GDPR for any personal data, and keep request rates polite
(the Actor already throttles itself and retries on `429`/`5xx` with backoff).

### Use from AI agents (MCP)

This Actor is exposed as a tool through **Apify's MCP server** — any MCP client (Claude, Cursor, VS Code / Copilot, Codex, custom agents) can discover and run it without writing code:

```json
{
  "mcpServers": {
    "apify": { "url": "https://mcp.apify.com?tools=amygraphics/rightmove-uk-property-scraper" }
  }
}
```

Then just ask: *"Use amygraphics/rightmove-uk-property-scraper to get me every 3-bed house for sale in Manchester under £400k."* Agents can also pay autonomously — this Actor is **whitelisted for agentic payments** (Direct x402 / Apify AGI prepaid token), so no Apify account is required.

***

#### Keywords

Rightmove scraper · Rightmove API alternative · UK property data · property for sale UK · UK real
estate scraper · London property scraper · house prices UK · estate agent leads UK · buy-to-let
data · property monitoring · rent data UK · new homes UK · real-estate MCP server · AI agent
property data.

# Actor input Schema

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

search = return every matching property. monitor = compare with the previous run (Apify key-value store) and return only what is new, changed (price cut included) or gone — ideal for a daily schedule.

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

For sale, to rent, or new homes for sale.

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

One location per item: a city or area name (London, Manchester, Birmingham), a postcode district (SW1W, EH1, M20) or a Rightmove identifier (REGION^87490). Spaces are allowed. Leave empty to use the default UK search or your own search URLs.

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

Paste full rightmove.co.uk search URLs (with filters, maps or estate-agent searches). The Actor scrapes them as-is and applies the same automatic splitting when the 1 008-result cap is hit.

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

Leave empty for all types. Used both as a filter and as the second splitting dimension when a query is truncated.

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

Optional. Minimum number of bedrooms.

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

Optional. Maximum number of bedrooms.

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

Optional. Minimum asking price (or rent per month).

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

Optional. Maximum asking price (or rent per month).

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

Optional. Works with postcodes and area names: 0.0 = exact, 0.25, 0.5, 1.0, 3.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0.

## `addedWithinDays` (type: `integer`):

Optional. Only listings first advertised in the last N days (Rightmove supports 1, 3, 7, 14). Great for a lightweight daily watch.

## `sortType` (type: `integer`):

Rightmove sort code. 6 = newest first (recommended, used by default). 1 = price high→low, 2 = price low→high, 4 = most reduced, 5 = oldest first.

## `autoSplit` (type: `boolean`):

Recommended. Rightmove cuts every search at 1 008 results; the Actor splits such queries by price band → property type → bedrooms so a city-wide scan is complete.

## `maxResults` (type: `integer`):

Global cap on rows returned (and charged).

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

Adds each property's EPC certificate image URL and its floorplan image URLs. Everything else (agency phone, price, features, coordinates) already comes from the search payload without extra requests.

## `includeImages` (type: `boolean`):

Adds up to 20 high-resolution photo URLs per property.

## `onlyChanges` (type: `boolean`):

Monitor mode only. Unchanged properties are not returned and not charged.

## `detectClosed` (type: `boolean`):

Monitor mode only. Properties that disappeared from the portal are returned once with changeType='closed', then forgotten. Runs only when the scan was complete and error-free (never guesses).

## `stateKey` (type: `string`):

Leave empty: the key is derived from your search scope, so each different search keeps its own history.

## Actor input object example

```json
{
  "mode": "search",
  "channel": "buy",
  "locations": [
    "London",
    "Manchester",
    "SW1W"
  ],
  "searchUrls": [
    "https://www.rightmove.co.uk/property-for-sale/London.html?maxPrice=500000"
  ],
  "propertyTypes": [],
  "minBedrooms": null,
  "maxBedrooms": null,
  "minPrice": null,
  "maxPrice": null,
  "radius": "",
  "addedWithinDays": null,
  "sortType": 6,
  "autoSplit": true,
  "maxResults": 20,
  "fetchDetails": false,
  "includeImages": true,
  "onlyChanges": true,
  "detectClosed": true,
  "stateKey": ""
}
```

# Actor output Schema

## `results` (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 = {
    "mode": "search",
    "channel": "buy",
    "locations": [
        "London"
    ],
    "searchUrls": [],
    "propertyTypes": [],
    "radius": "",
    "sortType": 6,
    "autoSplit": true,
    "maxResults": 20,
    "fetchDetails": false,
    "includeImages": true,
    "onlyChanges": true,
    "detectClosed": true,
    "stateKey": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("amygraphics/rightmove-uk-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 = {
    "mode": "search",
    "channel": "buy",
    "locations": ["London"],
    "searchUrls": [],
    "propertyTypes": [],
    "radius": "",
    "sortType": 6,
    "autoSplit": True,
    "maxResults": 20,
    "fetchDetails": False,
    "includeImages": True,
    "onlyChanges": True,
    "detectClosed": True,
    "stateKey": "",
}

# Run the Actor and wait for it to finish
run = client.actor("amygraphics/rightmove-uk-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 '{
  "mode": "search",
  "channel": "buy",
  "locations": [
    "London"
  ],
  "searchUrls": [],
  "propertyTypes": [],
  "radius": "",
  "sortType": 6,
  "autoSplit": true,
  "maxResults": 20,
  "fetchDetails": false,
  "includeImages": true,
  "onlyChanges": true,
  "detectClosed": true,
  "stateKey": ""
}' |
apify call amygraphics/rightmove-uk-property-scraper --silent --output-dataset

```

## MCP server setup

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