# Rightmove Property Scraper: UK Sale & Rent Listings (`kyungminlee/rightmove-property-scraper`) Actor

Scrape Rightmove properties for sale or to rent by location, filters or search URL, past the 1,000-result limit. Price, beds, baths, address, coordinates, agent, dates, tags; optional details: description, postcode, tenure, council tax, floorplans, EPC, stations. Unofficial. JSON/CSV/API.

- **URL**: https://apify.com/kyungminlee/rightmove-property-scraper.md
- **Developed by:** [Kyungmin Lee](https://apify.com/kyungminlee) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 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 does Rightmove Property Scraper do?

**Rightmove Property Scraper** collects UK property listings from [Rightmove](https://www.rightmove.co.uk), **for sale and to rent**, for any town, city, area or postcode district. Type a location such as `Manchester` or `SW1A` and set the usual filters, or paste any Rightmove search URL. You get one flat row per property: **price** (and rent per month), **bedrooms**, **bathrooms**, **property type**, **address**, **coordinates**, **first listed and last changed dates**, **tags** such as *reduced* or *new home*, all **photo URLs**, and the **estate agent** branch.

Turn on **property details** to also get the full description, key features, **full postcode**, **tenure and lease years left**, **council tax band**, service charge and ground rent, size in sq ft and m², room sizes, **nearest stations**, **floorplan, EPC and brochure links**, and deposit and furnishing for rentals.

It reads the same public pages a logged-out visitor sees. No Rightmove account, cookies or browser are needed.

This is an **unofficial** tool. It is not affiliated with, endorsed by or connected to Rightmove plc.

### Why use Rightmove Property Scraper?

- **More than 1,000 results per search.** Rightmove never shows more than about 1,000 listings (42 pages) for one search. This Actor automatically splits a big search into price bands and merges them without duplicates, so you can collect a whole city.
- **Built to finish.** Every request is retried with a fresh IP and backs off when Rightmove slows down. A bad page is skipped and logged instead of failing the run, and a `SUMMARY` record shows exactly what was collected per search.
- **Fair pricing.** You only pay for properties saved. Failed searches and pages are never charged.
- **Market research and valuation:** asking prices, price per sq ft, reductions and time on market for an area.
- **Lettings and investment:** rents per month, deposits, furnishing and availability across postcodes.
- **Lead lists for property businesses:** which estate agent branches list what, where.
- **Monitoring:** schedule a daily run with "Added to site: last 24 hours" to catch new listings.

### How to scrape Rightmove

1. Click **Try for free**.
2. Enter one or more **locations** (town, area, postcode district, or a Rightmove ID like `REGION^87490`), or paste **Rightmove search URLs**.
3. Pick *for sale* or *to rent* and any filters: price, bedrooms, property type, radius, added within, under offer.
4. Set **Maximum properties per search** (0 = all) and switch on **Include property details** if you need them.
5. Click **Start** and download the results as JSON, CSV or Excel, or read them through the Apify API.

### Input

```json
{
  "locations": ["Manchester", "SW1A"],
  "listingType": "rent",
  "minPrice": 1000,
  "maxPrice": 2500,
  "minBedrooms": 2,
  "propertyTypes": ["flat"],
  "radius": "1.0",
  "addedWithin": "7",
  "sortBy": "newest",
  "maxProperties": 500,
  "includeDetails": false,
  "searchUrls": ["https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=600000"]
}
```

- `locations`: looked up with Rightmove's own location search; the first match is used and saved in `searchLocation`.
- `searchUrls`: search pages (list, map or area pages) keep all their own filters; property pages (`/properties/123456789`) return the full detail record.
- Filters (`listingType`, `minPrice`, `maxPrice`, `minBedrooms`, `maxBedrooms`, `propertyTypes`, `radius`, `addedWithin`, `includeUnderOffer`, `sortBy`) apply to `locations`. Rent prices are per calendar month.
- `maxProperties`: per location or URL; 0 means all.
- `splitByPrice` (on by default) and `includeDetails` (off by default) are explained above. `proxyConfiguration` uses the Apify datacenter proxy by default.

### Output

One dataset item per property (details on):

```json
{
  "propertyId": "93996837",
  "url": "https://www.rightmove.co.uk/properties/93996837",
  "listingType": "sale",
  "title": "3 bedroom semi-detached house for sale",
  "displayAddress": "Edale Road, Stretford, Manchester, M32 9RY",
  "latitude": 53.454711,
  "longitude": -2.322978,
  "price": 350000,
  "currency": "GBP",
  "displayPrice": "£350,000",
  "priceQualifier": "Offers Over",
  "bedrooms": 3,
  "bathrooms": 1,
  "propertyType": "Semi-Detached",
  "firstListedDate": "2026-10-06T15:12:44Z",
  "addedOrReduced": "Added today",
  "tags": ["virtual_tour"],
  "imageCount": 21,
  "agentName": "Paul Birtles Estate Agents",
  "agentDisplayName": "Paul Birtles Estate Agents, Urmston",
  "agentPhone": "0161 524 5588",
  "postcode": "M32 9RY",
  "tenure": "LEASEHOLD",
  "leaseYearsRemaining": 906,
  "councilTaxBand": "C",
  "annualGroundRent": 5,
  "sizeSqFt": 896,
  "pricePerSqFt": 390.63,
  "nearestStations": [{ "name": "Humphrey Park Station", "types": ["NATIONAL_TRAIN"], "distanceMiles": 0.24 }],
  "floorplanUrls": ["https://media.rightmove.co.uk/property-floorplan/.../5804ea9404b26f59039f6e50780303f8.jpeg"],
  "description": "AN EXTENDED THREE BEDROOM SEMI-DETACHED PROPERTY ...",
  "detailScraped": true,
  "searchInput": "Manchester",
  "searchLocation": "Manchester, Greater Manchester",
  "scrapedAt": "2026-10-07T00:00:00+00:00"
}
```

The run's key-value store also has a `SUMMARY` record: Rightmove's total per search, how many were saved, the price bands used, skipped pages and request timings.

### Data fields

| Field | Description |
|---|---|
| `propertyId`, `url` | Rightmove property ID and page |
| `listingType` | `sale` or `rent` |
| `title`, `propertyType` | e.g. "2 bedroom flat for sale", `Flat` |
| `displayAddress`, `latitude`, `longitude` | Address as shown on Rightmove and map position |
| `price`, `currency`, `priceFrequency`, `pricePerMonth` | Price as listed (rentals: `weekly`/`monthly` and the per-month equivalent Rightmove filters on) |
| `displayPrice`, `secondaryDisplayPrice`, `priceQualifier` | Price text, e.g. "£1,050 pcm" / "£242 pw", "Offers Over", "Guide Price" |
| `bedrooms`, `bathrooms`, `sizeSqFt`, `displaySize`, `tenure` | Basics from the search page |
| `summary` | Short summary from the search page |
| `firstListedDate`, `listingUpdateReason`, `listingUpdateDate`, `addedOrReduced`, `lastUpdated` | When it was first listed and last changed (`new`, `price_reduced`, ...) |
| `status` | `Under offer`, `Sold STC`, `Let agreed` (with "include under offer") |
| `tags` | `reduced`, `new_home`, `shared_ownership`, `auction`, `student`, `featured`, `premium_listing`, `virtual_tour`, ... |
| `isFeatured`, `isPremiumListing`, `isAuction`, `isNewHome`, `agentLabel` | Listing flags and the agent's label such as "No Chain" |
| `imageCount`, `floorplanCount`, `virtualTourCount`, `mainImageUrl`, `imageUrls` | Photos (full-size URLs) |
| `agentName`, `agentBranch`, `agentDisplayName`, `agentBranchId`, `agentPhone`, `agentUrl` | Estate agent branch (business details only) |
| `letAvailableDate` | Rentals: available from |
| `searchInput`, `searchLocation` | Which search found it |
| **With details:** `description`, `keyFeatures` | Full description and bullet points |
| `postcode`, `outcode`, `ukCountry` | Full postcode |
| `tenure`, `leaseYearsRemaining`, `councilTaxBand`, `annualServiceCharge`, `annualGroundRent`, `groundRentReviewPeriodYears` | Ownership costs |
| `isSharedOwnership`, `sharedOwnershipPercentage`, `sharedOwnershipRent` | Shared ownership |
| `sizeSqM`, `pricePerSqFt`, `rooms` | Size and room dimensions |
| `nearestStations` | Name, type and distance in miles |
| `features` | Parking, garden, heating, utilities, accessibility as listed |
| `floorplanUrls`, `epcUrls`, `brochureUrls`, `virtualTourUrls` | Documents and tours |
| `deposit`, `furnishType`, `letType`, `minimumTermMonths` | Rentals |
| `agentCompany`, `agentAddress` | Agent company and branch address |
| `commercialType`, `commercialSubType`, `commercialSize`, `useClasses`, `serviceCharge`, `businessRates` | Commercial listings only (offices, shops, land, ...) |
| `listingHistory`, `isArchived`, `detailScraped`, `detailError` | Page status |

### Pricing: how much does it cost to scrape Rightmove?

Pay per event, only for properties saved:

| Event | Price | When |
|---|---|---|
| `property` | $0.001 ($1.00 per 1,000) | One property from search results |
| `property-detail` | $0.002 ($2.00 per 1,000) | One property with its detail page, charged **instead of** `property` |

A 50-property test costs about $0.05. All 6,800 properties for sale in Manchester cost about $6.80 (about $13.60 with details).

Failed searches and pages are never charged. If a detail page cannot be loaded, you still get the search data for that property and pay only the `property` price. Set a maximum charge for the run and the Actor stops exactly there.

### Tips and limits

- **How the 1,000-result limit is handled.** Rightmove stops every search at 42 pages. When a search has more results and you want more than ~1,000, the Actor sorts it by price and reads it in bands: the first band is the cheapest ~1,000, the next band starts just above the last price read, and so on. All listings at the boundary price are read separately, and if more than 1,000 share one exact price (e.g. £500,000 in London) they are split by bedroom count. Every property ID is saved once. In this mode results come cheapest first, so use `addedWithin` instead of a sort if you only want the newest.
- Listings without a price (POA) and listings without a bedroom count that share an over-crowded exact price may be missed when a search is split; the `SUMMARY` notes when this can apply.
- Price history and sold prices are not included: Rightmove only serves them through endpoints its robots.txt disallows.
- Speed: about 1.3 seconds per page of 24 listings (in our tests 2,199 London listings took about 2 minutes). With details, 3 parallel workers load about 1.5 property pages per second.
- Residential searches (for sale, to rent, new homes) are supported. Commercial and overseas *searches* are not yet; commercial listings that appear in residential results, and single commercial property URLs, are.
- To monitor an area, save your input as a task and schedule it daily with "Last 24 hours".
- **Property data for other countries:** [Poland (Otodom)](https://apify.com/kyungminlee/otodom-listings-scraper), [UAE (Property Finder)](https://apify.com/kyungminlee/propertyfinder-listings-scraper), [Brazil (ZAP Imóveis & VivaReal)](https://apify.com/kyungminlee/zap-vivareal-property-scraper).

### FAQ

#### Do I need a Rightmove account?

No. The Actor reads public listing pages only and never logs in or uses cookies.

#### Does it collect personal data?

No. Listings on Rightmove are published by estate agents and developers; the Actor saves the listing and the agent branch's business details only. It never opens contact forms.

#### Why did I get fewer results than Rightmove's total?

Check `maxProperties` (0 = all) and the `SUMMARY` record. Properties already saved by another search in the same run are skipped, and listings can be added or removed while the run is going.

#### Is it legal to scrape Rightmove?

The Actor collects only public listing data at a polite rate, from pages Rightmove's robots.txt allows. You are responsible for how you use the data and for following the laws and terms that apply to you.

#### Is this an official Rightmove product?

No. This is an unofficial, independent tool and is not affiliated with Rightmove plc. Rightmove is a trademark of its owner.

Found a problem or need another field? Open an issue on the **Issues** tab.

# Actor input Schema

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

Places to search, one per line: a town, city or area (`Manchester`, `Clapham`), a postcode district (`SW1A`, `M32`) or a Rightmove location identifier (`REGION^87490`, `OUTCODE^2506`). Each name is looked up with Rightmove's own location search and the first match is used; the resolved name is saved with every result and in the SUMMARY record. The filters below apply to these locations.

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

Paste URLs from rightmove.co.uk, one per line: a search results page (`/property-for-sale/find.html?...`, `/property-to-rent/find.html?...`, map view, or area pages such as `/property-for-sale/London.html`), or single property pages (`/properties/123456789`). Every filter in a search URL is kept as it is; the filters below do not change URLs. Property pages always return the full detail record.

## `listingType` (type: `string`):

Search properties for sale or to rent.

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

Lowest price in pounds. For rentals this is rent per calendar month (pcm), like on Rightmove. Any whole number works.

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

Highest price in pounds (rentals: per calendar month). Leave empty for no limit.

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

Minimum number of bedrooms (0 = studio).

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

Maximum number of bedrooms.

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

Only these property types. Leave empty for all types.

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

Also include properties within this distance of the location, as on Rightmove.

## `addedWithin` (type: `string`):

Only listings added to Rightmove recently. Useful for daily monitoring of new listings.

## `includeUnderOffer` (type: `boolean`):

Also return listings that are under offer or sold subject to contract (for sale), or let agreed (to rent). Their `status` field says which.

## `sortBy` (type: `string`):

Order in which Rightmove returns listings. When a search is split into price bands (more than about 1,000 results and you want more), results come cheapest first instead.

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

How many properties to save for each location or search URL. 0 = all of them. Properties already saved by another search in the same run are skipped and do not count. The run's maximum charge can lower this.

## `splitByPrice` (type: `boolean`):

Rightmove shows at most about 1,000 listings (42 pages) for any search. When a search has more and you ask for more, the Actor reads it in price bands (cheapest first) and merges them without duplicates, so you can collect a whole city. Turn off to stop at Rightmove's 1,000.

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

Also open each property page to add the full description, key features, full postcode, tenure and lease years left, council tax band, service charge and ground rent, size, rooms, nearest stations, floorplan, EPC and brochure links, deposit and furnishing for rentals. One extra request per property, charged as `property-detail` instead of `property`.

## `detailConcurrency` (type: `integer`):

How many property pages are loaded at the same time when details are on, each through its own proxy IP at about one request per second. Higher is faster; lower is gentler.

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

The Apify datacenter proxy (default) spreads requests over several IPs and switches to a fresh IP whenever Rightmove slows one down. You can turn it off; requests then come from the run's own IP.

## Actor input object example

```json
{
  "locations": [
    "Manchester"
  ],
  "listingType": "sale",
  "radius": "0.0",
  "addedWithin": "any",
  "includeUnderOffer": false,
  "sortBy": "newest",
  "maxProperties": 50,
  "splitByPrice": true,
  "includeDetails": false,
  "detailConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "locations": [
        "Manchester"
    ],
    "maxProperties": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/rightmove-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 = {
    "locations": ["Manchester"],
    "maxProperties": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kyungminlee/rightmove-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 '{
  "locations": [
    "Manchester"
  ],
  "maxProperties": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kyungminlee/rightmove-property-scraper --silent --output-dataset

```

## MCP server setup

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