# Rightmove Scraper 🏡 (past the 1,000 result limit) (`tagadanar/rightmove-scraper`) Actor

Scrape UK property listings from Rightmove, for sale or to rent: asking price, bedrooms, address, floor area, tenure, key features, coordinates and the agent's branch and phone. Type a place name, no region ids. Splits big areas by price band for the whole market, not the 1,000 Rightmove stops at.

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

## Pricing

from $1.05 / 1,000 listing scrapeds

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/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

Pull UK property listings off Rightmove as clean rows of data: asking price,
bedrooms and bathrooms, address, floor area, tenure, key features, coordinates,
and the estate agent's branch name and phone number. Works for sales and
rentals, anywhere in the UK, from a single postcode district to a whole city.

Two things make this one different from the other Rightmove actors.

**It covers areas bigger than 1,000 properties.** Rightmove itself stops at
1,008 results per search, whatever the result counter says at the top of the
page. Ask this actor for more than that and it splits your search into price
bands and walks them one after another until the area is actually finished. A
London search that reports 59,000 properties really does return 59,000 rows,
not the first 1,008.

**You type a place name, not a region id.** "Bath", "Manchester", "Clapham",
"SW1A": the actor looks each one up through Rightmove's own location search, the
same way the search box on the site does. No hunting through URLs for a
`REGION^116` to paste.

No API key, no account, no proxy to configure. You pay per listing you get back.

### Who uses this

- **Property investors and buying agents** watching a town for new instructions
  and for asking prices that have just been cut.
- **Estate agents** pulling every competing listing in their patch, with the
  rival branch name and phone on each row.
- **Letting agents and relocation firms** who need new rentals the hour they go
  live, not when the portal alert email arrives.
- **Proptech and data teams** building price indices, yield models or
  time-on-market analysis, who need the whole market rather than a sample.
- **Surveyors and valuers** collecting comparables for a street or a postcode
  district in one run.

### What you get

One row per listing.

| Field | What it is |
| --- | --- |
| `url`, `id` | Direct link to the listing and Rightmove's own id |
| `price`, `priceLabel`, `priceQualifier` | Asking price as a number, as printed, and the qualifier ("Guide Price", "Offers Over") |
| `priceFrequency` | `monthly` on rentals, empty on sales |
| `bedrooms`, `bathrooms` | Room counts |
| `propertySubType`, `propertyDescription` | "Terraced", "Apartment", plus the headline Rightmove writes |
| `displaySize`, `sizeSqFt` | Floor area as printed and as a number in square feet |
| `tenure` | FREEHOLD, LEASEHOLD, SHARE\_OF\_FREEHOLD |
| `displayAddress`, `outcode` | Address as published, plus the postcode district on its own |
| `latitude`, `longitude` | Coordinates |
| `summary`, `keyFeatures` | The listing blurb and the agent's bullet points |
| `firstVisibleDate` | When the listing first appeared on Rightmove (ISO) |
| `addedOrReduced`, `listingUpdateReason`, `listingUpdateDate` | What changed last and when: `new` or `price_reduced` |
| `isPriceReduced`, `priceReducedDate` | Flag and date for a price cut |
| `letAvailableDate` | Move-in date on rentals |
| `agentName`, `agentBranch`, `agentPhone`, `agentUrl` | The branch advertising it, with its phone number |
| `mainImage`, `images`, `imageCount`, `floorplanCount` | Photos and floorplans |
| `isNewHome`, `isStudent`, `isAuction`, `isFeatured`, `isPremium` | Listing flags |
| `isNew`, `isPriceDrop`, `previousPrice` | Monitor mode only: what changed since your last run |

### Input examples

Family houses for sale in Bath, newest first:

```json
{
  "location": ["Bath"],
  "listingType": "sale",
  "minBedrooms": 3,
  "maxPrice": 750000,
  "sortBy": "newest",
  "maxResults": 200
}
```

Every flat to rent in Manchester and Salford, including the ones already let
agreed, for a market study:

```json
{
  "location": ["Manchester", "Salford"],
  "listingType": "rent",
  "propertyTypes": ["flat"],
  "includeUnavailable": true,
  "maxResults": 5000
}
```

The whole London sales market, past the site's own 1,008 result limit:

```json
{
  "location": ["London"],
  "listingType": "sale",
  "maxResults": 60000
}
```

A scheduled monitor that posts new listings and price cuts in three postcode
districts to Slack:

```json
{
  "location": ["SW11", "SW18", "SW4"],
  "listingType": "sale",
  "addedWithin": "1",
  "monitorMode": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
  "maxResults": 200
}
```

Or paste a search URL straight from your browser, filters and all:

```json
{
  "searchUrls": ["https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E116&minBedrooms=2&maxPrice=750000"],
  "maxResults": 100
}
```

### Getting past the 1,008 result limit

Rightmove pages 24 results at a time and refuses to serve past result 1,008. It
does not matter that the counter says 59,525: page 43 does not exist. Every
scraper on the Store hits that wall, and so does the site's own interface.

When your `maxResults` is higher than 1,008 and the area holds more than that,
this actor stops paging and starts slicing instead. It sorts the search
cheapest-first, takes the 1,008 the site will hand over, notes the highest
asking price in that slice, and re-runs the same search from that price upwards.
It repeats until a slice comes back under the limit. Nothing is skipped at the
seams, and listings that appear in two slices are removed before you are
charged.

Prices in a real market bunch on round numbers, and occasionally more than 1,008
properties share one exact price. When that happens the actor splits that single
price by property type so those listings are reachable too. In the rare case
where even that is not enough, the run log says exactly which price could not be
fully covered, rather than quietly returning less than you asked for.

### Monitor mode

Turn on `monitorMode` and schedule the actor hourly or daily. The first run
records what is on the market today. Every run after that returns, and charges
for, only two things: listings that were not there last time, and listings whose
asking price has dropped since last time, with `previousPrice` on the row so you
can see the size of the cut. Set `webhookUrl` and each run also posts a short
digest to Slack.

That is the difference between a scraper and an alert. A daily monitor on a
London borough costs you a handful of changed listings a day, not the whole
borough every day.

### Output sample

```json
{
  "id": "88521360",
  "url": "https://www.rightmove.co.uk/properties/88521360",
  "listingType": "sale",
  "price": 350000,
  "priceLabel": "£350,000",
  "priceQualifier": "Offers Over",
  "priceFrequency": null,
  "currency": "GBP",
  "bedrooms": 3,
  "bathrooms": 3,
  "propertySubType": "Flat",
  "propertyDescription": "3 bedroom flat for sale",
  "displaySize": null,
  "sizeSqFt": null,
  "tenure": "LEASEHOLD",
  "displayAddress": "Roper Court, 109 George Leigh Street, Ancoats, Manchester City Centre, M4",
  "outcode": "M4",
  "latitude": 53.486177,
  "longitude": -2.226572,
  "summary": "An exceptional opportunity to acquire this beautifully presented, design-led three-bedroom duplex townhouse, ideally positioned within the highly sought-after district of Ancoats, Manchester.",
  "keyFeatures": [
    "Three Bedroom Duplex",
    "Arranged Over Two Floors",
    "High Specification Throughout",
    "Prime Ancoats Location"
  ],
  "firstVisibleDate": "2026-05-15T09:30:23Z",
  "lastUpdateDate": "2026-08-06T20:04:48Z",
  "addedOrReduced": "Reduced yesterday",
  "listingUpdateReason": "price_reduced",
  "listingUpdateDate": "2026-08-06T20:04:45Z",
  "priceReducedDate": "2026-08-06T20:04:45Z",
  "isPriceReduced": true,
  "letAvailableDate": null,
  "agentName": "Thornley Groves",
  "agentBranch": "Thornley Groves, Manchester Southern Gateway",
  "agentPhone": "0161 524 4726",
  "agentUrl": "https://www.rightmove.co.uk/estate-agents/agent/Thornley-Groves/Manchester-Southern-Gateway-12532.html",
  "agentBranchId": "12532",
  "mainImage": "https://media.rightmove.co.uk/dir/crop/10:9-16:9/236k/235562/88521360/235562_RopCou109_IMG_00_0000_max_476x317.jpeg",
  "imageCount": 21,
  "floorplanCount": 1,
  "virtualTourCount": 0,
  "isNewHome": null,
  "isStudent": null,
  "isAuction": null,
  "isFeatured": false,
  "isPremium": false,
  "isNew": null,
  "previousPrice": null,
  "isPriceDrop": false,
  "searchLocation": "Manchester, Greater Manchester",
  "source": "rightmove.co.uk",
  "scrapedAt": "2026-08-07T01:12:44.913Z"
}
```

### FAQ

**Which places work?** Anything Rightmove's own search box accepts: a city, a
town, a London borough, a village, a station, or a postcode district such as
`M4` or `SW1A`. Put several in `location` and they are searched one after the
other into the same dataset. If you already have a Rightmove identifier like
`REGION^116` you can pass that instead.

**Sales or rentals?** Both. Set `listingType` to `sale` or `rent`. On rentals
the prices are monthly, the same figures the site shows as pcm, and
`letAvailableDate` tells you when the property is free.

**Can I really get more than 1,000 results?** Yes, that is the point of this
actor. Set `maxResults` above 1,008 and the search is split by price band until
the area is covered. Verified on a live Manchester search of 6,857 listings.

**Does it include sold subject to contract and let agreed?** Not unless you ask.
Turn on `includeUnavailable` when you are studying a market rather than shopping
in it.

**How do I get only listings added today?** Set `addedWithin` to "Last 24 hours".
For a running alert, use `monitorMode` on a schedule instead, which also catches
price cuts.

**Do I need an API key, a login or a proxy?** No. Nothing to set up, and there is
no proxy field to get wrong. Reliability is handled inside the actor and
included in the price per listing.

**Can I widen a search around a town?** Yes, `radiusMiles` is the same "within X
miles" dropdown the site has, from a quarter of a mile up to forty.

**Does it scrape sold house prices?** No, this actor covers what is currently on
the market, for sale and to rent.

**Something changed on the site and my run came back short.** Open an issue on
the actor. Fixture tests are kept from real pages, so a markup change is usually
reproduced and fixed in a day or two.

### Pricing

You pay per listing returned. Platform usage is included in the price, there is
no subscription, and users on higher Apify plans get automatic discounts.

| Event | When |
| --- | --- |
| Run started | Flat, once per run |
| Listing scraped | Per listing actually returned with its data |
| Digest sent | Monitor mode only, per webhook digest actually delivered |

Listings that are skipped as duplicates across price bands are not charged.

### Related actors

- [ImmobilienScout24 Scraper](https://apify.com/tagadanar/immobilienscout24-scraper) for the German market.
- [SeLoger Scraper](https://apify.com/tagadanar/french-real-estate-seloger) for France, with seller phone numbers.
- [Companies House Monitor](https://apify.com/tagadanar/companies-house-monitor) if you also need the UK company behind a landlord or developer.

***

Rightmove scraper, UK property data, Rightmove API alternative, property
listings scraper UK, house prices data UK, estate agent contact data, rental
listings scraper UK, Rightmove price drop alerts, new listing alerts UK,
property market data London, Rightmove data extraction, UK real estate dataset.

# Actor input Schema

## `location` (type: `array`):

Type the place the way you would in Rightmove's own search box: a town, city, borough, village, station or postcode district, for example <code>Bath</code>, <code>Manchester</code>, <code>Clapham</code> or <code>SW1A</code>. One entry per area, and the actor looks each one up for you, so you never have to hunt for a region id. Rightmove identifiers such as <code>REGION^116</code> also work if you already have one.

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

Which side of Rightmove to search.

## `radiusMiles` (type: `string`):

Widen the search around the place you picked, exactly like the "within" dropdown on the site.

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

Lowest asking price to include. On rentals this is a monthly figure, the same as the site's pcm filter.

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

Highest asking price to include. On rentals this is a monthly figure. Rightmove itself stops filtering above £20,000,000 for sales and £40,000 pcm for rentals.

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

Fewest bedrooms to include.

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

Most bedrooms to include.

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

Leave empty for every type, or pick the ones you want. Same list as the site's own filter.

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

Only listings first published within this window. The usual choice for a scheduled monitor is the last 24 hours.

## `includeUnavailable` (type: `boolean`):

Off by default, so you only get what is still available. Turn it on to see properties already under offer, sold subject to contract or let agreed, which is what you want when you are studying a market rather than shopping in it.

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

Which listings you get first when you ask for fewer than the whole area. On very large areas the actor switches to its own price-by-price walk so that nothing is left behind, and this setting then only decides the first page.

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

Stop after this many listings across every area you asked for. You are only charged for listings actually delivered. Rightmove itself serves 1008 results per search; ask for more than that and the actor splits the search by price band until the whole area is covered.

## `monitorMode` (type: `boolean`):

For scheduled runs. The first run records what is on the market today, and every run after it returns, and charges for, only listings that are new plus listings whose asking price has dropped since the previous run.

## `webhookUrl` (type: `string`):

Optional. In monitor mode the run posts a short digest of the new listings and price drops to this URL. A Slack incoming-webhook URL works as is.

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

Paste one or more Rightmove search URLs straight from your browser, filters and all. When this is set, the fields above are ignored.

## Actor input object example

```json
{
  "location": [
    "Bath"
  ],
  "listingType": "sale",
  "radiusMiles": "0.0",
  "maxPrice": 750000,
  "minBedrooms": 2,
  "propertyTypes": [],
  "addedWithin": "any",
  "includeUnavailable": false,
  "sortBy": "newest",
  "maxResults": 25,
  "monitorMode": false
}
```

# Actor output Schema

## `listings` (type: `string`):

One item per property listing in the default dataset.

# 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 = {
    "location": [
        "Bath"
    ],
    "listingType": "sale",
    "radiusMiles": "0.0",
    "maxPrice": 750000,
    "minBedrooms": 2,
    "propertyTypes": [],
    "addedWithin": "any",
    "includeUnavailable": false,
    "sortBy": "newest",
    "maxResults": 25,
    "monitorMode": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "location": ["Bath"],
    "listingType": "sale",
    "radiusMiles": "0.0",
    "maxPrice": 750000,
    "minBedrooms": 2,
    "propertyTypes": [],
    "addedWithin": "any",
    "includeUnavailable": False,
    "sortBy": "newest",
    "maxResults": 25,
    "monitorMode": False,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "location": [
    "Bath"
  ],
  "listingType": "sale",
  "radiusMiles": "0.0",
  "maxPrice": 750000,
  "minBedrooms": 2,
  "propertyTypes": [],
  "addedWithin": "any",
  "includeUnavailable": false,
  "sortBy": "newest",
  "maxResults": 25,
  "monitorMode": false
}' |
apify call tagadanar/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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