# UK Sold House Price Stats by Postcode Area (HM Land Registry) (`owenryland/uk-sold-price-stats`) Actor

Area-level sold-price stats for England & Wales from official HM Land Registry Price Paid Data: median, mean, quartiles, sales volume, property-type mix, new-build and freehold share, and period change for any postcode district or sector. Aggregated only.

- **URL**: https://apify.com/owenryland/uk-sold-price-stats.md
- **Developed by:** [Owen Ryland](https://apify.com/owenryland) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 area reports

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 Price Stats by Postcode Area (HM Land Registry)

Get **area-level sold-price statistics for England & Wales** in seconds, straight from **official HM Land Registry Price Paid Data**. Enter postcode districts (e.g. `BB11`, `M20`), sectors (e.g. `M20 2`) or full postcodes, and get one tidy row per area per year, quarter or month:

- median, mean, lower and upper quartile, min and max sold price
- number of sales, and the mix of detached, semi, terraced and flat sales (with a median for each)
- new-build share and freehold share
- median change vs the previous period, plus the change across the whole range
- location info (lat/long, local authority, country) via postcodes.io
- a `lowSample` flag when fewer than 10 sales sit behind a figure

**No scraping, no login, no proxies.** It uses the Land Registry's public open-data endpoint, so runs are fast and cheap.

### Who it's for

- Property investors and sourcers comparing areas
- Estate and letting agents writing market updates
- Analysts, journalists and content creators needing local price trends
- AI agents and automations needing a clean, structured price summary for a postcode

### Input

| Field | Example | Notes |
|---|---|---|
| `areas` | `["BB11", "M20 2", "BB11 1NL"]` | Districts, sectors or full postcodes. Max 50 per run. England & Wales only. |
| `dateFrom` / `dateTo` | `2023-01-01` | Completion dates. Defaults to 1 Jan 2023 → latest. |
| `propertyTypes` | `["D","S","T","F"]` | Detached, Semi, Terraced, Flat, Other. "Other" is excluded by default because it is often commercial. |
| `groupBy` | `year` | `year`, `quarter`, `month` or `none`. |
| `includeAdditionalTransactions` | `false` | Category B (repossessions, company purchases, etc.). Off by default = standard market sales. |
| `addGeo` | `true` | Adds lat/long, local authority and country. |

### Output (one row per area per period, plus an `ALL` row)

```json
{
  "area": "M20 2",
  "areaType": "sector",
  "period": "2025",
  "sales": 229,
  "medianPrice": 336000,
  "meanPrice": 444448,
  "p25Price": 250000,
  "p75Price": 560000,
  "medianChangePct": 6.1,
  "newBuildShare": 0.031,
  "freeholdShare": 0.31,
  "detachedSales": 17,
  "detachedMedianPrice": 950000,
  "adminDistrict": "Manchester",
  "latitude": 53.42,
  "longitude": -2.23,
  "lowSample": false,
  "source": "Contains HM Land Registry data (c) Crown copyright and database right. This data is licensed under the Open Government Licence v3.0."
}
```

*(Real output from a test run on 23 Oct 2026, categories A, types D/S/T/F.)*

Export to JSON, CSV or Excel, or call the Actor from the Apify API, Make, Zapier or an AI agent.

### Pricing

Pay per event: **$0.01 per area report** (every period for one area). Areas with no matching sales are **not charged**. Example: 20 postcode districts × 5 years = 20 reports = $0.20.

### Notes and limits

- Data covers England & Wales residential sales lodged with HM Land Registry. Recent months fill in over time, because registrations lag completions by weeks to months.
- The current year is partial.
- Small areas or short periods can have very few sales. Check `sales` and `lowSample` before drawing conclusions.
- **Aggregated output only.** The Actor never outputs house numbers, names or street addresses.
- Not financial or valuation advice.

### Data source and licence

Contains HM Land Registry data © Crown copyright and database right. This data is licensed under the Open Government Licence v3.0. Location data from postcodes.io (contains OS data © Crown copyright and database right; Royal Mail data © Royal Mail copyright and database right; ONS data © Crown copyright). Not affiliated with or endorsed by HM Land Registry.

### Support

Found a problem or want a feature (e.g. Scotland, rental data, HPI comparison)? Open an issue on the Actor's **Issues** tab. Issues are answered within 2 working days.

# Actor input Schema

## `areas` (type: `array`):

Postcode districts (e.g. BB11, M20, SW1A), sectors (e.g. BB11 1) or full postcodes (e.g. BB11 1NL). England & Wales only. Max 50 per run.

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

Earliest completion date to include (YYYY-MM-DD).

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

Latest completion date to include (YYYY-MM-DD). Leave empty for latest available.

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

D = detached, S = semi-detached, T = terraced, F = flat/maisonette, O = other (often commercial or non-standard).

## `groupBy` (type: `string`):

One row per area per period, plus an ALL row covering the whole date range.

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

Category B covers repossessions, buy-to-lets bought by companies, transfers under a power of sale, etc. Off by default to match standard market sales (category A).

## `addGeo` (type: `boolean`):

Adds latitude/longitude, local authority and country for each area using the free postcodes.io API.

## Actor input object example

```json
{
  "areas": [
    "BB11",
    "M20 2"
  ],
  "dateFrom": "2023-01-01",
  "propertyTypes": [
    "D",
    "S",
    "T",
    "F"
  ],
  "groupBy": "year",
  "includeAdditionalTransactions": false,
  "addGeo": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Sold-price statistics per postcode area and period from HM Land Registry Price Paid Data. One 'ALL' row per area plus one row per period when grouping is on.

# 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 = {
    "areas": [
        "BB11",
        "M20 2"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("owenryland/uk-sold-price-stats").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 = { "areas": [
        "BB11",
        "M20 2",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("owenryland/uk-sold-price-stats").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 '{
  "areas": [
    "BB11",
    "M20 2"
  ]
}' |
apify call owenryland/uk-sold-price-stats --silent --output-dataset

```

## MCP server setup

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

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/2M8TqljxYHtlomigY/builds/RSw9s3UEhHdxwyJxH/openapi.json
