# Rightmove Scraper - UK Property Listings & Agent Leads (`scrapesage/rightmove-scraper`) Actor

Scrape Rightmove UK property listings for sale & to rent: price, beds/baths, address, geo, floor area, EPC, council tax, tenure, description, photos, nearest stations — plus estate-agent leads (branch, phone). New-listing & price-drop monitoring. No login, key or browser.

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

## Pricing

from $4.00 / 1,000 property scrapeds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — UK Property Listings, Prices & Agent Leads

Extract **complete Rightmove property data** for **sale and rent** across the UK — prices, beds/baths, full address & geo, floor area, EPC, council tax band, ground rent, service charge, tenure, full description, key features, photos and nearest stations. Optionally turn every estate agent into a **ready-to-contact B2B lead** (branch, brand, phone, valuation page), and run in **monitoring mode** to capture only new listings and price drops.

No login, no cookies, no browser — fast JSON extraction with 99%+ reliability.

### Why this Rightmove scraper?

Most Rightmove scrapers only parse the listing cards and stop. This actor pulls the **full property detail layer** too — the same fields a buyer sees on the property page — and adds estate-agent leads and change monitoring, shipping the **richest dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Price, beds/baths, address, geo, type | ✅ | ✅ |
| Full description + all key features | ❌ | ✅ |
| Floor area (sq ft **and** sq m) | ❌ | ✅ |
| EPC, council tax band, ground rent, service charge | ❌ | ✅ |
| Tenure + years remaining on lease | ❌ | ✅ |
| Nearest stations + distances | ❌ | ✅ |
| Added/reduced reason & date, price history flag | partial | ✅ |
| Estate-agent **leads** (branch, brand, phone, valuation URL) | ❌ | ✅ opt-in |
| New-listing & **price-drop monitoring** | ❌ | ✅ opt-in |
| Location auto-resolve (type a place name) | ❌ | ✅ |

### Use cases

- **Property investment & sourcing** — find below-market and reduced stock fast; filter by yield-relevant fields (price, beds, floor area, tenure, ground rent, service charge) and watch a patch for new listings and price drops.
- **Lead generation** — estate agents are active B2B buyers (and sellers): they need proptech, mortgage & conveyancing referrals, photography, EPC assessors, floorplans, cleaning and marketing. Output one deduplicated lead per branch with brand, phone and valuation page.
- **Market & pricing intelligence** — track asking prices, £/sq ft, days-on-market signals (`addedOrReduced`, `listingUpdateReason`) and stock levels by town, outcode or postcode.
- **Comparables & valuation** — pull every active comparable around a postcode with size, tenure and council tax band for AVM and CMA workflows.
- **Relocation & portals** — feed property search apps, newsletters and dashboards with structured, photo-rich listings for any UK area.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Rightmove Scraper**, enter one or more `locations` (e.g. `London`, `Manchester`, `SW1A`), pick **for sale** or **to rent**, set your filters, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchType": "for-sale",
    "locations": ["London", "Manchester", "SW1A"],
    "minPrice": 400000,
    "maxPrice": 800000,
    "minBedrooms": 2,
    "propertyTypes": ["flat"],
    "radius": "1.0",
    "sortType": "6",
    "includePropertyDetails": true,
    "deduplicateAgents": true,
    "maxResults": 500
}
````

- **searchType** — `for-sale` or `to-rent` (applies to `locations` searches).
- **locations** — place names (`London`), outcodes/postcodes (`SW1A`, `M1`), station names, Rightmove identifiers (`REGION^87490`, `OUTCODE^2506`), or a full Rightmove search URL. Each is auto-resolved via Rightmove's own autocomplete.
- **startUrls** — paste Rightmove search-results URLs (paginated with your filters) or individual property URLs (scraped in full detail).
- **propertyUrls** — direct property URLs or numeric IDs to scrape detail records for.
- **minPrice / maxPrice / minBedrooms / maxBedrooms / propertyTypes / radius / sortType / maxDaysSinceAdded / keywords** — search filters.
- **includeSSTC / includeLetAgreed / furnishTypes** — include Sold STC (sale) or Let Agreed (rent); restrict rentals by furnishing.
- **includePropertyDetails** *(default true)* — open each property page for the full detail layer (description, key features, floor area, EPC, council tax, ground rent, service charge, tenure, nearest stations, photos, full agent profile). Turn off for a faster, cheaper listing-only run.
- **deduplicateAgents** *(default false)* — also output one lead record per unique estate-agent branch (`type: "agent"`).
- **maxResults** — global cap (Rightmove returns up to ~1,000 results per individual search).
- **monitorMode** *(default false)* — only emit new and price-changed listings (see below).

### Output

One record per property (`type: "property"`), plus optional estate-agent lead records (`type: "agent"`):

```json
{
    "type": "property",
    "id": "173885045",
    "url": "https://www.rightmove.co.uk/properties/173885045",
    "channel": "for-sale",
    "displayAddress": "Michael Road, Kings Road Park, SW6",
    "propertyType": "2 bedroom flat for sale",
    "bedrooms": 2,
    "bathrooms": 2,
    "price": 1150000,
    "currency": "GBP",
    "displayPrice": "£1,150,000",
    "pricePerSqFt": "£1232.58 per sq ft",
    "addedOrReduced": "Reduced on 27/04/2026",
    "listingUpdateReason": "price_reduced",
    "latitude": 51.477491,
    "longitude": -0.18878,
    "postcode": "SW6 2RN",
    "outcode": "SW6",
    "ukCountry": "England",
    "tenureType": "LEASEHOLD",
    "yearsRemainingOnLease": 994,
    "councilTaxBand": "G",
    "annualGroundRent": 800,
    "annualServiceCharge": 6062.66,
    "sizeSqFt": 933,
    "sizeSqM": 87,
    "keyFeatures": ["Turn-key lateral ground floor apartment", "Two bedrooms, two bathrooms"],
    "description": "A turn-key apartment within this newly formed development…",
    "nearestStations": [{ "name": "Imperial Wharf Station", "types": ["NATIONAL_TRAIN"], "distanceMiles": 0.31, "unit": "miles" }],
    "imageCount": 10,
    "floorplanCount": 1,
    "mainImage": "https://media.rightmove.co.uk/.../173885045_max_476x317.jpeg",
    "agentName": "Chestertons",
    "agentBranch": "Fulham Parsons Green",
    "agentPhone": "020 3870 3072",
    "agentBranchAddress": "78 New Kings Road, Fulham, London, SW6 4LT",
    "agentProfileUrl": "https://www.rightmove.co.uk/estate-agents/agent/Chestertons/Fulham-Parsons-Green-48856.html",
    "searchLocation": "London",
    "scrapedAt": "2026-06-16T12:00:00.000Z"
}
```

In **monitoring mode**, records are tagged `changeType` (`new` or `price_changed`) and price changes include `previousPrice` and `priceDelta`.

### Monitoring mode & scheduling

Turn on **monitorMode** to remember the properties already returned and emit **only** ones that are new or whose price/status changed since the last run. This is the cleanest way to track fresh stock and price drops in a patch.

It is **fully compatible** with [Apify Schedules](https://docs.apify.com/platform/schedules) — they do different jobs: the schedule decides *when* the run fires (e.g. every morning), and monitoring mode decides *what* is returned (only the deltas). Point each scheduled search at its own `monitorStoreName` to keep histories separate.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it hourly/daily/weekly to monitor new stock and price drops in a town, outcode or postcode; perfect for alerts and lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/rightmove-scraper').call({
    searchType: 'for-sale',
    locations: ['Manchester'],
    minBedrooms: 2,
    maxPrice: 350000,
    includePropertyDetails: true,
    deduplicateAgents: true,
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} properties & agent leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new property alerts or agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new stock or a price drop.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find 2-bed flats under £350k in Manchester added this week and list the agents' phone numbers" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **property & local-leads stack**:

- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** — US rental listings, prices & property-management leads.
- **[FastExpert Agent Scraper](https://apify.com/scrapesage/fastexpert-agent-scraper)** — US real-estate agent leads, stats & reviews.
- **[Airbnb Scraper](https://apify.com/scrapesage/airbnb-scraper)** — short-let listings, prices & availability.
- **[Houzz Scraper](https://apify.com/scrapesage/houzz-scraper)** — home-improvement pros, contacts & reviews.
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** — UK companies, directors & PSCs (qualify agents & developers).
- **[Craigslist Scraper](https://apify.com/scrapesage/craigslist-scraper)** — classifieds incl. housing & for-sale-by-owner.
- **[99.co Property Scraper](https://apify.com/scrapesage/99-co-property-scraper)** — Singapore property listings & agent leads.
- **[EdgeProp.sg Scraper](https://apify.com/scrapesage/edgeprop-singapore-scraper)** — Singapore property & agent leads.

### Tips

- **Big cities**: Rightmove caps each individual search at ~1,000 results. To exhaust a large area, split runs by outcode/postcode, by `propertyTypes`, or by price band.
- **Fresh stock only**: set `maxDaysSinceAdded` (e.g. `1` or `7`) and/or turn on `monitorMode` to capture just new and reduced listings.
- **Cost control**: turn off `includePropertyDetails` for a fast listing-only run (still 30+ fields per card including agent name & phone); agent leads are deduplicated per branch.
- **Proxies**: the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch the proxy to Residential.

### FAQ

**How do I scrape Rightmove for a specific area?** Put the place in `locations` — a name (`Leeds`), an outcode/postcode (`LS1`), a station, or a Rightmove identifier (`REGION^87490`). Combine with filters to narrow by price, beds, type and radius. You can also paste a full Rightmove search URL.

**Can I get sale and rental data?** Yes — set `searchType` to `for-sale` or `to-rent`. Rental records include the rent frequency (e.g. pcm) and a per-week equivalent where Rightmove provides it.

**Where do the agent phone numbers come from?** From the property's own listing — Rightmove publishes the marketing branch's display name and contact telephone on every listing. With `deduplicateAgents` on, the actor rolls these up into one lead per branch.

**How do I monitor new listings and price drops automatically?** Turn on `monitorMode` and create an [Apify Schedule](https://docs.apify.com/platform/schedules). Each run returns only new and price-changed properties; add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push them into your CRM or a Slack channel.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**A field is null — why?** Some listings genuinely don't publish a value (e.g. freehold houses have no lease years; online-only developments omit a station). Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

**Is scraping Rightmove legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (UK GDPR for personal data) and Rightmove's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchType` (type: `string`):

Scrape properties **for sale** or **to rent**. Applies to the `locations` searches below (start URLs keep their own channel).

## `locations` (type: `array`):

Places to search. Use plain names (`London`, `Manchester`, `Bristol`), outcodes/postcodes (`SW1A`, `M1`), station names, or Rightmove location identifiers (`REGION^87490`, `OUTCODE^2506`) — each is auto-resolved via Rightmove's own autocomplete. You can also paste a full Rightmove search URL here.

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

Optional. Paste Rightmove **search-results URLs** (`/property-for-sale/find.html?...`, `/property-to-rent/find.html?...`) or individual **property URLs** (`/properties/<id>`). Search URLs are paginated and crawled with your filters baked in; property URLs are scraped in full detail.

## `propertyUrls` (type: `array`):

Optional. Direct Rightmove property URLs or numeric IDs (`https://www.rightmove.co.uk/properties/173885045` or `173885045`) to scrape the full detail record for each.

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

Minimum price. For rentals this is per the listing's frequency (usually pcm). Leave empty for no minimum.

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

Maximum price. Leave empty for no maximum.

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

Minimum number of bedrooms (use 0 for studios).

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

Maximum number of bedrooms.

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

Restrict to specific property types. Leave empty for all.

## `radius` (type: `string`):

Expand the search around the location. `0` = this area only.

## `sortType` (type: `string`):

How Rightmove orders the results before they are collected.

## `maxDaysSinceAdded` (type: `string`):

Only listings added/updated within this many days. Great for fresh-stock monitoring.

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

Optional free-text keyword filter (e.g. `garden`, `garage`, `sea view`).

## `includeSSTC` (type: `boolean`):

Include properties marked Sold Subject To Contract. Applies to for-sale searches.

## `includeLetAgreed` (type: `boolean`):

Include properties marked Let Agreed. Applies to to-rent searches.

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

Restrict rentals by furnishing. Applies to to-rent searches only.

## `includePropertyDetails` (type: `boolean`):

Open each property page for the rich record: full description, all key features, floor area (sq ft & sq m), EPC count, council tax band, ground rent & service charge, tenure + years remaining on lease, nearest stations with distances, postcode, image & floorplan URLs, and the full agent profile. Turn off for a faster, cheaper listing-only run (still 30+ fields per card, including agent name & phone). Adds one page fetch per property.

## `deduplicateAgents` (type: `boolean`):

Emit one extra **lead record per unique estate-agent branch** found across the results (`type: "agent"`) — agent/brand name, branch, phone, branch address, profile & valuation URLs, and a sample listing. Perfect for B2B prospecting (proptech, mortgage, conveyancing, photography, EPC, cleaning).

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

Global cap on the total number of properties emitted in this run. Rightmove returns up to ~1,000 results per individual search.

## `monitorMode` (type: `boolean`):

Remember the properties already returned and emit ONLY ones that are **new** or whose **price/status changed** since the last run (tagged `changeType` = `new` | `price_changed`, with `previousPrice` and `priceDelta`). Ideal for tracking fresh stock and price drops in a patch. Pairs with Apify Schedules — schedule the run, this flag handles the de-duplication.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' properties for monitoring mode. Use a different name per tracked search to keep histories separate (lowercase letters, digits and hyphens).

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

Maximum parallel requests. Keep it moderate to stay friendly to Rightmove's servers and avoid rate limiting.

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

Proxy settings. Rightmove serves clean pages to datacenter IPs, so the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch to Residential.

## Actor input object example

```json
{
  "searchType": "for-sale",
  "locations": [
    "London"
  ],
  "propertyTypes": [],
  "radius": "0.0",
  "sortType": "6",
  "maxDaysSinceAdded": "",
  "includeSSTC": false,
  "includeLetAgreed": false,
  "furnishTypes": [],
  "includePropertyDetails": true,
  "deduplicateAgents": false,
  "maxResults": 100,
  "monitorMode": false,
  "monitorStoreName": "rightmove-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped Rightmove properties and agent leads in the default dataset.

# 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 = {
    "locations": [
        "London"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = { "locations": ["London"] }

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Rightmove Scraper - UK Property Listings & Agent Leads",
        "description": "Scrape Rightmove UK property listings for sale & to rent: price, beds/baths, address, geo, floor area, EPC, council tax, tenure, description, photos, nearest stations — plus estate-agent leads (branch, phone). New-listing & price-drop monitoring. No login, key or browser.",
        "version": "0.1",
        "x-build-id": "KYrhN7OHRsHbppsGv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~rightmove-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-rightmove-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~rightmove-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-rightmove-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~rightmove-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-rightmove-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchType": {
                        "title": "Listing type",
                        "enum": [
                            "for-sale",
                            "to-rent"
                        ],
                        "type": "string",
                        "description": "Scrape properties **for sale** or **to rent**. Applies to the `locations` searches below (start URLs keep their own channel).",
                        "default": "for-sale"
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Places to search. Use plain names (`London`, `Manchester`, `Bristol`), outcodes/postcodes (`SW1A`, `M1`), station names, or Rightmove location identifiers (`REGION^87490`, `OUTCODE^2506`) — each is auto-resolved via Rightmove's own autocomplete. You can also paste a full Rightmove search URL here.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs (search or property pages)",
                        "type": "array",
                        "description": "Optional. Paste Rightmove **search-results URLs** (`/property-for-sale/find.html?...`, `/property-to-rent/find.html?...`) or individual **property URLs** (`/properties/<id>`). Search URLs are paginated and crawled with your filters baked in; property URLs are scraped in full detail.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "propertyUrls": {
                        "title": "Property URLs / IDs",
                        "type": "array",
                        "description": "Optional. Direct Rightmove property URLs or numeric IDs (`https://www.rightmove.co.uk/properties/173885045` or `173885045`) to scrape the full detail record for each.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minPrice": {
                        "title": "Min price (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price. For rentals this is per the listing's frequency (usually pcm). Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Max price (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price. Leave empty for no maximum."
                    },
                    "minBedrooms": {
                        "title": "Min bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum number of bedrooms (use 0 for studios)."
                    },
                    "maxBedrooms": {
                        "title": "Max bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of bedrooms."
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Restrict to specific property types. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "detached",
                                "semi-detached",
                                "terraced",
                                "flat",
                                "bungalow",
                                "land",
                                "park-home"
                            ],
                            "enumTitles": [
                                "Detached",
                                "Semi-detached",
                                "Terraced",
                                "Flat / apartment",
                                "Bungalow",
                                "Land",
                                "Park home"
                            ]
                        },
                        "default": []
                    },
                    "radius": {
                        "title": "Search radius (miles)",
                        "enum": [
                            "0.0",
                            "0.25",
                            "0.5",
                            "1.0",
                            "3.0",
                            "5.0",
                            "10.0",
                            "15.0",
                            "20.0",
                            "30.0",
                            "40.0"
                        ],
                        "type": "string",
                        "description": "Expand the search around the location. `0` = this area only.",
                        "default": "0.0"
                    },
                    "sortType": {
                        "title": "Sort order",
                        "enum": [
                            "6",
                            "10",
                            "2",
                            "1"
                        ],
                        "type": "string",
                        "description": "How Rightmove orders the results before they are collected.",
                        "default": "6"
                    },
                    "maxDaysSinceAdded": {
                        "title": "Added in the last…",
                        "enum": [
                            "",
                            "1",
                            "3",
                            "7",
                            "14"
                        ],
                        "type": "string",
                        "description": "Only listings added/updated within this many days. Great for fresh-stock monitoring.",
                        "default": ""
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Optional free-text keyword filter (e.g. `garden`, `garage`, `sea view`)."
                    },
                    "includeSSTC": {
                        "title": "Include Sold STC (for sale)",
                        "type": "boolean",
                        "description": "Include properties marked Sold Subject To Contract. Applies to for-sale searches.",
                        "default": false
                    },
                    "includeLetAgreed": {
                        "title": "Include Let Agreed (to rent)",
                        "type": "boolean",
                        "description": "Include properties marked Let Agreed. Applies to to-rent searches.",
                        "default": false
                    },
                    "furnishTypes": {
                        "title": "Furnish type (to rent)",
                        "type": "array",
                        "description": "Restrict rentals by furnishing. Applies to to-rent searches only.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "furnished",
                                "unfurnished",
                                "partFurnished"
                            ],
                            "enumTitles": [
                                "Furnished",
                                "Unfurnished",
                                "Part furnished"
                            ]
                        },
                        "default": []
                    },
                    "includePropertyDetails": {
                        "title": "Include full property details",
                        "type": "boolean",
                        "description": "Open each property page for the rich record: full description, all key features, floor area (sq ft & sq m), EPC count, council tax band, ground rent & service charge, tenure + years remaining on lease, nearest stations with distances, postcode, image & floorplan URLs, and the full agent profile. Turn off for a faster, cheaper listing-only run (still 30+ fields per card, including agent name & phone). Adds one page fetch per property.",
                        "default": true
                    },
                    "deduplicateAgents": {
                        "title": "Also output estate-agent leads",
                        "type": "boolean",
                        "description": "Emit one extra **lead record per unique estate-agent branch** found across the results (`type: \"agent\"`) — agent/brand name, branch, phone, branch address, profile & valuation URLs, and a sample listing. Perfect for B2B prospecting (proptech, mortgage, conveyancing, photography, EPC, cleaning).",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max properties (whole run)",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Global cap on the total number of properties emitted in this run. Rightmove returns up to ~1,000 results per individual search.",
                        "default": 100
                    },
                    "monitorMode": {
                        "title": "Monitoring mode — only new & changed",
                        "type": "boolean",
                        "description": "Remember the properties already returned and emit ONLY ones that are **new** or whose **price/status changed** since the last run (tagged `changeType` = `new` | `price_changed`, with `previousPrice` and `priceDelta`). Ideal for tracking fresh stock and price drops in a patch. Pairs with Apify Schedules — schedule the run, this flag handles the de-duplication.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'already seen' properties for monitoring mode. Use a different name per tracked search to keep histories separate (lowercase letters, digits and hyphens).",
                        "default": "rightmove-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum parallel requests. Keep it moderate to stay friendly to Rightmove's servers and avoid rate limiting.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Rightmove serves clean pages to datacenter IPs, so the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch to Residential.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
