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

Scrape property listings and details from Rightmove. Supports search by location name, location ID, search URL, or direct property URLs.

- **URL**: https://apify.com/thenetaji/rightmove-scraper.md
- **Developed by:** [The Netaji](https://apify.com/thenetaji) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

Scrape property listings from **rightmove.co.uk** at scale.
Extracts property search results and full property details — from location names, location IDs, search URLs, or direct property URLs.

### Features

- **Location search** — type a location name like `"London"` and the scraper resolves it to a location ID via Rightmove's typeahead API
- **Search results** — paginated scraping of the search JSON API (24/page, up to 1000 results)
- **Property detail pages** — full data from the `PAGE_MODEL` JS variable (handles both plain and encoded formats)
- **Auto-classification** — no need to specify input type; URLs and keywords are detected automatically

### Input

The `inputs` field accepts a mixed list of any of the following:

| Type | Example |
|------|---------|
| Location name | `London`, `Manchester`, `Bristol` |
| Location ID | `REGION^87490`, `OUTCODE^1234` |
| Search URL | `https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION^87490` |
| Property URL | `https://www.rightmove.co.uk/properties/12345678` |

#### Input schema

```json
{
  "inputs": ["London", "Manchester"],
  "channel": "BUY",
  "maxResults": 100
}
```

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `inputs` | `string[]` | required | Location names, IDs, search URLs, or property URLs |
| `channel` | `"BUY"` | `"RENT"` | `"BUY"` | Used when input is a location name or ID |
| `maxResults` | `integer` | `100` | Max search results per location (Rightmove API caps at 1000) |

### Output

Two output types depending on input:

#### Search result (`_type: "search_result"`)

Returned when input is a location name, ID, or search URL. Contains the stub data from the search API.

```json
{
  "_type": "search_result",
  "id": 167391443,
  "bedrooms": 2,
  "bathrooms": 1,
  "summary": "This well presented 2 bedroom flat...",
  "displayAddress": "Grafton Way, Fitzrovia, London, W1T",
  "location": { "latitude": 51.5233, "longitude": -0.13791 },
  "price": { "amount": 900000, "currencyCode": "GBP", "displayPrices": [{"displayPrice": "£900,000"}] },
  "propertySubType": "Flat",
  "propertyUrl": "/properties/167391443#/?channel=RES_BUY",
  "channel": "BUY",
  "customer": { "branchDisplayName": "Foxtons, Marylebone", "contactTelephone": "020 3906 1036" },
  "addedOrReduced": "Reduced on 28/08/2024"
}
```

#### Property detail (`_type: "property"`)

Returned when input is a direct property URL. Contains full data from the `PAGE_MODEL` variable.

```json
{
  "_type": "property",
  "url": "https://www.rightmove.co.uk/properties/167391443",
  "id": 167391443,
  "title": "2 bedroom flat for sale",
  "description": "This well presented 2 bedroom flat...",
  "price": "£900,000",
  "price_sqft": "£1,438 per sq. ft.",
  "bedrooms": 2,
  "bathrooms": 1,
  "property_type": "Flat",
  "transaction_type": "BUY",
  "address": { "displayAddress": "Grafton Way, Fitzrovia, London, W1T", "outcode": "W1T" },
  "latitude": 51.5233,
  "longitude": -0.13791,
  "features": ["Lovely 2 bedroom flat", "Modern kitchen with integrated appliances"],
  "photos": ["https://media.rightmove.co.uk/..."],
  "floorplans": ["https://media.rightmove.co.uk/..."],
  "agent": { "id": 76585, "branch": "Marylebone", "company": "Foxtons" },
  "nearest_stations": [{ "name": "Warren Street", "distance": 0.3 }],
  "listing_history": { "firstListedDate": "2025-09-24" },
  "available": true,
  "archived": false
}
```

### Examples

#### Search by location name

```json
{
  "inputs": ["London", "Manchester"],
  "channel": "BUY",
  "maxResults": 50
}
```

#### Search for rentals

```json
{
  "inputs": ["Bristol"],
  "channel": "RENT",
  "maxResults": 100
}
```

#### Use a location ID directly

```json
{
  "inputs": ["REGION^87490"],
  "channel": "BUY",
  "maxResults": 200
}
```

#### Scrape specific property pages

```json
{
  "inputs": [
    "https://www.rightmove.co.uk/properties/167391443",
    "https://www.rightmove.co.uk/properties/155320229"
  ]
}
```

#### Mix of inputs

```json
{
  "inputs": [
    "London",
    "REGION^61294",
    "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490",
    "https://www.rightmove.co.uk/properties/167391443"
  ],
  "maxResults": 100
}
```

# Actor input Schema

## `inputs` (type: `array`):

What to scrape. Accepts any mix of:

- Location name: 'London', 'Manchester'
- Location ID: 'REGION^87490'
- Search URL: 'https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=...'
- Property URL: 'https://www.rightmove.co.uk/properties/12345678'

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

BUY or RENT. Used when input is a location name or ID (ignored for search/property URLs which encode channel in the URL).

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

Maximum number of search results to return per location. Rightmove API caps at 1000.

## Actor input object example

```json
{
  "inputs": [
    "London"
  ],
  "channel": "BUY",
  "maxResults": 100
}
```

# 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 = {
    "inputs": [
        "London"
    ]
};

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

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

```

## MCP server setup

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