# Rightmove Scraper — Price History, Agent Contacts & EPC (`haketa/rightmove-scraper`) Actor

Scrape Rightmove UK largest property portal via Next.js JSON extraction. Buy, rent, sold, commercial & overseas listings with price history (reduced/new), agent phone, tenure, floorplans, EPC and full descriptions. Pure HTTP, no proxy or login needed.

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

## Pricing

from $1.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?

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 UK Property Scraper — Price History, Agent Contacts & EPC

The fastest, cheapest, and most data-rich **Rightmove scraper** on Apify. Extracts properties from the **UK's #1 property portal** — for-sale, to-rent, sold prices, commercial and overseas listings — via **Next.js JSON extraction**. Unlike competitors who parse HTML or run heavy browsers, we extract structured JSON directly from Rightmove's server-rendered data, giving you **50+ fields per property including agent phone numbers, price change history, days on market, tenure, floorplans and EPC ratings**.

No proxy. No browser. No login. Rightmove serves its data as clean JSON — we just structure it for you.

***

### Why This Actor?

#### Pure JSON Extraction — Faster & Cheaper

Rightmove is a **Next.js** application that embeds all search result data inside a `<script id="__NEXT_DATA__">` JSON blob. We extract that blob directly — no HTML parsing, no browser rendering, no CAPTCHA solving. This means:

- **Faster**: 50-100 properties/second in list-only mode
- **Cheaper**: Zero proxy cost, minimal compute (256MB RAM)
- **More reliable**: JSON structure changes less often than HTML markup
- **Richer data**: Fields that HTML scrapers miss (listingUpdate reason, customer contactTelephone, premiumListing)

#### Price Change Intelligence

Rightmove exposes a `listingUpdate` field for every property. We surface whether a listing is **new**, **reduced**, or **unchanged**, with exact dates. Combined with `firstVisibleDate`, you get **days-on-market** automatically calculated. No other actor explicitly tracks price change history.

#### Agent Contact Built-In

Unlike most competitors that require a detail-page visit to get agent info, Rightmove includes **agent phone numbers** in the search result JSON. This means you can extract lead-generation data even in fast list-only mode (`includeDetails: false`).

#### All 5 Channels

| Channel | Path | Description |
|---------|------|-------------|
| **BUY** | property-for-sale | Residential sales |
| **RENT** | property-to-rent | Residential lettings |
| **SOLD** | house-prices | Land Registry sold prices |
| **Commercial** | commercial-property-for-sale | Shops, offices, industrial |
| **Overseas** | overseas-property-for-sale | Spain, France, Portugal, etc. |

***

### Data Fields

Every property record includes:

| Category | Fields |
|----------|--------|
| **Identity** | `propertyId`, `title`, `propertyUrl`, `channel` |
| **Property** | `propertyType`, `propertySubType`, `bedrooms`, `bathrooms` |
| **Price** | `price` (formatted), `priceAmount` (numeric GBP), `priceQualifier`, `priceFrequency` |
| **Location** | `displayAddress`, `latitude`, `longitude` |
| **Size & Tenure** | `displaySize`, `sizeSqft`, `tenure`, `leaseYears` |
| **Status** | `listingStatus` (new/reduced/unchanged), `listingUpdateDate`, `firstVisibleDate`, `updateDate`, `daysOnMarket` |
| **Description** | `summary` (from search), `description` (full, from detail), `keyFeatures` (JSON array) |
| **Energy** | `epcRating`, `councilTax` (from detail page) |
| **Agent** | `agentName`, `agentPhone`, `agentBranchId`, `agentLogo` |
| **Media** | `images` (JSON array), `floorplans` (JSON array), `numberOfImages`, `numberOfFloorplans` |
| **Listing** | `premiumListing`, `searchLocation`, `scrapedAt` |

***

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `channel` | select | buy | BUY / RENT / SOLD / Commercial / Overseas |
| `locationIdentifier` | string | REGION^93917 | Rightmove location ID (London). Find from URL: `REGION^93917` = London, `REGION^93548` = Manchester, `POSTCODE^1013367` = NW3 |
| `minBedrooms` | integer | 0 | Minimum bedrooms |
| `maxBedrooms` | integer | 0 | Maximum bedrooms |
| `minPrice` | integer | 0 | Min price in GBP |
| `maxPrice` | integer | 500000 | Max price in GBP (0 = unlimited) |
| `propertyTypes` | array | \[] | Filter: detached, semi-detached, terraced, flat, bungalow, land, park-home |
| `includeSold` | boolean | true | Include SSTC / Under Offer |
| `dontShow` | array | \[] | Exclude: newHome, retirement, sharedOwnership, auction |
| `radius` | number | 0 | Search radius in miles |
| `sortType` | select | 2 | Newest Listed / Most Recent / Most Reduced / Highest Price / Lowest Price |
| `startUrls` | array | \[] | Direct Rightmove URLs (overrides all filters) |
| `includeDetails` | boolean | true | Visit each property for full description, EPC, floorplans, council tax |
| `maxItems` | integer | 100 | Max properties (0 = no limit) |
| `maxPages` | integer | 4 | Max result pages (25 props/page, ~42 pages max per search) |
| `requestDelay` | integer | 300 | Delay between requests in ms |
| `maxConcurrency` | integer | 10 | Parallel detail page requests |

#### Location Identifiers

Rightmove uses internal location codes. Find them from any Rightmove search URL:

| Location | Identifier |
|----------|------------|
| London | `REGION^93917` |
| Manchester | `REGION^93548` |
| Birmingham | `REGION^93903` |
| Leeds | `REGION^93529` |
| Bristol | `REGION^93898` |
| Liverpool | `REGION^93538` |
| Edinburgh | `REGION^93516` |
| Cardiff | `REGION^93932` |
| NW3 postcode | `POSTCODE^1013367` |
| SW1A postcode | `POSTCODE^1021947` |

For other locations, search on rightmove.co.uk and copy the `locationIdentifier` from the URL.

***

### Usage Examples

#### 1. Basic Search — London flats under £500K

```json
{
    "channel": "buy",
    "locationIdentifier": "REGION^93917",
    "maxPrice": 500000,
    "propertyTypes": ["flat"],
    "minBedrooms": 1,
    "maxItems": 100
}
```

#### 2. Rental Market — Manchester 2+ beds

```json
{
    "channel": "rent",
    "locationIdentifier": "REGION^93548",
    "minBedrooms": 2,
    "maxPrice": 1500,
    "includeDetails": false
}
```

#### 3. Sold Prices — Last 100 sales in a postcode

```json
{
    "channel": "sold",
    "locationIdentifier": "POSTCODE^1013367",
    "radius": 0.5,
    "maxItems": 100
}
```

#### 4. Commercial Property

```json
{
    "channel": "commercial",
    "locationIdentifier": "REGION^93917",
    "maxItems": 50
}
```

#### 5. Start URLs — Pre-filtered Searches

```json
{
    "startUrls": [
        "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION^93917&maxPrice=300000&propertyTypes=flat&dontShow=newHome,retirement,sharedOwnership"
    ],
    "maxItems": 200
}
```

***

### Use Cases

#### 1. Estate Agent Lead Generation

Every listing includes the agent's **branch name and phone number**. Build targeted prospecting lists for:

- Lettings agents in specific postcodes
- Independent vs. chain agents
- Agents with premium listings (higher marketing spend)

#### 2. Property Market Analytics

- **Price trends**: Track `listingStatus` (new vs. reduced) by area over time
- **Days on market**: Measure market velocity by property type and location
- **Supply analysis**: Count active listings by channel, price band, property type
- **Rental yields**: Cross-reference BUY and RENT data for yield estimates

#### 3. Investment Research

- Identify below-market properties (`listingStatus: reduced`)
- Track new-to-market opportunities (`listingStatus: new`)
- Filter by tenure (freehold vs. leasehold)
- Calculate price/sqft from `priceAmount` and `sizeSqft`

#### 4. Sold Price Comparables

Use the SOLD channel to access Land Registry sold-price data:

- Comps for valuation and underwriting
- Price-per-sqft benchmarks by postcode
- Transaction volume analysis

#### 5. Development Site Sourcing

- Filter by property type (land, development opportunities)
- Identify properties with large lots or development potential
- Track auction listings

#### 6. B2B PropTech

Feed structured property data into:

- Property valuation models
- Automated valuation tools (AVMs)
- Investment analysis platforms
- CRM enrichment for estate agency software

#### 7. Market Research Reports

Schedule recurring weekly/monthly runs to track:

- New listing volume by region
- Average asking prices and trends
- Price reduction frequency (market cooling indicator)
- Supply/demand balance metrics

#### 8. Tenant/Landlord Matching

For corporate relocation and B2B tenant services:

- Find rental properties matching employee requirements
- Track available stock in specific school catchment areas
- Monitor rental price trends for corporate housing budgets

***

### Example Output

```json
{
    "propertyId": "165879002",
    "title": "3 bedroom end of terrace house for sale",
    "channel": "BUY",
    "propertyType": "House",
    "propertySubType": "End of Terrace",
    "bedrooms": "3",
    "bathrooms": "2",
    "price": "£500,000",
    "priceAmount": "500000",
    "priceQualifier": "Offers in Excess of",
    "displayAddress": "Lynhurst Crescent, Hillingdon, UB10",
    "latitude": "51.547821",
    "longitude": "-0.437776",
    "displaySize": "751 sq. ft.",
    "tenure": "FREEHOLD",
    "listingStatus": "new",
    "listingUpdateDate": "2026-06-15T14:04:31Z",
    "firstVisibleDate": "2025-08-18T12:43:05Z",
    "daysOnMarket": "67",
    "agentName": "Coopers, Hillingdon",
    "agentPhone": "01895 544542",
    "agentBranchId": "49645",
    "propertyUrl": "https://www.rightmove.co.uk/properties/165879002",
    "numberOfImages": "16",
    "numberOfFloorplans": "1",
    "premiumListing": "true",
    "searchLocation": "buy — REGION^93917",
    "scrapedAt": "2026-06-22T12:00:00.000Z"
}
```

***

### Performance

| Mode | Speed | Memory | Proxy |
|------|-------|--------|-------|
| List-only (`includeDetails: false`) | ~50-100 props/sec | ~128 MB | None needed |
| With details (`includeDetails: true`) | ~10-20 props/sec | ~256 MB | None needed |
| Direct URLs | ~10-20 props/sec | ~256 MB | None needed |

**Typical cost**: 100 properties with full details = ~30-60 seconds, minimal CU consumption.

***

### Limitations

- **1,050 results per search**: Rightmove caps each query at ~42 pages × 25 results. For larger datasets, segment by location, price band, or property type.
- **Detail page rate**: With `includeDetails: true`, each property gets one additional HTTP request. Use `maxConcurrency: 10-15` for optimal speed.
- **SOLD channel**: Returns recent Land Registry sold prices, not the full transaction history.
- **Commercial/Overseas**: Filter options are more limited than residential BUY/RENT.

***

### Integration

#### JavaScript / TypeScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('haketa/rightmove-scraper').call({
    channel: 'buy',
    locationIdentifier: 'REGION^93917',
    maxPrice: 500000,
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient(token='YOUR_TOKEN')
run = client.actor('haketa/rightmove-scraper').call(run_input={
    'channel': 'buy',
    'locationIdentifier': 'REGION^93917',
    'maxPrice': 500000,
    'maxItems': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

#### CLI

```bash
apify call haketa/rightmove-scraper \
    --input '{"channel":"buy","locationIdentifier":"REGION^93917","maxPrice":500000,"maxItems":100}'
```

***

### Legal & Responsible Use

This actor extracts publicly available property listings from Rightmove.co.uk. Users are responsible for complying with applicable laws and Rightmove's terms of service. We recommend:

- Using the data for legitimate business intelligence, market research, and property analysis
- Respecting the platform's availability with reasonable request delays
- Not redistributing the data in violation of the source site's terms
- Complying with GDPR and UK Data Protection Act for any personal data processing

***

*The most efficient Rightmove scraper on Apify — pure JSON extraction, zero proxy cost, all 5 channels, agent contacts built-in.*

### 📅 Changelog & Maintenance

**Last updated:** 2026-07-02 — Actor verified and maintained. Data pipeline tested for quality, structure and freshness; selectors/endpoints confirmed against the live site.

# Actor input Schema

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

Choose the type of listings to collect: properties for sale, to rent, sold price history, commercial, or overseas.

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

Pick a UK city or region to search. Leave on "Mixed sample" to get a diverse selection of listings from several major cities.

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

Only include these property types. Leave empty to include every type.

## `dontShow` (type: `array`):

Exclude these categories from your results.

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

Minimum number of bedrooms. Leave at 0 for any.

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

Maximum number of bedrooms. Leave at 0 for any.

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

Minimum price in GBP. Leave at 0 for any.

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

Maximum price in GBP. Leave at 0 for any.

## `radius` (type: `number`):

How far around the chosen location to search. 0 = the location only. Common values: 1, 3, 5, 10, 20 miles.

## `includeSold` (type: `boolean`):

Include SSTC (Sold Subject to Contract) and Under Offer listings alongside available ones.

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

How to order the results.

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

Visit each property page for the full description, key features, EPC rating, floorplans and the complete image gallery. Turn off for a faster, lighter run.

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

Maximum number of properties to collect. Use 0 for no limit (Rightmove caps at ~1,050 results per search).

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

Maximum number of result pages to walk (about 24 properties per page). 0 = no limit.

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

Advanced: paste a Rightmove location code (e.g. REGION^93917 or POSTCODE^1013367) to search a location not in the dropdown. Overrides the Location dropdown when set.

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

Advanced: paste Rightmove search or property page URLs to scrape directly. When set, these take priority over the filters above.

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

Proxy settings. Residential UK proxy is recommended for reliable results and is enabled by default. You can change the groups/country or turn it off here.

## `requestDelay` (type: `integer`):

Pause between requests. Higher values are gentler on large runs.

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

How many detail pages to fetch in parallel. 5-10 is a good balance.

## Actor input object example

```json
{
  "channel": "buy",
  "location": "REGION^87490",
  "propertyTypes": [],
  "dontShow": [],
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "minPrice": 0,
  "maxPrice": 0,
  "radius": 0,
  "includeSold": true,
  "sortType": "2",
  "includeDetails": true,
  "maxItems": 100,
  "maxPages": 0,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  },
  "requestDelay": 300,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted Rightmove property records for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table view of the scraped properties.

# 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 = {
    "channel": "buy",
    "location": "REGION^87490",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "channel": "buy",
    "location": "REGION^87490",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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 '{
  "channel": "buy",
  "location": "REGION^87490",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call haketa/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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