# UK Sold House Prices (HM Land Registry Price Paid) (`marcoxpolo/uk-sold-house-prices`) Actor

Get sold house prices for any postcode, sector or district in England and Wales from official HM Land Registry Price Paid Data. Filter by date, price, property type, tenure and new build, with median price summaries. No API key needed.

- **URL**: https://apify.com/marcoxpolo/uk-sold-house-prices.md
- **Developed by:** [Keel Data](https://apify.com/marcoxpolo) (community)
- **Categories:** Real estate, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Sold House Prices (HM Land Registry Price Paid Data)

Get **sold house prices for any postcode, postcode sector or district in England and Wales**, straight from official **HM Land Registry Price Paid Data**. Every completed residential sale since 1995: price, date, full address, property type, freehold or leasehold, new build or not. Add an optional **price summary per area** (median, mean, quartiles, by property type and by year).

No API key, no login, no scraping of property portals. Just clean, official open data in JSON, CSV or Excel.

### What you can use it for

- **Property investors and landlords**: pull comparable sales (comps) for a street, sector or district before you make an offer.
- **Mortgage brokers, surveyors and estate agents**: check what similar homes actually sold for, not what they were listed at.
- **Proptech and AI builders**: feed sold-price data into valuation models, dashboards, chatbots or agents (works with the Apify API and MCP).
- **Analysts and journalists**: track local price trends by year and property type.
- **Home buyers and sellers**: see real sale prices around a postcode in seconds.

### How to use it

1. Enter one or more areas: a full postcode (`SW19 8UA`), a sector (`SW19 8`) or a district (`SW19`).
2. Optionally set a date range, price range, property types, tenure and new-build filter.
3. Click **Start**. Results appear newest first. Download as JSON, CSV, Excel or via API.

#### Example input

```json
{
  "postcodes": ["SW19 8", "M1 1AE"],
  "dateFrom": "2024-01-01",
  "propertyTypes": ["terraced", "semi-detached"],
  "tenure": "freehold",
  "includeAdditionalTransactions": false,
  "maxResultsPerArea": 500,
  "includeSummary": true
}
```

#### Example sale row

```json
{
  "transactionId": "5A7B802D-0E0A-1886-E063-4704A8C021AE",
  "pricePaid": 542000,
  "transactionDate": "2026-08-17",
  "address": "Flat 4, 1B, Haydon Park Road, London, SW19 8JY",
  "street": "HAYDON PARK ROAD",
  "town": "LONDON",
  "district": "MERTON",
  "county": "GREATER LONDON",
  "postcode": "SW19 8JY",
  "propertyType": "Flat/maisonette",
  "tenure": "Leasehold",
  "newBuild": false,
  "transactionCategory": "A - Standard",
  "searchArea": "SW19 8",
  "recordType": "sale"
}
```

#### Example summary row

```json
{
  "recordType": "summary",
  "searchArea": "SW19 8",
  "overall": { "count": 30, "median": 880000, "mean": 839105, "lowerQuartile": 451625, "upperQuartile": 1255250 },
  "byPropertyType": { "Terraced": { "count": 16, "median": 1053000 }, "Flat/maisonette": { "count": 13, "median": 480500 } },
  "byYear": { "2025": { "count": 18, "median": 905000 } }
}
```

### Input options

| Field | What it does |
|---|---|
| `postcodes` | Full postcodes, sectors or districts in England and Wales |
| `dateFrom`, `dateTo` | Sale date range (defaults: last two years) |
| `propertyTypes` | Detached, semi-detached, terraced, flat/maisonette, other |
| `tenure` | Any, freehold, leasehold |
| `newBuild` | Any, new builds only, existing homes only |
| `minPrice`, `maxPrice` | Price range in £ |
| `includeAdditionalTransactions` | Include category B sales (repossessions, company buyers, etc.) |
| `maxResultsPerArea` | Cap per area, newest first (up to 20,000) |
| `includeSummary` | Add one summary row per area |

### Pricing

Pay only for what you get (pay per event):

- **Sale record**: $0.002 per sold-price row ($2 per 1,000)
- **Area summary**: $0.01 per area summary row

Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

### Data coverage and notes

- Covers **England and Wales** only. Scotland and Northern Ireland are not part of HM Land Registry Price Paid Data.
- Sales usually appear **1 to 2 months after completion**; HM Land Registry updates the data monthly.
- Price Paid Data excludes some sales, such as transfers that are not for value, right-to-buy discounts and some commercial transactions. See HM Land Registry's guidance for details.
- Summary statistics are based on the rows returned for each area, so a low `maxResultsPerArea` limits the summary to the newest sales.

### FAQ

**Do I need an API key?** No. The Actor uses HM Land Registry's free public Price Paid Data service.

**Can I search by town or street?** Use the postcode district or sector that covers it; each row includes street, town and local authority so you can filter further.

**Is this the official Land Registry service?** No. This Actor is independent and is **not affiliated with or endorsed by HM Land Registry**. It uses their published open data.

**Is the data personal data?** Price Paid Data records property sales and addresses, not the names of buyers or sellers. Use it in line with UK data protection law and the licence below.

### Licence and attribution

Contains HM Land Registry data © Crown copyright and database right 2026. This data is licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

### Support

Found a problem or want a new filter? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `postcodes` (type: `array`):

Areas in England or Wales to search. Use a full postcode (SW19 8UA), a postcode sector (SW19 8) or a postcode district (SW19). Spaces and case don't matter.

## `dateFrom` (type: `string`):

Earliest sale date (YYYY-MM-DD). Defaults to two years ago. Data goes back to 1995.

## `dateTo` (type: `string`):

Latest sale date (YYYY-MM-DD). Defaults to today. Land Registry usually publishes sales one to two months after completion.

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

Leave empty for all types.

## `tenure` (type: `string`):

Freehold, leasehold or both.

## `newBuild` (type: `string`):

Only new builds, only existing homes, or both.

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

Only sales at or above this price.

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

Only sales at or below this price.

## `includeAdditionalTransactions` (type: `boolean`):

Category B covers repossessions, buy-to-lets bought with a mortgage, transfers to companies and other non-standard sales. Turn off for 'market' sales only.

## `maxResultsPerArea` (type: `integer`):

Newest sales first. Up to 20,000 per area.

## `includeSummary` (type: `boolean`):

Adds one summary row per area: count, median, mean, quartiles, by property type and by year.

## Actor input object example

```json
{
  "postcodes": [
    "SW19 8",
    "M1 1AE"
  ],
  "tenure": "any",
  "newBuild": "any",
  "includeAdditionalTransactions": true,
  "maxResultsPerArea": 500,
  "includeSummary": true
}
```

# Actor output Schema

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

All sale rows (recordType = sale) and area summaries (recordType = summary).

# 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 = {
    "postcodes": [
        "SW19 8",
        "M1 1AE"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("marcoxpolo/uk-sold-house-prices").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 = { "postcodes": [
        "SW19 8",
        "M1 1AE",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("marcoxpolo/uk-sold-house-prices").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 '{
  "postcodes": [
    "SW19 8",
    "M1 1AE"
  ]
}' |
apify call marcoxpolo/uk-sold-house-prices --silent --output-dataset

```

## MCP server setup

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

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/LkIrgDYxfdEZSZ1vY/builds/GfWfpxOMcfy2R2yo7/openapi.json
