# Rightmove Scraper (Cheap) (`data_api/rightmove-scraper-cheap`) Actor

Rightmove scraper that extracts UK property listings from any search URL, giving investors, agents, and analysts structured data including prices, addresses, bedrooms, agent details, and coordinates.

- **URL**: https://apify.com/data\_api/rightmove-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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/platform/actors/running/actors-in-store#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 Listings Scraper

![Rightmove Listings Scraper](cover.jpg)

Rightmove holds the UK's biggest pool of for-sale and to-rent listings, but clicking through it page by page is slow and there is no export button. This scraper turns any Rightmove search into clean, structured rows. Set your filters on the site, copy the link, and the scraper reads the data Rightmove embeds in each results page: address, price, bedrooms, the estate agent, map coordinates, photos, and more. Run one search link or a whole batch, and pull back as much or as little as you need.

### What you get

Every property on your search becomes one row with the same set of columns, so the output drops straight into a spreadsheet or database. Fields the listing does not expose come back empty rather than disappearing, which keeps your table tidy. The data splits into a few groups:

- **Identity and link** — `listingId`, `listingUrl`, `originUrl`
- **Location** — `displayAddress`, `geoLat`, `geoLng`
- **Price** — `priceText`, `priceValue`, `priceNote`
- **Property facts** — `homeType`, `bedroomCount`, `bathroomCount`, `listingSummary`, `listingChange`, `marketStatus`
- **Media** — `photoLinks`, `floorplanLink`
- **Agent** — `agencyName`, `agencyAddress`
- **Run metadata** — `collectedAt`

### Quick start

1. Run a search on rightmove.co.uk with the filters you want, then copy the link from the address bar.
2. Hit **Try for free** and open the input form.
3. Paste that link into **Single search link**, or drop several links into **Multiple search links**.
4. Set **Listings per link** to cap each search, and pick a proxy type.
5. Press **Start**, then export the rows as JSON, CSV, Excel, or XML once the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Property investors** — track new listings and price drops across target postcodes without refreshing the site
- **Estate agents** — watch competitor stock, asking prices, and time-on-market in your patch
- **Proptech teams** — feed a steady stream of fresh listing data into valuation or alert tools
- **Mortgage and finance** — pull asking-price benchmarks by area for affordability models
- **Relocation services** — gather and compare available homes for clients moving to a new region
- **Market analysts** — measure supply, pricing, and property mix across whole towns or regions

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `queryUrl` | string | One of `queryUrl` or `searchPages` | A single Rightmove search link copied from your browser. Use this for a quick one-off run. |
| `searchPages` | array of strings | One of `queryUrl` or `searchPages` | A list of Rightmove search links, one per line. Results merge into one dataset, each row tagged with its `originUrl`. |
| `resultsLimit` | integer | No | Listings to collect per search link. Default `50`; hard ceiling `1000`. |
| `runTimeoutSeconds` | integer | No | Total time budget for the run in seconds. The scraper stops and keeps partial results when it runs out. Default `360`. |
| `pageTimeoutSeconds` | integer | No | Seconds to wait on a single page download before moving on. Default `45`; raise it on residential proxies. |
| `proxyConfiguration` | object | No | Proxies used for requests. Datacenter default suits most runs; switch to Residential if Rightmove blocks requests. |

#### Example input

```json
{
    "searchPages": [
        "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E274&sortType=6",
        "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E93929&sortType=6"
    ],
    "resultsLimit": 50,
    "runTimeoutSeconds": 360,
    "pageTimeoutSeconds": 45,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB"
    }
}
```

### Output

Each listing on your search returns one row. Every field is always present, and values Rightmove does not publish come back as `null`, so the dataset stays rectangular and easy to load.

#### Example output

```json
{
    "listingId": "154872063",
    "listingUrl": "https://www.rightmove.co.uk/properties/154872063",
    "displayAddress": "Maple Grove, Headingley, Leeds, LS6",
    "priceText": "£350,000",
    "priceValue": 350000,
    "priceNote": "Guide Price",
    "homeType": "Semi-Detached",
    "bedroomCount": 3,
    "bathroomCount": 2,
    "listingSummary": "A well-presented three-bedroom semi-detached home close to local schools and amenities.",
    "agencyName": "Bramley & Co Estate Agents",
    "agencyAddress": "12 High Street, Leeds, LS6",
    "photoLinks": [
        "https://media.rightmove.co.uk/dir/154872063_01.jpeg",
        "https://media.rightmove.co.uk/dir/154872063_02.jpeg"
    ],
    "floorplanLink": "https://media.rightmove.co.uk/dir/154872063_FLP_00.jpeg",
    "geoLat": 53.819,
    "geoLng": -1.581,
    "listingChange": "Reduced 3 days ago",
    "marketStatus": "available",
    "collectedAt": "2026-06-30T12:00:00.000000+00:00",
    "originUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E274&sortType=6"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Rightmove's own identifier for the property |
| `listingUrl` | string | Direct link to the property page on rightmove.co.uk |
| `displayAddress` | string | Address shown on the listing card |
| `priceText` | string | Price exactly as printed, e.g. '£350,000' |
| `priceValue` | number | Plain numeric price with the currency symbol removed |
| `priceNote` | string | Wording attached to the price, e.g. 'Guide price', 'Offers over' |
| `homeType` | string | Kind of dwelling, e.g. Detached, Semi-detached, Flat |
| `bedroomCount` | integer | Number of bedrooms |
| `bathroomCount` | integer | Number of bathrooms |
| `listingSummary` | string | Short blurb the agent wrote for the listing |
| `agencyName` | string | Estate agent or branch handling the property |
| `agencyAddress` | string | Branch address of the estate agent |
| `photoLinks` | array | Every property photo URL from the listing |
| `floorplanLink` | string | URL of the floorplan image when one is published |
| `geoLat` | number | Map latitude of the property |
| `geoLng` | number | Map longitude of the property |
| `listingChange` | string | When the listing went live or last dropped in price |
| `marketStatus` | string | Where the listing sits, e.g. 'available', 'sold STC', 'let agreed' |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |
| `originUrl` | string | The Rightmove search link this row came from |

### Tips for best results

- **Trial a small run first.** Set `resultsLimit` to 20 and check the columns line up with your pipeline before you scale to hundreds.
- **Sort your search before copying the link.** Pick "Newest listed" or "Lowest price" on Rightmove and that order carries through to your rows.
- **Switch to Residential (GB) when blocked.** Datacenter clears most searches; residential helps if you hit repeated blocks or empty pages.
- **Give long batches room.** Several links with a high `resultsLimit` need a bigger `runTimeoutSeconds`, or the run stops early with partial data.
- **Raise `pageTimeoutSeconds` to ~60** on residential proxies or during busy periods so slow pages still load.

### How can I use Rightmove property data?

**How can I use the Rightmove Listings Scraper to track a local property market?**
Build a Rightmove search for your area, copy the link, and run it on a schedule. Each run returns every listing with its price, `priceNote`, bedrooms, and `listingChange`, so you can watch new stock appear and prices move over time without scrolling the site by hand.

**How can I export Rightmove listings to a spreadsheet or CSV?**
Paste one or more search links, start the run, and download the dataset as CSV, Excel, JSON, or XML. You get one row per property with address, price, agent, and coordinates already split into columns — no copy-paste from the website.

**How can I scrape Rightmove search results for several towns at once?**
Add a search link for each town to **Multiple search links**. The scraper runs them one after another and tags every row with its `originUrl`, so you can pull a multi-area property dataset in a single run and filter it back apart later.

**How can I get map coordinates for Rightmove properties?**
Every row includes `geoLat` and `geoLng` read straight from the listing, alongside the `displayAddress`. That lets you plot listings on a map, cluster them by neighbourhood, or join them to other geographic data for research.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `queryUrl` (type: `string`):

Paste one Rightmove search link here. Run your property search on rightmove.co.uk, then copy the address bar URL. Need several searches at once? Use the list field below instead.

## `searchPages` (type: `array`):

A batch of Rightmove search links, one per line. The scraper walks each link in turn and merges every result into a single dataset. Each row carries an 'originUrl' field so you can tell which search produced it.

## `resultsLimit` (type: `integer`):

How many listings to collect from each search link. Supply 3 links with this set to 50 and you can receive up to 150 rows. Hard ceiling is 1000.

## `runTimeoutSeconds` (type: `integer`):

Total seconds the run may take. Once this budget is spent the scraper halts and keeps whatever it has gathered so far.

## `pageTimeoutSeconds` (type: `integer`):

How long to wait on a single page download before moving on. Bump this up when you run through residential proxies.

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

Choose which proxies handle the requests. Routing through proxies keeps you off rate limits and IP blocks. Datacenter is quickest; Residential is the hardest to spot.

## Actor input object example

```json
{
  "queryUrl": "https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E93929&sortType=6",
  "searchPages": [
    "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E274&sortType=6",
    "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E93929&sortType=6"
  ],
  "resultsLimit": 50,
  "runTimeoutSeconds": 360,
  "pageTimeoutSeconds": 45,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "queryUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&sortType=6&propertyTypes=&mustHave=&dontShow=&furnishTypes=&keywords=",
    "searchPages": [
        ""
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/rightmove-scraper-cheap").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 = {
    "queryUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&sortType=6&propertyTypes=&mustHave=&dontShow=&furnishTypes=&keywords=",
    "searchPages": [""],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("data_api/rightmove-scraper-cheap").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queryUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&sortType=6&propertyTypes=&mustHave=&dontShow=&furnishTypes=&keywords=",
  "searchPages": [
    ""
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call data_api/rightmove-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=data_api/rightmove-scraper-cheap",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/RNBSzOp1H0BPCxeqB/builds/sw0HrfdeF9154bPkf/openapi.json
