# Rightmove API · UK Property Data + Sold Prices · No-Code (`sian.agency/rightmove-property-scraper`) Actor

The complete Rightmove API for UK property data. Pull live sale + rent listings, sold-price comparables (Land Registry stitched), EPC + tenure + floor area, buy-to-let filters, and polygon search — in one no-code actor.

- **URL**: https://apify.com/sian.agency/rightmove-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 property extracteds

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/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 API · UK Property Data + Sold Prices · No-Code

The complete **Rightmove API** for UK property data. Pull live sale + rent listings, **sold-price comparables** (Land-Registry-stitched), EPC + tenure + floor area, buy-to-let filters, and polygon search — in one no-code actor. No proxies, no CAPTCHAs, no breaking selectors.

> Independent tool · not affiliated with Rightmove plc.

### Why this Rightmove scraper

Most Rightmove scrapers on Apify give you live listings only. **This one bundles five things no one else combines:**

1. **Sold-price comparables in the same actor** — Land-Registry-style completed sales for any UK location, no extra workflow.
2. **Buy-to-let / investor filters** — `mustHave` (garden, parking, new home), `dontShow` (retirement, shared ownership, student let), `letType` (long-term / short-term / student) — out of the box.
3. **Polygon + coordinate search** — sweep map-bounded areas, not just town names.
4. **Full-detail enrichment** — one extra call returns description, EPC, tenure, floor area, council tax, stations, floorplans, virtual tours, full branch contact.
5. **Market KPIs** — median sale / rent / sold price, area breakdowns, price distribution (min · median · p90 · max).

### What you get

- **3 listing channels in one actor** — for-sale, to-rent, AND UK sold-price comparables (Land-Registry-style completed sales).
- **6 search modes** — `bylocation` · `byzip` · `bycoordinates` · `byurl` · `bulklocations` (PAID) · `soldprices`.
- **HTML report** — saved to the key-value store on every run.
- **Transparent 6-tier pricing** — FREE → BRONZE → SILVER → GOLD → PLATINUM → DIAMOND. Discount auto-applies as your monthly volume grows.
- **Three-key fallback** — primary + 2 backups for uptime.

### Search modes at a glance

| Mode | Input | Best for |
|---|---|---|
| `bylocation` | Free-text UK location (`"London"`, `"Manchester"`, `"Clapham Junction"`, `"NW3"`) | Town / neighbourhood / station sweeps |
| `byzip` | UK postcode — outward (`SW1A`) or full (`SW1A 1AA`) | Postcode-level inventory |
| `bycoordinates` | Lat/lon + radius (miles) | Map-bounded sweeps |
| `byurl` | Paste a Rightmove search URL | Replicate any filter the website supports |
| `bulklocations` (PAID) | Array of locations | Multi-area portfolio sweeps |
| `soldprices` | UK location + property type + tenure + last-N-years | UK comparables / Land-Registry-style sold-price comps |

### Filters

**Shared across listings modes** — `propertyType`, `priceRange`, `bedroomsRange`, `bathroomsRange`, `mustHave`, `dontShow`, `keywords`, `daysSinceAdded`, `sortOrder`, `resultCount`, `includeUnavailable`.

**Rent-only** — `furnishType` (furnished / part_furnished / unfurnished), `letType` (long_term / short_term / student).

**Sold-prices** — `soldPropertyType`, `soldTenure` (FREEHOLD / LEASEHOLD), `soldInYears`, `soldSortBy`, `soldSortOrder`.

### FREE tier

- 1 search mode at a time, up to 5 queries
- 25 listings per run
- All search modes available except `bulklocations` and `listingType=both`
- Detail enrichment disabled
- HTML report + market KPIs included

Upgrade to any paying Apify plan to unlock bulk locations, dual sale+rent runs, full-detail enrichment, and unlimited listings.

### Output schema (per row)

```jsonc
{
  "propertyId": "148711631",
  "listingType": "sale",                  // sale | rent | sold
  "url": "https://www.rightmove.co.uk/properties/148711631",
  "thumbnailUrl": "https://media.rightmove.co.uk/...",
  "propertyTitle": "5 bedroom apartment",
  "address": { "full": "One Hyde Park, Knightsbridge, London, SW1X" },
  "pricing": {
    "price": 60000000,
    "priceCurrency": "GBP",
    "priceDisplay": "£60,000,000",
    "priceQualifier": "",
    "rentFrequency": null                 // populated for rent: "pcm" | "pw"
  },
  "specs": { "beds": 5, "propertyType": "Apartment" },
  "location": { "latitude": 51.50187, "longitude": -0.161945, "distance": null },
  "branch": { "id": 271223, "name": "...", "brandName": "...", "phone": "...", "logoUrl": "...", "branchUrl": "..." },
  "media": { "photoCount": 6, "floorplanCount": 0, "hasVideo": false, "photos": [ "..." ] },
  "flags": { "isPremium": false, "isFeatured": false, "isBuildToRent": false, "status": null },
  "keywords": [],
  "addedReason": "new",
  "sortDate": "2024-07-05T15:28:05.000Z",
  "detail": { /* (optional, PAID) fullDescription, EPC, tenure, floor area, features, stations, branch */ },
  "sourceLabel": "location: London · sale",
  "scrapedAt": "2026-05-19T..."
}
````

### Use cases

- **UK property investors** — sweep BTL targets by postcode + must-have filters, then pull sold-price comparables to underwrite the deal.
- **Estate agents** — comp pulls, branch / brand listings counts, on-market vs sold-STC ratios.
- **PropTech builders** — pipe live UK property data into your dashboards, CRMs, valuation tools.
- **Market researchers** — median price + area breakdowns + recency cohorts across any UK location.
- **Surveyors / valuers** — pull `soldprices` for any postcode with tenure and property-type filters.

### Quick start

1. Pick a search mode (default `bylocation`).
2. Fill the matching input — `location`, `zipCode`, `latitude` + `longitude`, or `rightmoveUrl`.
3. (Optional) Add filters — `propertyType`, `priceRange`, `mustHave`, `daysSinceAdded`, etc.
4. (Optional, PAID) Tick `includeDetails` for the full property record per listing.
5. Run. The dataset fills in real time; the HTML report is saved to the key-value store.

### ⚠️ Trademark Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Rightmove plc, or any of its subsidiaries. "Rightmove" is used solely in a descriptive sense to identify the public data source the Actor reads from. All trademarks are the property of their respective owners.

### Legal & scraping

This Actor reads publicly-available UK property listings via a stable third-party data layer. Use of the data must comply with your local laws and any applicable terms of the source website. Bulk personal data, copyrighted descriptions, and contact details are intended for one-off research and underwriting, not bulk redistribution.

### Support

- 📝 Feedback / feature requests: Apify Console → Issues tab
- 📧 `apify@sian-agency.online`
- 🏪 More SIÁN Agency actors: https://apify.com/sian.agency?fpr=sian

# Actor input Schema

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

How to specify what to scrape.

• **bylocation** — free-text UK location (town, neighbourhood, postcode area, station)
• **byzip** — UK postcode (outward code like NW3 or full like NW3 1AA)
• **bycoordinates** — latitude + longitude + radius (miles)
• **byurl** — paste a Rightmove search URL — filters are read from the URL
• **bulklocations** — array of locations in one run (PAID)
• **soldprices** — UK sold-price comparables (Land-Registry-style completed sales)

## `listingType` (type: `string`):

Which side of the UK market to scrape.

• **sale** — properties for sale
• **rent** — properties to rent
• **both** — runs each query twice — sale + rent (PAID)

Ignored when Search Mode = byurl (the URL encodes whether it's a for-sale or to-rent search) or soldprices (which is always completed sales).

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

Free-text UK location — neighbourhood, town, county, region, station, or postcode area.

Examples: `London`, `Hampstead`, `Manchester`, `Clapham Junction`, `Edinburgh`, `SW1A`

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

Array of UK location strings to sweep in one run. PAID tier only.

## `zipCode` (type: `string`):

UK postcode. Both forms accepted:

- **Outward code** (broader): `NW3`, `SW1A`, `M1`, `EH1`, `B33`
- **Full postcode** (tighter): `SW1A 1AA`, `NW3 1AA`

Outward codes generally return broader, more useful result sets.

## `latitude` (type: `number`):

Latitude in decimal degrees (WGS84). London centre ≈ `51.5074`.

## `longitude` (type: `number`):

Longitude in decimal degrees. Negative = west of Greenwich. London centre ≈ `-0.1278`.

## `rightmoveUrl` (type: `string`):

Paste any search/filter URL from the Rightmove site.

Examples:

- `https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=500000`
- `https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87540`

## `radius` (type: `number`):

Search radius around the location/postcode/coordinates, in miles. Allowed 0–40. Default: 1 mile.

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

Comma-separated UK property types. Leave empty to include all.

Allowed: `house, detached, semi_detached, terraced, flat, bungalow, commercial, land, park_home, student_halls, other`

Examples: `flat`, `house,bungalow`, `terraced,semi_detached`

## `priceRange` (type: `string`):

Price range in GBP. Format: `min:N`, `max:N`, or `min:N,max:N`.

For sale: total price. For rent: monthly rent (pcm).

Examples: `min:500000,max:1500000`, `max:2000`, `min:300000`

## `bedroomsRange` (type: `string`):

Bedroom range. Studio = `min:0`. Format: `min:N`, `max:N`, or `min:N,max:N`.

Examples: `min:2`, `min:3,max:3`, `min:2,max:5`

## `bathroomsRange` (type: `string`):

Bathroom range. Format: `min:N`, `max:N`, or `min:N,max:N`.

## `mustHave` (type: `string`):

Comma-separated features the listing MUST have.

Allowed: `garden, parking, new_home, retirement, house_share, shared_ownership, auction, student`

Examples: `garden`, `garden,parking`, `new_home`

## `dontShow` (type: `string`):

Comma-separated features to EXCLUDE (same vocabulary as Must-have).

Examples: `retirement,shared_ownership`, `auction`

## `furnishType` (type: `string`):

Furnishing filter — used when listingType = rent. Comma-separate multiple.

Allowed: `furnished, part_furnished, unfurnished`

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

Letting term — used when listingType = rent.

• **long\_term** — standard assured shorthold tenancy
• **short\_term** — serviced / short lets
• **student** — student lets

## `daysSinceAdded` (type: `string`):

Restrict to listings added in the last N days. Leave empty for any age.

Allowed: `1`, `3`, `7`, `14`

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

Comma-separated free-text keywords matched against listing descriptions.

Examples: `garden`, `loft conversion,balcony`, `period property`

## `sortOrder` (type: `string`):

How results are sorted. Default: highest\_price.

## `resultCount` (type: `integer`):

Records per API page (1–40). Default 25. Higher values fetch the same listings in fewer pages.

## `includeUnavailable` (type: `boolean`):

Also include sold-STC / let-agreed / under-offer listings alongside live ones.

## `soldPropertyType` (type: `string`):

Filter sold prices to a single property type. Leave empty for all.

Allowed: `detached, semi_detached, terraced, flat, other`

## `soldTenure` (type: `string`):

Filter by tenure.

• **FREEHOLD** — own the building and the land
• **LEASEHOLD** — own the property for a fixed term

## `soldInYears` (type: `integer`):

Restrict to sales completed in the last N years. Leave empty for all-time.

## `soldSortBy` (type: `string`):

Sort field for sold prices.

## `soldSortOrder` (type: `string`):

Sort direction for sold prices.

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

Hard cap on listings returned per query. Auto-paginates until the cap is reached or the search is fully drained. Default 25. FREE tier is always capped at 25 listings per run.

## `includeDetails` (type: `boolean`):

When ON, fetches the full property record for each listing (1 extra API call per listing) — adds full description, EPC, tenure, floor area, key features, floorplans, virtual tours, council tax, nearest stations, and full branch contact. Adds a detail-enriched charge per successful enrichment. Disabled on FREE tier and in soldprices mode.

## Actor input object example

```json
{
  "searchMode": "bylocation",
  "listingType": "sale",
  "location": "London",
  "zipCode": "SW1A",
  "latitude": 51.5074,
  "longitude": -0.1278,
  "radius": 1,
  "letType": "",
  "daysSinceAdded": "",
  "sortOrder": "",
  "includeUnavailable": false,
  "soldPropertyType": "",
  "soldTenure": "",
  "soldSortBy": "",
  "soldSortOrder": "",
  "maxResults": 25,
  "includeDetails": false
}
```

# Actor output Schema

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

Structured Rightmove sale, rent and sold-price entries with optional full-detail enrichment.

## `htmlReport` (type: `string`):

HTML summary with run stats, market KPIs (median price, area + property-type breakdowns), and per-query totals.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/rightmove-property-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 = {}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Rightmove API · UK Property Data + Sold Prices · No-Code",
        "description": "The complete Rightmove API for UK property data. Pull live sale + rent listings, sold-price comparables (Land Registry stitched), EPC + tenure + floor area, buy-to-let filters, and polygon search — in one no-code actor.",
        "version": "1.0",
        "x-build-id": "OhBKRghraOqtQHFA7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~rightmove-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-rightmove-property-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/sian.agency~rightmove-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-rightmove-property-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/sian.agency~rightmove-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-rightmove-property-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": {
                    "searchMode": {
                        "title": "🧭 Search Mode",
                        "enum": [
                            "bylocation",
                            "byzip",
                            "bycoordinates",
                            "byurl",
                            "bulklocations",
                            "soldprices"
                        ],
                        "type": "string",
                        "description": "How to specify what to scrape.\n\n• **bylocation** — free-text UK location (town, neighbourhood, postcode area, station)\n• **byzip** — UK postcode (outward code like NW3 or full like NW3 1AA)\n• **bycoordinates** — latitude + longitude + radius (miles)\n• **byurl** — paste a Rightmove search URL — filters are read from the URL\n• **bulklocations** — array of locations in one run (PAID)\n• **soldprices** — UK sold-price comparables (Land-Registry-style completed sales)",
                        "default": "bylocation"
                    },
                    "listingType": {
                        "title": "🏠 Listing Type",
                        "enum": [
                            "sale",
                            "rent",
                            "both"
                        ],
                        "type": "string",
                        "description": "Which side of the UK market to scrape.\n\n• **sale** — properties for sale\n• **rent** — properties to rent\n• **both** — runs each query twice — sale + rent (PAID)\n\nIgnored when Search Mode = byurl (the URL encodes whether it's a for-sale or to-rent search) or soldprices (which is always completed sales).",
                        "default": "sale"
                    },
                    "location": {
                        "title": "📍 Location  (used when Search Mode = bylocation or soldprices)",
                        "type": "string",
                        "description": "Free-text UK location — neighbourhood, town, county, region, station, or postcode area.\n\nExamples: `London`, `Hampstead`, `Manchester`, `Clapham Junction`, `Edinburgh`, `SW1A`",
                        "default": "London"
                    },
                    "locations": {
                        "title": "📋 Bulk Locations  (PAID, bulklocations mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Array of UK location strings to sweep in one run. PAID tier only.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "zipCode": {
                        "title": "📮 Postcode  (used when Search Mode = byzip)",
                        "type": "string",
                        "description": "UK postcode. Both forms accepted:\n\n- **Outward code** (broader): `NW3`, `SW1A`, `M1`, `EH1`, `B33`\n- **Full postcode** (tighter): `SW1A 1AA`, `NW3 1AA`\n\nOutward codes generally return broader, more useful result sets."
                    },
                    "latitude": {
                        "title": "🗺 Latitude  (used when Search Mode = bycoordinates)",
                        "type": "number",
                        "description": "Latitude in decimal degrees (WGS84). London centre ≈ `51.5074`."
                    },
                    "longitude": {
                        "title": "🗺 Longitude  (used when Search Mode = bycoordinates)",
                        "type": "number",
                        "description": "Longitude in decimal degrees. Negative = west of Greenwich. London centre ≈ `-0.1278`."
                    },
                    "rightmoveUrl": {
                        "title": "🔗 Rightmove URL  (used when Search Mode = byurl)",
                        "type": "string",
                        "description": "Paste any search/filter URL from the Rightmove site.\n\nExamples:\n- `https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E87490&maxPrice=500000`\n- `https://www.rightmove.co.uk/property-to-rent/find.html?locationIdentifier=REGION%5E87540`"
                    },
                    "radius": {
                        "title": "📏 Search radius (miles)",
                        "minimum": 0,
                        "maximum": 40,
                        "type": "number",
                        "description": "Search radius around the location/postcode/coordinates, in miles. Allowed 0–40. Default: 1 mile.",
                        "default": 1
                    },
                    "propertyType": {
                        "title": "🏘 Property type",
                        "type": "string",
                        "description": "Comma-separated UK property types. Leave empty to include all.\n\nAllowed: `house, detached, semi_detached, terraced, flat, bungalow, commercial, land, park_home, student_halls, other`\n\nExamples: `flat`, `house,bungalow`, `terraced,semi_detached`"
                    },
                    "priceRange": {
                        "title": "💷 Price range (GBP)",
                        "type": "string",
                        "description": "Price range in GBP. Format: `min:N`, `max:N`, or `min:N,max:N`.\n\nFor sale: total price. For rent: monthly rent (pcm).\n\nExamples: `min:500000,max:1500000`, `max:2000`, `min:300000`"
                    },
                    "bedroomsRange": {
                        "title": "🛏 Bedrooms",
                        "type": "string",
                        "description": "Bedroom range. Studio = `min:0`. Format: `min:N`, `max:N`, or `min:N,max:N`.\n\nExamples: `min:2`, `min:3,max:3`, `min:2,max:5`"
                    },
                    "bathroomsRange": {
                        "title": "🛁 Bathrooms",
                        "type": "string",
                        "description": "Bathroom range. Format: `min:N`, `max:N`, or `min:N,max:N`."
                    },
                    "mustHave": {
                        "title": "✅ Must-have features",
                        "type": "string",
                        "description": "Comma-separated features the listing MUST have.\n\nAllowed: `garden, parking, new_home, retirement, house_share, shared_ownership, auction, student`\n\nExamples: `garden`, `garden,parking`, `new_home`"
                    },
                    "dontShow": {
                        "title": "🚫 Exclude features",
                        "type": "string",
                        "description": "Comma-separated features to EXCLUDE (same vocabulary as Must-have).\n\nExamples: `retirement,shared_ownership`, `auction`"
                    },
                    "furnishType": {
                        "title": "🛋 Furnished state (rent only)",
                        "type": "string",
                        "description": "Furnishing filter — used when listingType = rent. Comma-separate multiple.\n\nAllowed: `furnished, part_furnished, unfurnished`"
                    },
                    "letType": {
                        "title": "📅 Let type (rent only)",
                        "enum": [
                            "",
                            "long_term",
                            "short_term",
                            "student"
                        ],
                        "type": "string",
                        "description": "Letting term — used when listingType = rent.\n\n• **long_term** — standard assured shorthold tenancy\n• **short_term** — serviced / short lets\n• **student** — student lets",
                        "default": ""
                    },
                    "daysSinceAdded": {
                        "title": "🆕 Days since added",
                        "enum": [
                            "",
                            "1",
                            "3",
                            "7",
                            "14"
                        ],
                        "type": "string",
                        "description": "Restrict to listings added in the last N days. Leave empty for any age.\n\nAllowed: `1`, `3`, `7`, `14`",
                        "default": ""
                    },
                    "keywords": {
                        "title": "🔑 Free-text keywords",
                        "type": "string",
                        "description": "Comma-separated free-text keywords matched against listing descriptions.\n\nExamples: `garden`, `loft conversion,balcony`, `period property`"
                    },
                    "sortOrder": {
                        "title": "🔃 Sort order",
                        "enum": [
                            "",
                            "highest_price",
                            "lowest_price",
                            "newest",
                            "oldest",
                            "distance"
                        ],
                        "type": "string",
                        "description": "How results are sorted. Default: highest_price.",
                        "default": ""
                    },
                    "resultCount": {
                        "title": "📄 Records per page",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "Records per API page (1–40). Default 25. Higher values fetch the same listings in fewer pages."
                    },
                    "includeUnavailable": {
                        "title": "📌 Include unavailable",
                        "type": "boolean",
                        "description": "Also include sold-STC / let-agreed / under-offer listings alongside live ones.",
                        "default": false
                    },
                    "soldPropertyType": {
                        "title": "🏘 Sold property type (soldprices mode)",
                        "enum": [
                            "",
                            "detached",
                            "semi_detached",
                            "terraced",
                            "flat",
                            "other"
                        ],
                        "type": "string",
                        "description": "Filter sold prices to a single property type. Leave empty for all.\n\nAllowed: `detached, semi_detached, terraced, flat, other`",
                        "default": ""
                    },
                    "soldTenure": {
                        "title": "📜 Sold tenure",
                        "enum": [
                            "",
                            "FREEHOLD",
                            "LEASEHOLD"
                        ],
                        "type": "string",
                        "description": "Filter by tenure.\n\n• **FREEHOLD** — own the building and the land\n• **LEASEHOLD** — own the property for a fixed term",
                        "default": ""
                    },
                    "soldInYears": {
                        "title": "⏱ Sold in last N years",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Restrict to sales completed in the last N years. Leave empty for all-time."
                    },
                    "soldSortBy": {
                        "title": "🔃 Sold sort field",
                        "enum": [
                            "",
                            "price",
                            "address"
                        ],
                        "type": "string",
                        "description": "Sort field for sold prices.",
                        "default": ""
                    },
                    "soldSortOrder": {
                        "title": "↕ Sold sort direction",
                        "enum": [
                            "",
                            "DESC",
                            "ASC"
                        ],
                        "type": "string",
                        "description": "Sort direction for sold prices.",
                        "default": ""
                    },
                    "maxResults": {
                        "title": "📊 Max results per query",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on listings returned per query. Auto-paginates until the cap is reached or the search is fully drained. Default 25. FREE tier is always capped at 25 listings per run.",
                        "default": 25
                    },
                    "includeDetails": {
                        "title": "📋 Include full property details (PAID)",
                        "type": "boolean",
                        "description": "When ON, fetches the full property record for each listing (1 extra API call per listing) — adds full description, EPC, tenure, floor area, key features, floorplans, virtual tours, council tax, nearest stations, and full branch contact. Adds a detail-enriched charge per successful enrichment. Disabled on FREE tier and in soldprices mode.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
