# Rightmove Property Scraper — UK Sale & Rent Listings (`yadroo/rightmove-uk`) Actor

Rightmove property listings for AI agents and analysts: any UK location (town, outcode, postcode, station), for sale / to rent / new homes / commercial, with all site filters, exact listing timestamps, price per sq ft, agent & phone, optional full property pages. Location lookup built in.

- **URL**: https://apify.com/yadroo/rightmove-uk.md
- **Developed by:** [Samat Makatov](https://apify.com/yadroo) (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 $1.05 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Search **rightmove.co.uk** — the UK's largest property portal — the way its own search does: any town, area, outcode, postcode or station; for sale, to rent, new homes or commercial; every filter the site offers (price, bedrooms, type, radius, must-haves, added-since, SSTC/let-agreed). Each property comes back as clean JSON with exact listing timestamps, coordinates, size and price per sq ft, agent and phone; `detail: true` adds the full description, key features, tenure & lease years, council tax band, service charge, deposit, nearest stations and floorplans. Built for analysts and AI agents: no browser, no proxies, no API key.

### Use cases

- **New-listing alerts** — `sortType: 6` + `sinceHours: 2` every couple of hours → only what appeared since the last run, with agent phone numbers.
- **Price-reduction tracking** — `sinceField: "updated"` catches reductions and re-listings; compare `price` across runs by `id`.
- **Buy-to-let yield screening** — run the same postcode on `buy` and `rent`, join on bedrooms/type, divide `pricePcm × 12` by sale `price`.
- **Comparable evidence for valuations** — `includeSSTC: true` + `detail: true` gives sold-subject-to-contract comps with size, `pricePerSqFt`, tenure and lease years.
- **Agent / developer market share** — count listings per `agent` (or `agentCompany`) in an area, spot new branches and developments (`agentIsDeveloper`).
- **Commercial-property sourcing** — `commercial-buy` / `commercial-rent` with `businessForSale`, use classes and sizes.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `location` | string | — (prefill `"London"`) | **Required unless `locationIdentifier` is given** (the run stops with a clear message otherwise). Free text as typed on the site: town, area, outcode (`"M3"`), full postcode, station (`"Leeds station"`). Resolved through Rightmove's own typeahead; the first non-street match wins. |
| `locationIdentifier` | string | — | Exact identifier, e.g. `REGION^904`, `OUTCODE^2506`, `POSTCODE^123456`, `STATION^5462`, `STREET^<token>`. Overrides `location`. Copy from a site URL or from `mode: "locations"`. |
| `locationType` | enum | — | `REGION` | `OUTCODE` | `POSTCODE` | `STATION` | `STREET` — preferred match type when the text is ambiguous. |
| `mode` | enum | `search` | `search` or `locations` (returns the typeahead candidates for `location` without searching). |
| `channel` | enum | `buy` | `buy` · `rent` · `new-homes` · `commercial-buy` · `commercial-rent` |
| `minPrice`, `maxPrice` | integer | — | £ sale price; £ per calendar month for rentals. |
| `minBedrooms`, `maxBedrooms` | integer 0–10 | — | 0 = studio. Ignored on commercial channels. |
| `radius` | enum | `"0.0"` | Miles: `0.0 0.25 0.5 1.0 3.0 5.0 10.0 15.0 20.0 30.0 40.0` — the only values the site accepts; Apify refuses any other value before the run starts. |
| `propertyTypes` | enum\[] | — | `detached semi-detached terraced flat bungalow land park-home private-halls` |
| `mustHave` | enum\[] | — | `garden parking newHome retirement sharedOwnership auction` |
| `dontShow` | enum\[] | — | `newHome retirement sharedOwnership auction houseShare` (houseShare rentals only) |
| `maxDaysSinceAdded` | enum | — | `1 3 7 14` — server-side; finer cut-offs via `sinceHours`. |
| `furnishTypes` | enum\[] | — | Rentals: `furnished partFurnished unfurnished` |
| `letType` | enum | — | Rentals: `longTerm shortTerm student` |
| `includeSSTC` | boolean | `false` | Sales: include sold-subject-to-contract / under-offer listings. |
| `includeLetAgreed` | boolean | `false` | Rentals: include let-agreed listings. |
| `keywords` | string\[] | — | Must-appear words, e.g. `["garage","annexe"]`; the site reports `keywordMatchType`. |
| `sortType` | enum | `"6"` | `6` newest listed · `10` oldest · `1` lowest price · `2` highest price |
| `sinceHours` | integer | — | Keep only listings whose `firstVisibleDate` (or `listingUpdateDate`, see `sinceField`) is younger than N hours. Exact timestamps come with the list — no detail needed. With `sortType 6` the run stops early. |
| `sinceField` | enum | `added` | `added` (new listings) or `updated` (also price reductions / re-listings). |
| `detail` | boolean | `false` | Open every property page (0.7 s apart, about 50 properties a minute) for description, key features, sizes, tenure, costs, stations, floorplans, brochures, EPC. A page that cannot be read leaves `detailError` on its row; see **Blocking** below for when property pages stop. |
| `maxItems` | integer 1–1000 | `40` | Stop after N properties. Mode `locations` returns every match (at most 10). |
| `maxPages` | integer 1–42 | `42` | Result pages (24 listings plus the page's featured property each). Rightmove serves at most ~1,000 results per search. |
| `fields` | string\[] | — | Keep only these top-level fields per item, in this order. Every row keeps `id` (mode `locations`: `locationIdentifier`), and with `detail: true` also `detailError` when a property page was not read; they come first unless you list them. Another letter case or a near miss (`"bedroms"`) is read as the output field and noted in the status; detail-only fields without `detail: true` and unknown names are ignored with a note; if no name is an output field the run fails and lists the valid names. |

### Reference

#### Location identifiers (sample — any place works via `location`)

| Place | `locationIdentifier` |
|---|---|
| London | `REGION^87490` |
| Manchester | `REGION^904` |
| Birmingham | `REGION^162` |
| Leeds | `REGION^787` |
| Glasgow | `REGION^550` |
| Edinburgh | `REGION^475` |
| Liverpool | `REGION^813` |
| Bristol | `REGION^219` |
| Sheffield | `REGION^1195` |
| Nottingham | `REGION^1019` |
| Cardiff | `REGION^281` |
| Belfast | `REGION^133` |
| Oxford | `REGION^1036` |
| Cambridge | `REGION^274` |
| Brighton | `REGION^93554` |
| Leicester | `REGION^789` |
| Reading | `REGION^1114` |
| Southampton | `REGION^1231` |
| Milton Keynes | `REGION^940` |
| Outcode SW1A | `OUTCODE^2506` |
| Leeds Station | `STATION^5462` |

Identifier types: `REGION` (towns, boroughs, counties, London areas), `OUTCODE` (first half of a postcode), `POSTCODE` (full postcode), `STATION`, `STREET`. Run `mode: "locations"` with any text to list the candidates with their identifiers.

#### Channels

| `channel` | Site section | Rental-only options apply |
|---|---|---|
| `buy` | property-for-sale | no |
| `rent` | property-to-rent | yes (`furnishTypes`, `letType`, `includeLetAgreed`, `dontShow: houseShare`) |
| `new-homes` | new-homes-for-sale | no |
| `commercial-buy` | commercial-property-for-sale | no (bedrooms / residential types ignored) |
| `commercial-rent` | commercial-property-to-let | yes |

#### Sort, radius, added-since

`sortType`: 6 newest · 10 oldest · 1 price ↑ · 2 price ↓. `radius` miles: 0.0, 0.25, 0.5, 1.0, 3.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0. `maxDaysSinceAdded`: 1, 3, 7, 14. These are select fields: Apify refuses any other value (another spelling or case included) before the run starts.

### Examples

**New flats in Manchester since the last run (alerting)**

```json
{ "location": "Manchester", "channel": "buy", "propertyTypes": ["flat"], "sortType": "6", "sinceHours": 6, "maxItems": 200 }
```

**Furnished 2-bed rentals within a mile of SW1A, full details**

```json
{ "location": "SW1A", "locationType": "OUTCODE", "channel": "rent", "minBedrooms": 2, "maxPrice": 4000, "furnishTypes": ["furnished"], "radius": "1.0", "detail": true, "maxItems": 50 }
```

**Sold-STC comparables with size and lease for a valuation**

```json
{ "locationIdentifier": "OUTCODE^2506", "channel": "buy", "includeSSTC": true, "propertyTypes": ["flat"], "detail": true, "fields": ["id","displayAddress","price","bedrooms","sizeSqFt","pricePerSqFt","tenure","yearsRemainingOnLease","annualServiceCharge","listingUpdateReason","url"], "maxItems": 100 }
```

**Price reductions in Leeds this week**

```json
{ "location": "Leeds", "channel": "buy", "sinceField": "updated", "sinceHours": 168, "maxPrice": 300000, "maxItems": 300 }
```

**Which identifiers does "Newcastle" resolve to?**

```json
{ "mode": "locations", "location": "Newcastle" }
```

### Output

```json
{
  "id": 92854638,
  "url": "https://www.rightmove.co.uk/properties/92854638",
  "displayAddress": "Belfield Road, Didsbury Village, M20",
  "price": 1500000, "currency": "GBP", "frequency": "not specified",
  "priceDisplay": "£1,500,000", "priceQualifier": null, "pricePcm": null, "pricePw": null,
  "bedrooms": 6, "bathrooms": 3,
  "propertySubType": "Detached", "propertyTypeFullDescription": "6 bedroom detached house for sale",
  "tenure": "FREEHOLD", "transactionType": "buy", "channel": "BUY",
  "latitude": 53.419401, "longitude": -2.229238, "distanceMiles": null,
  "displaySize": "2,806 sq. ft.", "sizeSqFt": 2806, "pricePerSqFt": 535,
  "addedOrReduced": "Added on 07/09/2026", "firstVisibleDate": "2026-09-07T16:40:18.000Z",
  "listingUpdateReason": "new", "listingUpdateDate": "2026-09-07T16:46:06.000Z",
  "agent": "Philip James Kennedy, Didsbury", "agentBranchId": 7572, "agentPhone": "0161 524 4262", "agentIsDeveloper": false,
  "premiumListing": true, "featured": true, "auction": false, "development": false,
  "image": "https://media.rightmove.co.uk/…_max_476x317.jpeg", "images": ["…"], "imagesCount": 29, "floorplansCount": 1,
  "locationIdentifier": "REGION^904", "locationName": "Manchester, Greater Manchester",
  "searchUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E904&…",
  "fetchedAt": "2026-09-13T07:55:11.933Z"
}
```

| Field | Meaning |
|---|---|
| `id`, `url` | Rightmove property id and page |
| `price`, `currency`, `frequency`, `priceDisplay`, `priceQualifier` | Amount as listed; rentals may be weekly — see `pricePcm` / `pricePw` (normalised monthly and weekly rent) |
| `bedrooms`, `bathrooms`, `propertySubType`, `propertyTypeFullDescription`, `tenure` | Basics |
| `latitude`, `longitude`, `distanceMiles` | Location; distance only with a radius search |
| `displaySize`, `sizeSqFt`, `pricePerSqFt` | Size when the agent supplied it; computed £/sq ft |
| `firstVisibleDate`, `listingUpdateReason`, `listingUpdateDate`, `addedOrReduced` | Exact listing timeline (`new`, `price_reduced`, …), timestamps in real UTC |
| `letAvailableDate` | Rentals: the day the property is available, `YYYY-MM-DD` (or Rightmove's text, e.g. `Now`) |
| `agent`, `agentBranchId`, `agentPhone`, `agentIsDeveloper` | Listing agent / developer |
| `premiumListing`, `featured`, `enhancedListing`, `auction`, `development`, `students`, `onlineViewingsAvailable`, `displayStatus` | Flags (`displayStatus` e.g. "Sold STC", "Let agreed") |
| `image`, `images`, `imagesCount`, `floorplansCount`, `virtualToursCount` | Media |
| `keywordMatchType`, `locationIdentifier`, `locationName`, `searchUrl`, `fetchedAt` | Provenance |
| **detail only:** `description`, `keyFeatures`, `propertyPhrase`, `outcode`, `incode`, `ukCountry`, `sizeSqM`, `pricePerSqM`, `pricePerSqFtSite`, `yearsRemainingOnLease`, `councilTaxBand`, `annualGroundRent`, `annualServiceCharge`, `deposit`, `letAvailableDate`, `furnishType`, `letType`, `minimumTermInMonths`, `listingHistory`, `published`, `archived`, `entranceFloor` (`{alias, displayText}`), `parking`, `heating`, `garden`, `accessibility`, `nearestStations[]`, `agentCompany`, `agentBranchName`, `agentAddress`, `agentLogo`, `brochures[]`, `floorplans[]`, `epcGraphs[]`, `allImages[]`, `sharedOwnership`, `affordableBuyingScheme`, `businessForSale`, `commercialUseClasses[]`, `tags[]`, `detailError` | From the property page |

`mode: "locations"` rows: `query`, `locationIdentifier`, `type`, `id`, `displayName`, `howToUse`, `fetchedAt`. When nothing matches, the run ends with the status *No Rightmove location matches "…"* and saves no rows.

Every run also writes a `SUMMARY` record to its key-value store (linked in the run's Output tab): rows saved, Rightmove's total, pages read, `detail` counts with the reason property pages stopped, notes on ignored inputs and why the run ended early.

### Use it from code / agents

```bash
curl -X POST "https://api.apify.com/v2/acts/yadroo~rightmove-uk/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"location":"Bristol","channel":"buy","maxPrice":350000,"minBedrooms":2,"maxItems":50}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/rightmove-uk').call({ location: 'Manchester', channel: 'rent', sinceHours: 3, maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/rightmove-uk").call(run_input={"locationIdentifier": "OUTCODE^2506", "channel": "buy", "includeSSTC": True, "detail": True, "maxItems": 60})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

MCP: add `https://mcp.apify.com` to your agent (Claude, Cursor, custom) and call the `yadroo/rightmove-uk` tool with the same JSON input — the input schema descriptions are written for agents.

### Pricing

Pay per event: **$0.005 per run start + $0.0015 per property**. A 100-property search costs about $0.155; `detail: true` costs the same per item but takes ~0.7 s per property. `mode: locations` rows are billed as items too (usually < 10). Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the property price; the start event is the same on every plan; platform usage is included.

**Your max cost per run is respected**: the run stops before the next property it could not pay for, saves what it has and ends with *Stopped at your spending limit: N rows delivered*. A run that nears its timeout stops starting new pages, keeps every row already read and ends with *Stopped before the run timeout: N rows saved*. Rows are saved page by page (every 10 properties with `detail: true`), and a restarted run never saves or bills a property twice.

### Limits & FAQ

- **Rate limits** — one request per results page (24 listings + 1 featured property) plus one per property page, 0.7–0.8 s apart. Measured in the cloud: about 660 properties a minute from results pages, about 50 a minute with `detail: true` (1,000 properties ≈ 20 min). Rightmove caps any search at ~1,000 results (42 pages); split by price band, outcode or type for full coverage — the status says when the cap ended the paging.
- **Freshness** — live search results with exact `firstVisibleDate` / `listingUpdateDate` on every list item, so `sinceHours` monitoring needs no detail pages.
- **Time zone** — Rightmove sends these timestamps as UK wall-clock time with a `Z` (UTC) suffix, so in summer (BST) they run one hour ahead of real UTC; its own page timestamp is off the same way. The actor converts them from Europe/London to real UTC (no change in winter, when UK time is UTC). `letAvailableDate` is a calendar day and is returned as a plain date.
- **Rentals** — `price` is the amount as listed (may be weekly); use `pricePcm` / `pricePw`. `minPrice`/`maxPrice` are always per month.
- **Blocking** — the search and property pages have been stable without proxies (no block in 1,300 requests, 02.10.2026). If the first results page is refused (403 or a challenge page), the run fails with that message; a later results page that fails ends the paging, keeps the rows saved and says so in the status. On property pages, a 403 or three failed pages in a row stop them for the rest of the run: the rest of the current results page is saved with list data only and `detailError: "skipped: …"`, no further results pages are read, and the status reports *detail k/N* and why. A single page that fails (a removed listing included) only sets `detailError` on its own row.
- **Newer property pages** — listings with 15-digit ids (most commercial listings, a few residential ones) use a newer page layout. `detail: true` reads it too, but that layout carries no council tax band, ground rent, deposit, furnishing, agent company/address/logo, Rightmove's own price texts, feature lists (parking, heating, garden, accessibility) or tags: those fields stay `null` / `[]` on such rows. A page in a layout the actor cannot read keeps the list fields with `detailError` and does not stop the other property pages.
- **Ambiguous places** — "Newcastle" resolves to several regions; set `locationType`, pass `locationIdentifier`, or check `mode: locations`. Streets are only chosen when `locationType: STREET` or no area matches.
- **Not included** — sold-price history, agent e-mail, anything behind login. Only what the public page shows.
- **Roadmap** — saved-search diffing (only items not seen in a previous run), sold-prices dataset.

***

Made by **Yadroo**. Related actors: [otodom-pl](https://apify.com/yadroo/otodom-pl) · [willhaben-at](https://apify.com/yadroo/willhaben-at) · [kleinanzeigen-de](https://apify.com/yadroo/kleinanzeigen-de) · [marktplaats-nl](https://apify.com/yadroo/marktplaats-nl) · [krisha-kz](https://apify.com/yadroo/krisha-kz) · [autoscout24-cars](https://apify.com/yadroo/autoscout24-cars)

# Actor input Schema

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

Town, area, outcode or station as you would type it on rightmove.co.uk: "Manchester", "Leeds LS1", "SW1A", "Clapham Junction". The first match is used (see locationType / mode "locations").

## `locationIdentifier` (type: `string`):

Exact Rightmove identifier, e.g. REGION^904 (Manchester), OUTCODE^2506 (SW1A), POSTCODE^123456, STATION^5462 (Leeds Station), STREET^<token>. Overrides location. Find it with mode "locations" or in the site URL (locationIdentifier=...).

## `locationType` (type: `string`):

When the free-text location has several matches, prefer this type (e.g. OUTCODE for "M3", STATION for "Leeds"). Without it the first non-street match is used.

## `mode` (type: `string`):

"locations" returns the typeahead candidates for the text in "location" (type, id, displayName, locationIdentifier) without searching; when nothing matches, the run ends with a status that says so and saves no rows.

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

Which Rightmove search to run.

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

Sale price, or monthly rent (pcm) for rentals.

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

Sale price, or monthly rent (pcm) for rentals.

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

0 = studio.

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

Maximum number of bedrooms (0 = studio). Ignored on commercial channels.

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

Search radius around the location, in miles (the only values the site accepts). 0.0 = inside the area only.

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

Residential types (ignored on commercial channels). Empty = any.

## `mustHave` (type: `array`):

Only properties with these features.

## `dontShow` (type: `array`):

Exclude these property kinds.

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

Server-side recency filter (the only values the site accepts). For a finer cut-off use sinceHours.

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

Rentals only.

## `letType` (type: `string`):

Rentals only.

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

Include properties already sold subject to contract / under offer (sales channels).

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

Include properties already let agreed (rental channels).

## `keywords` (type: `array`):

Words that must appear in the listing, e.g. \["garage", "annexe"]. Rightmove marks matches in keywordMatchType.

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

6 newest listed (best for monitoring), 10 oldest, 1 lowest price, 2 highest price.

## `sinceHours` (type: `integer`):

Client-side cut-off on firstVisibleDate (or listingUpdateDate with sinceField "updated"). Exact timestamps come with every list item — no detail needed. With sortType 6 the run stops as soon as older organic listings appear.

## `sinceField` (type: `string`):

Which timestamp sinceHours compares against: "added" = firstVisibleDate (new listings), "updated" = listingUpdateDate (also catches price reductions and re-listings).

## `detail` (type: `boolean`):

Open every property page for the full description, key features, outcode/incode, size (sq ft / m²) and computed price per sq ft / m², tenure & lease years, council tax band, service charge, ground rent, deposit/furnishing (rent), nearest stations, floorplans, brochures, EPC and all photos. One request per property, 0.7 s apart (about 50 properties a minute); rows are saved every 10 properties. A property page that cannot be read keeps the list fields and gets detailError. On a 403 block or 3 failed pages in a row, property pages stop: the rest of the current results page is saved with list data only and detailError "skipped: …", no further pages are read, and the status says "detail k/N". Listings with 15-digit ids (most commercial ones) use a newer page that has no council tax, deposit, furnishing, agent company or feature lists: those fields stay empty there.

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

Stop after this many properties (24 per results page plus the page's featured property; Rightmove serves at most ~1,000 results per search — narrow the filters for full coverage). Mode locations returns every match (at most 10).

## `maxPages` (type: `integer`):

Hard cap on result pages (24 listings plus one featured property each).

## `fields` (type: `array`):

Keep only these top-level fields per item, in this order, e.g. \["price","bedrooms","displayAddress","url"]. Every row keeps id (mode locations: locationIdentifier), and with detail: true also detailError when a property page was not read; they come first unless you list them. A different letter case or a near miss ("bedroms") is read as the output field and noted in the status; detail-only fields without detail: true and unknown names are ignored with a note; if no name is an output field the run fails and lists the valid names. Empty = all.

## Actor input object example

```json
{
  "location": "London",
  "mode": "search",
  "channel": "buy",
  "radius": "0.0",
  "includeSSTC": false,
  "includeLetAgreed": false,
  "sortType": "6",
  "sinceField": "added",
  "detail": false,
  "maxItems": 40,
  "maxPages": 42
}
```

# Actor output Schema

## `properties` (type: `string`):

One item per property: id, url, displayAddress, price (+ pricePcm/pricePw for rentals), bedrooms, bathrooms, propertySubType, tenure, coordinates, size & pricePerSqFt, agent & phone, firstVisibleDate, listingUpdate, images — plus description, keyFeatures, outcode/incode, sizeSqM/pricePerSqM, lease years, council tax band, service charge, deposit, nearest stations, floorplans when detail is on (detailError when a property page was not read). In mode locations the dataset holds typeahead candidates instead.

## `summary` (type: `string`):

SUMMARY record: rows saved, Rightmove's total for the search, pages read, "detail k/N" with the reason when property pages stopped, notes on ignored inputs, and why the run stopped early (spending limit, timeout, block).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "London"
};

// Run the Actor and wait for it to finish
const run = await client.actor("yadroo/rightmove-uk").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "location": "London" }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yadroo/rightmove-uk"
        }
    }
}
```

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/VqteesDKHOEEIBcr0/builds/xoaQbNNAQBexaLHo9/openapi.json
