# 🏠 Rightmove Scraper (`scraper-engine/rightmove-scraper`) Actor

🏠 Rightmove Scraper extracts property listings from Rightmove—prices, addresses, bedrooms, descriptions & key details—quickly and reliably. 🚀 Perfect for property research, lead gen, and market analysis. 📈

- **URL**: https://apify.com/scraper-engine/rightmove-scraper.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 2 monthly users, 96.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

Scrape **sale and rent** property listings from [Rightmove.co.uk](https://www.rightmove.co.uk) at scale. Paste one or more **search-result URLs** and/or **direct property URLs**, and the actor returns clean, structured records — with optional **monitoring mode**, a **delisting tracker**, **full property details**, **price history**, and **nearest schools**.

It ships with a **smart connection ladder**: it starts on a direct connection and only escalates to datacenter, then residential proxies if Rightmove pushes back — so you pay for heavy proxies only when you actually need them.

### ⭐ Why Choose This Scraper?

- 🚀 **Fast by default** — basic listing data comes straight from Rightmove's search results; only opt into per-property detail when you need it.
- 🛡️ **Self-healing networking** — automatic direct → datacenter → residential fallback, with clear log messages for every switch.
- 🔁 **Monitoring & delisting** — scrape only new listings since the last run, and track which properties disappear.
- 🧱 **Robust** — live saving (a crash never loses scraped rows), retries with backoff, and graceful handling of restricted-permission runs.
- 📊 **Organised output** — results are split across themed dataset views (Overview, Agent, Location, Costs, Media, Status).

### ✨ Key Features

| Feature | What it does |
|--------|--------------|
| 🔗 Search URL input | Paginates any Rightmove sale/rent search-result URL |
| 🏡 Direct property URLs | Scrape individual properties by URL |
| 🔬 Full property details | Council tax, lease, floorplans, stations, EPC, tags, agent profile |
| 📈 Price history | Sold-price history per property |
| 🏫 Nearest schools | Nearby schools with distance and ratings |
| 🆕 Monitoring mode | Only scrape listings unseen in previous runs |
| 🗂️ Delisting tracker | Stamp every property's `lastSeen` in a key-value store |
| 📧 Email notifications | Optional run report / error email |

### 📥 Input

| Field | Type | Description |
|-------|------|-------------|
| `listUrls` | array | Rightmove search-result URLs (sale or rent) |
| `propertyUrls` | array | Direct property page URLs |
| `fullScrape` | boolean | Scrape everything every run (default `true`) |
| `monitoringMode` | boolean | Only scrape new listings since last run |
| `deduplicateAtTaskLevel` | boolean | Scope dedup/monitoring per task instead of account |
| `fullPropertyDetails` | boolean | Visit each property page for the rich record |
| `includePriceHistory` | boolean | Add sold-price history (enables full details) |
| `includeNearestSchools` | boolean | Add nearby schools (enables full details) |
| `enableDelistingTracker` | boolean | Track `lastSeen` per property in a KV store |
| `addEmptyTrackerRecord` | boolean | Push id-only records for still-listed props in monitoring |
| `email` | string | Address for run/error notifications |
| `maxProperties` | integer | Max properties per search URL (default `1000`) |
| `concurrency` | integer | Simultaneous requests (default `8`) |
| `proxyConfiguration` | object | Apify proxy settings (residential GB recommended) |

```json
{
  "listUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445" }
  ],
  "fullPropertyDetails": false,
  "maxProperties": 50,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "GB" }
}
```

### 📤 Output

Each property is one dataset record. Basic example:

```json
{
  "id": "89145879",
  "url": "https://www.rightmove.co.uk/properties/89145879#/?channel=RES_BUY",
  "title": "2 bedroom flat for sale",
  "channel": "BUY",
  "displayAddress": "Sidbury Circular Road, Tidworth, SP9 7HT",
  "price": "£120,000",
  "bedrooms": 2,
  "bathrooms": 1,
  "propertyType": "Flat",
  "type": "sale",
  "tenure": "LEASEHOLD",
  "agent": "Brockenhurst Estate Agents, Andover",
  "agentPhone": "01264 312461",
  "coordinates": { "latitude": 51.244835, "longitude": -1.668411 },
  "images": ["https://media.rightmove.co.uk/..."],
  "listingUpdateReason": "new"
}
```

With **full property details** the record additionally includes `descriptionHtml`, `floorplans`, `brochures`, `nearestStations`, `epc`, `councilTaxBand`, `yearsRemainingOnLease`, `tags`, `agentProfileUrl`, and (when enabled) `priceHistory` and `nearestSchools`.

Results are organised into themed **dataset views** in the Output tab: 🏘️ Overview, 🧑‍💼 Agent & contact, 📍 Location, 💷 Costs & tenure, 🖼️ Media & documents, and 🔔 Listing status & tracking.

### 🚀 How to Use (Apify Console)

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **Rightmove Scraper**.
3. Paste your search URLs and/or property URLs.
4. Pick your depth (full details, price history, schools) and mode (full / monitoring).
5. Click **Start** and watch the live log.
6. Open the **Output** tab and export to JSON / CSV / XLSX.

### 🤖 Use via API

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"listUrls":[{"url":"https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445"}],"maxProperties":50}'
```

### 💡 Best Use Cases

- Building a property dataset for a region or postcode
- Monitoring new listings and price changes daily
- Detecting delisted / sold-STC properties over time
- Enriching leads with agent contact details

### 💷 Pricing

This actor uses Apify's **pay-per-event** model. You are billed per property scraped, plus standard platform usage. Enabling the delisting tracker and full property details increases compute and proxy usage.

### ❓ FAQ

**Do I need residential proxies?** Not always. The actor starts direct and only escalates when blocked. Residential (GB) gives the most reliable results for larger jobs.

**How does monitoring mode work?** It remembers every property id it has seen (in a key-value store) and, on the next run, scrapes only ids it hasn't seen before.

**Can I scrape both sale and rent?** Yes — just include both kinds of search URLs.

### ⚖️ Legal & Compliance

Data is collected only from publicly available pages. You are responsible for complying with Rightmove's Terms of Service and applicable laws (GDPR, etc.).

### 🛟 Support

Found a bug or have a request? Open an issue on the actor's Issues tab.

# Actor input Schema

## `listUrls` (type: `array`):

Rightmove search-result page URLs (for sale or to rent). Each one is paginated automatically. Example: https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445

## `propertyUrls` (type: `array`):

Individual property page URLs, e.g. https://www.rightmove.co.uk/properties/169711034

## `fullScrape` (type: `boolean`):

Scrape ALL properties matching your input on every run. Turn this OFF when you enable monitoring mode below.

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

If checked, only properties that are brand-new compared to previous runs are scraped. Please turn OFF full scrape above when using this.

## `deduplicateAtTaskLevel` (type: `boolean`):

Track 'seen' listings per task instead of per account. Useful only when running multiple tasks of this scraper.

## `fullPropertyDetails` (type: `boolean`):

Visit each property page for the rich record (council tax, lease, floorplans, stations, EPC, etc.). Leaving it off is much faster.

## `includePriceHistory` (type: `boolean`):

Fetch sold-price history. Automatically enables full property details.

## `includeNearestSchools` (type: `boolean`):

Fetch nearby schools. Automatically enables full property details.

## `enableDelistingTracker` (type: `boolean`):

Stamp every property with a lastSeen date in a key-value store so you can spot delisted properties. (Enabling this has an impact on billing.)

## `addEmptyTrackerRecord` (type: `boolean`):

In monitoring mode, push an id-only tracker record for still-listed properties so a custom loader can detect delistings.

## `email` (type: `string`):

Receive a run report or an error notification at this address.

## `maxProperties` (type: `integer`):

Maximum number of properties to scrape per input search URL.

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

The scraper starts with a direct connection and automatically escalates to datacenter, then residential proxies only if Rightmove blocks it. Residential (country GB) is recommended for reliability.

## Actor input object example

```json
{
  "listUrls": [
    "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445"
  ],
  "propertyUrls": [],
  "fullScrape": true,
  "monitoringMode": false,
  "deduplicateAtTaskLevel": false,
  "fullPropertyDetails": false,
  "includePriceHistory": false,
  "includeNearestSchools": false,
  "enableDelistingTracker": false,
  "addEmptyTrackerRecord": false,
  "email": "",
  "maxProperties": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# 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 = {
    "listUrls": [
        "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-engine/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 = { "listUrls": ["https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445"] }

# Run the Actor and wait for it to finish
run = client.actor("scraper-engine/rightmove-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 '{
  "listUrls": [
    "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=OUTCODE%5E2445"
  ]
}' |
apify call scraper-engine/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VTX7YcI06POGFiWUk/builds/XC3aUuqkmzx1XwWch/openapi.json
