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

Scrapes UK property listings from Rightmove — prices, bedrooms, type, agent, and coordinates, for sale and to rent.

- **URL**: https://apify.com/mina_safwat/rightmove-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 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.

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

Scrape **UK property listings from [Rightmove](https://www.rightmove.co.uk)** — asking prices, bedrooms, property type, tenure, estate agent, coordinates, and photos, **for sale or to rent**, newest listings first.

### What does Rightmove Property Scraper do?

Type a UK place — a city, town, borough, or postcode area — and it returns Rightmove's listings for it as **structured data**: the address, asking price, bedrooms and bathrooms, property type and tenure, the marketing agent, exact coordinates, photos, whether the listing is new or reduced, and a link to it.

Running it on Apify adds an **API**, **scheduling**, **integrations** (Google Sheets, Slack, Zapier, Make, S3), UK residential proxies, and run monitoring.

### Why use Rightmove Property Scraper?

- **Market monitoring** — schedule it on the same searches, sorted by newest listed, and see new and reduced listings every day.
- **Investment research** — pull every listing in an area with price, size, and location.
- **Comparable analysis** — gather asking prices for similar homes nearby.
- **Rental market research** — see what comparable properties let for, per month or per week.
- **Agent market share** — see which agents hold the most stock in an area.

### How to scrape Rightmove property data

1. Enter one or more **Locations** — for example `London`, `Manchester`, or `SW1`.
2. Choose **For sale** or **To rent**.
3. Pick a **Sort order** and set **Max results per location**.
4. Add price, bedroom, or property-type filters if you need them, then click **Start**.

Results appear in the Output tab as they are scraped.

### Input

Everything is set on the Input tab.

| Field | Description |
| --- | --- |
| `locations` | UK places, one per line. The log shows which place matched and the alternatives. |
| `channel` | For sale or To rent. |
| `max_results_per_location` | Cap per location (default 100). |
| `sort` | Newest listed (default), Highest price, or Lowest price. With a cap, this decides which properties you get — except that Rightmove puts a paid listing at the top of every page whatever the order. |
| `min_price` / `max_price` | Price range. For rentals this is per month. |
| `min_beds` / `max_beds` | Bedroom range. |
| `property_type` | Houses, flats, bungalows, detached, semi-detached, terraced, or land. |
| `radius_miles` | How far around the location to include. |
| `proxy_country` | Comma-separated 2-letter codes for the residential proxy exit (default `GB`). |

```json
{
  "locations": ["London"],
  "channel": "For sale",
  "sort": "Newest listed",
  "max_results_per_location": 100
}
```

### Output

```json
{
  "property_id": 93812208,
  "url": "https://www.rightmove.co.uk/properties/93812208",
  "address": "Abbeyfields Close, Hanger Hill, London, NW10",
  "summary": "This one bedroom ground floor flat is in good condition...",
  "price": 300000,
  "price_label": "£300,000",
  "price_qualifier": null,
  "price_frequency": null,
  "currency": "GBP",
  "bedrooms": 1,
  "bathrooms": 1,
  "property_type": "Flat",
  "tenure": "LEASEHOLD",
  "transaction_type": "buy",
  "latitude": 51.53324,
  "longitude": -0.28302,
  "agent": "Foxtons, Ealing",
  "agent_phone": "020 1234 5678",
  "listing_status": "new",
  "listing_updated": "2026-10-01T14:54:07",
  "image": "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/.../max_476x317.jpeg",
  "image_count": 9,
  "floorplan_count": 1,
  "is_featured": false,
  "location_searched": "London"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
| --- | --- |
| `property_id`, `url`, `address`, `summary` | The listing and where to find it. |
| `price` | Asking price as a number. Empty for "POA" listings, which have no price. |
| `price_label`, `price_qualifier`, `currency` | The price as displayed, plus any qualifier such as "Guide Price" or "Offers in Excess of". |
| `price_frequency` | Rentals only: `monthly` or `weekly`, the period `price` is quoted for. `price_label` shows weekly rents converted to per month, as Rightmove does. |
| `bedrooms`, `bathrooms`, `property_type` | Size and type. |
| `tenure` | Freehold, leasehold, or share of freehold. Mostly given for sales. |
| `transaction_type` | `buy` or `rent`. |
| `latitude`, `longitude` | Exact position. |
| `agent`, `agent_phone` | The marketing branch and its phone number. |
| `listing_status`, `listing_updated` | `new` or `price_reduced`, and when that happened, in UK local time as Rightmove shows it. |
| `available_from` | When the property is available. Given mostly for rentals. |
| `image`, `images`, `image_count`, `floorplan_count` | The first photo, up to 10 photos, and how many photos and floorplans the listing has. |
| `is_featured` | Whether the agent paid for prominence (a featured or premium listing). About one in six listings has it; the top row of each page is always one of them, ahead of the sort order. |
| `location_searched` | The location you typed that produced this row. |

### How much does it cost to scrape Rightmove?

You pay per property: **$1.50 per 1,000 properties** ($0.0015 each), plus $0.00005 per run start. A run with the default 100 properties per location costs about **$0.15 per location**. Apify's free plan includes $5 of monthly credit, enough for over 3,000 properties.

Locations that return nothing are not charged — see below.

### Tips

- **Search by borough or postcode** rather than a whole city. **Rightmove pages 42 deep**, about 1,000 properties, however many match. A London search reporting 60,000 results still stops there, so cover a large area with several narrower searches — by borough, postcode, or price band.
- **Sort by newest listed and schedule it** to catch new and reduced listings as they appear. `listing_status` tells you which is which.
- **Locations are matched, not exact.** Typing `London` matches the London region; the log names the match and lists the alternatives it saw, such as Central London or South London, so you can be more specific. A station name such as `Angel` or `Baker Street` searches the area around that station.
- **Overlapping locations repeat properties.** Each location is searched on its own, so a home that matches both `London` and `Camden` comes back once for each, and is charged once for each. Repeated lines are searched once.
- **A full postcode covers only that postcode.** For `E14 9GE`, set a search radius, or use the postcode area `E14`.
- Each results page carries **25 properties** (24 plus a featured listing) and the Actor pauses between pages, so 1,000 properties take a few minutes.

### FAQ, disclaimers, and support

**Does it need a Rightmove account?** No. It reads publicly visible search results.

**What happens to a location that returns nothing?** It is not pushed as a row, so you are not charged for it. It is listed with the reason in the `FAILED_INPUTS` record of the run's key-value store — for example an unknown place name, a search with no matches, or Rightmove refusing the request — and the run's status message summarises it. A location that Rightmove stopped answering partway through keeps the properties already collected and is listed there too. A run fails only when nothing was collected and Rightmove refused every search.

**Why did my location not resolve, or resolve to the wrong place?** Rightmove's own place lookup picks the match, so the place name has to be one it recognises. Official spellings such as `Stoke-on-Trent` or `King's Lynn` work, and a trailing country such as `, UK` or `, Wales` is ignored. Streets and pasted links are not searchable. If the log shows the wrong match, type a larger nearby place, the county as well, or a postcode area such as `SW1`.

**Why fewer results than the total shown?** That is Rightmove's paging limit, not the Actor stopping early. The log says when it is reached.

**Is scraping Rightmove legal?** This Actor collects publicly visible listing data, but **Rightmove's terms of use prohibit automated collection**, so you are responsible for how you use it. Agent names and phone numbers can identify individuals, which makes them **personal data under UK GDPR**: you need a lawful basis to store or use them, and direct marketing is further restricted by PECR. Consult a lawyer before relying on this commercially.

Found a bug or want a field that is missing? Open an issue on the Actor's Issues tab. Need a custom Rightmove solution? Get in touch through the Issues tab as well.

# Actor input Schema

## `locations` (type: `array`):

UK places to search, one per line — a city, town, borough, or postcode area. The run log shows which place was matched and what the alternatives were.

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

Which market to search.

## `max_results_per_location` (type: `integer`):

Stops after this many properties for each location.

## `sort` (type: `string`):

The order Rightmove lists properties in, which also decides which ones fit under the results cap. Rightmove still puts one featured listing at the top of every page. Newest listed suits scheduled monitoring.

## `min_price` (type: `integer`):

Lowest price. For rentals this is per month.

## `max_price` (type: `integer`):

Highest price. For rentals this is per month.

## `min_beds` (type: `integer`):

Fewest bedrooms.

## `max_beds` (type: `integer`):

Most bedrooms.

## `property_type` (type: `string`):

Restrict to one kind of property. Leave empty for all.

## `radius_miles` (type: `string`):

How far around the location to include. Leave empty for the area itself only.

## `proxy_country` (type: `string`):

Comma-separated 2-letter country codes, e.g. GB. UK addresses work best — Rightmove is a UK site.

## Actor input object example

```json
{
  "locations": [
    "London"
  ],
  "channel": "For sale",
  "max_results_per_location": 100,
  "sort": "Newest listed",
  "proxy_country": "GB"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

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

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

```

## MCP server setup

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