# Rightmove Scraper — UK Property, Prices & Agent Leads (`logiover/rightmove-scraper`) Actor

Scrape Rightmove, the UK's largest property portal: price, address, bedrooms, bathrooms, tenure, coordinates, listing dates and the marketing agent with branch name and contact phone. Sale and rental. Keyless. JSON, CSV or Excel.

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

## Pricing

from $3.50 / 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

## Rightmove Scraper — UK Property, Prices & Agent Leads

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify\&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

**Scrape Rightmove, the UK's largest property portal: price, address, bedrooms, bathrooms, tenure, coordinates, listing dates and the marketing agent with branch name and contact phone. Sale and rental. Keyless. JSON, CSV or Excel.**

***

### What does the Rightmove Scraper do?

This Actor turns Rightmove into a structured dataset you can actually work with. You give it a search, it walks the result pages, and it writes one clean row per record into your dataset — ready to export as JSON, CSV or Excel, or to pull straight from the Apify API.

It runs on plain HTTP with no browser and no login, which keeps it fast and cheap, and it works the same on a free account as on a paid one. Every field documented below came from a real verification run of this Actor, so what you read here is what you get.

The current build returns **33 populated fields** per record, of which **31 are present on virtually every row**.

### Who is it for?

- **Analysts** who need Rightmove data as a spreadsheet instead of a browser tab.
- **Operations and research teams** tracking how Rightmove listings change over time.
- **Developers** wiring a live data feed into an internal tool or database.
- **Growth and sales teams** building prospect and market lists from public data.
- **AI teams** assembling structured training or grounding data.

### Use cases

- Export a full Rightmove search into a spreadsheet for analysis.
- Track how prices, volumes or availability move week over week by scheduling the run.
- Feed a dashboard or internal database with a repeatable, structured source.
- Build a market map by running several searches in one job.
- Enrich an existing list by matching on the identifiers in the output.

### Why use this Rightmove Scraper?

- 🔑 **No API key and no login** — nothing to authenticate, nothing to expire.
- 📦 **33 verified fields** — every column below was confirmed against live output.
- 📄 **Real pagination** — it walks the result set instead of returning the first screen.
- 🎯 **Bounded runs** — caps in the input stop the job exactly where you want, so the bill is predictable.
- 💸 **Tiered pay-per-result** — you pay per row, and higher Apify plans pay less per row.
- 📊 **Export anywhere** — JSON, CSV, Excel, HTML, the API, or any Apify integration.

### What data can you extract?

One row per record. These columns come from a live run, with the share of rows that carried a value:

| Field | Type | Typically filled | Description |
|-------|------|------------------|-------------|
| `addedOrReduced` | string | 93% | Added or reduced |
| `address` | string | 100% | Address |
| `agentBranch` | string | 100% | Agent branch |
| `agentBranchId` | string | 100% | Agent branch id |
| `agentPhone` | string | 100% | Agent phone |
| `bathrooms` | number | 97% | Bathrooms |
| `bedrooms` | number | 100% | Bedrooms |
| `country` | number | 100% | Country |
| `currency` | string | 100% | Currency |
| `firstVisibleDate` | string | 100% | First visible date |
| `floorplanCount` | number | 100% | Floorplan count |
| `imageCount` | number | 100% | Image count |
| `imageUrl` | string | 100% | Image url |
| `isAuction` | boolean | 100% | Is auction |
| `isCommercial` | boolean | 100% | Is commercial |
| `latitude` | number | 100% | Latitude |
| `listingUpdateDate` | string | 100% | Listing update date |
| `listingUpdateReason` | string | 100% | Listing update reason |
| `longitude` | number | 100% | Longitude |
| `priceAmount` | number | 100% | Price amount |
| `priceFrequency` | number | 100% | Price frequency |
| `priceLabel` | number | 100% | Price label |
| `propertyId` | string | 100% | Property id |
| `propertySubType` | string | 100% | Property sub type |
| `propertyUrl` | string | 100% | Property url |
| `scrapedAt` | string | 100% | Scraped at |
| `source` | string | 100% | Source |
| `summary` | string | 100% | Summary |
| `tenure` | string | 97% | Tenure |
| `title` | string | 100% | Title |
| `transactionType` | string | 100% | Transaction type |
| `displaySize` | number | 83% | Display size |
| `priceQualifier` | number | 42% | Price qualifier |

Fields below 90% are genuinely optional at the source — Rightmove does not publish them for every record. An empty value means the source did not show it, not that extraction failed.

#### Output example

```json
{
  "addedOrReduced": "Added on 29/12/2025",
  "address": "10 Cedar Park Gardens, Wimbledon, London, SW19",
  "agentBranch": "by United Kingdom Sotheby's International Realty, Wimbledon",
  "agentBranchId": "293414",
  "agentPhone": "020 4634 0199",
  "bathrooms": 5,
  "bedrooms": 6,
  "country": "United Kingdom",
  "currency": "GBP",
  "firstVisibleDate": "2025-12-29T10:44:53Z",
  "floorplanCount": 1,
  "imageCount": 21,
  "imageUrl": "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/9963098ea/170669582/9963098ea9c3176521c69a7fec20ce24_max_476x317.jpeg",
  "isAuction": false,
  "isCommercial": false,
  "latitude": 51.42494,
  "listingUpdateDate": "2025-12-29T10:50:07Z",
  "listingUpdateReason": "new",
  "longitude": -0.23846,
  "priceAmount": 4650000,
  "priceFrequency": "not specified",
  "priceLabel": "£4,650,000"
}
```

### How to use

1. Open the Actor and fill in the search fields — the defaults below are a working example.
2. Set the result cap so the run stops where you want it.
3. Click **Start**, then export from the **Output** tab or pull the dataset through the API.

```json
{
  "locationIdentifier": "REGION^87490",
  "channel": "buy",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "radiusMiles": 0,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locationIdentifier` | string | `–` | Rightmove's location code, e.g. |
| `channel` | string | `buy` | Sale or rental listings. |
| `minPrice` | integer | `0` | Only return properties at or above this price. |
| `maxPrice` | integer | `0` | Only return properties at or below this price. |
| `minBedrooms` | integer | `0` | Only return properties with at least this many bedrooms. |
| `radiusMiles` | integer | `0` | Search radius around the location. |
| `maxResults` | integer | `500` | Stop after this many properties. |
| `proxyConfiguration` | object | `–` | Rightmove serves its data inside the page; the default datacenter proxy is enough. |

### Tips for best results

- Broad searches return the deepest result sets; very narrow ones run out after a page or two.
- Use the result cap rather than the page cap when you want a predictable bill.
- Schedule the same input daily or weekly to build a history instead of a one-off snapshot.
- Lower the concurrency if you see retries — the source rate-limits aggressive crawling.
- Run several searches in one job instead of one search with a huge page count.
- Empty optional fields are normal; filter on the columns that matter to you after export.
- Deduplicate on the identifier column if you merge several runs together.
- Keep the proxy setting on the default unless the source blocks your region.

### Integrations

Push results straight into **Google Sheets**, **Slack**, **Zapier**, **Make**, **Airtable** or any **Webhook**. You can also **schedule** the Actor and have each run append to the same dataset, which is how you turn a single export into a time series.

### API usage

Replace `<YOUR_TOKEN>` with your Apify API token.

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~rightmove-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locationIdentifier": "REGION^87490", "channel": "buy", "minPrice": 0, "maxPrice": 0, "minBedrooms": 0, "radiusMiles": 0, "maxResults": 500, "proxyConfiguration": {"useApifyProxy": true}}'
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient('<YOUR_TOKEN>')
run = client.actor('logiover/rightmove-scraper').call(run_input={"locationIdentifier": "REGION^87490", "channel": "buy", "minPrice": 0, "maxPrice": 0, "minBedrooms": 0, "radiusMiles": 0, "maxResults": 500, "proxyConfiguration": {"useApifyProxy": true}})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

**Node.js**

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

const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('logiover/rightmove-scraper').call({"locationIdentifier": "REGION^87490", "channel": "buy", "minPrice": 0, "maxPrice": 0, "minBedrooms": 0, "radiusMiles": 0, "maxResults": 500, "proxyConfiguration": {"useApifyProxy": true}});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use with AI agents (MCP)

This Actor is reachable through the Apify MCP server, so an AI agent can call it as a tool. Point the agent at `https://mcp.apify.com` and ask it something like *"pull the first 200 listings from Rightmove and summarise them"* — it receives the same structured rows you would get from the UI.

### FAQ

#### Do I need a Rightmove account or API key?

No. The Actor reads publicly available pages only. There is nothing to authenticate and no credentials to rotate.

#### Does it work on the free plan?

Yes. Every feature is available on a free Apify account — nothing is gated behind a paid tier. Pricing is per result, and higher plans simply pay less per row.

#### How many listings can I get in one run?

As many as the search exposes. Raise the page and result caps together; the run stops at whichever limit it reaches first.

#### Why did I get fewer rows than I asked for?

The search ran out of records. That is normal for narrow queries — broaden the search or add more searches to one run.

#### Why are some fields empty?

Rightmove does not publish every attribute for every record. The table above shows how often each field is filled in practice.

#### What export formats are supported?

JSON, CSV, Excel, HTML and RSS from the Output tab, plus the Apify API and any integration you connect.

#### How fast is it?

It is pure HTTP with no browser, so a page of results typically takes a second or two.

#### Can I schedule it?

Yes. Use the Apify scheduler to run it on any interval and append each run to the same dataset.

#### Does it use a proxy?

It routes through Apify Proxy by default. You can switch groups or supply your own proxies in the input.

#### Is the output schema stable?

Yes. Field names and types are fixed, so downstream pipelines will not break between runs.

#### How often is the data refreshed?

Every run reads the live source. There is no cache, so the data is as current as the website itself.

#### What if the site changes its layout?

Open an issue on the Issues tab and it gets fixed — the Actor is actively maintained.

### Is it legal?

This Actor reads only publicly available pages on Rightmove — the same content any visitor sees without logging in. It does not bypass authentication and does not collect private data. You remain responsible for how you use the output: respect the source's terms of service, applicable copyright, and data-protection law such as GDPR where personal data is involved.

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Rightmove; Rightmove and all other trademarks mentioned here are the property of their respective owners.

### Related scrapers

Other Actors from the same collection:

- [DDproperty](https://apify.com/logiover/ddproperty-scraper)
- [99.co](https://apify.com/logiover/99-co-scraper)
- [OnTheMarket](https://apify.com/logiover/onthemarket-scraper)

### How much Rightmove data can you extract in one run?

A single run returned **1,000 rows** in 69 seconds on the example input, and it was still going when the measurement stopped — raise the result limit and it keeps paginating. That is roughly **869 rows a minute**.

There is no hard ceiling built into this Actor. What bounds a run is the result limit you set, the breadth of the input you give it, and how much Rightmove itself publishes. Because billing is per result, a wider run costs proportionally more and a narrow one costs almost nothing — so it is worth starting small and scaling once the output looks right.

### 📝 Changelog

#### 2026-11-01

- Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
- README refreshed: 1 link to retired Actors removed; independence disclaimer added.
- README refreshed: duplicate "Related scrapers" sections merged.

#### 2026-10-15

- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
- Runs with a short timeout (API and AI-agent calls) now finish inside it with what they collected, instead of being cut off.
- Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.

#### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 500 row(s) across 33 columns, 97.4% of cells populated.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.

#### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

#### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/rightmove-scraper/changelog.md

# Actor input Schema

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

Rightmove's location code, e.g. REGION^87490 for London. Search on Rightmove and copy the locationIdentifier from the URL.

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

Sale or rental listings.

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

Only return properties at or above this price. 0 disables the filter.

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

Only return properties at or below this price. 0 disables the filter.

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

Only return properties with at least this many bedrooms. 0 disables the filter.

## `radiusMiles` (type: `integer`):

Search radius around the location. 0 uses Rightmove's default (this area only).

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

Stop after this many properties. Rightmove renders 24 per page and the Actor walks pages until the target is met.

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

Rightmove serves its data inside the page; the default datacenter proxy is enough.

## Actor input object example

```json
{
  "locationIdentifier": "REGION^87490",
  "channel": "buy",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "radiusMiles": 0,
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All records from this run.

# 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 = {
    "locationIdentifier": "REGION^87490",
    "channel": "buy",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "radiusMiles": 0,
    "maxResults": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "locationIdentifier": "REGION^87490",
    "channel": "buy",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "radiusMiles": 0,
    "maxResults": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "locationIdentifier": "REGION^87490",
  "channel": "buy",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "radiusMiles": 0,
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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