# Rightmove + AI Deal Scoring $0.95💰 Buy·Rent·Sold·Agents (`memo23/rightmove-scraper`) Actor

\[💰$0.95/1K] All-in-one Rightmove — Buy · Rent · Agents · Commercial · Overseas · Sold Prices, ~100 fields. Plus opt-in AI per area ($0.15): DEAL SCORING — ROI, cashflow, payback & best strategy, ranked — with yields, short-let ADR & occupancy, demand signals. Pay-per-result, free trial.

- **URL**: https://apify.com/memo23/rightmove-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, AI, Agents
- **Stats:** 195 total users, 53 monthly users, 98.1% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.95 / 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/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 Scraper — Buy · Rent · Agents · Commercial · Overseas · House Prices

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/rightmove-logo.png" alt="Rightmove Scraper" width="200">
</p>

The most complete Rightmove.co.uk scraper on Apify — **eight search modes in one actor**: properties for sale, properties to rent, estate agents, commercial sale, commercial let, sold house prices, overseas sale, overseas rent. Paste any Rightmove URL or build a search from filter fields. Pure HTTP, no browser, ~100 fields per listing including historic sold prices, floor plans, EPC, and full agent metadata.

| Input | Row(s) emitted |
|---|---|
| **Property search URL** (sale / rent / commercial / overseas) | N property rows — one per listing, auto-paginates the full result set |
| **Direct property URL** — `/properties/{id}` | 1 property row with full mobile-API payload |
| **Estate agent search URL** | N agent rows — one per branch/agent |
| **House prices URL** — `/house-prices/{postcode}.html` | N sold-history rows — sold prices, dates, property type |
| **Search filter form** (no URL needed) | Same as above — actor builds the URL from your filters |

> **Pure HTTP. No Puppeteer, no Playwright, no headless Chromium, no third-party CAPTCHA solver.**

***

### 🧠 NEW: AI Market Intelligence + Investment Deal Scoring — listings → ranked deals

Flip on **`marketAnalysis`** and the scraper doesn't just return listings — it returns an **investment read on every area it scrapes**. After the crawl, one AI pass per outcode (backed by live web research) computes rental economics, short-let potential and demand drivers:

> *E14 · Canary Wharf, real run →* avg local rent **£1,900/mo** · short-let **ADR £212 · 87% occupancy · ~£5,527/mo est. revenue** · demand: *corporate weekday stays (HSBC, Citi, JP Morgan), O2/Greenwich weekend tourism* · risks: *Tower Hamlets 90-night annual cap, lease restrictions on short-lets, Flood Zone 3 pockets*.

One `marketAnalysis` row per area **with cited sources**, cached 90 days so repeat lookups of the same area don't re-charge. Paid plans only, **$0.15 per fresh area analysis** — areas with fewer than 3 scraped listings are skipped and never billed.

**And it now scores the deals for you — free with the same analysis.** Every listing in an analyzed area is scored against those comps: **ROI, monthly cashflow, payback, and the best strategy** (buy-to-let vs rent-to-serviced-accommodation), **ranked best-first**, with data-quality flags (auction guides, shared-ownership shares, price anomalies). Each `marketAnalysis` row carries a `deals` array + a `dealsSummary` with the top clean deal — the "what's actually worth buying here" feed, at no extra charge.

> *E3 · real run →* £300k 1-bed → **11.8% ROI (R2SA)**, £931/mo cashflow, 102-mo payback · £400k 2-bed → 5.6% ROI · ranked best-first, anomalies flagged.
>
> 💡 Tip: set **Sort = Newest** for the widest spread of deals — the default price-descending sort clusters listings at your price cap.

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-deals.png" alt="How deal scoring works">
</p>

***

### Why use this scraper

- **Eight modes in one actor.** Most Rightmove scrapers only handle sale + rent. This one covers commercial property, overseas listings, sold house prices, and estate-agent directories — without switching tools or paying for separate actors.
- **Historic sold prices.** Pull a property's full sale history (price + year for every prior transaction) so you can spot growth corridors and price drops.
- **Floor plans + EPC + media.** Direct URLs to PDF floor plans, energy-performance certificates, virtual tours, and full-size image sets.
- **Agent intelligence.** Brand, branch ID, phone, agent type (Sales / Lettings / Commercial), and the agent's full Rightmove profile URL — useful for B2B lead generation.
- **Smart input.** Paste any Rightmove URL OR fill the filter form (location, radius, beds, price, sort, SSTC/Let-Agreed flags). The actor auto-resolves location names → Rightmove identifiers.
- **Monitoring mode.** On rerun, only emit listings that are new since the last run — perfect for daily watchlists or new-build alerts.
- **JSON or CSV.** Standard Apify dataset export. Stream live or download after the run.

***

### Overview

The actor classifies each input by URL pattern (sale / rent / commercial / overseas / agents / house-prices) and routes it through a matching internal handler. For listing searches, it hits Rightmove's mobile API for the bulk fetch then fans out to individual property endpoints with bounded concurrency. Each row is **flat** (no nested arrays of mixed shapes) and **typed** by the URL it came from — so a sale row, a rent row, an agent row, and a sold-house-price row all sit cleanly side-by-side in the same dataset, distinguishable by `transactionType` / `channel` / route metadata.

> **One row = one paid result.** No hidden multipliers, no per-page surcharges. Reviews, images, and floor plans are bundled into the property row, not billed separately.

***

### Supported inputs

You can mix any of these in a single run; the actor classifies and routes each one automatically.

#### Search URLs (any mode)

```
https://www.rightmove.co.uk/property-for-sale/find.html?...        ← For Sale
https://www.rightmove.co.uk/property-to-rent/find.html?...         ← To Rent
https://www.rightmove.co.uk/commercial-property-for-sale/find.html?...   ← Commercial sale
https://www.rightmove.co.uk/commercial-property-to-let/find.html?...     ← Commercial let
https://www.rightmove.co.uk/overseas-property/find.html?...        ← Overseas
https://www.rightmove.co.uk/house-prices/{outcode}.html?...        ← Sold prices
https://www.rightmove.co.uk/estate-agents/find.html?...            ← Estate agents
```

#### Direct entity URLs

```
https://www.rightmove.co.uk/properties/{propertyId}                ← Single listing
https://www.rightmove.co.uk/estate-agents/agent/{name}-{branchId}.html  ← Agent branch
```

#### Filter form (no URL)

If you don't have a URL handy, fill the filter section: search mode, location, radius, price range, bedrooms, must-haves, sort. The actor builds a working Rightmove search URL from your inputs and runs it.

#### Not yet supported

- Floor-plan PDFs are linked in the output but not downloaded into the dataset
- `propertyDisclaimer` text comes from Rightmove as HTML (intentional — keep the markup if you need to render it back)

***

### Use cases

| Audience | What they use it for |
|---|---|
| **Property investors** | Track new listings + price changes in target postcodes; pull historic sold prices to model growth |
| **Estate agencies** | Competitor branch monitoring, agent benchmarking, new-stock alerts |
| **PropTech & analytics** | Build datasets for AVMs, yield calculators, rent-vs-buy comparisons |
| **Buy-to-let / portfolio managers** | Daily rent-monitoring across multiple boroughs; let-agreed tracking |
| **Researchers & journalists** | Sold-price datasets by postcode, region, or property type |
| **B2B lead-gen** | Estate-agent directory pulls — branch + phone + brand + agent type |

#### What the ROI math looks like

Say you monitor 15,000 London rentals daily. At `$0.95 / 1,000 rows` and one full refresh per day, that's **~$0.43 / day = $13 / month** — vs $500/month for an enterprise PropTech feed, or the recurring cost of building and maintaining a custom Rightmove crawler. The actor handles pagination, retries, session rotation, and listing-detail enrichment for you.

***

### How it works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-rightmove.png" alt="How Rightmove Scraper works">
</p>

1. **Classify input.** Each `startUrls` entry is matched against Rightmove URL patterns to determine its route — search, property detail, agent, or house-prices.
2. **Fetch with HTTP only.** No browser, no headless Chrome. Rightmove's mobile API (`api.rightmove.co.uk/api/v2/properties/{id}`) returns rich JSON; search pages are JSON-API too (`/api/property-search/listing/search`).
3. **Parse + denormalize.** Each property row is flattened from the API payload — ~100 fields including bedrooms, address, price (with currency code), agent, branch, full image set, key features, EPC, floor plan URL.
4. **Optional enrichment.** With `moreDetails: true`, the actor fetches the property's full web page for extra fields not in the mobile API. With `includeSaleHistory: true`, it pulls the sold-prices endpoint and embeds the result into the row.
5. **Concurrent + bounded.** Internal handler runs at concurrency 20 per page with `min/maxConcurrency` for the Crawlee fallback layer. `maxRequestRetries` controls retry budget per URL.
6. **Push.** Every parsed row is `Actor.pushData()`-ed live. The dataset is queryable mid-run; the run isn't paused waiting for the full batch.

***

### Input configuration

The actor takes **either** a list of URLs **or** a filled-in filter form. If both are present, `startUrls` wins.

#### Common fields

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | `array<{url}>` | one of the two | Any Rightmove URL — sale, rent, commercial, overseas, agents, house-prices, or direct property page. |
| `maxItems` | `integer` | no | Cap on total dataset rows. Default `10,000`. Non-paying users capped at 100. |
| `monitoringMode` | `boolean` | no | If `true`, only emit listings that are new since the last run (uses Apify KV store). Default `false`. |
| `moreDetails` | `boolean` | no | Fetch the property's full HTML page in addition to the mobile API. Default `false`. |
| `includeSaleHistory` | `boolean` | no | For sale + rent: embed the property's prior-sale history if available. Default `false`. |
| `maxConcurrency` | `integer` | no | Crawlee fallback concurrency. Default `10`. |
| `maxRequestRetries` | `integer` | no | Per-URL retry budget. Default `100`. |
| `proxy` | `object` | no | Apify residential proxy recommended. Default `{ useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'] }`. |

#### Search-builder fields (alternative to `startUrls`)

Use these if you don't have a Rightmove URL ready.

| Field | Type | Notes |
|---|---|---|
| `searchMode` | `enum` | One of `propertySale`, `propertyRent`, `estateAgents`, `commercialSale`, `commercialRent`, `housePrices`, `overseasSale`, `overseasRent`. |
| `searchLocation` | `string` | Friendly label like `"London"` or `"NW3"`. The actor resolves it to a Rightmove identifier. |
| `searchLocationIdentifier` | `string` | Explicit identifier (more reliable). Examples: `REGION^87490` (London), `OUTCODE^1859` (NW3), `POSTCODE^4812813` (E14 0XG), `STATION^5462` (Leeds Station). |
| `searchRadius` | `enum` | `0.0` to `40.0` miles. |
| `searchMinPrice` / `searchMaxPrice` | `string` | Price range. |
| `searchMinBedrooms` / `searchMaxBedrooms` | `string` | Bedroom range. |
| `searchPropertyTypes` | `array<string>` | Optional. Joined into Rightmove's `propertyTypes` parameter. |
| `searchMustHave` / `searchDontShow` | `array<string>` | Rightmove's mustHave / dontShow filters. |
| `searchKeywords` | `string` | Free-text keyword filter. |
| `searchIncludeSSTC` | `boolean` | For sale mode — include Sold STC listings. |
| `searchIncludeLetAgreed` | `boolean` | For rent mode — include Let Agreed listings. |
| `searchFurnishTypes` / `searchLetType` | — | For rent mode (e.g. `shortTerm`). |
| `searchBrandName` / `searchBranchType` | — | For estate-agent mode. |
| `searchDisplayPropertyType` | `enum` | For commercial: `industrial_warehousing`, `offices`, `retail`, `leisure`, `land`, `other_commercial`. |
| `searchOutcodeOrPostcode` | `string` | **Required** for `housePrices` mode. E.g. `NW3`, `W9 2BA`. |
| `searchSoldIn` | `string` | For housePrices — years window. |
| `searchPropertyType` / `searchTenure` | `string` | For housePrices — `FLAT`, `DETACHED`, `SEMI_DETACHED` / `LEASEHOLD`, `FREEHOLD`. |
| `searchCountry` | `string` | **Required** for overseas modes. E.g. `Portugal`, `Spain`, `France`. |
| `searchSort` | `string` | Rightmove `sortType` (e.g. `2` = price asc, `6` = newest). |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=500000&minBedrooms=2&sortType=6" },
    { "url": "https://www.rightmove.co.uk/properties/163602461" },
    { "url": "https://www.rightmove.co.uk/house-prices/nw3.html?soldIn=1" },
    { "url": "https://www.rightmove.co.uk/estate-agents/find.html?locationIdentifier=OUTCODE^1859&branchType=ALL" }
  ],
  "maxItems": 500,
  "moreDetails": true,
  "includeSaleHistory": true,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

***

### Output overview

Each row is a single Rightmove entity — a property, an agent branch, or a sold-price record. The shape varies slightly by route, but they all share:

- `identifier` / `propertyId` — Rightmove's primary key for the entity
- `transactionType` — `BUY`, `RENT`, `RES_LET`, `COMMERCIAL_SALE`, `COMMERCIAL_LET`, etc.
- `channel` — Rightmove's internal channel tag
- `propertyUrl` — canonical Rightmove URL (clickable)
- The full mobile-API payload, flattened

***

### Output samples

#### Sale / Rent property row (truncated)

```json
{
  "identifier": 163602461,
  "transactionType": "RENT",
  "channel": "RES_LET",
  "bedrooms": 1,
  "bathrooms": 1,
  "address": "Woodfield Road, London, W9",
  "propertyPhrase": "1 bedroom apartment",
  "propertyUrl": "https://www.rightmove.co.uk/properties/163602461",
  "keyFeatures": [
    "Bills and utilities included",
    "Fully furnished private studio",
    "En suite bathroom",
    "Smart TV and superfast wi-fi",
    "Regular housekeeping",
    "Air conditioning"
  ],
  "fullDescription": "Westbourne Park champions living differently…",
  "listingUpdateReason": "Added on 20/06/2025",
  "prices": {
    "primaryPrice": "£2,800 pcm",
    "secondaryPrice": "£646 pw",
    "displayPriceQualifier": null,
    "currencyCode": "GBP"
  },
  "location": {
    "latitude": 51.5198,
    "longitude": -0.2061,
    "postcode": "W9",
    "city": "London"
  },
  "images": [
    { "url": "https://media.rightmove.co.uk/...", "caption": "Living room" }
  ],
  "floorplans": [
    { "url": "https://media.rightmove.co.uk/.../floorplan.pdf" }
  ],
  "epcGraphs": [
    { "url": "https://media.rightmove.co.uk/.../epc.pdf" }
  ],
  "tags": ["BUILT_FOR_RENTERS", "NEW_HOME"],
  "features": {
    "heating":       [{ "alias": "air_conditioning", "displayText": "Air conditioning" }],
    "accessibility": [{ "alias": "lift_access",      "displayText": "Lift access" }],
    "parking":       [{ "alias": "on_street",        "displayText": "On street" }]
  },
  "customer": {
    "branchId": 289715,
    "branchName": "Westbourne Park, Westbourne Park",
    "brandPlus": true,
    "customerProfileUrl": "https://www.rightmove.co.uk/estate-agents/agent/Westbourne-Park/Westbourne-Park-289715.html",
    "displayAddress": "Westbourne Park, Westbourne Park"
  },
  "propertyDisclaimer": "<b>Disclaimer</b> - Property reference CB3M. The information displayed about this property comprises a property advertisement…",
  "schoolCheckerUrl": "https://www.rightmove.co.uk/properties/apps/163602461/schools"
}
```

#### Estate agent row (truncated)

```json
{
  "branchId": 289715,
  "brandName": "Westbourne Park",
  "branchName": "Westbourne Park",
  "branchType": "LETTINGS",
  "phone": "020 4537 9281",
  "address": "Westbourne Park, London W9",
  "profileUrl": "https://www.rightmove.co.uk/estate-agents/agent/Westbourne-Park/Westbourne-Park-289715.html",
  "propertiesForSaleCount": 0,
  "propertiesToRentCount": 18,
  "logoUrl": "https://media.rightmove.co.uk/branch/289715-logo.png"
}
```

#### House-prices sold row (truncated)

```json
{
  "rowType": "soldPrice",
  "address": "12 Rosslyn Hill, London, NW3 5UL",
  "propertyType": "FLAT",
  "tenure": "LEASEHOLD",
  "soldPrice": 875000,
  "soldDate": "2024-09-12",
  "bedrooms": 2,
  "detailUrl": "https://www.rightmove.co.uk/house-prices/details/...",
  "saleHistory": [
    { "year": 2018, "price": 620000 },
    { "year": 2011, "price": 415000 }
  ]
}
```

***

### Key output fields

#### Identity

| Field | Type | Notes |
|---|---|---|
| `identifier` / `propertyId` | number | Rightmove's primary key |
| `propertyUrl` | URL | Canonical Rightmove URL |
| `transactionType` | enum | `BUY`, `RENT`, `RES_LET`, `COMMERCIAL_SALE`, `COMMERCIAL_LET` |
| `channel` | enum | `BUY`, `RENT`, `RES_LET`, etc. |

#### Price + currency

| Field | Type | Notes |
|---|---|---|
| `prices.primaryPrice` | string | Headline display price (`"£500,000"`, `"£2,800 pcm"`) |
| `prices.secondaryPrice` | string | Per-week or per-sqft equivalent |
| `prices.displayPriceQualifier` | string | `"Guide Price"`, `"Offers Over"`, etc. |
| `prices.currencyCode` | enum | `GBP`, `EUR`, `USD` (overseas) |

#### Property attributes

| Field | Type | Notes |
|---|---|---|
| `bedrooms` / `bathrooms` | number | |
| `propertyPhrase` | string | `"3 bedroom semi-detached house"` |
| `keyFeatures` | string\[] | Bulleted list from the listing |
| `fullDescription` | string | Multi-paragraph description |
| `tags` | string\[] | `NEW_HOME`, `BUILT_FOR_RENTERS`, `SHARED_OWNERSHIP`, … |

#### Location

| Field | Type | Notes |
|---|---|---|
| `location.latitude` / `longitude` | number | |
| `location.postcode` | string | |
| `location.city` | string | |
| `address` | string | Full display address |

#### Media

| Field | Type | Notes |
|---|---|---|
| `images[]` | array | `{ url, caption }` |
| `floorplans[]` | array | `{ url }` (PDF or image) |
| `epcGraphs[]` | array | EPC certificate URL |
| `videoUrl` | URL | If present |
| `virtualTourUrl` | URL | If present |

#### Agent

| Field | Type | Notes |
|---|---|---|
| `customer.branchId` | number | |
| `customer.branchName` | string | |
| `customer.brandPlus` | boolean | Premium-brand flag |
| `customer.customerProfileUrl` | URL | Agent's Rightmove profile page |
| `customer.displayAddress` | string | |

#### Sale history (`includeSaleHistory: true`)

| Field | Type | Notes |
|---|---|---|
| `saleHistory[]` | array | `{ year, price }` for every prior sale of this property |

#### Sold-price entity (house-prices mode)

| Field | Type | Notes |
|---|---|---|
| `soldPrice` | number | GBP |
| `soldDate` | ISO date | |
| `propertyType` | enum | `FLAT`, `DETACHED`, `SEMI_DETACHED`, `TERRACED` |
| `tenure` | enum | `LEASEHOLD`, `FREEHOLD` |
| `bedrooms` | number | |

***

### FAQ

**Q. Can I scrape a single property by ID?**
Yes — paste the canonical URL `https://www.rightmove.co.uk/properties/{id}` into `startUrls`. The actor hits Rightmove's mobile API directly.

**Q. Do I need to provide a Rightmove location identifier, or can I just type "London"?**
Either works. If you only fill `searchLocation` ("London", "Canary Wharf", "NW3"), the actor resolves it to a Rightmove identifier automatically. Passing `searchLocationIdentifier` (e.g. `REGION^87490`) skips the resolve step and is more reliable for unusual locations.

**Q. How is this different from other Rightmove scrapers on Apify?**
This is the only one with **eight modes in a single actor** — sale, rent, agents, commercial sale, commercial let, sold prices, overseas sale, overseas rent. Most competitors only handle sale + rent. It also includes historic sold-price retrieval and full agent metadata.

**Q. Does it work on every Rightmove URL?**
Public listings (sale, rent, commercial, overseas, agents, house-prices) — yes. Sold-out listings sometimes have stripped data (`available: false`); the actor still emits a row but some fields are null. Pre-market / off-market properties not visible to the public are not accessible.

**Q. What's the throughput?**
With residential proxy, ~25 rows/second sustained on a search route, including detail enrichment. A 6,000-row London search takes 4-5 minutes end-to-end.

**Q. Does monitoring mode work across runs?**
Yes — `monitoringMode: true` uses Apify's KV store to remember IDs seen in previous runs. On rerun, only newly-listed properties are emitted. Reset by deleting the actor's persistent state, or by switching `monitoringMode: false`.

**Q. Can I get floor plans or EPC?**
Floor-plan PDF URLs and EPC certificate URLs are in the row. The actor doesn't download the PDFs into the dataset — you'd fetch them separately if you need the binary content.

**Q. How is pricing calculated?**
Pay-per-result. One dataset row = one paid `outputrecord` event. 120-minute free trial included on first install. No subscription, no monthly fee.

**Q. Do I need my own proxy?**
No — Apify residential proxy is included and recommended. You can swap in your own if you prefer; the actor honours the `proxy` input field.

***

### Support

- **Issues:** Use the **Issues** tab on the actor page on Apify Console.
- **Email:** muhamed.didovic@gmail.com
- **Response time:** typically within 24 hours.

***

### Additional services

- Custom Rightmove scrapers for niche routes (e.g. retirement listings, new builds, specific brand monitoring)
- One-shot historical data pulls for backtesting / AVM training
- Webhook integrations (push new listings to your CRM, Slack, or Google Sheet on a schedule)
- Tailored field selection / row shape if you need a specific export schema

DM via the email above with your use case for a quote.

***

### Explore more scrapers

- [Zillow Scraper](https://apify.com/memo23/zillow-scraper-ppe) — US property data, comparable schema
- [Realtor.com Scraper](https://apify.com/memo23/realtor-search-cheerio) — second US source for cross-referencing
- [Idealista Scraper](https://apify.com/memo23/idealista-scraper) — Spain / Portugal / Italy property data
- [Domain.com.au Scraper](https://apify.com/memo23/domain-com-au-scraper) — Australia property data

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/rightmove-scraper`).

**Purpose:** Scrapes Rightmove.co.uk across eight modes (sale, rent, estate agents, commercial sale/let, sold house prices, overseas sale/rent) from either pasted URLs or filter fields, returning ~100 flat fields per listing including historic sold prices, floor plans, EPC and agent metadata.

**Minimal input:**

```json
{
  "startUrls": [
    { "url": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=500000&sortType=6" }
  ],
  "maxItems": 25
}
```

Search-builder variant (no URL): `{ "searchMode": "propertySale", "searchLocation": "London", "searchMaxPrice": "500000", "maxItems": 25 }`

**Output:** one row per entity. Property rows carry identifier/propertyId, transactionType, channel, propertyUrl, bedrooms, bathrooms, address, propertyPhrase, keyFeatures, fullDescription, tags, prices {primaryPrice, secondaryPrice, displayPriceQualifier, currencyCode}, location {latitude, longitude, postcode, city}, images \[{url, caption}], floorplans \[{url}], epcGraphs \[{url}], customer {branchId, branchName, brandPlus, customerProfileUrl, displayAddress}. Agent rows carry branchId, brandName, branchType, phone, profileUrl, propertiesForSaleCount, propertiesToRentCount. House-prices rows carry rowType, soldPrice, soldDate, propertyType, tenure, saleHistory \[{year, price}].

**Behaviors an agent should know:**

- If both `startUrls` and the search-filter fields are filled, `startUrls` wins.
- Always set `maxItems` (default 10000; non-paying accounts are capped at 100 rows).
- `searchMode` = one of propertySale, propertyRent, estateAgents, commercialSale, commercialRent, housePrices, overseasSale, overseasRent; housePrices needs `searchOutcodeOrPostcode`, overseas modes need `searchCountry`.
- `monitoringMode: true` uses Apify KV store to emit only listings new since the previous run. `moreDetails` and `includeSaleHistory` each add an extra request per property.
- Opt-in add-ons: `marketAnalysis` (AI market + deal scoring, $0.15 per fresh area, paid plans, cached) and `enrichEmails` (billed per email found, never for misses); `instantDatabase` serves estate-agent branches from a prebuilt DB instead of live scraping.
- Billed per result — one dataset row = one paid `outputrecord` event; `marketAnalysis` and `enrichEmails` are separate events. 120-minute free trial on first install. See the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor accesses publicly available data on **Rightmove.co.uk** for legitimate research, market intelligence, real-estate analysis, and lead-generation purposes. Rightmove is a trademark of Rightmove plc; this Actor is not affiliated with, endorsed by, or connected to Rightmove plc in any way.

Use of this Actor must comply with Rightmove's Terms of Service and all applicable laws including UK GDPR, the Data Protection Act 2018, and the EU GDPR where applicable. The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading Rightmove's infrastructure
- Not use scraped data to violate user privacy, agent privacy, or any contractual terms
- Use the data in compliance with applicable jurisdictions and local property-data regulations
- Not republish scraped content (descriptions, images, floor plans) in violation of copyright or Rightmove's content licensing

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

***

### SEO Keywords

rightmove scraper, rightmove.co.uk scraper, rightmove api alternative, uk property scraper, uk real estate data, rightmove rent scraper, rightmove sale scraper, rightmove sold prices scraper, rightmove estate agents scraper, rightmove commercial property scraper, rightmove overseas property, uk house prices data, uk property api, london property scraper, buy to let data, b2b real estate leads, estate agent directory scraper, sold house prices uk, property monitoring scraper, uk property json export, rightmove csv export, real estate web scraping, property market intelligence, no-code property scraper, apify rightmove

# Actor input Schema

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

Paste Rightmove search URLs, estate agent URLs, house prices URLs, commercial URLs, overseas URLs, or direct property URLs.

## `searchMode` (type: `string`):

Choose what type of Rightmove search to build from the filter fields below. House prices needs searchOutcodeOrPostcode. Overseas needs searchCountry.

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

Friendly location label such as London, Canary Wharf, or NW3. Starter default is London. For property sale/rent, estate agents, and commercial, the actor will try to resolve this automatically into a Rightmove location identifier when searchLocationIdentifier is empty. Explicit searchLocationIdentifier is still more reliable.

## `searchLocationIdentifier` (type: `string`):

Optional explicit Rightmove identifier for residential sale/rent, estate agents, and commercial modes. Leave empty to let the actor resolve it automatically from searchLocation (recommended). Only set this to pin an exact area — a value here overrides searchLocation. Use the full format, not a bare numeric ID. Examples: REGION^87490 for London, REGION^904 for Manchester, OUTCODE^1859 for NW3, POSTCODE^4812813 for E14 0XG, STATION^5462 for Leeds Station.

## `searchRadius` (type: `string`):

Rightmove radius value. Starter default is 15.0. Common examples: 0.0, 0.25, 0.5, 1.0, 3.0, 5.0, 10.0.

## `searchMinPrice` (type: `string`):

Used for property sale, property rent, commercial, and overseas modes.

## `searchMaxPrice` (type: `string`):

Used for property sale, property rent, commercial, and overseas modes. Starter default is 500000.

## `searchMinBedrooms` (type: `string`):

Used for residential and overseas property modes.

## `searchMaxBedrooms` (type: `string`):

Used for residential and overseas property modes.

## `searchPropertyTypes` (type: `array`):

Optional. Multiple values will be joined with commas into Rightmove's propertyTypes parameter.

## `searchMustHave` (type: `array`):

Optional. Multiple values will be joined into Rightmove's mustHave parameter.

## `searchDontShow` (type: `array`):

Optional. Multiple values will be joined into Rightmove's dontShow parameter.

## `searchKeywords` (type: `string`):

Optional keyword filter where Rightmove supports it.

## `searchIncludeSSTC` (type: `boolean`):

For residential property sale mode.

## `searchIncludeLetAgreed` (type: `boolean`):

For residential property rent mode.

## `searchFurnishTypes` (type: `array`):

For residential property rent mode.

## `searchLetType` (type: `string`):

For residential property rent mode. Example: shortTerm.

## `searchBrandName` (type: `string`):

For estate agent mode.

## `searchBranchType` (type: `string`):

For estate agent mode.

## `searchDisplayPropertyType` (type: `string`):

For commercial modes. This maps to Rightmove's frontend displayPropertyType before pagination converts it to propertyTypes.

## `searchOutcodeOrPostcode` (type: `string`):

Required for house prices mode. This is the minimum targeting field for house prices and is not defaulted. Example: NW3 or W9 2BA.

## `searchSoldIn` (type: `string`):

For house prices mode. Defaults to 1.

## `searchPropertyType` (type: `string`):

For house prices mode. Example: FLAT, DETACHED, SEMI\_DETACHED.

## `searchTenure` (type: `string`):

For house prices mode. Example: LEASEHOLD or FREEHOLD.

## `searchCountry` (type: `string`):

Required for overseas modes. This is the minimum targeting field for overseas searches and is not defaulted. Example: Portugal, Spain, or France.

## `searchSort` (type: `string`):

Optional Rightmove sortType value. Starter default is 2. Example values often seen in live URLs are 2 and 6.

## `moreDetails` (type: `boolean`):

If enabled, makes an additional request to the property page to fetch extra details not available from the mobile API.

## `includeSaleHistory` (type: `boolean`):

If enabled, makes an additional request to fetch the property sale history when supported.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `marketAnalysis` (type: `boolean`):

If enabled, appends a `rowType: "marketAnalysis"` row per area found in your results (up to 8 areas per run, largest first). Each row carries the area's market intelligence AND a `deals` array (every scored listing: ROI %, cashflow, payback, strategy, flags) plus a `dealsSummary` (best clean deal). Billed per area row delivered via the `market-analysis` event — the deal scoring is included at no extra charge. Never charged when analysis fails or signal is too thin.

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

Maximum number of items that will be scraped. Example: `500`. Default `10000`; non-paying accounts are capped at 100 rows.

## `monitoringMode` (type: `boolean`):

If checked, it will only scrape newly listed properties compared to previous runs.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `instantDatabase` (type: `boolean`):

Instead of live-scraping, return UK estate-agent branches straight from our cumulative database (18,000+ branches, ~98% with a phone). Instant, and uncapped by Rightmove's per-search limit. Combine with the filters below.

## `dbBrand` (type: `string`):

Filter the database by estate-agent brand (substring), e.g. "Foxtons". Setting this alone also triggers Instant Database mode.

## `dbCity` (type: `string`):

Filter the database by city/town (substring), e.g. "Manchester".

## `dbHasPhone` (type: `boolean`):

Return only branches that have a phone or direct phone number.

## `dbHasEmail` (type: `boolean`):

Return only branches that have an email address.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/find.html?useLocationIdentifier=true&locationIdentifier=REGION%5E93814&rent=To+rent&radius=0.0&minBedrooms=1&maxBedrooms=3&_includeLetAgreed=on&maxPrice=3000&index=0&sortType=6&channel=RENT&transactionType=LETTING&displayLocationIdentifier=Zone-2-93814.html&letType=shortTerm"
    }
  ],
  "searchMode": "propertySale",
  "searchLocation": "London",
  "searchRadius": "15.0",
  "searchMaxPrice": "500000",
  "searchIncludeSSTC": false,
  "searchIncludeLetAgreed": false,
  "searchBranchType": "ALL",
  "searchSoldIn": "1",
  "searchSort": "2",
  "moreDetails": false,
  "includeSaleHistory": false,
  "enrichEmails": false,
  "marketAnalysis": false,
  "maxItems": 10000,
  "monitoringMode": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "instantDatabase": false,
  "dbBrand": "Foxtons",
  "dbCity": "Manchester",
  "dbHasPhone": false,
  "dbHasEmail": false
}
```

# Actor output Schema

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

No 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": [
        {
            "url": "https://www.rightmove.co.uk/property-to-rent/find.html?useLocationIdentifier=true&locationIdentifier=REGION%5E93814&rent=To+rent&radius=0.0&minBedrooms=1&maxBedrooms=3&_includeLetAgreed=on&maxPrice=3000&index=0&sortType=6&channel=RENT&transactionType=LETTING&displayLocationIdentifier=Zone-2-93814.html&letType=shortTerm"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = { "startUrls": [{ "url": "https://www.rightmove.co.uk/property-to-rent/find.html?useLocationIdentifier=true&locationIdentifier=REGION%5E93814&rent=To+rent&radius=0.0&minBedrooms=1&maxBedrooms=3&_includeLetAgreed=on&maxPrice=3000&index=0&sortType=6&channel=RENT&transactionType=LETTING&displayLocationIdentifier=Zone-2-93814.html&letType=shortTerm" }] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/rightmove-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.rightmove.co.uk/property-to-rent/find.html?useLocationIdentifier=true&locationIdentifier=REGION%5E93814&rent=To+rent&radius=0.0&minBedrooms=1&maxBedrooms=3&_includeLetAgreed=on&maxPrice=3000&index=0&sortType=6&channel=RENT&transactionType=LETTING&displayLocationIdentifier=Zone-2-93814.html&letType=shortTerm"
    }
  ]
}' |
apify call memo23/rightmove-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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