# Rightmove Sold House Properties Scraper (`dhrumil/rightmove-sold-house-properties-scraper`) Actor

Scrape rightmove.co.uk to crawl millions of sold house properties from United Kingdom. Our real estate scraper also lets you monitor specific listing for newly sold properties. You can provide multiple search result listings to scrape/monitor.

- **URL**: https://apify.com/dhrumil/rightmove-sold-house-properties-scraper.md
- **Developed by:** [Dhrumil Bhankhar](https://apify.com/dhrumil) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 56 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.00 / 1,000 starter tier per 1k properties

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

### 🏡 What is Rightmove Sold House Properties Scraper?

This Rightmove sold house properties Scraper will enable you scrape any sold property listing from [rightmove.co.uk](https://www.rightmove.co.uk/house-prices.html).

You can simply take your listing url from browser and enter it into this actor. This actor will crawl through all pages of particular listing and generate dataset for you.

Listing url is something you get when you perform the search on rightmove site. Example listing urls :

- https://www.rightmove.co.uk/house-prices/ab10.html
- https://www.rightmove.co.uk/house-prices/london-bridge-station.html
- https://www.rightmove.co.uk/house-prices/tn15/yopps-green.html

### 🚪 What can this Rightmove Sold House Properties Scraper do?

📈 Extract Rightmove sold history data listings on Rightmove

👀 This actor is not just scraper but also has monitoring capability. You can turn on monitoring mode and it will give you only newly sold properties compared to your previous scrapes.

⬇️ Download Rightmove real estate data in Excel, CSV, JSON, and other formats

### 📚 How do I start scraping with this scraper?

1. Register for your free Apify account [here](https://apify.com/pricing?fpr=z2di7)
2. You don't need to provide your credit card details for free account. Just click on "Get Started" button on above link and complete the registration only.
3. Free account comes with reasonable credits to try out this actor. This actor also comes with free trial of 3 days without any commitment/upfront charge.
4. Run this actor and verify the scraped data. Apify has huge integration possibilities. You can download the data or push the data into any 3rd party platform directly.

### 🌳 What Rightmove data can I extract using this tool?

| 📝                  | 📝                               |
| ------------------ | ------------------------------- |
| Property Type      | Full Address                    |
| Property URL       | Features                        |
| Bathrooms          | Bedrooms                        |
| Latitude           | Longitude                       |
| Floorplans         | Images                          |
| Past Transactions  | Updated Date                    |

### 📦 Additional Listing Data Fields

When available, the following fields from the property listing (listingData) are also included in the output when `fullScrape` is enabled:

| Field                      | Description                                  |
|----------------------------|----------------------------------------------|
| id                         | Listing ID                                   |
| channel                    | Listing channel (e.g., RES_BUY)              |
| keyFeatures                | Array of key features                        |
| bedrooms                   | Number of bedrooms                           |
| bathrooms                  | Number of bathrooms                          |
| propertySubType            | Property sub-type (e.g., Terraced)           |
| soldPropertyLastListed     | Last listed date for the property            |
| advertisedFrom             | Date property was first advertised           |
| advertisedTo               | Date property was last advertised            |
| status                     | Listing status (published/archived)          |
| address                    | Address object (displayAddress, etc.)        |
| images                     | Array of images with URLs and captions       |
| floorplans                 | Array of floorplan images                    |
| streetView                 | Street view info (lat/lng, heading, etc.)    |
| nearestStations            | Array of nearest stations                    |
| sizings                    | Array of sizing info                         |
| listingHistory             | Listing history object                       |
| soldPropertyInfoReelItems  | Array of info reel items                     |

These fields are appended to the output if available, providing richer property data for each result.

### ⬇️ Input

For simple use case, you just need to provide browser url of rightmove sold house prices page & that's all. You can leave other fields as they are to be sensible defaults.

#### Input example

```json
{
    "listUrls": [
        {
            "url": "https://www.rightmove.co.uk/house-prices/ab10.html"
        }
    ],
	"propertyUrls": [
		{
			"url": "https://www.rightmove.co.uk/house-prices/details/1229be73-9bef-421f-a8de-78382d56f358"
		}
	],
    "fullAddress": "12, Street Name, London AB10 3AC",
	"cutoffMonthYear": "Mar 2026",
    "fullScrape": true,
    "monitoringMode": false,
    "deduplicateAtTaskLevel": false
}
```

Understanding input options:

- `propertyUrls` : Provide one or more sold property detail URLs (for example, `https://www.rightmove.co.uk/house-prices/details/<property-id>`). These URLs are enqueued directly as detail requests, so you can scrape specific properties without crawling list pages.

- `cutoffMonthYear` : Optional month/year filter for list crawling in format like `Mar 2026` or `Apr 2026`. When set, only properties with latest sold date after the cutoff are processed, and pagination stops once the listing reaches properties at or older than the cutoff month/year. This setting applies to `listUrls` crawling.

- `fullAddress` : If you want to search only a specific property, provide this input instead of a list url. Make sure the address is full starting with `unit number, street name, xxxxx` and ends with a post code like `xxxx AB10 3AC`. It will provide only a single matched output in that case.

- `fullScrape` : If you turn this setting on, it will take more time to scrape. However, it will fetch additional details like features, number of bathrooms, property sub type, images, floorplans and more. If you don't need these extra details, turning this off will run significantly faster and reduce cost.

- `monitoringMode` : This option when turned on will only scrape newly sold property listings compared to previously scraped properties by this actor. In case an existing property is sold again having a new transaction, it will appear again in the output.

- `deduplicateAtTaskLevel` : By default the scraper will deduplicate and monitor successive updates at account level. In case you have configured many tasks from this actor and you want de-duplication / successive updates at task level, enable this setting. Enabling this means that two different tasks are treated as two isolated scraping sessions when it comes to monitoring mode.

### ⬆️ Output

The scraped data is stored in the dataset of each run. The data can be viewed or downloaded in many popular formats, such as *JSON, CSV, Excel, XML, RSS, and HTML*.

#### Output example

```json
{
	"id": "1229be73-9bef-421f-a8de-78382d56f358",
	"encId": "UXFcbWIb27vr9XiNEn6nRgvj9Duld3nd07o=",
	"source": "ROS",
	"referenceId": "17ABN09666",
	"property_type": "Detached",
	"address": "123, Gray Street, Aberdeen AB10 6JJ",
	"addressId": "91f902d6472c52edcf8b6a28f9d5e6d9",
	"country": "SCOTLAND",
	"deliveryPointId": 25416562,
	"uniqueAddressKey": "52553928|123|",
	"postcode": {
		"outcode": "AB10",
		"incode": "6JJ"
	},
	"detailUrl": "https://www.rightmove.co.uk/house-prices/details/1229be73-9bef-421f-a8de-78382d56f358",
	"latitude": 57.13131,
	"longitude": -2.11934,
	"transactions": [
		{
			"id": "7258792",
			"displayPrice": "£300,000",
			"price": 300000,
			"deedDate": "2025-06-17",
			"newBuild": false,
			"tenure": null,
			"percentageChange": 5,
			"displayDeedDate": "17 Jun 2025"
		},
		{
			"id": "91574400",
			"displayPrice": "£285,000",
			"price": 285000,
			"deedDate": "2017-05-09",
			"newBuild": false,
			"tenure": null,
			"percentageChange": null,
			"displayDeedDate": "09 May 2017"
		}
	],
	"processed_at": "2025-09-28T15:09:43.083Z",
	"listing": {
		"id": "4034887",
		"channel": "RES_BUY",
		"keyFeatures": [
			"Terraced Family Home",
			"Three Good Sized Bedrooms",
			"12'3 Lounge Area &amp; 9'10 Dining Area",
			"10'4 Kitchen",
			"Bathroom With White Suite &amp; Separate WC",
			"Gas Central Heating &amp; Double Glazing",
			"Rear Garden",
			"Off-Street Parking",
			"No Forward Chain",
			"Sole Agents"
		],
		"bedrooms": 3,
		"bathrooms": null,
		"propertySubType": "Terraced",
		"soldPropertyLastListed": "March 2005",
		"advertisedFrom": "October 2004",
		"advertisedTo": "March 2005",
		"status": {
			"published": false,
			"archived": true
		},
		"address": {
			"displayAddress": "Swabey Road\r\nLangley\r\nBerkshire",
			"countryCode": "GB",
			"deliveryPointId": 82755877,
			"ukCountry": "England",
			"outcode": "SL3",
			"incode": "8NR"
		},
		"images": [
			{
				"url": "https://media.rightmove.co.uk/7k/6316/6316_SwabLang_IMG_01.jpg",
				"caption": "Front Elevation",
				"resizedImageUrls": {
					"size135x100": "https://media.rightmove.co.uk/dir/7k/6316/6316_SwabLang_IMG_01_max_135x100.jpg",
					"size476x317": "https://media.rightmove.co.uk/dir/7k/6316/6316_SwabLang_IMG_01_max_476x317.jpg",
					"size656x437": "https://media.rightmove.co.uk/dir/7k/6316/6316_SwabLang_IMG_01_max_656x437.jpg"
				}
			}
		],
		"floorplans": [],
		"streetView": {
			"heading": null,
			"pitch": null,
			"zoom": null,
			"latitude": 51.49957,
			"longitude": -0.54577
		},
		"nearestStations": [
			{
				"name": "Langley Station",
				"types": ["NATIONAL_TRAIN"],
				"distance": 0.6026128037702355,
				"unit": "miles"
			}
		],
		"sizings": [],
		"listingHistory": {
			"listingUpdateReason": ""
		},
		"soldPropertyInfoReelItems": [
			{
				"title": "PROPERTY TYPE",
				"type": "PROPERTY_TYPE",
				"primaryText": "Terraced",
				"secondaryText": "",
				"tooltipText": ""
			},
			{
				"title": "BEDROOMS",
				"type": "BEDROOMS",
				"primaryText": "3",
				"secondaryText": "",
				"tooltipText": ""
			}
		]
	}
}
```

### ❓ Limitations

Since Rightmove allows only 1000 properties per listing/search result, you might want to break down your listing urls into smaller areas if it has more than 1K results. Good news is that even if multiple list urls contain overlapping results, they will get deduplicated within the same run data.

### 💸 Pricing Model & Usage Logic

This actor uses a tiered pay-per-event pricing model, with usage tracked and charged based on the number of properties processed and additional multipliers. Charges are triggered at specific usage thresholds and events.

#### 🟢 Charge Events & Tiers

The actor uses a tiered pricing model based on the number of properties processed. Each tier has a specific charge event and rate per 1,000 properties:

> **🔻 Cost Efficiency as You Scale:**
> The tier-based pricing model is designed to reduce your cost per property as your usage increases. The more properties you process, the lower your per-unit cost becomes, helping keep your overall costs under control as you scale up to higher volumes.

##### Starter Tier (`starter-tier-1K`)

For the first 25,000 properties processed, the cost per 1,000 properties is **$4 USD**.
This tier is ideal for small to medium jobs and ensures a low entry cost for initial usage.

##### Growth Tier (`growth-tier-1K`)

For properties processed from 25,000 up to 50,000 the cost per 1,000 properties drops to **$3.5 USD**.
This tier rewards higher volume usage with a reduced rate, making it cost-effective for scaling up.

##### Scale Tier (`scale-tier-1K`)

For properties processed from 50,000 up to 100,000 the cost per 1,000 properties is **$3 USD**.
This tier is designed for large-scale operations, offering further discounts as your volume increases.

##### Enterprise Tier (`enterprise-tier-1K`)

For properties processed above 100,000 the cost per 1,000 properties is **$2 USD**.
This tier is for enterprise-level usage, providing the lowest rate for very high-volume processing.

Each charge event is triggered automatically as your processed property count crosses into the next tier. The actor tracks usage and applies the correct rate for each tier, ensuring transparent and predictable billing.

These pricing tiers are applied on a **monthly** basis, and your usage count resets at the start of each new month. This ensures you always start fresh and only pay for what you use each month.

##### Example:

- Scraping 200,000 properties in a month:
  - $4 per 1K properties for the first 25,000 properties ($100)
  - $3.5 per 1K properties up to 50,000 properties ($87.50)
  - $3 per 1K properties up to 100,000 properties ($150)
  - $2 per 1K properties above 100,000 properties ($200)
  - **Total:** $537.50

#### ⚡ Additional Usage Parameters (Multipliers)

The actor may apply additional usage multipliers based on your input settings. These do **not** directly charge you extra, but they affect how quickly you use up your monthly quota. The more features you enable, the faster your included usage is consumed.

- **🌐 Residential Proxy Usage:** If you use a residential proxy, an additional 5x usage multiplier will apply. This is due to the higher cost and complexity of residential proxy traffic.
- **🧠 Memory Usage:** If you run the actor with more than 2048 MB of memory, you will be charged an additional usage multiplier. For example, running at 4096 MB will double your usage cost.
- **🔄 Monitoring Mode:** Enabling `monitoringMode` adds 2 property count for retrieval of the tracked property and 4 property count as usage for storing and tracking a new property, as it requires additional logic and storage for incremental scraping.
- **🏷️ Full Scrape:** Enabling `fullScrape` will increase your usage multiplier by 5x, as it requires scraping an additional detail page per property.
- **📄 Providing invalid URL:** If you provide an invalid scraping url (not from rightmove.co.uk), it will cause 10x of your total per property usage for that configuration. Any failed request will cause 1x of your per property usage.

These multipliers are **cumulative**. For example, if you enable both `fullScrape` and use a residential proxy, your usage for each property will be multiplied by 11x (1 base + 5 fullScrape + 5 residential).

> **💡 Tip:**
> This actor requires a minimum of **2 GB memory** to run reliably with Puppeteer. The actor is optimised for this setting. Only increase memory if you are scraping very large volumes concurrently. Running below 2 GB may cause instability or crashes.

### 🤝 Related Actors

- [Rightmove Scraper](https://apify.com/dhrumil/rightmove-scraper?fpr=z2di7): Scrape sale/rent listings from rightmove.co.uk.
- [Zoopla Scraper](https://apify.com/dhrumil/zoopla-scraper?fpr=z2di7): Scrape property sale/rent listings, prices, and details from Zoopla.
- [OnTheMarket Scraper](https://apify.com/dhrumil/onthemarket-scraper?fpr=z2di7): Scrape property sale/rent listings, prices, and details from OnTheMarket.
- [Rightmove Full Address & House Number Finder](https://apify.com/dhrumil/rightmove-full-address-house-number-finder?fpr=z2di7): Find full addresses and house numbers for Rightmove listings.
- [Rightmove Land Registry Full Address & House Number Finder](https://apify.com/dhrumil/rightmove-landregistry-full-address-house-number-finder?fpr=z2di7): Get full address and house number using Land Registry data for Rightmove properties.
- [Rightmove EPC Full Address Finder](https://apify.com/dhrumil/rightmove-epc-full-address-finder?fpr=z2di7): Find EPC and full address details for Rightmove listings.
- [Rightmove Commercial Scraper](https://apify.com/dhrumil/rightmove-commercial-scraper?fpr=z2di7): Scrape commercial property listings from Rightmove.
- [Rightmove Agents Scraper](https://apify.com/dhrumil/rightmove-agents-scraper?fpr=z2di7): Extract agent and agency details from Rightmove.
- [Zoopla Sold Properties Scraper](https://apify.com/dhrumil/zoopla-sold-properties-scraper?fpr=z2di7): Scrape sold property data from Zoopla.
- [Zoopla Commercial Properties Scraper](https://apify.com/dhrumil/zoopla-commercial-properties-scraper?fpr=z2di7): Scrape commercial property listings from Zoopla.

### 🙋‍♀️ For custom solutions

In case you need some custom solution, you can contact me: <dhrumil@techvasu.com>

Or learn more about me on github: <https://github.com/dhrumil4u360>

# Actor input Schema

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

Any rightmove sold house property listing url which has list of properties

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

Any rightmove sold house property URL to scrape directly

## `fullAddress` (type: `string`):

Format should be house number, street name xxxxxxxx post code. For example: 1234, Main Street, London SW1A 1AA

## `cutoffMonthYear` (type: `string`):

Optional cutoff in format like Mar 2026 or Apr 2026. Detail pages are enqueued only for properties sold after this month/year, and pagination stops once this cutoff is reached.

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

If checked, it will perform full scrape including all pagination pages.

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

If checked, it will only scrape newly listed properties compared to what has been scraped in previous runs. Please turn off full scrape setting above in case you are tunring this on.

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

If this setting is enabled, deduplication and successive updates via monitoring mode works at task level instead of account level. Helpful only if you are using multiple tasks of this scraper

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

Email address to send notifications or reports to.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "listUrls": [
    {
      "url": "https://www.rightmove.co.uk/house-prices/sl3/swabey-road.html?soldIn=15"
    }
  ],
  "propertyUrls": [],
  "fullAddress": "",
  "cutoffMonthYear": "",
  "fullScrape": true,
  "monitoringMode": false,
  "deduplicateAtTaskLevel": false,
  "email": "",
  "proxy": {
    "useApifyProxy": true,
    "groups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        {
            "url": "https://www.rightmove.co.uk/house-prices/sl3/swabey-road.html?soldIn=15"
        }
    ],
    "propertyUrls": [],
    "proxy": {
        "useApifyProxy": true,
        "groups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dhrumil/rightmove-sold-house-properties-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": [{ "url": "https://www.rightmove.co.uk/house-prices/sl3/swabey-road.html?soldIn=15" }],
    "propertyUrls": [],
    "proxy": {
        "useApifyProxy": True,
        "groups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dhrumil/rightmove-sold-house-properties-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 '{
  "listUrls": [
    {
      "url": "https://www.rightmove.co.uk/house-prices/sl3/swabey-road.html?soldIn=15"
    }
  ],
  "propertyUrls": [],
  "proxy": {
    "useApifyProxy": true,
    "groups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call dhrumil/rightmove-sold-house-properties-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dhrumil/rightmove-sold-house-properties-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/0uihS4in1ReF1lsf2/builds/7HYgkJscqa0jy44VL/openapi.json
