# Rightmove Scraper (`solidcode/rightmove-co-uk-scraper`) Actor

\[💰 $0.9 / 1K] Extract property listings from Rightmove.co.uk — buy, rent, and sold prices. Search by location or paste URLs, filter by price, bedrooms, property type, and radius. Get full details: agent contacts, photos, floorplans, EPC, council tax, and more.

- **URL**: https://apify.com/solidcode/rightmove-co-uk-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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.

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

## Rightmove Scraper

Pull UK property listings from Rightmove.co.uk at scale — for-sale homes, rentals, and sold-price history with full agent contacts, photos, floorplans, full postcode and coordinates, council tax band, tenure, and nearest tube/train stations on the same flat row. Built for UK property investors, estate agents tracking competitors, lead-gen teams, and proptech / data platforms that need fresh Rightmove data without hand-crafting search URLs or maintaining a parser.

### Why This Scraper?

- **All three Rightmove channels in one actor** — for-sale, to-rent, and sold-price history. Auto-detected from the URL or chosen with a single dropdown.
- **Type a city, town, or postcode — no URL building required** — "London", "SW1A 1AA", "Newcastle upon Tyne" all resolve straight to Rightmove's location automatically. Competing scrapers force you to hand-craft `OUTCODE`-style search URLs; this actor does the lookup for you.
- **Nine property-type filters wired to Rightmove's UI** — Houses, Flats, Bungalows, Land, Commercial, Farms, Parking, New Homes, or Any.
- **Eleven radius bands** — `This area only`, 0.25, 0.5, 1, 3, 5, 10, 15, 20, 30, and 40 miles. Mirrors the dropdown on Rightmove's own search page.
- **Up to ~1,000 results per query** — paginates Rightmove's full ceiling: 42 pages of 24 on for-sale and rental searches, 40 pages of 25 on sold prices, before the platform caps further results.
- **Branch contact card on every for-sale and rental row** — branch name, phone (when published by the agent), branch landing page, profile URL, listings URL, logo, address, and full agent description HTML.
- **Tenure, council tax band, lease years and ground rent on the same row** — no extra request, no nested dataset. Freehold / leasehold / share-of-freehold, years remaining on the lease, and annual ground-rent and service-charge figures wherever the agent published them, plus a direct link to the listing's EPC certificate.
- **Nearest train and tube stations with walking distance** — name, distance, and station type (national rail, tube, light rail) per listing.
- **The 10 nearest schools with Ofsted ratings** — name, Ofsted grade, straight-line distance, age range, pupil count, faith affiliation, and state / independent status, plus a direct link to each school's Ofsted inspection report.
- **Machine-readable new-build, featured and premium flags** — `isNewHome`, `isFeatured` and `isPremiumListing` on every row, plus the raw `lozenges` badges, so you can separate genuine search matches from paid placements without reading a word of the listing copy.
- **Honest `maxResults` cap** — exact integer, no rounding to 50. Set 73 and you get 73 (or one full final page over — never trimmed to under-deliver).

### Use Cases

**Investment & Portfolio Analysis**

- Compare for-sale asking prices against sold-price history to surface under-priced listings
- Build CMA-style comparable lists by postcode, radius, and bedroom count
- Track rental yields by combining `rent` channel data with `sold` channel purchase data
- Monitor price reductions (`listingUpdateReason: "Reduced"`) across a target area

**Estate Agent Competitive Intelligence**

- Pull every active instruction for a competing branch via `agent.listingsUrl`
- Benchmark instruction volume by postcode month over month
- Track average days on market and reduction frequency by branch
- Map an agent's branch network across the UK

**Lead Generation**

- Build outreach lists for renovation contractors targeting recently-listed properties
- Source mortgage broker leads from new-build and high-priced listings
- Power conveyancer and removal-company campaigns by postcode and listing date
- Surface landlord targets via the `to-rent` channel for property-management pitches
- Compare nearby schools alongside listings (toggle `includeNearestSchools` on)

**Market Research & Journalism**

- Quantify housing supply by region with bedroom-count and price-band breakdowns
- Track new-build inventory across England, Scotland, Wales, and Northern Ireland
- Build longitudinal price-per-sqft datasets for media and policy reports
- Compare leasehold vs. freehold composition by city

**Proptech & Data Products**

- Power valuation models with structured prices, sqft, tenure and EPC bands where the agent published them
- Feed search portals with a fresh, normalised UK listing feed
- Build alerting systems triggered by new listings or price reductions in a target area
- Enrich existing CRM records with current Rightmove URLs and agent contacts

### Getting Started

#### Search by Location (simplest)

```json
{
    "searchLocation": "London",
    "channel": "buy",
    "maxResults": 50
}
```

#### Filtered Rental Search

Two-bed-plus rentals in Manchester under £1,500 pcm:

```json
{
    "searchLocation": "Manchester",
    "channel": "rent",
    "bedroomsMin": 2,
    "priceMax": 1500,
    "maxResults": 100
}
```

#### Sold-Price History

Pull the public sold-price record for a postcode area:

```json
{
    "searchLocation": "SW1A 1AA",
    "channel": "sold",
    "maxResults": 200
}
```

#### Full-Featured Search (filters + enrichment)

Three-bed houses around Oxford within five miles, sorted price-ascending, with price history and schools enabled:

```json
{
    "searchLocation": "Oxford",
    "channel": "buy",
    "propertyType": "houses",
    "bedroomsMin": 3,
    "bedroomsMax": 4,
    "priceMin": 400000,
    "priceMax": 800000,
    "radiusMiles": "5",
    "sortBy": "price-asc",
    "maxResults": 200,
    "includePriceHistory": true,
    "includeNearestSchools": true,
    "includeNearestStations": true
}
```

#### Paste a Rightmove URL

Search-results pages, individual property pages, and sold-price pages all work. Filters embedded in the URL — including draw-area polygons and Property Status — are honoured exactly:

```json
{
    "startUrls": [
        "https://www.rightmove.co.uk/property-for-sale/London.html",
        "https://www.rightmove.co.uk/properties/123456789",
        "https://www.rightmove.co.uk/house-prices/sw1a.html"
    ],
    "maxResults": 100
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste Rightmove URLs directly. Supports search results, individual property pages (`/properties/123456789`), and sold-price pages (`/house-prices/...`). Channel is auto-detected from the URL. |
| `searchLocation` | string | `"London"` | Type a city, town, area, or postcode (e.g. "London", "Manchester", "SW1A 1AA"). Resolved to Rightmove's location automatically. Leave empty if using Start URLs. |

#### Search Filters

These apply to **Search Location** only — URLs carry their own filters.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `channel` | select | `buy` | `For Sale (Buy)`, `To Rent`, or `Sold Prices`. |
| `propertyType` | select | `any` | `Any Type`, `Houses`, `Flats / Apartments`, `Bungalows`, `Land`, `Commercial`, `Farms`, `Parking`, or `New Homes`. |
| `bedroomsMin` | integer | *none* | Minimum bedrooms (0–10). |
| `bedroomsMax` | integer | *none* | Maximum bedrooms (0–10). |
| `priceMin` | integer | *none* | Minimum price in GBP. For rentals, this is monthly rent. |
| `priceMax` | integer | *none* | Maximum price in GBP. For rentals, this is monthly rent. |
| `radiusMiles` | select | `0` | Search radius: `This area only`, `0.25`, `0.5`, `1`, `3`, `5`, `10`, `15`, `20`, `30`, or `40` miles. |
| `sortBy` | select | `newest` | `Newest Listings`, `Oldest Listings`, `Price: Low to High`, or `Price: High to Low`. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Hard cap on listings across all inputs. `0` = unlimited. Results may slightly overshoot if the cap falls mid-page — you get the full last page rather than a trimmed one. |
| `includePriceHistory` | boolean | `false` | Fetch the historical sold-price record for each listing's address when available. Adds an extra request per listing. |
| `includeNearestSchools` | boolean | `false` | Include the 10 nearest schools with Ofsted ratings, distance, age range, pupil count and state / independent status. Adds an extra lookup per listing. |
| `includeNearestStations` | boolean | `true` | Include nearest train and tube stations with walking distance. |
| `includeSoldSTC` | boolean | `false` | Also return properties that are sold subject to contract, under offer, or let agreed. Rightmove hides these by default; the stage appears in `displayStatus`. |

### Output

Every listing is one flat row. The same shape applies across `buy`, `rent`, and `sold` — channel-specific fields (rental term, sold-date) populate when relevant and stay blank otherwise.

#### What's available per channel

| Field group | Buy | Rent | Sold |
|-------------|-----|------|------|
| Core (id, url, title, propertyType, bedrooms, price, displayAddress) | yes | yes | yes |
| Structured address (`postcode`, `outcode`, `incode`, `ukCountry`, `latitude`, `longitude`) | yes | yes | blank — Rightmove's sold-prices page does not expose these |
| Agent contact card (`agent.*`) | yes | yes | not applicable |
| Tenure (`tenure`, `yearsRemainingOnLease`) | yes | rarely — a tenancy has no tenure to state | yes |
| Council tax, EPC, features, images, floorplans | yes | yes | not applicable |
| Rental terms (`letAvailableDate`, `letType`, `furnishType`, `deposit`) | not applicable | yes | not applicable |
| Description (`description`, `descriptionHtml`) | yes | yes | not applicable — a sold-price record is a land-registry entry, not an advert |
| Transaction history (`priceHistory[]` — every recorded sale of that address, newest first) | on request | on request | yes, always |

A few row-level notes:

- `agent.phone` is populated when the branch has published a landline. Some withdrawn or let-agreed listings omit the phone — the field is present but blank.
- `epc.certificateUrl` links the listing's own EPC document and appears on roughly 6 in 10 for-sale and rental rows. `epc.currentRating` carries the A–G letter wherever the agent stated it in the listing, which works out at about 1 row in 5 across a typical mixed search and over half on Scottish searches, where the Home Report band is quoted as a matter of course. `epc.potentialRating` is different: agents almost never publish the potential band, so treat that one field as a rare bonus rather than a column to plan around. Where no letter is available you still get the certificate link.
- On `buy` and `rent` rows, `firstVisibleDate` and `listingUpdateDate` are full ISO timestamps. On `sold` rows they carry the land-registry completion date as Rightmove prints it (`"29 Apr 2026"`), because that is the only date the public record publishes.

#### Example: For-Sale Listing

```json
{
    "id": "123456789",
    "url": "https://www.rightmove.co.uk/properties/123456789",
    "channel": "buy",
    "title": "3 bed semi-detached house",
    "displayAddress": "Acacia Road, London, SW19",
    "postcode": "SW19 4HJ",
    "outcode": "SW19",
    "incode": "4HJ",
    "ukCountry": "England",
    "latitude": 51.4189,
    "longitude": -0.2014,
    "propertyType": "Semi-Detached",
    "bedrooms": 3,
    "bathrooms": 2,
    "sizeSqFeetMin": 1280,
    "sizeSqFeetMax": 1280,
    "price": 875000,
    "priceDisplay": "£875,000",
    "priceQualifier": "Guide Price",
    "pricePerSqFt": 683.59,
    "currency": "GBP",
    "firstVisibleDate": "2026-04-12T09:14:00Z",
    "listingUpdateDate": "2026-05-01T11:02:00Z",
    "listingUpdateReason": "Reduced on 01/05/2026",
    "displayStatus": "For Sale",
    "productLabel": "Premium",
    "isNewHome": false,
    "isFeatured": false,
    "isPremiumListing": true,
    "tenure": "Freehold",
    "councilTaxBand": "E",
    "tags": ["Garden", "Off-Street Parking"],
    "features": ["Three double bedrooms", "Modern kitchen", "Private garden"],
    "epc": { "currentRating": "C", "potentialRating": "B", "certificateUrl": "https://.../" },
    "images": ["https://media.rightmove.co.uk/img/1.jpg"],
    "floorplans": ["https://media.rightmove.co.uk/floorplan/1.jpg"],
    "agent": {
        "name": "Foxtons Wimbledon",
        "url": "https://www.rightmove.co.uk/estate-agents/agent/...",
        "phone": "020 1234 5678",
        "displayAddress": "12 The Broadway, Wimbledon, SW19 1RF",
        "profileUrl": "https://www.rightmove.co.uk/estate-agents/...",
        "listingsUrl": "https://www.rightmove.co.uk/property-for-sale/branch/..."
    },
    "nearestStations": [
        { "name": "Wimbledon", "distance": 0.4, "unit": "miles", "types": ["NATIONAL_TRAIN", "TUBE"] }
    ],
    "scrapedAt": "2026-05-07T10:30:00Z"
}
```

#### Example: Sold-Price Record

A sold row is a land-registry entry, so it carries no advert copy, agent, or photos — but it does carry every recorded sale of that address:

```json
{
    "id": "5ffe93f9-bef3-497e-ace0-a8101e10ae23",
    "url": "https://www.rightmove.co.uk/house-prices/details/5ffe93f9-...",
    "channel": "sold",
    "title": "2 bed Terraced",
    "displayAddress": "40, Burnham Road, Birmingham B47 6AT",
    "propertyType": "Terraced",
    "bedrooms": 2,
    "price": 270000,
    "priceDisplay": "£270,000",
    "currency": "GBP",
    "tenure": "Freehold",
    "firstVisibleDate": "29 Apr 2026",
    "displayStatus": "Sold",
    "sold": true,
    "archived": true,
    "priceHistory": [
        { "date": "29 Apr 2026", "price": 270000, "event": "sold" },
        { "date": "29 Nov 2023", "price": 272000, "event": "sold" }
    ],
    "scrapedAt": "2026-08-19T16:12:00Z"
}
```

`priceHistory` is where the sold data lives: one entry per completed transaction, newest first, so a single row shows you both the latest sale price and what the property changed hands for last time.

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Rightmove listing identifier |
| `url` | string | Canonical Rightmove URL |
| `channel` | string | `buy`, `rent`, or `sold` |
| `title` | string | Short headline built from bed count and property type — `"3 bed semi-detached house"` on for-sale and rental rows, `"2 bed Terraced"` on sold rows |
| `propertyType` | string | Sub-type (Semi-Detached, Flat, Bungalow, etc.) |
| `bedrooms` | integer | Number of bedrooms |
| `bathrooms` | integer | Number of bathrooms |
| `sizeSqFeetMin` | integer | Lower bound of internal size |
| `sizeSqFeetMax` | integer | Upper bound of internal size |
| `tags` | string\[] | Listing tags (`Garden`, `Parking`, etc.) |
| `description` | string | Plain-text description |
| `descriptionHtml` | string | HTML description |
| `features` | string\[] | Bullet-point key features |
| `scrapedAt` | string | ISO timestamp of extraction |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `displayAddress` | string | Address as shown on the listing |
| `postcode` | string | Full UK postcode where available |
| `outcode` | string | Postcode prefix (e.g. `SW19`) |
| `incode` | string | Postcode suffix (e.g. `4HJ`) |
| `ukCountry` | string | England, Scotland, Wales, or Northern Ireland |
| `latitude` | number | Coordinate |
| `longitude` | number | Coordinate |

#### Pricing & Status

| Field | Type | Description |
|-------|------|-------------|
| `price` | integer | Numeric price in GBP |
| `priceDisplay` | string | Formatted price (`£725,000`, `£1,500 pcm`) |
| `priceQualifier` | string | `Guide Price`, `Offers Over`, `POA`, etc. |
| `secondaryPrice` | string | Weekly equivalent for rentals where shown |
| `pricePerSqFt` | number | Asking price per square foot, on listings where Rightmove publishes a floor area |
| `currency` | string | Always `GBP` |
| `firstVisibleDate` | string | ISO timestamp of first listing (`buy` / `rent`); the printed completion date on `sold` rows |
| `listingUpdateDate` | string | ISO timestamp of last update (`buy` / `rent`); the printed completion date on `sold` rows |
| `listingUpdateReason` | string | `Added on 12/06/2026`, `Reduced today`, `Added yesterday`, etc. |
| `displayStatus` | string | `For Sale` / `To Rent` while available, then `Sold STC`, `Under offer`, or `Let agreed` (turn on **Include Sold STC** to receive those) |
| `productLabel` | string | `Featured`, `Premium`, or `Standard` |
| `isNewHome` | boolean | New build or part of a development — filter your results yourself without reading the copy |
| `isFeatured` | boolean | Paid featured placement, so you can tell promoted listings from plain search matches |
| `isPremiumListing` | boolean | Paid premium placement |
| `lozenges` | string\[] | Rightmove's own badges on the listing, e.g. `["NEW_HOME"]` |
| `archived` | boolean | Listing archived |
| `published` | boolean | Listing published |
| `sold` | boolean | Listing has sold |

#### Tenure, Tax & Running Costs

| Field | Type | Description |
|-------|------|-------------|
| `tenure` | string | Freehold, Leasehold, or Share of Freehold |
| `yearsRemainingOnLease` | integer | Lease years remaining (leaseholds only) |
| `councilTaxBand` | string | A through H |
| `councilTaxExempt` | boolean | Property exempt from council tax |
| `councilTaxIncluded` | boolean | Council tax bundled in rent |
| `domesticRates` | string | Northern Ireland equivalent |
| `annualGroundRent` | number | Annual ground rent in GBP (pence preserved) |
| `annualServiceCharge` | number | Annual service charge in GBP (pence preserved) |
| `groundRentPercentageIncrease` | number | Stated annual escalator |
| `groundRentReviewPeriodInYears` | integer | Years between ground-rent reviews |

#### Rental-Specific Fields

Populated when `channel: "rent"`.

| Field | Type | Description |
|-------|------|-------------|
| `letAvailableDate` | string | Available-from date |
| `deposit` | integer | Required deposit in GBP |
| `minimumTermInMonths` | integer | Minimum tenancy length |
| `letType` | string | `Long term`, `Short term`, `Student` |
| `furnishType` | string | `Furnished`, `Unfurnished`, `Part Furnished` |

#### Energy, Highlights & Media

| Field | Type | Description |
|-------|------|-------------|
| `epc` | object | `{currentRating, potentialRating, certificateUrl}` — `certificateUrl` on ~6 rows in 10, `currentRating` (A–G) wherever the agent stated the band, `potentialRating` rarely |
| `highlights` | object | `electricity`, `broadband`, `water`, `sewerage`, `heating`, `accessibility`, `parking`, `garden`, `risks`, `obligations` |
| `images` | string\[] | All property photo URLs |
| `floorplans` | string\[] | All floorplan image URLs |
| `brochures` | string\[] | Linked brochure PDFs |

#### Agent Contact

| Field | Type | Description |
|-------|------|-------------|
| `agent.name` | string | Branch / agency display name |
| `agent.phone` | string | Branch contact number |
| `agent.url` | string | Branch landing page |
| `agent.profileUrl` | string | Agency profile page. Rightmove serves the branch landing page and the agency profile at the same address, so this normally matches `agent.url` |
| `agent.listingsUrl` | string | Page listing every active instruction at this branch |
| `agent.displayAddress` | string | Branch street address |
| `agent.logoUrl` | string | Agency brand logo |
| `agent.descriptionHtml` | string | Agency description (HTML) |

#### Optional Sub-Collections

| Field | Type | Description |
|-------|------|-------------|
| `nearestStations` | object\[] | `[{name, distance, unit, types}]` — populated by default |
| `nearestSchools` | object\[] | `[{name, type, subType, distance, unit, ofstedRating, ratingBody, inspectionReportUrl, ageRangeMin, ageRangeMax, pupilCount, gender, religion, latitude, longitude}]` — the 10 nearest, closest first, populated when toggled on |
| `priceHistory` | object\[] | `[{date, price, event}]` — every recorded sale of the address, newest first. Always present on `sold` rows; on `buy` / `rent` rows populated when **Include Price History** is on |

### Tips for Best Results

- **Use full city names for ambiguous places.** "Newcastle" alone resolves to Newcastle in Northern Ireland — type "Newcastle upon Tyne" for the English city. Same applies to "Bromley" and any other shared place name.
- **Paste a Rightmove URL when you need a filter the input form doesn't expose.** Draw-area polygon searches, "Auction" property status, "Include Sold STC", and Rightmove's "Look 2 / 3 bedrooms" combinations all serialise into the URL — paste it as a `startUrls` entry and every URL parameter is honoured exactly.
- **Use `channel: "sold"` for true comparables.** Sold-price history is the gold standard for valuation work and CMA reports — actual transaction prices, not asking prices.
- **Rightmove caps any single search at roughly 1,000 listings.** For large areas, split the run into multiple postcodes or smaller radii rather than expecting one search to return more.
- **Keep `includePriceHistory` off unless you need it.** It adds an extra request per listing and roughly doubles run time. Default rows already include the most recent listing-update reason and date.
- **Sort by `oldest` to find stale listings.** Properties on the market for many months are often signs of price misalignment — useful for negotiation and for spotting overpriced inventory.
- **Set `radiusMiles` to expand commuter searches.** Buyers prepared to live within 5 or 10 miles of a city centre find materially better value once you step outside the immediate postcode.
- **Treat a `newest`-sorted run over a busy market as a moving window, not a snapshot.** Rightmove counts results from the top of a live list, so in a city like London or Manchester properties listed while your run is in progress push everything down a place. You still get every result once — duplicates are removed for you and never billed twice — but the set spans the minutes the run took rather than a single instant. When you need a clean point-in-time cut, sort by `oldest` or narrow the area so the run finishes faster.
- **Compare like with like when you join `sold` to `buy` data.** Sold rows come from the public land-registry record, so they carry the completion date and full transaction history but no agent, photos, or description. Join the two channels on `displayAddress` rather than expecting one row to hold both.

### Pricing

**From $0.75 per 1,000 results** — one flat rate whether you pull a plain listing or a fully enriched row with schools, stations and price history. No compute or time-based charges: you pay per result, plus a small fixed start fee each time a run begins. Bronze, Silver, and Gold subscribers pay progressively less, and the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.090 | $0.086 | $0.081 | $0.075 |
| 1,000 | $0.90 | $0.86 | $0.81 | $0.75 |
| 10,000 | $9.00 | $8.60 | $8.10 | $7.50 |
| 100,000 | $90.00 | $86.00 | $81.00 | $75.00 |

A "result" is one property row in your dataset. Duplicate properties are removed before they reach the dataset, so you are never billed twice for the same listing. Standard Apify platform fees apply on top.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is intended for legitimate property research, market analysis, lead generation, and proptech use cases. Users are responsible for complying with Rightmove's Terms of Service, the UK Data Protection Act, and the GDPR when handling any personal data contained in agent contact fields. Do not use extracted data for spam, harassment, or any unlawful purpose.

# Actor input Schema

## `startUrls` (type: `array`):

Paste Rightmove URLs directly. Supports search results for homes and for commercial property — both the /find.html page you land on after searching and the shorter pages you get from Google (e.g. /property-for-sale/London.html or /property-for-sale/London-87490/2-bed-flats.html) — plus individual property pages (/properties/123456789) and sold-price pages (/house-prices/...). The scraper auto-detects buy / rent / sold and residential / commercial from the URL. The URL always wins: filters set in the URL are kept as-is, and the settings below are only used to fill in what the URL doesn't already specify. Anything that can't be applied is listed in the run log.

## `searchLocation` (type: `string`):

Type a city, town, area, or postcode (e.g. "London", "Manchester", "SW1A 1AA"). We resolve it to Rightmove's location automatically — no need to copy a URL. Leave empty if using Start URLs above.

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

What kind of listings to find. Only applies to Search Location — when using URLs, the channel is taken from the URL itself.

## `propertyType` (type: `string`):

Filter by property category. Applies to Search Location, and to a pasted search URL that doesn't already specify a property type. Commercial, farms and parking only exist in commercial listings, so they can't be applied to a residential URL (and vice versa).

## `bedroomsMin` (type: `integer`):

Only include properties with at least this many bedrooms. Leave empty for any.

## `bedroomsMax` (type: `integer`):

Only include properties with at most this many bedrooms. Leave empty for any.

## `priceMin` (type: `integer`):

Only include properties at or above this price in GBP. For rentals, this is the monthly rent. Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include properties at or below this price in GBP. For rentals, this is the monthly rent. Leave empty for no maximum.

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

Expand the search to include properties within this many miles of the location. Mirrors Rightmove's UI.

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

Sort order for search results.

## `maxResults` (type: `integer`):

Maximum number of property listings to return across all URLs and searches. Set to 0 for unlimited. Note: results may slightly overshoot if the cap falls in the middle of a page — you get the full last page.

## `includePriceHistory` (type: `boolean`):

Fetch the historical sold-price record for each listing's address (if available). Adds an extra request per listing — slower but useful for investment analysis.

## `includeNearestSchools` (type: `boolean`):

Include the 10 nearest schools for each listing — name, Ofsted rating, distance, age range, pupil count and state/independent status. Adds an extra lookup per listing, so runs take a little longer.

## `includeSoldSTC` (type: `boolean`):

Also return properties that are already sold subject to contract, under offer, or let agreed. Rightmove hides these by default. Turn this on to see them, with the stage shown in the Status column.

## `includeNearestStations` (type: `boolean`):

Include the nearest train and tube stations with walking distance. Free — comes from the same property page.

## Actor input object example

```json
{
  "startUrls": [],
  "searchLocation": "London",
  "channel": "buy",
  "propertyType": "any",
  "radiusMiles": "0",
  "sortBy": "newest",
  "maxResults": 100,
  "includePriceHistory": false,
  "includeNearestSchools": false,
  "includeSoldSTC": false,
  "includeNearestStations": true
}
```

# Actor output Schema

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

Compact table of scraped property listings with key fields.

## `details` (type: `string`):

Every field for every listing — agent contacts, EPC, council tax, lease info, full description.

# 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 = {
    "startUrls": [],
    "searchLocation": "London",
    "channel": "buy",
    "propertyType": "any",
    "radiusMiles": "0",
    "sortBy": "newest",
    "maxResults": 100,
    "includePriceHistory": false,
    "includeNearestSchools": false,
    "includeSoldSTC": false,
    "includeNearestStations": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/rightmove-co-uk-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 = {
    "startUrls": [],
    "searchLocation": "London",
    "channel": "buy",
    "propertyType": "any",
    "radiusMiles": "0",
    "sortBy": "newest",
    "maxResults": 100,
    "includePriceHistory": False,
    "includeNearestSchools": False,
    "includeSoldSTC": False,
    "includeNearestStations": True,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/rightmove-co-uk-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 '{
  "startUrls": [],
  "searchLocation": "London",
  "channel": "buy",
  "propertyType": "any",
  "radiusMiles": "0",
  "sortBy": "newest",
  "maxResults": 100,
  "includePriceHistory": false,
  "includeNearestSchools": false,
  "includeSoldSTC": false,
  "includeNearestStations": true
}' |
apify call solidcode/rightmove-co-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/rightmove-co-uk-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/Lk32eygLuQzXVW0eS/builds/G82VlWVXt8WaYXzXX/openapi.json
