# Rightmove Property Scraper (`cirkit/rightmove-property-search-scraper`) Actor

Search Rightmove for UK property for sale, to rent, new builds and commercial. Every row has coordinates, price, beds, baths, floor area, computed price per sq ft, tenure, listing dates and the agent's branch name and phone. Type a place name, no location codes needed.

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

## Pricing

$0.50 / 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

### What is Rightmove Property Scraper?

**Rightmove Property Scraper** lets you extract UK property listings from rightmove.co.uk at scale, helping you build valuation models, source investment stock, monitor a local market week over week, and pull agent contact lists without a single manual copy and paste.

Type a place name and it does the rest. No location codes to look up, no cookies, no login, no browser automation.

- 🏠 **Cover the whole UK market, not just one channel:** homes for sale, homes to rent, new builds, and commercial units for sale or to let, all from the same Actor and the same output shape.
- 📍 **Map every result instantly:** latitude and longitude on every row, so results drop straight into a map, a GIS layer, or a distance calculation.
- 📐 **Compare on price per square foot:** Rightmove publishes floor area as a display string like `996 sq. ft.` and never as a number. Rightmove Property Scraper parses it, converts square metres to square feet so the column is consistent, and computes `pricePerSqFt` for you. No competing Rightmove Actor returns this.
- ☎️ **Build agent lists:** branch name, brand, phone number, and profile URL on every listing.
- 🔎 **Search anywhere, however you have it:** a town or city, a full UK postcode, an outcode like `NW3`, or a Rightmove search URL pasted straight out of your browser.
- 💷 **Pay for rows, not for starting:** a flat $0.50 per 1,000 properties and no per-run start fee, which is what most Rightmove Actors charge on top of their per-result price.

Rightmove has no public API. Its website shows you 25 listings at a time behind a paginator, and its filters reset every time you leave the page. Rightmove Property Scraper turns any Rightmove search into a clean, typed dataset you can sort, join, and model.

### What data does Rightmove Property Scraper extract?

- 🏷 Full display address and the outward postcode recovered from it (`displayAddress`, `outcode`)
- 📍 Latitude and longitude (`latitude`, `longitude`)
- 💷 Numeric price, currency, and frequency (`price`, `priceCurrency`, `priceFrequency`)
- 🏷 Display price and its qualifier, so `Guide Price` and `Offers Over` are not silently flattened into an asking price (`displayPrice`, `priceQualifier`)
- 📅 Weekly rent alongside monthly rent on rental listings (`displayPriceSecondary`)
- 📐 Floor area parsed to a number in square feet, plus the original string (`sizeSqFt`, `displaySize`)
- 📊 Price per square foot, computed (`pricePerSqFt`)
- 🛏 Bedrooms and bathrooms (`bedrooms`, `bathrooms`)
- 🏘 Property type and sub type (`propertyType`, `propertySubType`)
- 📜 Tenure, freehold or leasehold (`tenure`)
- ✍️ Listing summary and the agent's key feature bullets (`summary`, `keyFeatures`)
- 🚩 New build, commercial, auction, student, retirement, and shared ownership flags
- 🕐 When it was added or reduced, first listed date, and last update (`addedOrReduced`, `firstVisibleDate`, `listingUpdateDate`, `listingUpdateReason`)
- 🔑 Let available date and whether tenant fees apply, on rentals (`letAvailableDate`, `feesApply`)
- ☎️ Agent brand, branch, branch ID, phone number, and profile URL
- 📸 Every image URL, plus image, floorplan, and virtual tour counts
- 🔗 The canonical rightmove.co.uk listing URL (`propertyUrl`)
- 🧾 Full provenance: which of your locations produced the row, the resolved Rightmove location ID, and the exact search URL

Address, price, coordinates, bedrooms, agent name, and listing URL came back on 100% of rows in QA. Floor area is best effort, because Rightmove itself only publishes it when the agent supplied it. See the measured coverage table below.

### How to use Rightmove Property Scraper

1. Click **Try for free**.
2. Type one or more locations into **Locations**: `Manchester`, `SW1A 1AA`, `NW3`, or a Rightmove search URL.
3. Pick a **Listing type**: for sale, to rent, new homes, commercial for sale, or commercial to rent.
4. Add any filters you want: price range, bedrooms, property type, radius, garden, parking, added within the last 7 days.
5. Set **Maximum properties**, click **Start**, and export to CSV, Excel, JSON, or pull it from the Apify API.

### Input

```json
{
  "searchLocations": ["Manchester", "M20"],
  "channel": "for sale",
  "minPrice": 150000,
  "maxPrice": 500000,
  "minBedrooms": 3,
  "propertyTypes": ["detached", "semi-detached"],
  "mustHave": ["garden"],
  "radiusMiles": "3",
  "addedWithin": "last 7 days",
  "sortBy": "newest listed",
  "maxItems": 500
}
```

Every field is optional except `searchLocations`. Leave a filter empty and Rightmove Property Scraper does not send it.

### Output

One row per property. Trimmed to the interesting fields:

```json
{
  "propertyId": 88625073,
  "propertyUrl": "https://www.rightmove.co.uk/properties/88625073",
  "displayAddress": "Mount Street, Mayfair, London, W1K",
  "outcode": "W1K",
  "latitude": 51.50956,
  "longitude": -0.15046,
  "price": 985000,
  "priceCurrency": "GBP",
  "displayPrice": "£985,000",
  "priceQualifier": null,
  "sizeSqFt": 551,
  "pricePerSqFt": 1787.66,
  "bedrooms": 0,
  "bathrooms": 1,
  "propertySubType": "Studio",
  "tenure": "LEASEHOLD",
  "agentName": "Foxtons",
  "agentBranchName": "Foxtons, Marylebone",
  "agentPhone": "020 3906 1036",
  "addedOrReduced": "Added on 18/05/2026",
  "keyFeatures": ["Bright open plan studio with wood flooring", "..."],
  "resultStatus": "ok",
  "scrapedAt": "2026-09-01T13:44:02.117Z"
}
```

The dataset ships with four ready-made table views so you do not have to hide 50 columns yourself:

- **Overview**: address, price, beds, baths, type, sq ft, price per sq ft, tenure, agent, URL
- **Investment view**: price, price per sq ft, floor area, tenure, price qualifier, and how long it has been listed
- **Agent contacts**: branch, phone, and profile URL per listing
- **Map data**: address, coordinates, outcode, price

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

A flat **$0.50 per 1,000 properties**. One event, one price. There is no per-run start fee, and duplicates are removed before billing.

| Properties | Cost |
|---|---|
| 1,000 | $0.50 |
| 10,000 | $5.00 |
| 100,000 | $50.00 |

Most Rightmove Actors on the Apify Store charge between $0.70 and $2.99 per 1,000 and add a separate charge every time a run starts, which hurts most if you schedule small runs often. Rightmove Property Scraper charges for rows and nothing else, so a daily 200-row market watch costs ten cents.

### Measured coverage

Measured 2026-09-01 across all five channels, 133 rows, every request through the same Apify datacenter proxy the Actor uses in production.

| Field | For sale | To rent | New homes | Commercial sale | Commercial rent |
|---|---|---|---|---|---|
| Address, price, beds, agent, URL | 100% | 100% | 100% | 100% | 100% |
| Coordinates | 100% | 100% | 100% | 100% | 100% |
| Agent phone | 100% | 100% | 100% | 100% | 100% |
| Floor area and price per sq ft | 76% | 56% | 92% | 59% | 93% |
| Outward postcode | 72% | 48% | 84% | 59% | 76% |

Floor area and outward postcode are best effort by design. Rightmove only publishes a floor area when the listing agent supplied one, and only ends the display address with a postcode on some listings. Neither is invented: the field is `null` when Rightmove does not have it, so an average over the column stays honest.

### Limits

- **About 1,000 results per search.** Rightmove serves roughly the first 1,000 matches of any one search and refuses deeper offsets. To go past that, split the search: narrow by price band, bedroom count, property type, or use several smaller locations instead of one large region. The Actor tells you in the log when a search has more matches than it can reach.
- **Search results only.** This Actor reads Rightmove's search listing, which is where the fields above live. It does not open each individual property page, which is what keeps it fast and cheap.
- **Sold house prices are a separate Rightmove product** and are not covered here.
- **Floor area is not always published.** See the coverage table.
- **UK only.** Rightmove's overseas channel is not supported.

### FAQ

#### Is it legal to scrape Rightmove?

Rightmove Property Scraper only reads pages that Rightmove serves publicly to any visitor, with no login and no cookies. It collects property listing data, not personal data: the contact details it returns are the business phone numbers estate agents publish on their own listings. You are responsible for how you use the data and for your own compliance with Rightmove's terms and with UK and EU data protection law. Apify's [ethical scraping guide](https://blog.apify.com/is-web-scraping-legal/) is a good starting point.

#### Can I use Rightmove Property Scraper as an API?

Yes. Every Actor on Apify is an API endpoint. Start a run, poll it, and read the dataset over HTTP. See the [Apify API docs](https://docs.apify.com/api/v2).

#### Can I use this in Python?

Yes, with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cirkit/rightmove-property-search-scraper").call(
    run_input={"searchLocations": ["Manchester"], "maxItems": 200}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["displayAddress"], item["price"], item["pricePerSqFt"])
```

#### Can I integrate Rightmove Property Scraper with other apps?

Yes. Apify connects to Zapier, Make, Google Sheets, Slack, Airbyte, GitHub, and any webhook, so results can land in a spreadsheet or a CRM the moment a run finishes.

#### How do I schedule Rightmove Property Scraper to run automatically?

Use Apify **Schedules** to run it daily or weekly. A common pattern is a nightly run with `addedWithin: "last 24 hours"` and a webhook, which gives you a feed of everything new in your patch each morning.

#### Why did I get fewer results than expected?

Three usual causes. Your **Maximum properties** cap was reached. Your filters were narrower than you thought, so check `searchUrl` on any row and open it in a browser to see exactly what was searched. Or the search has more than about 1,000 matches, which is Rightmove's own ceiling, and the log will say so.

#### What happens if nothing matches my search?

The run still finishes successfully and pushes a single row with `resultStatus: "no_results"` and an explanation in `summary`, so a scheduled job can tell "nothing matched today" apart from "the scraper broke". Every other row carries `resultStatus: "ok"`.

#### How do I search a specific area precisely?

Use a full postcode with **Search radius** set to `This area only` or `Within 1/4 mile`. For a broader sweep, use an outcode like `M20` or a town name with a larger radius.

#### Can I get sold prices or full property descriptions?

Not from this Actor. It reads Rightmove's search results, which carry the summary and key features but not the full description. Ask and it can be added.

#### Can I get a field that is not listed?

Probably. If Rightmove exposes it on the search results page, it can be added. Open an issue on the Actor's Issues tab.

### You might also like

- [Zillow Search Scraper](https://apify.com/cirkit/zillow-search-scraper) for the US equivalent
- [Zoopla and UK rental comparisons](https://apify.com/cirkit) across the rest of the Cirkit property Actors
- [Booking.com Search Scraper](https://apify.com/cirkit/booking-search-scraper) for short-let and hospitality pricing

### Changelog

#### 0.1 (2026-09-01)

- First release. Five Rightmove channels, free-text and postcode location resolution, computed price per square foot, agent contact details, and four dataset views.

# Actor input Schema

## `searchLocations` (type: `array`):

Where to search. Enter a town or city ("Manchester"), a UK postcode ("SW1A 1AA"), an outcode ("NW3"), or paste a Rightmove search URL straight from your browser. Each location is searched separately and the results are combined into one dataset.

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

Which part of Rightmove to search.

## `maxItems` (type: `integer`):

Stop after this many properties across all locations. Set to 0 for no cap. Rightmove serves roughly the first 1,000 results of any one search, so narrow the search with filters to reach past that.

## `radiusMiles` (type: `string`):

How far around the location to include. Rightmove allows 0, 0.25, 0.5, 1, 3, 5, 10, 15, 20, 30 and 40 miles; anything else is snapped to the nearest allowed value.

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

Lowest price to include, in pounds. On the rent channel this is per calendar month. Leave empty for no minimum.

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

Highest price to include, in pounds. On the rent channel this is per calendar month. Leave empty for no maximum.

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

Fewest bedrooms to include. Leave empty for any.

## `maxBedrooms` (type: `integer`):

Most bedrooms to include. Leave empty for any.

## `propertyTypes` (type: `array`):

Restrict to these property types. Leave empty for all types.

## `mustHave` (type: `array`):

Only return listings with these features.

## `dontShow` (type: `array`):

Leave these categories out of the results.

## `furnishTypes` (type: `array`):

Filter rental listings by how they are furnished. Rightmove ignores this on the sale channels.

## `addedWithin` (type: `string`):

Only return listings first added or reduced inside this window.

## `keywords` (type: `string`):

Free-text keywords Rightmove matches against the listing, for example "garage" or "south facing".

## `includeUnderOffer` (type: `boolean`):

Include listings that are already under offer, sold subject to contract, or let agreed. Useful for tracking what a market actually transacts at rather than only what is still available.

## `sortBy` (type: `string`):

How Rightmove orders the results before this Actor reads them. Matters when you cap the run, because the cap takes the top of this order.

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

Apify Proxy settings. The default works: Rightmove answers Apify's datacenter egress cleanly, so there is no reason to pay for residential here.

## Actor input object example

```json
{
  "searchLocations": [
    "Manchester"
  ],
  "channel": "for sale",
  "maxItems": 100,
  "addedWithin": "anytime",
  "includeUnderOffer": false,
  "sortBy": "rightmove default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `properties` (type: `string`):

Every property row from this run, shown as the Overview table: address, price, beds, baths, floor area, price per square foot and agent.

## `investment` (type: `string`):

The same rows arranged around price per square foot, tenure, floor area and how long the listing has been up, for comparing value across a market.

## `agents` (type: `string`):

Branch name, phone number and profile URL for the agent behind each listing.

## `propertiesCsv` (type: `string`):

The full result set as CSV, for a spreadsheet or a valuation model.

## `consoleRun` (type: `string`):

The Apify Console page for this run, including logs.

# 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 = {
    "searchLocations": [
        "Manchester"
    ],
    "channel": "for sale",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/rightmove-property-search-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 = {
    "searchLocations": ["Manchester"],
    "channel": "for sale",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/rightmove-property-search-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 '{
  "searchLocations": [
    "Manchester"
  ],
  "channel": "for sale",
  "maxItems": 100
}' |
apify call cirkit/rightmove-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/rightmove-property-search-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/3273VOqAOzbtagxEm/builds/iV26Ie6nULxVi5Zgw/openapi.json
