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

Scrapes property listings from Rightmove.

- **URL**: https://apify.com/datascrapers/rightmove-scraper.md
- **Developed by:** [Farhan Ali](https://apify.com/datascrapers) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 listings

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?

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

**Rightmove Scraper** creates a structured dataset of property listing records collected from [Rightmove](https://www.rightmove.co.uk). Each dataset item represents one property listing and can include the property URL, image, branch name, summary, display size, and a price object with amount, frequency, and currency. Query the source using one or more Rightmove search URLs, control the result limit with `maxListings`, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or HTML.

### Dataset at a glance

| Property | Value |
|---|---|
| Source | rightmove.co.uk |
| Record unit | One property listing |
| Input methods | Rightmove search URLs |
| Main identifiers | `id` (property ID) |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, HTML |
| Update model | Fresh records per Actor run |
| Pricing | $10.00 per 1,000 listings |

### Coverage and available records

The Actor collects property listings from Rightmove search result URLs:

- **Search URLs** — provide one or more `urls` entries; each is a Rightmove search URL, typically built from the Rightmove filters (location, price, property type, channel).
- **Result limit** — `maxListings` caps the total listings across all URLs (`0` = unlimited).

Supported record types include sales and letting listings, including commercial and residential property depending on the supplied search URL. The exact fields returned depend on the Rightmove listing payload; fields such as `bedrooms`, `location`, and `displayAddress` are present when the listing exposes them.

### Data dictionary

| Field | Type | Nullable | Description | Example |
|---|---:|---|---|---|
| `id` | number | No | Rightmove property ID | `136625822` |
| `imageUrl` | string | Yes | Primary property image | `https://media.rightmove.co.uk/...` |
| `propertyUrl` | string | No | Property page URL | `https://www.rightmove.co.uk/properties/136625822` |
| `formattedBranchName` | string | Yes | Branch/agency line | `Marketed by RX London Limited, London` |
| `summary` | string | Yes | Property description summary | `Newly fitted office space...` |
| `displaySize` | string | Yes | Size label | `195–634 sq. m.` |
| `displayAddress` | string | Yes | Property address | `6 Duke Street St. James's, London, SW1Y 6BN` |
| `countryCode` | string | Yes | Country code | `GB` |
| `bedrooms` | number | Yes | Bedroom count | `0` |
| `propertyTypeFullDescription` | string | Yes | Property type | `Office` |
| `propertySubType` | string | Yes | Property subtype | `Office` |
| `location` | object | Yes | Latitude/longitude | `{ "latitude": 51.507105, "longitude": -0.137131 }` |
| `price` | object | Yes | Price object (amount, frequency, currency, display) | `{...}` |
| `images` | array | Yes | Property image list | `[{...}]` |

The `price` object includes `amount` (number), `frequency` (e.g. `monthly`), `currencyCode` (e.g. `GBP`), and `displayPrices` with a formatted label. Use `id` as the stable field for deduplication.

### Example dataset record

```json
{
  "id": 136625822,
  "imageUrl": "https://media.rightmove.co.uk/dir/crop/10:9-16:9/property-photo/6a42f3fae/136625822/example.jpeg",
  "propertyUrl": "https://www.rightmove.co.uk/properties/136625822#/?channel=COM_LET",
  "formattedBranchName": "Marketed by RX London Limited, London",
  "summary": "Newly fitted office space available on ground and 1st floors, moments away from St. James's Square.",
  "displaySize": "195–634 sq. m.",
  "displayAddress": "6 Duke Street St. James's, London, SW1Y 6BN",
  "countryCode": "GB",
  "bedrooms": 0,
  "propertyTypeFullDescription": "Office",
  "location": { "latitude": 51.507105, "longitude": -0.137131 },
  "price": {
    "amount": 19241,
    "frequency": "monthly",
    "currencyCode": "GBP",
    "displayPrices": [{ "displayPrice": "£19,241 pcm", "displayPriceQualifier": "" }]
  }
}
```

This record was produced by a Rightmove commercial-property-to-let search URL for London.

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---:|---|---|---|---|
| `urls` | array | Yes | — | Rightmove search URLs | List of search URLs to scrape. |
| `maxListings` | integer | No | `0` | `0` = unlimited | Maximum listings across all URLs. |
| `proxyConfiguration` | object | No | Apify residential | Proxy editor | Proxy settings. |

Minimal request:

```json
{
  "urls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490" }
  ],
  "maxListings": 100
}
```

### Retrieve the data through the API

1. Start the Actor with a JSON input.
2. Wait for the run to finish, or use the synchronous endpoint for small jobs.
3. Retrieve items from the run's default dataset.
4. Paginate or export the dataset.

Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("datascrapers/rightmove-scraper").call(
    run_input={
        "urls": [
            {"url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490"}
        ],
        "maxListings": 100,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["displayAddress"], item.get("price"))
```

For other languages, use the generated API tab on the Actor page.

### Data quality and record handling

- **Completeness** — the Actor writes the fields present in the Rightmove listing payload; optional fields such as `bedrooms`, `location`, and `images` are present when the listing exposes them.
- **Source changes** — Rightmove page structure changes can cause individual fields to come back empty.
- **Deduplication** — the Actor writes one row per listing per run and does not persist dedup state across runs. Deduplicate on `id` when merging runs.
- **Retry/error behavior** — the Actor retries failed requests so transient errors do not drop listings.
- **Normalization** — `price` is returned as a structured object with `amount`, `frequency`, and `currencyCode`.

### Export and pipeline examples

| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL/Supabase | Dataset API or webhook consumer | Property listing tables |
| Google Sheets | Apify integration | Market comparison sheets |
| S3/cloud storage | Scheduled export or integration | Archive listing snapshots |

### Pricing and cost examples

Billing is pay per dataset item. You are not charged Apify platform usage on top of this event.

| Records | Estimated base cost |
|---:|---:|
| 1,000 listings | $10.00 |
| 10,000 listings | $100.00 |

Each property listing written to the dataset is one billable item. Apify plan discounts may reduce the per-item price.

### Limitations and responsible data use

- The Actor reads publicly accessible Rightmove listing data.
- Availability and source changes can produce empty or partial fields.
- No guarantee of historical snapshots unless you store results yourself.
- You are responsible for compliance with applicable terms, privacy, and legal requirements when using the data.

### Dataset questions

#### What does one dataset item represent?

One Rightmove property listing returned by a search URL.

#### Which field should I use as a unique identifier?

`id` is the stable Rightmove property ID.

#### Are fields nullable or conditional?

Many fields (`bedrooms`, `location`, `images`, `displayAddress`) are present only when the listing exposes them and vary by property type.

#### Can I retrieve the records as CSV or JSON?

Yes. Export from the Output tab as JSON, CSV, Excel, or HTML, or read the dataset through the Apify API.

#### How do I paginate large datasets?

Use `maxListings` to cap total listings. For API retrieval, paginate the default dataset items endpoint.

#### Does the Actor return historical data?

No. Each run captures the current state of the listings at run time.

#### What counts as a billable result?

Each property listing written to the dataset is one billable item.

### Related datasets from Data Scrapers

- **[Zoopla Scraper](https://apify.com/datascrapers/zoopla-scraper)** — UK property listings that can be joined with Rightmove for market coverage.
- **[Realtor.com Scraper](https://apify.com/datascrapers/realtor-scraper)** — US property listings for cross-market analysis.
- **[Idealista Scraper](https://apify.com/datascrapers/idealista-scraper)** — European property listings for regional research.

### Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.

# Actor input Schema

## `urls` (type: `array`):

List of Rightmove property listing URLs to scrape. Each URL should be a valid Rightmove search URL.

## `maxListings` (type: `integer`):

Maximum number of property listings to scrape in total across all URLs. Set to 0 for unlimited.

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

Select proxy groups or use your custom proxies

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://www.rightmove.co.uk/commercial-property-to-let/find.html?locationIdentifier=REGION%5E87490&radius=0.0&rent.x=RENT&search=To+Rent&index=0&sortType=13&priceType=pcm&channel=COMMERCIAL_RENT&transactionType=LETTING&displayLocationIdentifier=London-87490.html&minPrice=17500&maxPrice=20000&areaSizeUnit=sqm&minSize=500&maxSize=7500&propertyTypes=business-park%2Ccommercial-property%2Cresidential-development%2Cstorage%2Ctakeaway%2Cretail_property_shopping_centre_%2Cretail_property_retail_park_%2Cretail_property_high_street_%2Cretail_property_out_of_town_%2Cretail_property_pop_up_%2Cconvenience-store%2Cgarage%2Chairdresser-barber-shop%2Cpost-office%2Cshop%2Cworkshop"
    }
  ],
  "maxListings": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Property listings scraped from Rightmove

# 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 = {
    "urls": [
        {
            "url": "https://www.rightmove.co.uk/commercial-property-to-let/find.html?locationIdentifier=REGION%5E87490&radius=0.0&rent.x=RENT&search=To+Rent&index=0&sortType=13&priceType=pcm&channel=COMMERCIAL_RENT&transactionType=LETTING&displayLocationIdentifier=London-87490.html&minPrice=17500&maxPrice=20000&areaSizeUnit=sqm&minSize=500&maxSize=7500&propertyTypes=business-park%2Ccommercial-property%2Cresidential-development%2Cstorage%2Ctakeaway%2Cretail_property_shopping_centre_%2Cretail_property_retail_park_%2Cretail_property_high_street_%2Cretail_property_out_of_town_%2Cretail_property_pop_up_%2Cconvenience-store%2Cgarage%2Chairdresser-barber-shop%2Cpost-office%2Cshop%2Cworkshop"
        }
    ],
    "maxListings": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/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 = {
    "urls": [{ "url": "https://www.rightmove.co.uk/commercial-property-to-let/find.html?locationIdentifier=REGION%5E87490&radius=0.0&rent.x=RENT&search=To+Rent&index=0&sortType=13&priceType=pcm&channel=COMMERCIAL_RENT&transactionType=LETTING&displayLocationIdentifier=London-87490.html&minPrice=17500&maxPrice=20000&areaSizeUnit=sqm&minSize=500&maxSize=7500&propertyTypes=business-park%2Ccommercial-property%2Cresidential-development%2Cstorage%2Ctakeaway%2Cretail_property_shopping_centre_%2Cretail_property_retail_park_%2Cretail_property_high_street_%2Cretail_property_out_of_town_%2Cretail_property_pop_up_%2Cconvenience-store%2Cgarage%2Chairdresser-barber-shop%2Cpost-office%2Cshop%2Cworkshop" }],
    "maxListings": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("datascrapers/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 '{
  "urls": [
    {
      "url": "https://www.rightmove.co.uk/commercial-property-to-let/find.html?locationIdentifier=REGION%5E87490&radius=0.0&rent.x=RENT&search=To+Rent&index=0&sortType=13&priceType=pcm&channel=COMMERCIAL_RENT&transactionType=LETTING&displayLocationIdentifier=London-87490.html&minPrice=17500&maxPrice=20000&areaSizeUnit=sqm&minSize=500&maxSize=7500&propertyTypes=business-park%2Ccommercial-property%2Cresidential-development%2Cstorage%2Ctakeaway%2Cretail_property_shopping_centre_%2Cretail_property_retail_park_%2Cretail_property_high_street_%2Cretail_property_out_of_town_%2Cretail_property_pop_up_%2Cconvenience-store%2Cgarage%2Chairdresser-barber-shop%2Cpost-office%2Cshop%2Cworkshop"
    }
  ],
  "maxListings": 100
}' |
apify call datascrapers/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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