# Rightmove UK Property Listings (London and beyond) (`zinin/rightmove-london`) Actor

Pull live for-sale and to-rent property listings straight from Rightmove.co.uk — the UK's biggest property portal — for London or any other Rightmove location code. No login, no browser, no proxies. Unofficial, independent tool — not affiliated with, endorsed by, or sponsored by Rightmove.

- **URL**: https://apify.com/zinin/rightmove-london.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 listing founds

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 UK Property Listings (London and beyond)

Pull live for-sale and to-rent property listings straight from Rightmove.co.uk —
the UK's biggest property portal — for London or any other Rightmove location code.
No login, no API key, no browser needed on your side.

### What you get

- Title, price (normalized to a single comparable figure — monthly for rentals),
  currency, bedrooms, floor area, full address, coordinates, a short description,
  photos and the direct listing URL for every property found.
- Filter by for-sale or to-rent, and any Rightmove location code (defaults to
  London).
- Full ISO posting date for every listing (Rightmove prints an exact date, unlike
  some portals that only show a relative "3 days ago" stamp).
- Runs on Apify: schedule it, monitor it, call it from the API, export to
  JSON/CSV/Excel or push straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Leave **Location identifier** as the default for London, or paste in another
   Rightmove location code (see the Input section below for how to find one).
3. Pick **Deal type** — for sale or to rent.
4. Hit **Start** and pull the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.003 per result**. No monthly seat, no minimum. 100 listings found cost about $0.30 (the one-time start fee plus 100 result rows). Rows where the source returned nothing (an unrecognized location, a query with zero matching listings, or a request that failed) are returned for transparency but are **never** charged for.

### Input

| Field | Required | What it does |
|---|---|---|
| `location_identifier` | yes | Rightmove's own opaque location code, format `TYPE^NUMBER` (e.g. `REGION^87490` for London). Rightmove does not publish a name-to-code lookup table — to find the code for another area, search that area on rightmove.co.uk and copy the `locationIdentifier` query parameter from the results page URL. |
| `deal_type` | yes | `sale` for properties for sale, `rent` for properties to rent. |
| `max_items` | no | Total row cap for this run (default 100). |
| `max_pages` | no | How many result pages (24 listings per page) to walk before stopping (default 3). |

```json
{
    "location_identifier": "REGION^87490",
    "deal_type": "sale",
    "max_items": 5,
    "max_pages": 1
}
```

### Output

Real row from a live run on the platform (2026-08-01):

```json
{
    "location_identifier": "REGION^87490",
    "deal_type": "sale",
    "found": true,
    "url": "https://www.rightmove.co.uk/properties/166896110#/?channel=RES_BUY",
    "title": "1 bedroom apartment for sale — Cashmere House, Leman Street, E1",
    "price": 800000,
    "currency": "GBP",
    "property_type": "Apartment",
    "rooms": 1,
    "area_sqm": null,
    "location": "Cashmere House, Leman Street, E1",
    "lat": 51.51373,
    "lng": -0.070178,
    "posted_date": "2025-09-11T17:32:28Z",
    "description": "Regent are proud to present this spectacular one-bedroom apartment with amazing view over the City in the heart of Cashmere House, part of the Goodman's Field development, E1. The property boasts 903 sq. ft and comprises a spacious double bedroom with a private en-suite...",
    "images": [
        "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/36f551317/166896110/36f551317fd23d7243757894728a14a4_max_476x317.jpeg",
        "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/9a9b25b9b/166896110/9a9b25b9b76d38b7b9e5d2ef30b85b01_max_476x317.jpeg",
        "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/f7eadec92/166896110/f7eadec92821a03b4b8695279755d031_max_476x317.jpeg",
        "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/4c4ce0ae1/166896110/4c4ce0ae15c3d1803f6e138d8b92beef_max_476x317.jpeg",
        "https://media.rightmove.co.uk:443/dir/crop/10:9-16:9/property-photo/09e1cdbdd/166896110/09e1cdbddbf64b44bc4b8d113c11eeca_max_476x317.jpeg"
    ],
    "source_portal": "rightmove-london",
    "scraped_at": "2026-08-01T05:10:56.822Z",
    "partial": true,
    "partial_reason": "stopped after 1 page(s), 5 item(s) collected — reached this run's own max_pages/max_items limit before the source confirmed (via confirmedEnd) that there is nothing more; there may be additional matching listings beyond what was collected"
}
```

| Field | Meaning |
|---|---|
| `found` | `true` for a real listing row, `false` for a not-found/error row. |
| `price` | The headline price shown on the listing card. For rentals this is always the **per calendar month** figure, even when Rightmove's own internal record is weekly — so every rental row in your dataset is on the same, comparable unit. `null` when the listing has no public price ("POA" / price on application). |
| `area_sqm` | Floor area converted from Rightmove's own square feet to square meters. `null` when the listing doesn't publish a size at all — this is common (roughly a third of London listings in spot checks), not a parsing gap. |
| `location` | The display address as shown on the listing card. |
| `posted_date` | Full ISO timestamp of when the listing first went live — Rightmove publishes an exact date, not just a relative stamp. |
| `lat` / `lng` | Coordinates as published on the search-results page (no need to open the listing itself). |
| `images` | Photos as listed on the search-results card. |
| `partial` | `true` when this run stopped without Rightmove itself confirming there is nothing more — either `max_pages`/`max_items` was reached, or an unconfirmed empty page came back. `false` (and omitted by a `clean=true` Dataset read) once the source's own response confirmed a resolved result. Carried on every row, found or not. |
| `partial_reason` | Plain-English reason when `partial` is `true`; `null`/omitted otherwise. |

A not-found row looks like:

```json
{
    "location_identifier": "REGION^99999999",
    "deal_type": "sale",
    "found": false,
    "partial": true,
    "partial_reason": "page 1 returned 0 rows with no independent confirmation that the source actually has zero matches — could be a genuine empty result, or an unrecognized/broken page shape",
    "note": "Rightmove did not confirm zero listings for this location_identifier/deal_type — page 1 returned 0 rows with no independent confirmation that the source actually has zero matches — could be a genuine empty result, or an unrecognized/broken page shape",
    "scraped_at": "2026-08-01T05:11:01.840Z"
}
```

### API

Start a run with a bearer token and explicit JSON input:

```bash
curl -sS -X POST 'https://api.apify.com/v2/acts/zinin~rightmove-london/runs?waitForFinish=60' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"location_identifier":"REGION^87490","deal_type":"sale","max_items":5,"max_pages":1}'
```

Read Dataset rows using the returned `defaultDatasetId`:

```bash
curl -sS "https://api.apify.com/v2/datasets/$DEFAULT_DATASET_ID/items?clean=true&format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### MCP

For an Apify MCP client exposing the standard `call-actor` tool, send this exact payload:

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "zinin/rightmove-london",
    "input": {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "max_items": 5,
      "max_pages": 1
    }
  }
}
```

### Related Actors

Other real-estate portals on the same account, for a buyer weighing London against other markets.

| Actor | Use it when |
|---|---|
| [PropertyFinder.ae UAE Real Estate Listings](https://apify.com/zinin/propertyfinder-gulf) | A buyer priced out of London is comparing Dubai's tax-free market instead. |
| [Imovirtual Portugal Real Estate Listings](https://apify.com/zinin/imovirtual-lisbon) | Comparing London against a lower-cost EU, Golden-Visa-style alternative. |
| [Storia Romania Real Estate Listings](https://apify.com/zinin/storia-bucharest) | Adding an even cheaper EU entry-point market to the same portfolio. |
| [Realitica.com Adriatic Real Estate Listings](https://apify.com/zinin/realitica-adriatic) | Weighing a London buyer's holiday-home budget against Adriatic coastal pricing. |

### FAQ / Limitations

**Does this need a Rightmove account or API key?** No — it reads the same public
search pages a visitor sees, no login.

**Why is `price` sometimes `null` on a row?** The listing has no public asking
price ("POA" — price on application, common for very high-end commercial and
trophy residential listings). We don't invent a number for these.

**Why is `area_sqm` sometimes `null`?** Rightmove simply doesn't publish a floor
area for every listing — we report exactly what the source gives us, no guessing.

**What this is NOT.** This does not fetch the full photo gallery, floorplans, the
agent's phone number, or anything from the listing's own detail page — only what's
shown on the search-results list. It does not maintain a city-name-to-code lookup
table (Rightmove's `locationIdentifier` codes are not documented publicly) — you
supply the code you want, or use the London default.

Found a bug or need a custom variant (a different country's property portal, extra
fields)? Open an issue on the Actor page.

### Machine use

The Actor is callable through the Apify API, SDK, and Apify MCP server. The input and Dataset row are the machine-facing contract; `price`/`area_sqm` are `null` exactly when Rightmove itself doesn't publish a value (never a guess), and `partial`/`partial_reason` mark whenever a row's completeness wasn't independently confirmed by the source — an agent treating a run's results as the full market should check `partial` first.

# Actor input Schema

## `location_identifier` (type: `string`):

Rightmove's own opaque location code, format "TYPE^NUMBER" (e.g. "REGION^87490" for London). Rightmove does not publish a name-to-code lookup table; to find the code for another area, search that area on rightmove.co.uk and copy the `locationIdentifier` query parameter from the results page URL.

## `deal_type` (type: `string`):

"sale" for properties for sale, "rent" for properties to rent.

## `max_items` (type: `integer`):

Maximum number of listing rows to return in this run.

## `max_pages` (type: `integer`):

How many result pages (24 listings per page, per Rightmove) to walk before stopping.

## Actor input object example

```json
{
  "location_identifier": "REGION^87490",
  "deal_type": "sale",
  "max_items": 5,
  "max_pages": 1
}
```

# Actor output Schema

## `results` (type: `string`):

API URL for the default dataset items produced by this run.

# 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 = {
    "location_identifier": "REGION^87490",
    "deal_type": "sale",
    "max_items": 5,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/rightmove-london").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 = {
    "location_identifier": "REGION^87490",
    "deal_type": "sale",
    "max_items": 5,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/rightmove-london").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 '{
  "location_identifier": "REGION^87490",
  "deal_type": "sale",
  "max_items": 5,
  "max_pages": 1
}' |
apify call zinin/rightmove-london --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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