# UK Property Scraper: Rightmove + OnTheMarket Market Report (`precious_bathmat/uk-property-market`) Actor

Scrape UK homes for sale or to rent from Rightmove and OnTheMarket in one run, for any town, area or postcode: price, bedrooms, type, tenure, days listed, price cuts, agent. Plus a market report with homes on both portals counted once. No login.

- **URL**: https://apify.com/precious_bathmat/uk-property-market.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

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

## UK Property Scraper: Rightmove + OnTheMarket Market Report

Scrape **UK homes for sale or to rent from Rightmove and OnTheMarket in one run**, with no login and no API key, and get a **market report for every town, area or postcode** that counts each home once, even when it is on both portals:

- **Every listing**: portal, price (rents per month), price qualifier, bedrooms, bathrooms, type, address, map position, size (sq ft where shown), tenure, new or reduced, first listed and days on Rightmove, new home, auction, shared ownership, agent, photos, link
- **Both portals, matched**: the same home on Rightmove and OnTheMarket is linked (`alsoOn`) and counted once in the report
- **Any UK place**: towns and cities ("Manchester"), areas ("Kensington"), postcode districts ("SW11") and full postcodes ("M1 1AE"), with a radius
- **Filters**: for sale or to rent, price range, minimum bedrooms
- **Past the 1,000-listing limit**: each portal shows about 1,000 listings per search; this Actor splits large searches by price
- **Market report per place**: median price and middle half, by bedrooms and property type, £ per sq ft, share with price cuts, tenure (freehold / leasehold), new homes, **below-market homes**, top agents, how many homes are on both portals

### What does this UK property scraper do?

```
Manchester · for sale · Rightmove 6,904 · OnTheMarket 6,201
 Median £250,000 (£185,000 – £340,000) · £381 per sq ft
 1 bed £170,000 · 2 bed £210,000 · 3 bed £300,000 · 4 bed £400,000
 39% of recent activity is price cuts · 59% leasehold
 56% of OnTheMarket's listings are also on Rightmove
```

1. Enter **UK towns, areas or postcodes**.
2. Pick **for sale or to rent**, **radius**, **price range**, **bedrooms**, and which **portals**.
3. You get **one row per listing** and **one market report per place**.

```mermaid
flowchart LR
    A[Towns, areas,<br/>postcodes] --> B[Rightmove]
    A --> C[OnTheMarket]
    B --> D[Listings matched<br/>across portals]
    C --> D
    D --> E[Market report<br/>price by bedrooms,<br/>cuts, tenure, agents]
```

### Who is it for?

- **Property investors and landlords**: asking prices and rents by bedrooms in any town or postcode, and the homes priced under their area
- **Estate agents**: your patch on both portals at once, price cuts, and which agents list the most
- **Buyers and renters**: what a fair price is before you view or make an offer
- **Proptech, mortgage and insurance teams**: fresh UK listing data with map positions, tenure and new-build flags
- **Analysts and journalists**: price and rent levels across UK towns, and how much the two portals overlap

### What data do you get?

**Listings** (dataset, one row per listing)

| Field | What it tells you |
|---|---|
| `portal`, `id`, `url`, `operation` | Rightmove or OnTheMarket; for sale or to rent |
| `price`, `pricePeriod`, `priceText`, `priceQualifier` | Price in pounds (rents per month) and how it is offered ("Offers over", "Guide price") |
| `bedrooms`, `bathrooms`, `propertyType`, `sizeSqft`, `tenure` | The home |
| `address`, `latitude`, `longitude` | Where |
| `status`, `statusDate`, `firstListed`, `daysListed` | New or reduced, and time on Rightmove |
| `addedOrReducedWithinDays` | OnTheMarket's "Added today / Reduced < 7 days" |
| `isNewHome`, `isAuction`, `isSharedOwnership`, `isRetirement`, `isFeatured` | Special listings |
| `agent`, `agentUrl`, `photos`, `hasFloorplan`, `summary` | Agent and listing |
| `alsoOn` | The same home on the other portal |
| `vsBedroomMedianPercent`, `bedroomMedianPrice`, `belowMarket` | Price against homes with the same bedrooms |

**Report** (`REPORTS`, one per place)

| Field | What it tells you |
|---|---|
| `rightmoveListings`, `onthemarketListings` | Each portal's count for the search |
| `rightmoveRead`, `onthemarketRead`, `uniqueHomesRead`, `onBothPortals`, `onBothPortalsPercentOfOnTheMarket` | What was read, and the overlap |
| `medianPrice`, `price25`, `price75`, `medianPricePerSqft` | Prices |
| `byBedrooms`, `byPropertyType` | Median and middle half by group |
| `reducedPercent`, `newLast7Days`, `medianDaysListedRightmove`, `listedOver90DaysPercentRightmove` | Market activity |
| `tenure`, `newHomePercent`, `auctionPercent`, `sharedOwnershipPercent` | The market's make-up |
| `belowMarket`, `belowMarketCount`, `topAgents` | Homes under 75% of their bedroom group's median, and the busiest agents |

### Example: 3 October 2026

Four places, homes for sale, 300 listings from each portal: **2,400 listings and 4 reports in 115 seconds**.

| Place | Rightmove | OnTheMarket | Median price (middle half) | 2-bed median | On both portals | Leasehold |
|---|---|---|---|---|---|---|
| Kensington, London | 1,773 | 1,672 | £1,450,000 (£750,000 – £2,750,000) | £1,100,000 | 73% | 41% |
| Bristol | 3,855 | 3,498 | £345,000 (£270,000 – £425,000) | £295,000 | 63% | 34% |
| Leeds | 4,907 | 3,719 | £260,000 (£184,975 – £372,500) | £200,000 | 64% | 31% |
| Manchester | 6,904 | 6,201 | £250,000 (£185,000 – £340,000) | £210,000 | 56% | 59% |

- **SW11 to rent** (2+ bedrooms): median **£3,800 a month**; 57% of OnTheMarket's lettings are also on Rightmove.
- **Birmingham, 2,500 listings from each portal (5,000 in all) in 4 minutes 23 seconds**, past both portals' 1,000-listing cap.

### Pricing

**$0.001 per listing** and **$0.02 per report**.

- 300 listings from each portal for one place, with a report: **$0.62**
- The run above (2,400 listings, 4 reports): **$2.48**

Turn off reports to pay for listings only, or pick one portal.

### Good to know

- **Order**: by default the Actor reads the newest and most recently reduced listings first, a fair sample of asking prices. The portals' own order starts with the most expensive homes, which pushes medians up; pick it only if you want that.
- **The report covers the listings read**; `rightmoveListings` and `onthemarketListings` are each portal's count for the whole search. Past 1,000 listings, the Actor counts every price band and reads each in proportion to its share of the market, so the sample stays representative.
- **Both portals**: a home counts as the same when bedrooms match, the price is within 1% and the map position within about 150 m.
- **Below market** = under 75% of the median for the same number of bedrooms in the search (at least 5 homes to compare). Auctions, shared ownership, retirement homes, land, garages and commercial units are left out of prices.
- **Days listed** comes from Rightmove (first visible date); OnTheMarket shows "Added / Reduced within N days" instead.
- **Zoopla** blocks automated access and is not included.
- **Privacy**: agents' phone numbers are not collected; emails and phone numbers in summaries are hidden. Listings are by estate and letting agents.
- Data comes from **Rightmove's and OnTheMarket's public search pages**. **Not affiliated with Rightmove or OnTheMarket.**

### Input

| Field | Meaning |
|---|---|
| **Locations** | UK towns, areas, postcode districts or postcodes |
| **For sale or to rent** | Rents are given per month |
| **Radius** | Miles around each location |
| **Price from / to** | £ (per month when renting) |
| **Bedrooms from** | Minimum bedrooms |
| **Order** | Newest first (default) or the portals' own order |
| **Portals** | Rightmove, OnTheMarket, or both (default) |
| **Listings per portal** | 1 to 10,000 per place (default 300) |
| **Reports** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "Newest first" to catch new listings and price cuts in your areas.

# Actor input Schema

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

UK towns, cities, areas or postcodes, e.g. "Manchester", "Leeds", "Kensington", "SW11", "M1 1AE". One report each.

## `operation` (type: `string`):

Homes for sale or to rent (rents are given per month).

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

Distance around each location. 0 = the place itself.

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

Only homes priced at least this (per month when renting).

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

Only homes priced at most this.

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

Only homes with at least this many bedrooms.

## `sort` (type: `string`):

Newest first reads the latest new and price-reduced listings, a fair sample of asking prices. The portals' own order starts with the most expensive homes.

## `portals` (type: `array`):

Which portals to read.

## `maxListingsPerPortal` (type: `integer`):

Most listings to read from each portal per location (past 1,000 the search is split by price).

## `includeReports` (type: `boolean`):

One market report per location: median price and middle half, by bedrooms and type, price cuts, days listed, tenure, new homes, below-market homes, top agents, homes on both portals.

## Actor input object example

```json
{
  "locations": [
    "Manchester"
  ],
  "operation": "sale",
  "radiusMiles": "0",
  "sort": "newest",
  "portals": [
    "rightmove",
    "onthemarket"
  ],
  "maxListingsPerPortal": 300,
  "includeReports": true
}
```

# Actor output Schema

## `listings` (type: `string`):

One row per listing: portal, price, bedrooms, type, address, tenure, new or reduced, days listed, agent, the same home on the other portal, link.

## `reports` (type: `string`):

Per location: median price, by bedrooms and type, price cuts, days listed, tenure, below-market homes, agents, overlap between portals.

## `reportsCsv` (type: `string`):

One flat row per location.

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

Requests, problems and the limits of the data.

# 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": [
        "Manchester"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/uk-property-market").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": ["Manchester"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/uk-property-market").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 '{
  "locations": [
    "Manchester"
  ]
}' |
apify call precious_bathmat/uk-property-market --silent --output-dataset

```

## MCP server setup

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

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/BSnAGcvdGgNo10ljj/builds/hSPJSCehNZNNdHsXZ/openapi.json
