# Rightmove Property Scraper — UK Listings (`omarjab/rightmove-scraper`) Actor

Scrape UK property listings from Rightmove. Extract price, bedrooms, bathrooms, location, coordinates, agent details, images and more. Covers buy, rent and sold. Pay per property scraped — no subscription needed.

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

## Pricing

from $2.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.

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 Property Scraper

Scrape UK property listings from Rightmove. Extracts price, bedrooms, bathrooms, location, agent details, and images. Pay per property scraped (~$0.002/property).

### Features

- Search by city, town, or postcode (e.g. `Glasgow`, `G1`, `G1 1AA`)
- Filter by listing type (Buy / Rent / Sold), property type, price range, and bedrooms
- Returns up to 1,008 results per query (Rightmove's hard limit — see note below)
- Structured JSON output, ready for analysis or import

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `location` | string | ✅ | — | City, town, or postcode |
| `listingType` | string | | `BUY` | `BUY`, `RENT`, or `SOLD` |
| `propertyType` | string | | `ANY` | `ANY`, `DETACHED`, `SEMI_DETACHED`, `TERRACED`, `FLAT` |
| `minPrice` | integer | | — | Minimum price in £ |
| `maxPrice` | integer | | — | Maximum price in £ |
| `minBedrooms` | integer | | — | Minimum number of bedrooms |
| `maxResults` | integer | | `100` | Max properties to return (hard cap: 1,008) |

### Output fields

| Field | Type | Notes |
|-------|------|-------|
| `id` | string | Rightmove property ID |
| `url` | string | Full listing URL |
| `title` | string | Property type description |
| `price` | integer | **Price in pence** — divide by 100 for £. `null` = POA. |
| `priceQualifier` | string | e.g. "Offers over", "Guide price" |
| `propertyType` | string | e.g. "Detached", "Flat" |
| `bedrooms` | integer | |
| `bathrooms` | integer | May be `null` |
| `tenure` | string | "Freehold" / "Leasehold" |
| `address` | string | Display address |
| `latitude` | number | WGS84 |
| `longitude` | number | WGS84 |
| `agentName` | string | Estate agent brand |
| `agentPhone` | string | Contact number |
| `agentBranch` | string | Branch display name |
| `listingDate` | string | First visible date |
| `addedOrReduced` | string | e.g. "Added today", "Reduced on 01/01/2025" |
| `images` | array | Up to 5 image URLs |
| `scrapedAt` | string | ISO 8601 UTC timestamp |
| `description` | null | v2 — requires `fetchFullDetails` |
| `postcode` | null | v2 — requires `fetchFullDetails` |
| `floorplanUrl` | null | v2 — requires `fetchFullDetails` |
| `keyFeatures` | array | v2 — requires `fetchFullDetails` |

> **Price is stored in pence.** `45000000` = £450,000. This avoids floating-point errors on currency values.

### Rightmove result cap

Rightmove limits all searches to **1,008 results (42 pages × 24)**. To scrape more:

- Split by price band (e.g. £0–300k, £300k–500k, £500k+)
- Split by sub-area or postcode district

### Pricing

**$0.002 per property returned.**

| Volume | Cost |
|--------|------|
| 100 properties | $0.20 |
| 500 properties | $1.00 |
| 1,008 properties (max per run) | ~$2.02 |

### Running locally

```bash
pip install -r requirements.txt
playwright install chromium

export APIFY_TOKEN=your_token
export APIFY_IS_AT_HOME=0

echo '{"location":"Glasgow","listingType":"BUY","maxResults":50}' \
  > storage/key_value_stores/default/INPUT.json

python -m src.main
```

### Deploying

```bash
apify push
```

### Known limitations (v1)

- `description`, `postcode`, `floorplanUrl`, and `keyFeatures` are not populated. These require visiting individual listing pages — deferred to v2 as an opt-in `fetchFullDetails` flag.
- Sold prices (`listingType: SOLD`) use a different Rightmove endpoint and may have limited data.

### Compliance

This actor accesses only publicly available data on Rightmove. Use extracted data in compliance with Rightmove's [Terms of Use](https://www.rightmove.co.uk/termsofuse.html), the UK GDPR, and the Copyright and Rights in Databases Regulations 1997. You are responsible for how you use scraped data — particularly personal information such as agent names and phone numbers. This actor is not affiliated with, endorsed by, or connected to Rightmove or Rightmove Group Limited.

# Actor input Schema

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

City, town, district, or postcode to search. Examples: 'Glasgow', 'London', 'G20 9LY' (full postcode), 'G20' (outward code). Case-insensitive.

## `listingType` (type: `string`):

Whether to search for properties to buy, rent, or sold prices.

## `propertyType` (type: `string`):

Filter by property type, or use ANY to return all types.

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

Minimum property price in pounds.

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

Maximum property price in pounds.

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

Minimum number of bedrooms.

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

Maximum properties to return. Hard cap: 1,008 (Rightmove limit).

## Actor input object example

```json
{
  "location": "London",
  "listingType": "BUY",
  "propertyType": "ANY",
  "minPrice": 200000,
  "maxPrice": 500000,
  "minBedrooms": 2,
  "maxResults": 10
}
```

# Actor output Schema

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

Scraped property data — price, bedrooms, agent details, coordinates, and more.

# 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 = {
    "location": "London",
    "listingType": "BUY",
    "propertyType": "ANY",
    "minPrice": 200000,
    "maxPrice": 500000,
    "minBedrooms": 2,
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("omarjab/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 = {
    "location": "London",
    "listingType": "BUY",
    "propertyType": "ANY",
    "minPrice": 200000,
    "maxPrice": 500000,
    "minBedrooms": 2,
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("omarjab/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 '{
  "location": "London",
  "listingType": "BUY",
  "propertyType": "ANY",
  "minPrice": 200000,
  "maxPrice": 500000,
  "minBedrooms": 2,
  "maxResults": 10
}' |
apify call omarjab/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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