# Rightmove Scraper - UK Property Listings & Agents · $3/1K (`listingworks/rightmove-scraper`) Actor

Scrape Rightmove.co.uk homes for sale: price, beds, floor area, postcode district, listing date and agent. No proxy needed, one flat price per result, no contact details.

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

## Pricing

from $1.50 / 1,000 result items

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 — UK property listings, prices and agents

Rightmove is the UK's largest property site. This Actor turns its for-sale
search results into a clean table: what the property is, what it costs, where
it is, when it first went on the market, and which agent is selling it.

Press Start. The defaults return London listings in Rightmove's "newest
listed" order, with no configuration needed. In that order a price reduction
brings a listing back to the top, so an older home can sit among the new ones;
`posted_at` still tells you when it first appeared.

### What a row looks like

```json
{
  "title": "1 bedroom flat for sale",
  "listing_type": "sale",
  "property_type": "apartment",
  "layout": "1 bed, 1 bath",
  "bedrooms": 1,
  "price": 180000,
  "currency": "GBP",
  "postal_code": "SE18",
  "city": "London",
  "state": "",
  "address": "Ruston Road, London, SE18",
  "latitude": 51.49365,
  "longitude": 0.04899,
  "agency": "Mann, Woolwich",
  "posted_at": "2026-09-11T11:29:16Z",
  "updated_at": "2026-09-11T11:35:05Z",
  "source_url": "https://www.rightmove.co.uk/properties/93028365",
  "external_id": "93028365"
}
```

#### `rooms` and `bedrooms`

Property portals in different countries count different things, so this
catalogue keeps the two apart rather than putting whichever number a site
happens to publish into one column. `rooms` is a real room count. `bedrooms`
is a bedroom count. A site that publishes only one of the two leaves the other
out of the row entirely, so you never have to guess which quantity you are
looking at:

| Site | `rooms` | `bedrooms` |
|---|---|---|
| Willhaben (Austria) | yes | not published |
| Immowelt (Germany) | yes | not published |
| Bezrealitky (Czech Republic) | yes, from the `2+kk` layout | not published |
| Immoweb (Belgium) | not comparable, so left out | yes |
| Rightmove (UK) | not published | yes |

Immoweb does publish a `roomCount`, and it is not a room count in the sense the
other countries use: on one Gent search page a 102 m² three-bedroom flat
reported 1 and an 81 m² one-bedroom reported 9. Rather than ship a column that
cannot be compared, this Actor leaves `rooms` out and gives you `bedrooms`.
Rightmove publishes bedrooms and bathrooms and no total room count at all,
which is the British convention.

`living_area_sqm` appears when the listing gives a floor area, as it does on
about six listings in ten. Every row also carries `source_site` and
`scraped_at`; `floor` is always empty.

Agent names are included. Contact persons, phone numbers and email addresses
are never collected, and image URLs are deliberately not included — Rightmove's
terms restrict loading its images elsewhere, and this Actor respects that.

### What people use it for

Price monitoring, where you re-run a saved search on a schedule and watch a
postcode district or a town move. Agent and inventory research, where the
agent column matters as much as the homes. And feeding a valuation or
comparison tool that needs UK market data it cannot get from an official API.

### Input

| Field | What it does |
|---|---|
| `location` | A town, county or postcode district as Rightmove spells it (`Manchester`, `Greater Manchester`, `SW15`), a Rightmove `locationIdentifier` (`REGION^904`), or a Rightmove search URL. Leave empty for London. |
| `postedAfter` | Only keep listings that first appeared on or after this date (ISO 8601). A price cut does not make a listing new again. |
| `maxItems` | Hard stop, so your bill is predictable. |
| `proxyConfiguration` | Off by default. Most runs do not need one. |

There is no nationwide search on Rightmove, so a location is always used.
Ambiguous names resolve the way Rightmove resolves them (`Newport` is the
Welsh one); use the `locationIdentifier` from a Rightmove URL to pick the
other.

### How much one run returns

Rightmove serves 24 listings per page and stops at page 42, so one search
returns at most about 1,000 listings. Split by postcode district or town
across runs for more; duplicates are removed within a run.

### Pricing

$3.00 per 1,000 listings, dropping to $1.50 per 1,000 on higher Apify plans,
plus $0.005 each time a run starts. Platform usage is not passed on to you.

You are charged for rows you actually receive. If you set a maximum charge for
the run, it stops cleanly at that limit instead of overshooting it.

### Scope and limits

Public listings only, from the search results page. Floor, year built and
plot size are not on that page. Floor area is present on about six listings
in ten; postcode district on about three in four. "POA" listings have an
empty `price`. Tenure (freehold/leasehold) is not included.

Rightmove answers some mistakes with a normal page instead of an error — a
place name it does not know may resolve to a different place with a similar
name, and an unknown sort order silently becomes "highest price". This Actor
checks the place and the sort order Rightmove echoes back against what you
asked for and fails the run if they differ, rather than charging you for the
wrong rows.

If Rightmove changes its page structure, the run goes red. It does not return
zero rows and report success — a silent scraper is worse than a broken one,
because you find out weeks later.

A run that is blocked or cut short partway also goes red, even though the rows
it did collect are in the dataset and yours to keep. Red here means "this is
not the complete answer", not "you lost the data" — on a schedule, a run that
quietly came back short is the thing you most need to hear about.

Every run also publishes the site's own result count next to the rows it
delivered, so you can see "60 rows of 9,969 the site reports" without going
back to the site to check. That number is what the site says, not a promise
about what one run returns.

### Same data, other countries

This Actor shares its output shape with the Immoweb (Belgium), Willhaben
Immobilien (Austria) and Bezrealitky (Czech Republic) scrapers. A parser you
write for one keeps working on the others.

### Support

Open an issue on this Actor with the run ID and your input. Answered within
one business day.

# Actor input Schema

## `location` (type: `string`):

A town, county or postcode district as Rightmove knows it (e.g. Manchester, Cornwall, SW15), a locationIdentifier (e.g. REGION^87490), or a Rightmove search results URL. Leave empty for London. A name Rightmove resolves to a different place fails the run instead of returning that place.

## `postedAfter` (type: `string`):

Return only listings first shown on Rightmove at or after this date-time, e.g. 2026-09-01T00:00:00Z. Older listings that were reduced since are left out.

## `sinceDays` (type: `integer`):

Keep only listings posted in the last N days, counted in UTC from the day the run starts: 1 = yesterday and today. Made for a daily schedule. Ignored when Posted after is set.

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

Stop after this many listings. Rightmove shows at most 42 pages (about 1,000 listings) per search, so larger numbers need more locations.

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

Off by default. Turn on (residential, in the site's country) only if runs start getting blocked with 403/429.

## Actor input object example

```json
{
  "location": "",
  "postedAfter": "",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

All UK homes for sale from this run: what each one is, what it costs, and where.

## `pricing` (type: `string`):

The same listings reduced to the fields used for price analysis.

## `agencies` (type: `string`):

The same listings ordered around the estate agent branch selling them.

## `runReport` (type: `string`):

Pages read, records delivered, errors, and the verdict (ok, degraded or broken).

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("listingworks/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 = { "proxyConfiguration": { "useApifyProxy": False } }

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

```

## MCP server setup

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