# Rightmove Scraper (`normdata/rightmove-scraper`) Actor

Scrape Rightmove UK homes for sale, to rent and new builds: price, price per sq ft, reductions, beds, size, tenure, GPS, photos, agent and phone. Gets past the 1,000-result cap. Every filter. Optional full details: postcode, council tax, lease, floorplans, EPC, stations.

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

## Pricing

from $12.00 / 1,000 results

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?

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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🏠 Rightmove Scraper

Extract property listings from **Rightmove**, the UK's biggest property portal: homes **for sale**, **to rent** and **new builds** in any town, area, county, postcode or station, or from any Rightmove link. Each listing comes with price, **price per sq ft**, price reductions, bedrooms, bathrooms, size, tenure, address, GPS, key features, photos and the **estate agent with phone number**. Turn on **Full details** for the postcode, full description, **council tax band, service charge, ground rent, lease years left**, deposit, nearest stations, floorplans, brochures, EPC, parking, garden, heating, utilities and flood risk.

### 🎯 Who uses it?

#### 🏘️ Property investors and sourcers

Pull every listing in your target areas with price per sq ft, reductions and lease details, and spot the deals before anyone else.

#### 📞 Lead generation and proptech sales

Get every estate agent branch active in an area with their phone number, address and listings.

#### 📊 Analysts, valuers and researchers

Track asking prices, rents, time on market and reductions across towns and postcodes over time.

#### 🔔 Buyers, renters and relocation agents

Schedule a search and receive only the listings added since the last run.

### ✨ What it does

- **Any place by name.** A town ("Manchester"), an area ("Clapham"), a county ("Cornwall"), a postcode ("SW1A 1AA"), a postcode district ("NW8") or a station ("Kings Cross Station"). Several in one run.
- **Any link.** Paste Rightmove search pages with all their filters, or single property pages.
- **Sale, rent or new homes**, with a search radius from 1/4 mile to 40 miles.
- **Every Rightmove filter:** price, bedrooms, bathrooms, property type, tenure, must have (garden, parking, new home, retirement, shared ownership, auction, student, house share), don't show, furnishing, added in the last 24 hours / 3 / 7 / 14 days, include under offer and sold STC, sort order.
- **Extra filters Rightmove doesn't have:** keywords ("garage", "chain free"), min and max size in sq ft, price reduced only.
- **New listings only.** For scheduled runs: saves only what was added since the last run of the same search.
- **Full details (optional):** postcode, description, council tax band, service charge, ground rent, lease years left, shared ownership, deposit, minimum term, furnishing, nearest stations with distances, rooms, floorplans, brochures, EPC, parking, garden, heating, electricity, water, broadband, flood risk, listed building, agent address and profile.

### 🏆 Why this scraper

- **Fast.** 1,000 listings in about 15 seconds; with full details, about 100 per 12 seconds.
- **Complete.** Rightmove stops paging after about 1,000 results per search. This Actor splits big searches into price bands, so a whole city comes back in full (all 6,900 homes for sale in Manchester in under 2 minutes).
- **Ready to analyse.** Prices as numbers, rents also as a monthly figure, size in sq ft and m², price per sq ft computed, dates in ISO format, HTML turned into plain text.
- **No proxy needed.** Nothing extra to set up or pay for.

### ⚖️ How it compares

Based on each Actor's public input options (October 2026).

| Capability | This actor | memo23 | automation-lab | azzouzana |
|---|:--:|:--:|:--:|:--:|
| Search by place name | **yes** | yes | yes | no (link only) |
| Several places by name in one run | **yes** | no | no | no |
| Search links with their filters | **yes** | yes | yes | yes |
| Single property links | **yes** | yes | no | no |
| Price and bedroom filters as fields | **yes** | yes | yes | no |
| Bathrooms filter | **yes** | no | no | no |
| Tenure filter for sales | **yes** | no | no | no |
| Added in the last 24h / 3 / 7 / 14 days | **yes** | no | no | no |
| Must have / don't show | **yes** | yes | no | no |
| Size (sq ft) filter | **yes** | no | no | no |
| Price reduced only | **yes** | no | no | no |
| Keywords | **yes** | yes | no | no |
| New listings only (monitoring) | **yes** | yes | yes | no |
| Full property details | **yes** | yes | no | yes |

### 📦 What data you get

| Field | Description |
| --- | --- |
| `id`, `url`, `title` | Rightmove ID, property page, and title ("3 bedroom terraced house for sale"). |
| `listingType`, `status` | `sale`, `rent` or `new-homes`; `Available`, `Under offer`, `Sold STC`, `Let agreed`... |
| `price`, `priceText`, `priceQualifier` | Price as a number in £, as shown, and its qualifier ("Guide Price", "Offers over"...). |
| `priceFrequency`, `pricePerMonth` | Rentals: the period the rent is quoted in, and the rent per month. |
| `pricePerSqFt`, `currency` | Sales: price per sq ft when the size is known. Always `GBP`. |
| `bedrooms`, `bathrooms`, `propertyType`, `tenure` | Rooms, type ("Semi-Detached", "Flat"...), and `FREEHOLD`, `LEASEHOLD`, `SHARE_OF_FREEHOLD`... |
| `sizeSqFt`, `sizeSqM` | Size when the agent gives it. |
| `address`, `latitude`, `longitude` | Address as shown and GPS. |
| `summary`, `keyFeatures` | Short description and the bullet list. |
| `listedAt`, `lastUpdate`, `lastUpdateAt`, `addedOrReduced` | First listed, last change (`Added`, `Reduced`...) and when, and Rightmove's label ("Reduced on 11/09/2026"). |
| `availableFrom` | Rentals: move-in date. |
| `newHome`, `auction`, `student`, `featured`, `premium` | Listing flags. |
| `agentName`, `agentBranch`, `agentPhone`, `agentId`, `agentUrl`, `agentLogo` | The estate agent and branch with phone number. |
| `imageCount`, `floorplanCount`, `virtualTourCount`, `image`, `images` | Media counts, main photo and every photo in full size. |
| `searchLocation` | Which of your places or links found it. |
| `scrapedAt` | When the row was collected (UTC). |

With **Full details** on, each row also has: `description`, `postcode`, `outcode`, `region`, `councilTaxBand`, `councilTaxExempt`, `councilTaxIncluded`, `annualServiceCharge`, `annualGroundRent`, `groundRentReviewYears`, `groundRentIncreasePercent`, `leaseYearsRemaining`, `sharedOwnershipPercent`, `deposit`, `minimumTermMonths`, `letType`, `furnishing`, `parking`, `garden`, `heating`, `accessibility`, `electricity`, `water`, `sewerage`, `broadbandSupply`, `floodedInLast5Years`, `floodDefences`, `floodSources`, `listedBuilding`, `restrictions`, `rightsOfWay`, `nearestStations` (name, type, distance in miles), `rooms`, `floorplans`, `brochures`, `epcGraphs`, `virtualTours`, `tags`, `agentCompany`, `agentAddress`, `agentDescription`, `agentPropertiesUrl`, `agentIsDeveloper`, `archived`.

An `error` field only appears when a property's details page didn't load; the rest of the row is complete.

#### Example row (trimmed, with Full details)

```json
{
  "id": 93880386,
  "url": "https://www.rightmove.co.uk/properties/93880386",
  "title": "3 bedroom terraced house for sale",
  "listingType": "sale",
  "status": "Available",
  "price": 1250000,
  "priceText": "£1,250,000",
  "pricePerSqFt": 883.39,
  "currency": "GBP",
  "bedrooms": 3,
  "bathrooms": 2,
  "propertyType": "Terraced",
  "tenure": "LEASEHOLD",
  "sizeSqFt": 1415,
  "sizeSqM": 131.5,
  "address": "Bromells Road, SW4",
  "latitude": 51.462486,
  "longitude": -0.138834,
  "keyFeatures": ["Reception room", "Kitchen dining room", "Three bedrooms"],
  "addedOrReduced": "Added yesterday",
  "agentName": "Rampton Baseley",
  "agentBranch": "Northcote Road",
  "agentPhone": "020 3006 8723",
  "agentUrl": "https://www.rightmove.co.uk/estate-agents/agent/Rampton-Baseley/Northcote-Road-89369.html",
  "imageCount": 15,
  "image": "https://media.rightmove.co.uk/property-photo/b57637ed2/93880386/b57637ed2d8ee84cb14dd453b7957c77.jpeg",
  "searchLocation": "Clapham, South West London",
  "description": "This stunning townhouse is set in a modern, gated development in Clapham Old Town ...",
  "postcode": "SW4 0BG",
  "councilTaxBand": "F",
  "annualServiceCharge": 1000,
  "annualGroundRent": 250,
  "leaseYearsRemaining": 971,
  "parking": ["Yes"],
  "garden": ["Yes"],
  "nearestStations": [
    { "name": "Clapham Common Station", "types": ["LONDON_UNDERGROUND"], "distanceMiles": 0.06 },
    { "name": "Clapham High Street Station", "types": ["NATIONAL_TRAIN"], "distanceMiles": 0.34 }
  ],
  "floorplans": ["https://media.rightmove.co.uk/property-floorplan/064de9c9d/93880386/064de9c9d6681cc2c59abb08c4def2b2.jpeg"],
  "epcGraphs": ["https://media.rightmove.co.uk/property-epc/d7be28adc/93880386/d7be28adc39f7d569d5d28211a753d45.png"],
  "agentAddress": "131 Northcote Road, London, SW11 6PS",
  "scrapedAt": "2026-10-04T16:11:02.284Z"
}
```

### 💡 Use cases

#### 🏚️ Every price-reduced house in Bristol with a garden

```json
{ "locations": ["Bristol"], "propertyTypes": ["detached", "semi-detached", "terraced"], "mustHave": ["garden"], "reducedOnly": true, "maxItems": null }
```

#### 📞 Every agent listing rentals in Manchester, with phones

```json
{ "locations": ["Manchester"], "listingType": "rent", "maxItems": null }
```

Then open the **Agent contacts** view of the dataset.

#### 🔔 New flats in three London areas, daily

```json
{ "locations": ["Hackney", "Islington", "Camden"], "propertyTypes": ["flat"], "maxPrice": 600000, "onlyNew": true, "maxItems": null }
```

Schedule it every morning: each run saves only the flats added since the day before.

#### 🧾 Leasehold flats with lease, service charge and ground rent

```json
{ "locations": ["SW11"], "tenureTypes": ["LEASEHOLD"], "includeDetails": true, "maxItems": 200 }
```

#### 🔗 Your own Rightmove search, as it is

```json
{ "urls": ["https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E904&minBedrooms=2&maxPrice=250000"], "maxItems": null }
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum properties** | Always first: caps the whole run. Empty means no limit. |
| **Where** | Places, Rightmove links, listing type and radius. |
| **Filters** | Price, rooms, types, tenure, must have, don't show, furnishing, date added, under offer, keywords, size, reductions, sort, new listings only. |
| **What to include** | Full details (paid add-on). |

For rentals, prices are per month. Links keep their own filters; the form filters apply to the places you type.

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per property saved to your dataset. The price depends on your Apify plan tier:

| Your Apify plan | Price per property |
| --- | --- |
| Free | $0.016 |
| Bronze | $0.014 |
| Silver | $0.013 |
| Gold / Platinum / Diamond | $0.012 |

Approximate total cost:

| Properties collected | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| 100 | $1.60 | $1.40 | $1.30 | $1.20 |
| 1,000 | $16.00 | $14.00 | $13.00 | $12.00 |
| 10,000 | $160.00 | $140.00 | $130.00 | $120.00 |

**Full details add-on.** Only when **Full details** is on, each property saved with its details costs a little extra:

| Your Apify plan | Add-on per property |
| --- | --- |
| Free | $0.008 |
| Bronze | $0.007 |
| Silver | $0.0065 |
| Gold / Platinum / Diamond | $0.006 |

Leave it off and you pay only the base price. No proxy costs. New Apify accounts start with $5 in free credit. On the Free plan a run saves up to 10 properties.

**Speed:** 1,000 listings in about 15 seconds; a whole city of about 7,000 in under 2 minutes; with full details, about 100 properties per 12 seconds.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Rightmove Scraper.
3. Type a place (or keep the prefilled one), or paste Rightmove links, add filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (`run-sync-get-dataset-items`) or the ApifyClient for JavaScript and Python, and schedule it with Apify's built-in Scheduler (with **New listings only**) to catch new listings every day.

### 🤖 Use with AI agents (MCP)

Give an AI agent live access to Rightmove listings through the Model Context Protocol:

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/rightmove-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### 🔧 Troubleshooting

**A place was skipped.**
Type it the way Rightmove's search box shows it: "Newport, Isle of Wight", "Clapham, South West London", a postcode, or paste the search link instead.

**Some listings have no price per sq ft.**
The agent didn't give a size. Turn on **Full details**: some sizes only appear on the property page.

**Some listings have no council tax band or lease details.**
The agent didn't fill them in on Rightmove.

**A scheduled "New listings only" run saved nothing.**
Nothing new was listed since the last run of the same search. Changing the places, links or filters starts a fresh memory; set a **Monitor name** to keep it.

**A run with a Maximum isn't in my sort order past 1,000 listings.**
Very big searches are collected in price bands. Sorting by price keeps the order; other sorts are kept within each band.

### ❓ FAQ

| Question | Answer |
| --- | --- |
| Do I need a Rightmove account? | No. Only public listings are read. |
| Does it need a proxy? | No. |
| Can I get more than 1,000 results? | Yes. Leave the maximum empty: big searches are split into price bands automatically. |
| Can I get the agent's phone number? | Yes, `agentPhone` on every listing. |
| Can I get rentals and new builds? | Yes. Pick **To rent** or **New homes** in Listing type. |
| Can I track new listings? | Yes. Turn on **New listings only** and schedule the run. |
| Does it cover commercial property or sold prices? | Not yet. Write to us if you need them. |

### 🛡️ Limits & responsible use

This Actor reads only public listings from Rightmove. It never signs in and never contacts agents. Agent names and phone numbers are business contacts, but handle any personal data in line with UK GDPR and PECR, and use the data in line with Rightmove's terms.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### 🧪 Local development

```powershell
bun install
bun run typecheck
bun test/qa.mjs
apify run
```

Local results are stored in `storage/datasets/default`.

# Actor input Schema

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

Stop after this many properties. Leave empty for no limit (every listing that matches, even past Rightmove's 1,000-result cap). The Apify Free plan is always capped at 10.

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

Anything you would type in the Rightmove search box: a town or city ("Manchester"), an area ("Clapham, South West London"), a county ("Cornwall"), a postcode ("SW1A 1AA"), a postcode district ("NW8") or a station ("Kings Cross Station").

## `urls` (type: `array`):

Rightmove search pages (with all their filters, e.g. rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E904\&minBedrooms=2) or single properties (rightmove.co.uk/properties/123456789). Links keep their own filters; the filters below apply to Locations.

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

Homes for sale, homes to rent, or new-build homes from developers.

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

Also include properties this far around each location.

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

For rentals: per month.

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

For rentals: per month.

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

0 = studio.

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

Up to 10.

## `minBathrooms` (type: `integer`):

Up to 5.

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

Keep only these types. Leave empty for all.

## `tenureTypes` (type: `array`):

Keep only these tenures. Leave empty for all.

## `mustHave` (type: `array`):

Keep only listings with ALL of these. Student and house share apply to rentals.

## `dontShow` (type: `array`):

Leave these out.

## `furnishTypes` (type: `array`):

Keep only these. Leave empty for all.

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

Only listings added (or re-listed) in this window.

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

Rightmove hides these by default.

## `keywords` (type: `array`):

Keep listings that mention ANY of these in the title, summary or key features, e.g. "garage", "chain free", "sea view".

## `minSizeSqFt` (type: `integer`):

Listings without a size are left out when you set this.

## `maxSizeSqFt` (type: `integer`):

Listings without a size are left out when you set this.

## `reducedOnly` (type: `boolean`):

Keep only listings whose latest change was a price cut.

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

Order of the results. Matters most when you set a Maximum.

## `onlyNew` (type: `boolean`):

For scheduled runs: save only listings this same search has not saved before. The first run saves everything; later runs save just what was added since. Kept per search (locations, links and filters).

## `monitorName` (type: `string`):

Optional. Give "New listings only" a fixed name to keep its memory even after you change the filters.

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

Opens each property page and adds: full description, postcode, council tax band, service charge, ground rent, lease years left, deposit, furnishing, nearest stations, rooms, floorplans, brochures, EPC, parking, garden, heating, utilities, flood risk and agent address. Paid add-on: one extra charge per property saved with details (see Pricing).

## Actor input object example

```json
{
  "maxItems": 10,
  "locations": [
    "London"
  ],
  "listingType": "sale",
  "radius": "0.0",
  "includeUnderOffer": false,
  "reducedOnly": false,
  "sortBy": "newest",
  "onlyNew": false,
  "includeDetails": false
}
```

# Actor output Schema

## `properties` (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 = {
    "maxItems": 10,
    "locations": [
        "London"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/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 = {
    "maxItems": 10,
    "locations": ["London"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/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 '{
  "maxItems": 10,
  "locations": [
    "London"
  ]
}' |
apify call normdata/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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