# Rightmove UK Scraper - Properties, Prices, Sales & Rentals (`abotapi/rightmove-scraper`) Actor

Fast, reliable Rightmove.co.uk scraper for UK properties for sale, rent and sold-price records. Search by location or property URL and extract 80+ structured fields per listing. Ideal for property research, price comparisons, rental analysis and real estate market intelligence.

- **URL**: https://apify.com/abotapi/rightmove-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Automation, Real estate, Developer tools
- **Features:** Limited permissions
- **Stats:** 5 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 property records

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

## Rightmove Scraper: UK Property Listings, Rentals and Sold Prices

Rightmove Scraper turns Rightmove into a clean UK property data feed. Get properties for sale, to rent, and historical sold-price records for any location, postcode or Rightmove link, with over 80 structured fields per property when full detail is enabled: price, full address and postcode, agent contacts, council tax band, ground rent, service charge, EPC graphs, nearest stations and airports, floorplans and more. Search by location plus filters, or paste any Rightmove URL, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Five channels, one actor.** For-sale (`BUY`), to-rent (`RENT`), sold-price history (`SOLD`), new homes (`new`) and student lettings (`student`) all come from the same input. Rival-style names such as `sale`, `rent` and `new_homes` are accepted too.
- **Two ways to find data.** Build a search from a location plus filters, or paste any Rightmove URL: a search page, a single property page, or a sold-price area page.
- **80+ fields on demand.** Turn on full detail scraping for the complete description, key features, council tax band, ground rent, service charge, EPC graphs, nearest stations and airports, broadband speed, floorplans, remaining lease years, and full agent contact details.
- **Server-side filters that really narrow the result set.** Price, bedrooms, property type, radius, sort order, furnished status, added-within-days, and the Let Agreed / Sold STC toggles are applied on Rightmove's own servers, not filtered away client-side.
- **Incremental and monitoring modes for recurring runs.** Schedule it and get only new listings, or rows labelled NEW, UPDATED, REAPPEARED or EXPIRED; unchanged listings are not returned or billed.
- **Runs on your proxy settings.** Datacenter is the default and cheapest option; the actor never switches to residential on its own, and it automatically retries with a different connection when one is refused.
- **Pay only for what you fetch.** Every returned record is billed once, and the deep detail fields are billed only for the records that were actually enriched.

### Use Cases

- **Property market research:** track asking prices, price reductions and new listings across an area or postcode over time.
- **Lead generation for agents and services:** collect agent names, companies and phone numbers from active listings for outreach.
- **Sold-price and comparable analysis:** pull historical sold prices by postcode or area to value a property or a portfolio.
- **Relocation and house-hunting tools:** feed for-sale and to-rent listings, with full detail, into your own search app or alert bot.
- **Portfolio and rent-roll monitoring:** run monitoring mode on a schedule to catch newly listed properties as soon as they appear.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `158234567` |
| `channel` | `"BUY"` (also `"RENT"`, `"SOLD"`) |
| `url` | `"https://www.rightmove.co.uk/properties/158234567"` |
| `transactionType` | `"SALE"` |
| `displayPrice` | `"£325,000"` |
| `price` | `325000` |
| `pricePerMonth` / `pricePerWeek` | rent listings only: `1500` / `346` |
| `currency` | `"GBP"` |
| `bedrooms` / `bathrooms` | `1` / `1` |
| `propertySubType` | `"Flat"` |
| `displayAddress` | `"Example Road, London, SW1A"` |
| `postcode` | `"SW1A 1AA"` (detail only) |
| `latitude` / `longitude` | `51.5` / `-0.12` |
| `description` | detail only: the full listing description |
| `keyFeatures` | detail only: array of bullet-point features |
| `sizeSqFt` | detail only: `381` |
| `tenureType` | detail only: `"SHARE_OF_FREEHOLD"` |
| `councilTaxBand` / `annualGroundRent` / `annualServiceCharge` | detail only: `"C"` / `250` / `1071` |
| `nearestStations` | detail only: array of `{ name, distance, unit }` |
| `epcGraphs` / `floorplans` | detail only: arrays of image URLs |
| `images` | array of photo URLs |
| `agentName` / `agentPhone` | `"Example Estate Agents, London"` / `"020 0000 0000"` |
| `detailScraped` | `true` once the detail page has been fetched for this record |
| `beds` / `baths` / `title` / `addedOn` / `furnishedType` / `ownership` | additive aliases of existing fields (`addedOn` is the date first listed, `firstVisibleDate`; empty when Rightmove gives none) |
| `agentBrandName` / `agentCompanyType` / `country` / `countryCode` / `domesticRates` | agent brand trading name / `"agent"` or `"developer"` / `"United Kingdom"` / `"GB"` / domestic rates figure (detail only, Northern Ireland listings) |

Sold-price records (`channel: "SOLD"`) carry a different shape: `uuid`, `encryptedUprn`, `address`, `propertyType`, `bedrooms`, `bathrooms`, `hasFloorPlan`, `lastSoldPrice`, `lastSoldDate`, `transactionCount`, a `transactions` array with every recorded sale (price, date, tenure, new-build flag), `detailUrl` and `staticMapUrls`, instead of the for-sale/to-rent fields above. Detail-enriched for-sale and to-rent records also carry `secondaryPrice`, `pricePerSqFt`, `outcode`/`incode`/`ukCountry`, `sizeSqM`, `yearsRemainingOnLease`, `groundRentReviewPeriodInYears`, `nearestAirports`, `broadband`, `brochures`, `virtualTours`, `rooms`, rental-only lettings terms (`deposit`, `furnishType`, `letType`, `letAvailableDate`), scheme flags (`sharedOwnership`, `affordableBuyingScheme`, `commercial`), full agent details (`agentCompanyName`, `agentDisplayAddress`, `agentLogo`, `agentPhoneInternational`), and verbatim `rawCustomer` / `rawLivingCosts` passthrough objects so nothing from the source page is lost.

### How to Use

1. Pick a **mode**: `search` (location plus filters) or `url` (paste direct Rightmove links).
2. For search mode, choose a **channel** (`BUY`, `RENT`, `SOLD`, `new` or `student`) and one or more **locations**, then narrow with the price, bedroom, property type, radius, furnished, added-within and sort filters (sort by newest, oldest, lowest or highest price).
3. Turn on **Scrape full property details** for the deep 80+ field set, and set **Max items** and **Max pages per search** to control run size and cost.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Buy search with filters and full detail:**

```json
{
  "mode": "search",
  "channel": "BUY",
  "locations": ["London", "Manchester"],
  "minPrice": 200000,
  "maxPrice": 500000,
  "minBedrooms": 2,
  "maxPages": 3,
  "includeDetails": true,
  "maxItems": 300
}
```

**Rent search:**

```json
{
  "mode": "search",
  "channel": "RENT",
  "locations": ["Leeds"],
  "maxPrice": 1500,
  "minBedrooms": 1,
  "maxPages": 2
}
```

**Sold prices for an area:**

```json
{
  "mode": "search",
  "channel": "SOLD",
  "locations": ["SW19"],
  "maxItems": 200
}
```

**Direct URLs (a search page and a single property):**

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" },
    { "url": "https://www.rightmove.co.uk/properties/158234567" }
  ],
  "includeDetails": true
}
```

**Supported URL shapes.** The **Start URLs** field now has a non-empty default: one example of each supported shape below (the commercial row is not supported): a search per channel, a paginated and a filtered search, property pages, a location page, new homes and sold prices. In URL mode, if you leave it untouched the actor scrapes all of those examples, so replace it with your own links before running. Search mode ignores it.

| Shape | Example path | Result |
|---|---|---|
| Buy search (region id) | `/property-for-sale/find.html?locationIdentifier=REGION%5E87490` | Listings, channel `BUY` |
| Rent search (region id) | `/property-to-rent/find.html?locationIdentifier=REGION%5E87490` | Listings, channel `RENT` |
| Paginated search | `...find.html?locationIdentifier=REGION%5E87490&index=24` | Starts from that result offset |
| Filtered / sorted search | `...&minPrice=300000&maxPrice=500000&minBedrooms=2&sortType=6&propertyTypes=flat&includeSSTC=false` | Rightmove applies the filters in the link |
| Property page | `/properties/94114530` (a `#...` share-link fragment is ignored) | One full-detail record |
| Legacy property page | `/property-for-sale/property-155320229.html`, `/property-to-rent/property-108124898.html` | One full-detail record |
| Location page | `/property-for-sale/Wimbledon.html` (no location id needed) | Listings, channel `BUY` |
| New-homes search | `/new-homes-for-sale/find.html?locationIdentifier=REGION%5E87490` | Listings, channel `new` |
| Sold prices, area | `/house-prices/london.html` | Sold records, channel `SOLD` |
| Sold prices, postcode | `/house-prices/SW19.html` | Sold records, channel `SOLD` |
| Sold prices, search link | `/house-prices/detail.html?country=england&locationIdentifier=REGION%5E87490&searchLocation=London` (the link Rightmove's own sold-price search produces) | Sold records for that area, channel `SOLD` |
| Sold property | `/house-prices/details/<id>` | One sold-property record with its transaction history, channel `SOLD`, same field shape as the area listing; the single-property page does not carry `encryptedUprn`, `hasFloorPlan` or `staticMapUrls`, so those stay empty there |
| Commercial search | `/commercial-property-for-sale/find.html?...` | Not supported: skipped with a warning in the log |

Other unrecognised links are also skipped with a warning rather than failing the run. A link that loads but yields no records (an unknown area, a removed property, an empty search) logs a warning naming the link instead of finishing silently.

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/rightmove-scraper").call(run_input={"mode": "search", "channel": "BUY", "locations": ["London"], "maxItems": 200})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["displayAddress"], item["displayPrice"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/rightmove-scraper').call({ mode: 'search', channel: 'BUY', locations: ['London'], maxItems: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### How Max pages and Max items shape a search

**Max pages per search** defaults to `1`, which is a single results page, 24 listings, per location, for BUY and RENT searches (including a pasted search-results URL). Raise it (up to 42, Rightmove's own pagination limit) to walk further into the result list. It has no effect on SOLD mode, which walks up to its own internal page limit and is bounded only by **Max items**. **Max items** caps the total records returned across every location, but each individual BUY/RENT location is still capped by Rightmove's own deep-pagination limit of roughly 1000 results. To cover a large area beyond that, split it into smaller sub-areas or postcodes and run them as separate locations.

#### Incremental mode

Turn on **Incremental mode** for scheduled runs of the same search. The actor remembers what each earlier run returned (per search, including whether details were requested) and labels every returned row with `changeType`: `NEW`, `UPDATED` (with `changedFields` listing what moved), `REAPPEARED` (back after being gone) or `EXPIRED` (no longer in the results). Unchanged listings are not returned, so they are not billed (for sold-price rows the per-response `encryptedUprn` token is kept in the output but never counts as a change), and detail enrichment is only fetched and charged for rows that are returned.

- `EXPIRED` rows appear only after a run that walked the whole result set. A run cut short by **Max items**, **Max pages**, the deep-pagination limit or a failed page, a pasted link that starts beyond page 1, or a single property link never marks anything expired.
- The relative "Added today / yesterday" badge, the distance from the search centre and the scrape time never count as a change; they stay in the output. Add more fields (nested paths such as `agent.logo` work) with **Ignore fields when detecting changes**.
- A change in the listing update reason or date (for example a price reduction) does count as a change.
- If both **Monitoring mode** and **Incremental mode** are on, Incremental mode applies.
- `EXPIRED` rows count towards **Max items** and are billed as ordinary result rows.

#### Monitoring mode

When **Monitoring mode** is on, the actor remembers every listing id (or sold-record key) it has already returned for that exact combination of mode, channel, locations or URLs, and filters. The next run of the same search then returns only records it has not returned before, which is ideal for a scheduled search that should surface only new listings. Changing any filter or location starts a fresh, independent history. A pasted individual property link is never filtered by this history (it is still skipped, and not charged, when its listing was already collected by the run named in **Resume from a previous run**) and is re-fetched (and re-billed for detail) on every monitored run.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (location plus filters) or `url` (direct Rightmove links). |
| `channel` | string | `BUY` | `BUY`, `RENT`, `SOLD`, `new` (new homes) or `student` (search mode only). Aliases `sale`, `rent`, `new_homes` are accepted. |
| `locations` | array | no default (prefill: `["London"]`) | Location names, areas, or postcodes to resolve (search mode), e.g. `"London"`, `"SW19"`. |
| `minPrice` | integer | no default | Minimum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount. |
| `maxPrice` | integer | no default | Maximum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount. |
| `minBedrooms` | integer | no default | Minimum bedrooms (BUY/RENT). |
| `maxBedrooms` | integer | no default | Maximum bedrooms (BUY/RENT). |
| `propertyTypes` | array | no default | Property type filter (BUY/RENT): houses, flats, bungalows, land, detached, semi-detached, terraced, park-home (`houses` expands to detached, semi-detached and terraced). |
| `radius` | string | no default | Search radius in miles around the location, e.g. `0.5`, `1`, `5`. Leave empty to search the exact area only. |
| `sortType` | string | `""` (most relevant) | Result ordering: newest listed, oldest listed, lowest price, or highest price first. |
| `sort` | string | `""` | Alias of `sortType`: `newest`, `oldest`, `highest`, `lowest`. `sortType` wins when both are set. |
| `furnished` | string | `""` | `furnished`, `part_furnished` or `unfurnished` (rent and student). |
| `maxDaysSinceAdded` | string | `""` | Only listings added within 1, 3, 7 or 14 days. |
| `search` | string | no default | Alias of `locations` (a single location). |
| `endPage` | integer | no default | Alias of `maxPages`. |
| `includeLetAgreed` | boolean | `false` | Include "Let Agreed" properties in rental searches. |
| `includeSSTC` | boolean | `false` | Include "Sold STC" / under-offer properties in sale searches. |
| `startUrls` | array | one example of each URL shape | Direct Rightmove URLs to scrape (URL mode): search pages, location pages, new-homes pages, property pages, or sold-price pages. Left untouched, URL mode scrapes the examples. |
| `maxItems` | integer | `100000` | Maximum number of records to return; set `0` for unlimited. Each location is still capped by Rightmove's own roughly-1000-result deep-pagination limit. |
| `maxPages` | integer | `1` | Maximum result pages to walk per location for BUY/RENT searches (24 listings per page); raise it to scrape deeper (up to 42). Has no effect on SOLD mode. |
| `includeDetails` | boolean | `false` | Fetch each property's detail page for 40+ extra fields; billed per record enriched. |
| `monitoringMode` | boolean | `false` | Return only listings not returned by a previous run of this exact search. |
| `resumeFromRunId` | string | - | Run ID or dataset ID of an earlier run: listings already collected there are skipped and not charged again. A resumed run never marks listings EXPIRED. |
| `incrementalMode` | boolean | `false` | Label rows NEW / UPDATED / REAPPEARED / EXPIRED against earlier runs of this exact search; unchanged rows are not returned. |
| `ignoreFieldsForChanges` | array | `[]` | Extra output fields that must not count as a change (incremental mode only). |
| `proxyConfiguration` | object | `{"useApifyProxy": true}` | Connection settings; residential is never auto-enabled. |
| `proxyCountry` | string | no default | Pin the proxy exit country; applied only when a proxy group such as residential is selected. |
| `mcpConnectors` | array | no default | Optional: send a summary of each record to apps authorized under Integrations. |
| `notionParentPageUrl` | string | no default | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "id": 158234567,
  "channel": "BUY",
  "url": "https://www.rightmove.co.uk/properties/158234567",
  "transactionType": "SALE",
  "displayPrice": "£325,000",
  "price": 325000,
  "currency": "GBP",
  "bedrooms": 1,
  "bathrooms": 1,
  "propertySubType": "Flat",
  "displayAddress": "Example Road, London, SW1A",
  "outcode": "SW1A",
  "incode": "1AA",
  "postcode": "SW1A 1AA",
  "latitude": 51.5,
  "longitude": -0.12,
  "description": "<p>Offering approximately 381 sq.ft of well-presented accommodation ...</p>",
  "keyFeatures": ["Share of Freehold", "Modern One Bedroom Apartment"],
  "sizeSqFt": 381,
  "tenureType": "SHARE_OF_FREEHOLD",
  "yearsRemainingOnLease": 118,
  "councilTaxBand": "C",
  "annualGroundRent": 250,
  "annualServiceCharge": 1071,
  "nearestStations": [{ "name": "Example Station", "distance": 0.11, "unit": "miles" }],
  "epcGraphs": ["https://media.rightmove.co.uk/property-epc/example.png"],
  "floorplans": ["https://media.rightmove.co.uk/property-floorplan/example.png"],
  "images": ["https://media.rightmove.co.uk/example.jpeg"],
  "agentName": "Example Estate Agents, London",
  "agentCompanyName": "Example Estate Agents Ltd",
  "agentDisplayAddress": "1 Example Street, London, EC1A 1BB",
  "agentPhone": "020 0000 0000",
  "detailScraped": true
}
```

### Plan Requirement

The default datacenter proxy works: in our checks datacenter connections returned real listing content for every supported page shape, so no residential proxy is required. The actor retries with a different connection when one is refused or fails to connect, and gives up on a single property after 25 seconds rather than stalling the run. For larger or more frequent runs, select the residential proxy group under Connection for extra resilience. The actor's **Pricing** tab shows the current rates.

#### Billing

- `apify-actor-start`: charged once per run.
- `apify-default-dataset-item`: charged once for every row written to the dataset (including `EXPIRED` rows in incremental mode).
- `detail-enrichment`: charged once for every row that was pushed with full detail (`detailScraped: true`), for search results with **Scrape full property details** on and for every pasted property link. Rows that are not returned (unchanged in incremental mode, already seen in monitoring mode, or failed) are never charged.

### FAQ

#### How much does it cost?

You pay per property record returned, plus an extra charge only for the records where full detail was fetched. The **Pricing** tab on the actor page shows the current rates. Use **Max items** to cap the cost of any run.

#### Is it legal to scrape Rightmove?

This actor collects only publicly available property listing and sold-price data. You are responsible for how you use it: follow Rightmove's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Agent contact details and listing photos may be subject to third-party rights.

#### Can I get only new listings on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode** (labels every change) or **Monitoring mode** (new listings only). Each run then remembers every property it has already returned for that exact search, and only returns ones it hasn't seen before.

#### Why did my search only return 24 properties?

For BUY and RENT searches, **Max pages per search** defaults to `1`, a single results page of 24 listings, per location. Raise it (up to 42) to walk further into the result list, and set **Max items** to fit the total you want. This limit does not apply to SOLD mode, which is bounded only by **Max items**.

#### Why did my run return zero properties instead of an error?

If a location cannot be resolved, or the site refuses every request for that search, the run finishes normally with an empty dataset and a short explanation in its run summary, rather than throwing an error. Check the run's summary output (requests, blocks, pages fetched) to tell "no matches for this filter" apart from "the site blocked every request", and try again if requests were blocked.

#### Does pasting a single property link always fetch the full detail page?

Yes. A direct property URL in URL mode always returns the deep field set, and is billed as detail enrichment, regardless of the **Scrape full property details** toggle, since there is nothing to enrich beyond the page itself. That toggle applies to search results, whether from a location or a pasted search URL; it has no effect on SOLD mode.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🧩 <a href="https://apify.com/abotapi/zoopla-co-uk-scraper"><b>Zoopla Scraper</b></a><br>Scrape UK property from Zoopla: for sale, to rent and Land Registry sold prices. Search...</td><td>🏠 <a href="https://apify.com/abotapi/jitty-uk-scraper"><b>Jitty Scraper</b></a><br>Scrape residential property listings from Jitty.com across the UK. Search with 20+...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/onthemarket-scraper"><b>OnTheMarket Scraper</b></a><br>Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price...</td><td>🏠 <a href="https://apify.com/abotapi/591-com-tw-scraper"><b>591.com.tw Scraper</b></a><br>Extract property listings from 591房屋交易網 591.com.tw, Taiwan’s largest real estate...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/jobs-nhs-uk-scraper"><b>NHS UK</b></a><br>Scrape nhs.uk Jobs listings into a flat dataset. Extract 50+ fields, including pay band...</td><td>💼 <a href="https://apify.com/abotapi/reed-co-uk-scraper"><b>Reed.co.uk Scraper</b></a><br>Scrape Reed.co.uk jobs, companies, courses and reviews by keyword, location, filters or...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/rightmove-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

How to find properties: build a search from a location + filters, or paste direct Rightmove URLs.

## `channel` (type: `string`):

What to scrape: properties for sale, to rent, new homes, student accommodation, or sold-price history by area. 'sale', 'rent' and 'new_homes' are accepted as aliases of BUY, RENT and new.

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

Location names, areas, or postcodes. Each is resolved automatically, e.g. 'London', 'Manchester', 'SW19', 'Wimbledon'.

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

Minimum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount.

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

Maximum price filter (BUY/RENT). For RENT this is the monthly (pcm) amount.

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

Minimum bedrooms (BUY/RENT).

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

Maximum bedrooms (BUY/RENT).

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

Filter by property type (sale, rent, new homes, student). Options: houses, flats, bungalows, land, detached, semi-detached, terraced, park-home (or park_home). student_halls has no native filter: use channel Student accommodation instead.

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

Expand the search around the location. E.g. 0.25, 0.5, 1.0, 3.0, 5.0, 10.0. Default 0 (this area only).

## `sortType` (type: `string`):

Result ordering. Newest listed, oldest listed, lowest price, or highest price first.

## `furnished` (type: `string`):

Rent and student channels only: furnished, part furnished or unfurnished lets.

## `maxDaysSinceAdded` (type: `string`):

Only listings added to Rightmove within the last 1, 3, 7 or 14 days.

## `search` (type: `string`):

Single location text (town, city, postcode or region). Used only when Locations is empty.

## `endPage` (type: `integer`):

Alias of Max pages, used only when Max pages is not set.

## `sort` (type: `string`):

Alias of Sort order, used only when Sort order is left on default.

## `includeLetAgreed` (type: `boolean`):

Include 'Let Agreed' properties in rental searches.

## `includeSSTC` (type: `boolean`):

Include 'Sold STC' / 'Under Offer' properties in sale searches.

## `startUrls` (type: `array`):

Direct Rightmove URLs to scrape.

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

Maximum number of records to return. Set 0 for unlimited (capped by Rightmove's ~1000-result deep-pagination limit per search). The number of pages walked is governed by 'Max pages per search'.

## `maxPages` (type: `integer`):

Maximum result pages to walk per location (24 listings/page). Default 1 (first page only) keeps runs small and predictable; raise it to scrape deeper (Rightmove caps deep pagination at ~42 pages).

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

Fetch each property's detail page for 40+ extra fields (full description, key features, council tax band, ground rent, service charge, EPC, nearest stations/airports, broadband, floorplans, lease years, agent address). Off = faster & cheaper (search cards only).

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

Proxy settings. Datacenter (the default) is cheapest and works well for Rightmove. The actor uses exactly what you select here and does not auto-enable residential. Select residential here only if you need it.

## `proxyCountry` (type: `string`):

Pin the proxy exit country (default GB for the UK site). Leave empty to let residential rotate a GB-led pool.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large pull without returning or charging for listings already collected there. For recurring monitoring of the same search, use Incremental mode instead. A resumed run never marks listings EXPIRED.

## `incrementalMode` (type: `boolean`):

Track listings between runs of the same search. Each returned row gets changeType NEW, UPDATED (with changedFields), REAPPEARED or EXPIRED. Unchanged listings are not returned. EXPIRED rows are only produced after a run that walked the whole result set (not with a maxItems/maxPages cut-off, a pasted page-2+ link or a single property link). Replaces Monitoring mode when both are on.

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

Only return listings not seen in previous runs of this actor. Useful for tracking newly-added properties.

## `ignoreFieldsForChanges` (type: `array`):

Output field names (nested paths like agent.logo allowed) that must not count as a change in incremental mode. The relative 'added/reduced' badge, scrape time and distance are always ignored. The fields stay in the output.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "channel": "BUY",
  "locations": [
    "London"
  ],
  "sortType": "",
  "furnished": "",
  "maxDaysSinceAdded": "",
  "sort": "",
  "includeLetAgreed": false,
  "includeSSTC": false,
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    },
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87490"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&index=24"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&minPrice=300000&maxPrice=500000&minBedrooms=2&sortType=6&propertyTypes=flat&includeSSTC=false"
    },
    {
      "url": "https://www.rightmove.co.uk/properties/94114530"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/property-155320229.html"
    },
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/property-108124898.html"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/Wimbledon.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/london.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/SW19.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/detail.html?country=england&locationIdentifier=REGION%5E87490&searchLocation=London"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/details/2f92dc36-9eea-49a6-9143-aedb0ba11b30"
    },
    {
      "url": "https://www.rightmove.co.uk/new-homes-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "maxItems": 100000,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "monitoringMode": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

Individual property records. SERP cards carry ~48 fields; with 'Scrape full property details' enabled each record carries 80+ fields including description, key features, council tax band, ground rent, service charge, EPC graphs, nearest stations/airports, broadband, floorplans and agent address.

## `summary` (type: `string`):

Run statistics: total items, pages fetched, details fetched, blocks, proxy-tier health, duration and throughput.

## `detail` (type: `string`):

Property details view of the dataset.

## `changes` (type: `string`):

Changes view of the dataset.

## `resultsView` (type: `string`):

Results view of the dataset.

## `overviewView` (type: `string`):

Listings overview view of the dataset.

## `agentsView` (type: `string`):

Agents view of the dataset.

## `soldView` (type: `string`):

Sold prices view of the 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 = {
    "locations": [
        "London"
    ],
    "startUrls": [
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
        },
        {
            "url": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87490"
        },
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&index=24"
        },
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&minPrice=300000&maxPrice=500000&minBedrooms=2&sortType=6&propertyTypes=flat&includeSSTC=false"
        },
        {
            "url": "https://www.rightmove.co.uk/properties/94114530"
        },
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/property-155320229.html"
        },
        {
            "url": "https://www.rightmove.co.uk/property-to-rent/property-108124898.html"
        },
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/Wimbledon.html"
        },
        {
            "url": "https://www.rightmove.co.uk/house-prices/london.html"
        },
        {
            "url": "https://www.rightmove.co.uk/house-prices/SW19.html"
        },
        {
            "url": "https://www.rightmove.co.uk/house-prices/detail.html?country=england&locationIdentifier=REGION%5E87490&searchLocation=London"
        },
        {
            "url": "https://www.rightmove.co.uk/house-prices/details/2f92dc36-9eea-49a6-9143-aedb0ba11b30"
        },
        {
            "url": "https://www.rightmove.co.uk/new-homes-for-sale/find.html?locationIdentifier=REGION%5E87490"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "locations": ["London"],
    "startUrls": [
        { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" },
        { "url": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87490" },
        { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&index=24" },
        { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&minPrice=300000&maxPrice=500000&minBedrooms=2&sortType=6&propertyTypes=flat&includeSSTC=false" },
        { "url": "https://www.rightmove.co.uk/properties/94114530" },
        { "url": "https://www.rightmove.co.uk/property-for-sale/property-155320229.html" },
        { "url": "https://www.rightmove.co.uk/property-to-rent/property-108124898.html" },
        { "url": "https://www.rightmove.co.uk/property-for-sale/Wimbledon.html" },
        { "url": "https://www.rightmove.co.uk/house-prices/london.html" },
        { "url": "https://www.rightmove.co.uk/house-prices/SW19.html" },
        { "url": "https://www.rightmove.co.uk/house-prices/detail.html?country=england&locationIdentifier=REGION%5E87490&searchLocation=London" },
        { "url": "https://www.rightmove.co.uk/house-prices/details/2f92dc36-9eea-49a6-9143-aedb0ba11b30" },
        { "url": "https://www.rightmove.co.uk/new-homes-for-sale/find.html?locationIdentifier=REGION%5E87490" },
    ],
    "proxyConfiguration": { "useApifyProxy": True },
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "locations": [
    "London"
  ],
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    },
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87490"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&index=24"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&minPrice=300000&maxPrice=500000&minBedrooms=2&sortType=6&propertyTypes=flat&includeSSTC=false"
    },
    {
      "url": "https://www.rightmove.co.uk/properties/94114530"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/property-155320229.html"
    },
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/property-108124898.html"
    },
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/Wimbledon.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/london.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/SW19.html"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/detail.html?country=england&locationIdentifier=REGION%5E87490&searchLocation=London"
    },
    {
      "url": "https://www.rightmove.co.uk/house-prices/details/2f92dc36-9eea-49a6-9143-aedb0ba11b30"
    },
    {
      "url": "https://www.rightmove.co.uk/new-homes-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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