# Rightmove Property Scraper (`kekliktech/rightmove-scraper`) Actor

Scrapes property listings from Rightmove search results — prices, addresses, agents, coordinates, and optional full per-property details.

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

## Pricing

from $0.75 / 1,000 property listings

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 property listings from [Rightmove](https://www.rightmove.co.uk) — the UK's largest property portal — into clean, structured data. Works with **every Rightmove search type**: property for sale, to rent, new homes, student accommodation, and commercial property. Run your search on rightmove.co.uk, copy the URL, paste it in, and get every listing as JSON/CSV/Excel. Fast, reliable, and built to keep working when the site changes.

### 🎯 Use cases

- **📊 Market research** — track asking prices, price per sq ft, and time-on-market by area, postcode, or property type.
- **🏦 Investment sourcing** — spot new and reduced listings daily, compare against your yield criteria, and filter by tenure, lease length, or council tax band.
- **🧲 Lead generation** — new listings are buying signals for mortgage brokers, conveyancers, surveyors, and removal firms; agent names and phone numbers are included.
- **🏗️ PropTech & valuation models** — feed AVMs and analytics products with fresh listing data, coordinates, and full property attributes.
- **🔔 Competitor monitoring** — track which agents list what, where, and at what price.
- **📰 Research & journalism** — housing market studies with reproducible, exportable data.

### ⚙️ Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | *required* | Rightmove search result URLs |
| `fetchPropertyDetails` | boolean | `false` | Add full property details to every listing — description, postcode, council tax, lease, stations, and more (paid add-on, takes longer) |
| `maxResults` | integer | all | Stop after this many unique listings |
| `maxPagesPerUrl` | integer | all | Page cap per search URL (~24 listings/page) |
| `proxyConfiguration` | object | Apify Proxy | Datacenter (default) or your own proxy URLs |

**Minimal example** — all listings from one search:

```json
{
    "startUrls": [
        { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY&sortType=6" }
    ]
}
```

**Full example** — two searches, complete property details, capped at 500 listings:

```json
{
    "startUrls": [
        { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=Manchester&useLocationIdentifier=true&locationIdentifier=REGION%5E904&radius=5.0&channel=BUY&transactionType=BUY&maxPrice=300000&minBedrooms=2" },
        { "url": "https://www.rightmove.co.uk/property-to-rent/find.html?searchLocation=Leeds&useLocationIdentifier=true&locationIdentifier=REGION%5E787&radius=3.0&channel=RENT&transactionType=LETTING" }
    ],
    "fetchPropertyDetails": true,
    "maxResults": 500,
    "maxPagesPerUrl": 20,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📦 Output

One dataset item per listing. Real example (with `fetchPropertyDetails: true`):

```json
{
  "id": 92299551,
  "url": "https://www.rightmove.co.uk/properties/92299551#/?channel=RES_BUY",
  "property": {
    "type": "Flat",
    "description": "3 bedroom flat for sale",
    "bedrooms": 3,
    "bathrooms": 2,
    "size": "1,765 sq. ft.",
    "tenure": "LEASEHOLD",
    "key_features": []
  },
  "price": {
    "amount": 1250000,
    "currency": "GBP",
    "qualifier": null,
    "display": "£1,250,000",
    "frequency": "not specified"
  },
  "address": "RIVERDALE ROAD, EAST TWICKENHAM",
  "location": {
    "latitude": 51.455996,
    "longitude": -0.313781
  },
  "summary": "Stunning luxury apartment, the whole ground floor of a striking Victorian villa, with land including parking, garage and private garden area, less than 10 mins' walk from Richmond Bridge. lovely shared garden, sold newly decorated and re-floored, with NEW long lease... Call now to view. Davi",
  "images": {
    "count": 14,
    "floorplans": 0,
    "virtual_tours": 0,
    "main": "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/4f91dc4e5/92299551/4f91dc4e5ba247d6039f374a400cd180_max_476x317.jpeg",
    "all": [
      { "url": "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/4f91dc4e5/92299551/4f91dc4e5ba247d6039f374a400cd180_max_476x317.jpeg", "caption": null },
      { "url": "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/564152a8e/92299551/564152a8e37d288a1e1dc12fdc1d44db_max_476x317.jpeg", "caption": null }
    ]
  },
  "dates": {
    "first_listed": "2026-08-22T18:39:56Z",
    "last_updated": "2026-08-23T01:14:20Z",
    "added_or_reduced": "Added yesterday",
    "is_recent": true
  },
  "listing_update": {
    "reason": "new",
    "date": "2026-08-22T18:45:13Z"
  },
  "agent": {
    "name": "David McGeachie Sales",
    "branch": "David McGeachie Sales, St Margarets, Twickenham",
    "phone": "020 3907 9751",
    "branch_url": "https://www.rightmove.co.uk/estate-agents/agent/David-McGeachie-Sales/St-Margarets-Twickenham-81106.html",
    "logo": "https://media.rightmove.co.uk:443/partner-logo/15698081-PRODUCTS_LOGO-1766064814.jpeg"
  },
  "tags": {
    "label": null,
    "featured": true,
    "premium": false,
    "auction": false,
    "commercial": false,
    "development": false,
    "residential": true,
    "students": false,
    "online_viewings": false
  },
  "street_view": true,
  "channel": "BUY",
  "details": {
    "description": "Stunning luxury apartment, approx 1746 square feet, the whole ground floor of a striking Victorian villa c 1865, with land including parking, garage and private garden area, less than 10 mins' walk from Richmond Bridge. sold newly decorated and re-floored, with NEW long lease... Call now to view.  David <br /><br />3 bedroom apartment, just fully repainted and re-floored, with approx 1746 square feet including lots of storage<br />Own front door<br />Large shared garden to rear<br />Land to right of the building is included with this apartment - parking, garage and rear garden area<br />We are a local independent agent near to the property.<br /><br />Please call us now to view.<br />David <br /><br />PS Floorplan is in photos. <br /><br />Council Tax Band: F £3592 2026 (Richmond)<br />Tenure: Leasehold (250 years)<br />Ground Rent: £0 per year",
    "secondary_price": null,
    "price_per_sqft": "£708.22 per sq ft",
    "price_numeric": 1250000,
    "address_detail": {
      "country_code": "GB",
      "uk_country": "England",
      "outcode": "TW1",
      "incode": "2BT"
    },
    "size_sqft": 1765,
    "size_sqm": 164,
    "living_costs": {
      "council_tax_band": "F",
      "council_tax_exempt": false,
      "council_tax_included": false,
      "annual_ground_rent": 0,
      "annual_service_charge": null,
      "ground_rent_review_years": null,
      "ground_rent_pct_increase": null,
      "domestic_rates": 3592
    },
    "years_remaining_on_lease": 250,
    "features": {
      "electricity": [],
      "broadband": [],
      "water": [],
      "sewerage": [],
      "heating": [],
      "accessibility": [],
      "parking": [
        { "alias": "garage", "displayText": "Garage" },
        { "alias": "on_street", "displayText": "On street" },
        { "alias": "off_street", "displayText": "Off street" }
      ],
      "garden": [
        { "alias": "private_garden", "displayText": "Private garden" },
        { "alias": "communal_garden", "displayText": "Communal garden" },
        { "alias": "rear_garden", "displayText": "Rear garden" }
      ],
      "risks": {
        "floodedInLastFiveYears": false,
        "floodDefences": false,
        "floodSources": []
      },
      "obligations": {
        "listed": false,
        "restrictions": false,
        "requiredAccess": false,
        "rightsOfWay": false
      }
    },
    "nearest_stations": [
      { "name": "St. Margarets Station", "types": ["NATIONAL_TRAIN"], "distance": 0.29637373323022814, "unit": "miles" },
      { "name": "Richmond Station", "types": ["NATIONAL_TRAIN", "LONDON_UNDERGROUND", "LONDON_OVERGROUND"], "distance": 0.7468213839187418, "unit": "miles" },
      { "name": "Twickenham Station", "types": ["NATIONAL_TRAIN"], "distance": 0.8018574767279193, "unit": "miles" }
    ],
    "epc": [
      "https://media.rightmove.co.uk/property-epc/546859c45/92299551/546859c456010ecbdaf58fca6072c1bf.jpeg"
    ],
    "brochures": [
      { "url": "https://mcgeachiemedd.10ninety.co.uk/PublicProperty/DisplayBrochure/302", "caption": "Brochure" }
    ],
    "floorplan_urls": [],
    "image_urls": [
      "https://media.rightmove.co.uk/property-photo/4f91dc4e5/92299551/4f91dc4e5ba247d6039f374a400cd180.jpeg",
      "https://media.rightmove.co.uk/property-photo/564152a8e/92299551/564152a8e37d288a1e1dc12fdc1d44db.jpeg"
    ],
    "virtual_tours": [],
    "status": {
      "published": true,
      "archived": false
    },
    "shared_ownership": null,
    "lettings": null,
    "agent_detail": {
      "company": "Tenant Finder",
      "address": "191 Richmond Road,\r\nTwickenham,\r\nTW1 2NJ",
      "profile_url": "https://www.rightmove.co.uk/estate-agents/agent/David-McGeachie-Sales/St-Margarets-Twickenham-81106.html"
    }
  }
}
```

*(Image arrays shortened here for readability — the scraper returns all of them.)*

Export as JSON, CSV, Excel, or XML from the dataset. Nested fields flatten to dot notation (`price.amount`, `property.bedrooms`) in tabular exports.

### 🗂️ Data fields

#### Core

| Field | Description |
|---|---|
| 🆔 `id` | Rightmove property ID |
| 🔗 `url` | Listing URL |
| 📍 `address` | Display address |
| 📝 `summary` | Short listing summary |
| 📡 `channel` | `BUY` or `RENT` |
| 👁️ `street_view` | Street View available |

#### 🏠 `property`

| Field | Description |
|---|---|
| `type` | Property subtype (Flat, Detached, Terraced…) |
| `description` | Full type description ("3 bedroom flat for sale") |
| `bedrooms` / `bathrooms` | Room counts |
| `size` | Display size, when the agent provides one |
| `tenure` | `FREEHOLD`, `LEASEHOLD`, … |
| `key_features` | Agent's bullet-point highlights |

#### 💰 `price`

| Field | Description |
|---|---|
| `amount` | Numeric price |
| `currency` | Currency code (GBP) |
| `qualifier` | "Offers in Excess of", "Guide Price", … |
| `display` | Formatted price ("£1,250,000") |
| `frequency` | For rentals: monthly/weekly |

#### 🗺️ `location` · 🖼️ `images` · 📅 `dates`

| Field | Description |
|---|---|
| `location.latitude` / `longitude` | Coordinates |
| `images.count` / `floorplans` / `virtual_tours` | Media counts |
| `images.main` | Main photo URL |
| `images.all[]` | All photos with captions |
| `dates.first_listed` | First visible date |
| `dates.last_updated` | Last update date |
| `dates.added_or_reduced` | "Added yesterday", "Reduced on…" |
| `listing_update.reason` | `new`, `price_reduced`, … |

#### 🏢 `agent` · 🏷️ `tags`

| Field | Description |
|---|---|
| `agent.name` / `branch` / `phone` | Agent contact details |
| `agent.branch_url` / `logo` | Agent page and brand logo |
| `tags.featured` / `premium` | Paid placement flags |
| `tags.auction` / `commercial` / `development` / `residential` / `students` | Listing category flags |
| `tags.online_viewings` | Online viewings offered |

#### ➕ `details` (with `fetchPropertyDetails: true`)

| Field | Description |
|---|---|
| 📄 `description` | Full listing description |
| 📮 `address_detail` | Postcode (`outcode`/`incode`), UK country |
| 📐 `size_sqft` / `size_sqm` | Floor area |
| 💷 `price_per_sqft` / `secondary_price` / `price_numeric` | Extra price data |
| 🏛️ `living_costs` | Council tax band, service charge, ground rent, domestic rates |
| 📜 `years_remaining_on_lease` | Lease length remaining |
| 🔌 `features` | Parking, garden, heating, accessibility, flood risks, obligations |
| 🚉 `nearest_stations[]` | Nearby stations with distances |
| ⚡ `epc[]` | EPC certificate images |
| 📎 `brochures[]` / `floorplan_urls[]` | Documents and floorplans |
| 📷 `image_urls[]` | Full-resolution photo URLs |
| 🎥 `virtual_tours[]` | Virtual tour links |
| 🏷️ `status` | Published/archived flags |
| 🤝 `shared_ownership` | Ownership %, rent (shared-ownership listings) |
| 🔑 `lettings` | Deposit, let type, furnishing, available date (rentals) |
| 🏢 `agent_detail` | Agent company name, address, profile URL |

### 🔌 Run via API

Everything the scraper does is available programmatically — run it from your own code, on a schedule, or inside a pipeline. Get your API token from **Apify Console → Settings → API & Integrations**.

**cURL** — start a run and get results in one call (best for smaller runs):

```bash
curl -X POST "https://api.apify.com/v2/acts/kekliktech~rightmove-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{ "url": "https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY" }],
    "maxResults": 100
  }'
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("kekliktech/rightmove-scraper").call(run_input={
    "startUrls": [{"url": "https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY"}],
    "fetchPropertyDetails": True,
    "maxResults": 100,
})

for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["address"], listing["price"]["display"])
```

**Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('kekliktech/rightmove-scraper').call({
    startUrls: [{ url: 'https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY' }],
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

For long runs, start the run asynchronously (`POST /v2/acts/kekliktech~rightmove-scraper/runs`) and fetch the dataset when it finishes — or add a webhook in the **Integrations** tab to get notified. The **API** button at the top of this page has the full endpoint reference, and you can schedule recurring runs with [Apify Schedules](https://docs.apify.com/platform/schedules). AI agents can also call this actor through [Apify's MCP server](https://mcp.apify.com).

### ⚠️ Limits

Rightmove serves at most **1,008 listings per search** (42 pages) — this is a Rightmove cap, not a scraper limit. To collect more from a large area, split the search into narrower ones (by price band, property type, or smaller radius) and pass all the URLs in `startUrls`. Duplicates are removed automatically.

### 💬 Support

Questions, issues, or a field you need that isn't here?

- 📧 Email: <support@kekliktech.com>
- 💬 WhatsApp: [+44 7916 692476](https://wa.me/447916692476)
- 🐛 Or open an issue in the **Issues** tab of this actor

# Actor input Schema

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

One or more Rightmove search result URLs — for sale, to rent, new homes, student accommodation, or commercial. Run a search on rightmove.co.uk, then copy the URL from your browser's address bar.

## `fetchPropertyDetails` (type: `boolean`):

Add full property details to every listing: full description, postcode, council tax band, service charge, ground rent, lease years remaining, nearest stations, EPC, floorplans, all image URLs. Takes longer and is billed as an add-on per property.

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

Stop after this many unique listings in total. Leave empty to collect everything available (Rightmove serves at most 1,008 listings per search — split large searches by price band or area to get more).

## `maxPagesPerUrl` (type: `integer`):

Limit the number of result pages fetched per search URL (~24 listings per page). Leave empty for all pages.

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

Proxies to route requests through. Apify datacenter proxies (the default) work well for Rightmove — residential is not needed. You can also supply your own custom proxy URLs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-for-sale/find.html?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY&sortType=6"
    }
  ],
  "fetchPropertyDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped listings with prices, addresses, agents, coordinates, and optional full details.

# 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?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY&sortType=6"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kekliktech/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?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY&sortType=6" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kekliktech/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?searchLocation=London&useLocationIdentifier=true&locationIdentifier=REGION%5E87490&radius=0.0&channel=BUY&transactionType=BUY&sortType=6"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kekliktech/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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