# Rightmove Scraper — UK Sale, Rent & Agent Data (`crawloop/rightmove-scraper`) Actor

Scrape Rightmove.co.uk for-sale and to-rent listings. Get price, beds, tenure, EPC, GPS, photos, floorplans, and agent phone. Paste a search or property URL. Rightmove API alternative for Python, Node.js, and MCP.

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

## Pricing

from $0.99 / 1,000 listings

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 — UK Sale, Rent & Agent Data

> **Disclaimer:** This is an unofficial integration developed independently. It is not affiliated with, sponsored by, or endorsed by Rightmove Group Limited or any of its subsidiaries.
>
> **Rightmove** and related names are trademarks of their respective owners. Data is read from publicly accessible Rightmove UK listings. No Rightmove account login is required.
>
> This Actor is provided **for informational, research, lead-generation, and market monitoring purposes**. You are solely responsible for complying with applicable laws (including UK GDPR), Rightmove's terms of use, and your organization's policies when processing listing and agent data.

**Rightmove scraper** for UK **for sale** and **to rent** property listings — export price, beds, baths, tenure, EPC, GPS, photos, floorplans, stations, and estate-agent phone into JSON/CSV. Use it as a **Rightmove API alternative** from **Python**, **Node.js**, **cURL**, or **Apify MCP** / AI assistants: paste any search or `/properties/{id}` URL, or type a city / outcode.

**Best for:** UK sale and rent comps, PropTech pipelines, agent lead lists, new-listing monitors, and dataset export via Apify.

| Actor | Role |
| :--- | :--- |
| Rightmove Scraper ◄── you are here | UK Rightmove listings (sale & rent) |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain Idealista listings + agency leads |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany IS24 rent & buy |
| [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | French classifieds |
| [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) | German classifieds + monitor alerts |

### When to use this Actor

- **Rightmove property scraper for search pages** — Copy a filtered browser URL (area, price, beds, radius, SSTC) into Start URLs.
- **For sale / to rent datasets** — London, Manchester, Birmingham, or any outcode; export JSON/CSV for comps and pipelines.
- **Agent phones on every row** — Branch name, brand, and listed telephone from the search card and property JSON.
- **Full property details** — Keep details on for description, tenure, lease years, ground rent, council tax, EPC graphs, floorplans, and stations.
- **Scheduled monitoring** — Re-run the same search and emit only **new** or **price-changed** listings.
- **Coverage past the ~1,050 result cap** — Rightmove search stops around 42 pages. This Actor splits the query by price bands so large cities are not truncated.

### When not to use this Actor

- **Commercial, overseas, sold-prices, or estate-agent directory** — This version targets residential **sale** and **rent** listings. Paste `/property-for-sale/`, `/property-to-rent/`, or `/properties/{id}` URLs.
- **Zoopla / OnTheMarket** — Separate portals; this Actor reads Rightmove only.
- **Authenticated actions** — No login, messaging, saved-search inbox, or contact-unlock walls.

### Key features

- **HTTP JSON APIs** — Listing search + Android property payload. No headless browser, 128–512 MB RAM.
- **Search + property URLs** — One Actor handles result lists and single listing IDs.
- **Search builder** — Type `London`, `SW1A`, or `NW3` (auto typeahead), sale vs rent, price / beds / radius when you do not have a URL.
- **Sold STC / Let Agreed** — Optional include flag; off by default like the website.
- **Price-band split** — Automatic when a query hits the 42-page window (~1,050 rows) with tens of thousands of matches (e.g. all of London).
- **Monitor mode** — Key-value store remembers listing IDs and prices across runs.
- **Residential GB proxy** — Recommended on Apify Cloud so datacenter IPs are not blocked.

### Input

| Field | What it does |
| :--- | :--- |
| **Start URLs** | Search (`/property-for-sale/find.html`, `/property-to-rent/find.html`) or property (`/properties/{id}`) links. Filters in the URL are kept. |
| **Location** | Builder only. City, outcode, or postcode (`Manchester`, `SW1A`). |
| **Location identifier** | Optional explicit id (`REGION^87490`). |
| **Sale or rent** | Builder only. |
| **Min/max price, bedrooms, radius** | Builder filters in GBP / miles. |
| **Include Sold STC / Let Agreed** | Keep under-offer rows. |
| **Max listings** | Cap on dataset rows. |
| **Scrape full property details** | Default on. Off = search-card fields only (faster). |
| **Monitor mode** | Save new and price-changed rows only. |
| **Proxy** | Apify Residential, country GB. |

```json
{
  "startUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" }
  ],
  "maxItems": 50,
  "includeDetails": true,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "GB"
  }
}
```

Builder example (no URL):

```json
{
  "location": "Manchester",
  "transactionType": "rent",
  "maxPrice": 1500,
  "minBedrooms": 2,
  "maxItems": 40,
  "includeDetails": true
}
```

### Output

One dataset row per listing. Search-card fields are always present; detail fields fill in when **Scrape full property details** is on.

| Field | Description |
| :--- | :--- |
| `id` / `url` | Rightmove property id and canonical URL |
| `title` | Headline (`2 bedroom apartment`) |
| `transactionType` | `sale` or `rent` |
| `price` / `priceLabel` | Numeric GBP (purchase, or pcm for rent) and display string |
| `pricePcm` / `pricePw` | Rent breakdown when listed |
| `bedrooms` / `bathrooms` | Counts |
| `propertyType` / `tenure` | Apartment, Terraced, … / Freehold, Leasehold |
| `address` / `postcode` / `outcode` | Display address and UK postcode parts |
| `latitude` / `longitude` | GPS |
| `agentName` / `agentBrand` / `agentPhone` | Branch + listed telephone |
| `photos` / `floorplans` / `epcGraphs` | Media URLs |
| `stations` | Nearest stations with distance in miles |
| `description` / `keyFeatures` | Full text when details are on |
| `councilTaxBand` / `groundRent` / `serviceCharge` | Sale extras |
| `deposit` / `furnishType` / `letType` | Rent extras |
| `listingUpdateReason` / `firstVisibleDate` | New vs reduced |
| `scrapedAt` | UTC timestamp |

```json
{
  "id": "91682097",
  "url": "https://www.rightmove.co.uk/properties/91682097",
  "title": "2 bedroom apartment",
  "transactionType": "rent",
  "price": 5200,
  "priceLabel": "£5,200 pcm",
  "pricePcm": 5200,
  "pricePw": 1200,
  "bedrooms": 2,
  "bathrooms": 2,
  "propertyType": "Apartment",
  "address": "Fitzjohns Avenue, Hampstead, NW3",
  "postcode": "NW3",
  "latitude": 51.547691,
  "longitude": -0.176158,
  "agentName": "TK International, Hampstead",
  "agentPhone": "020 3834 8666",
  "photos": ["https://media.rightmove.co.uk/property-photo/..."],
  "scrapedAt": "2026-08-17T12:00:00+00:00"
}
```

### Use cases

- **Buy-to-let screening** — Pull 2-bed rentals in a postcode with pcm, yield inputs, and agent phone.
- **Sales comps** — Export price, beds, tenure, sq ft, and photos for an outcode.
- **Agency monitoring** — Schedule the same search daily; monitor mode keeps only new stock and reductions.
- **Lead lists** — Branch name + telephone on every row for outbound.
- **City-wide coverage** — London-scale queries are split by price so you are not stuck at the first 1,050 hits.

### Integration examples

Replace `YOUR_TOKEN` with your Apify API token. Actor name: `crawloop/rightmove-scraper`.

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/rightmove-scraper').call({
  startUrls: [
    { url: 'https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=500000&minBedrooms=2' }
  ],
  maxItems: 50,
  includeDetails: true,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'GB',
  },
});
for await (const item of client.dataset(run.defaultDatasetId).iterateItems()) {
  console.log(item.id, item.price, item.agentPhone);
}
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/rightmove-scraper").call(
    run_input={
        "location": "Manchester",
        "transactionType": "sale",
        "maxPrice": 350000,
        "minBedrooms": 3,
        "maxItems": 50,
        "includeDetails": True,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "GB",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("id"), item.get("price"), item.get("postcode"))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~rightmove-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=OUTCODE%5E1859"}],
    "maxItems": 20,
    "includeDetails": true,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "GB"
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID / name (`crawloop/rightmove-scraper`).

Example prompts:

- "Run Rightmove Scraper for 2-bed flats for sale in Manchester under £350,000, max 30, and return id, price, postcode, agent phone as JSON"
- "Scrape Rightmove NW3 rentals with full details and summarize average pcm vs weekly rent"
- "Pull Rightmove London sales, then compare the field set with ImmobilienScout24 Scraper for a UK vs Germany pipeline"

### Suite next step

After UK Rightmove comps, add Spain coverage with [Idealista Scraper](https://apify.com/crawloop/idealista-scraper), or Germany with [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper).

### FAQ

**Is this an official Rightmove API?**\
No. It is an unofficial **Rightmove scraper** / API alternative that reads the public listing-search JSON and Android property payload. It is not affiliated with Rightmove Group Limited. You can call it from **Python**, **Node.js**, **cURL**, or **MCP**.

**How do I scrape Rightmove with Python or Node.js?**\
Run this Actor via the Apify client (examples above) or **cURL**. Pass a search URL or a location such as `Manchester` plus `transactionType`. Results land in the default dataset as JSON.

**Can I scrape London (or another city) for sale?**\
Yes. Paste a London `/property-for-sale/find.html` URL, or use the builder with location `London` and transaction type sale. The same pattern works for Manchester, Birmingham, Edinburgh, and outcodes such as `SW1A`.

**Why residential proxies?**\
Apify datacenter IPs are often blocked. Residential GB is the supported setup on Cloud.

**Can I paste a browser search URL?**\
Yes. Apply filters on the site, copy the find.html URL, paste into Start URLs. Location, price, beds, radius, and SSTC in the query string are kept.

**Does it stop at 1,000 results like the website?**\
The website result list is capped at about 42 pages (~1,050 rows). When a query reports more hits than that window, the Actor splits the price range automatically.

**Are phone numbers included?**\
Yes when Rightmove already lists the branch telephone (`agentPhone`). Private contact-unlock flows are not automated.

**Do you scrape commercial property or sold house prices?**\
Not in this version. Residential sale and rent only.

### Related Actors

| Actor | What it covers |
| :--- | :--- |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain sale/rent listings + agency phones |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany rent and buy |
| [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | France classifieds |
| [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) | German classifieds monitor |

# Actor input Schema

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

Paste Rightmove search-result URLs or individual /properties/{id} links. Filters in the search URL (location, price, beds, radius, SSTC) are applied automatically.

## `location` (type: `string`):

Used only when Start URLs are empty. Examples: London, Manchester, SW1A, NW3. Resolved via Rightmove typeahead.

## `locationIdentifier` (type: `string`):

Explicit Rightmove id such as REGION^87490 (London) or OUTCODE^1859 (NW3). Overrides location text when set.

## `transactionType` (type: `string`):

Builder only. For sale or to rent.

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

Minimum purchase price or monthly rent in GBP. Builder only, or ignored when the Start URL already has a price filter.

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

Maximum purchase price or monthly rent in GBP.

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

Minimum bedroom count.

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

Maximum bedroom count.

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

Search radius around the location. Rightmove values: 0.0, 0.25, 0.5, 1.0, 3.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0.

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

Optional. Leave empty for all types.

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

Keep Sold STC (sale) or Let Agreed (rent) listings. Off by default, matching the Rightmove website.

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

Maximum number of listings to save per run.

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

Fetch each listing's mobile JSON for description, tenure, EPC, floorplans, stations, council tax, and agent phone. Turn off for faster search-card output.

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

On scheduled re-runs, save only listings that are new or whose price changed since the last run on this Actor.

## `maxConcurrency` (type: `integer`):

How many property-detail requests to run in parallel. Default 8.

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

Apify Proxy. UK RESIDENTIAL is recommended for stable access to Rightmove on Apify Cloud.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "transactionType": "sale",
  "radius": "0.0",
  "includeSSTC": false,
  "maxItems": 10,
  "includeDetails": true,
  "monitorMode": false,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items — one Rightmove listing per row.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
        }
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "startUrls": [{ "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" }],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call crawloop/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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