HM Land Registry Price Paid Data Explained

On this page

Problem statement

Price Paid Data is the record of residential property sales in England and Wales, and the source behind most house-price maps, rankings and research for those countries. It feels complete, every sale with its price and address, but it has a defined scope, a structure with codes and categories, and a publication process that changes the files after release. Misreading any of them leads to wrong statistics: averages inflated by company transactions, regions missing because they are not covered, recent months that look like a slump because they are not yet registered.

This page explains what Price Paid Data contains and how it is made, using the 2024 file. It covers which sales are included and which are not, the meaning of each code, the split between standard and additional transactions, and how registration lags shape the most recent data.

Quick answer

The file is one row per registered sale with sixteen fields; the categories and codes carry most of the meaning:

print(f"{len(P):,} sales registered for 2024")
print("category:", P.ppd_category.value_counts().to_dict())
print("property type:", P.property_type.value_counts().to_dict())
print("old/new:", P.old_new.value_counts().to_dict(), "| duration:", P.duration.value_counts().to_dict())
print("record status in the yearly file:", P.record_status.value_counts().to_dict())
931,453 sales registered for 2024
category: {'A': 763905, 'B': 167548}
property type: {'S': 252107, 'T': 250137, 'D': 211340, 'F': 163884, 'O': 53985}
old/new: {'N': 842308, 'Y': 89145} | duration: {'F': 716354, 'L': 215099}
record status in the yearly file: {'A': 931453}

The 2024 file has 931,453 sales: 763,905 standard (A) and 167,548 additional (B). One in ten is a new build and 23% are leasehold. Every record in the yearly file has status A; changes and deletions appear in the separate monthly change files.

Stacked bars of 2024 records by category and property type Stacked bars of 2024 records by category and property type
Type "other" appears only in category B.

Coverage, standard and additional sales, registration lag

1. Coverage

counties = P.county.str.upper().unique()
welsh = {"GWYNEDD", "POWYS", "CARDIFF", "SWANSEA", "PEMBROKESHIRE", "CEREDIGION", "CONWY", "DENBIGHSHIRE", "ISLE OF ANGLESEY", "CARMARTHENSHIRE"}
print(f"counties in the file: {len(counties)}; Welsh counties among them: {len(welsh & set(counties))}; Scottish or Northern Irish: {sum(c in counties for c in ['CITY OF EDINBURGH', 'GLASGOW CITY', 'BELFAST'])}")
print(f"sales in these ten Welsh counties: {P.county.isin(welsh).sum():,}")
counties in the file: 113; Welsh counties among them: 10; Scottish or Northern Irish: 0
sales in these ten Welsh counties: 23,104

The file names 113 counties and unitary areas. All ten of the Welsh counties checked appear, and none of the Scottish or Northern Irish ones, because Scotland and Northern Ireland have their own registers.

Category A and B transactions in the 2024 Price Paid file. standard vs additionalA standardB additionalsales763,905167,548medianΒ£291,000Β£215,000type "other"none32%in the UK HPIyesno931,453 records, all status A in the yearly file spatialworkflow.io
Category B is a different market, with a median of Β£215,000.

2. Standard and additional transactions

for cat, g in P.groupby("ppd_category"):
    print(f"category {cat}: {len(g):,} sales; median Β£{g.price.median():,.0f}; types {g.property_type.value_counts(normalize=True).round(2).to_dict()}")
category A: 763,905 sales; median Β£291,000; types {'S': 0.3, 'T': 0.27, 'D': 0.26, 'F': 0.17}
category B: 167,548 sales; median Β£215,000; types {'O': 0.32, 'T': 0.27, 'F': 0.18, 'S': 0.15, 'D': 0.07}

Category B is a different market. Its median is Β£215,000 against Β£291,000, and 32% of its sales are type O, "other", which never appears in category A.

3. The registration lag

Sales are registered after completion, so the latest months of a download can be incomplete. Count sales by month of completion to see whether the year has filled in:

m = P.groupby(P.date.dt.month).size()
print({mo: int(v) for mo, v in m.items()})
print(f"December's sales as a share of the monthly average: {m[12] / m.mean():.0%}")
{1: 56602, 2: 62203, 3: 73662, 4: 65236, 5: 77734, 6: 76471, 7: 82300, 8: 88116, 9: 80067, 10: 96014, 11: 88950, 12: 84098}
December's sales as a share of the monthly average: 108%

Read in 2026, the 2024 file has filled in: December's sales are 8% above the monthly average, and October is the busiest month. In a file downloaded early in a year, the most recent months fall short of this until late registrations arrive.

What an address looks like

The data used on this page

HM Land Registry Price Paid Data for 2024, pp-2024.csv as published at the time of the run (Β© Crown copyright 2026, Open Government Licence v3.0).

from pathlib import Path

import pandas as pd
import requests

Path("data").mkdir(exist_ok=True)
CSV = Path("data/pp-2024.csv")
if not CSV.exists():
    r = requests.get("http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-2024.csv", timeout=1800); r.raise_for_status(); CSV.write_bytes(r.content)
COLS = ["transaction_id", "price", "date", "postcode", "property_type", "old_new", "duration", "paon", "saon",
        "street", "locality", "town", "district", "county", "ppd_category", "record_status"]
P = pd.read_csv(CSV, header=None, names=COLS, parse_dates=["date"])
print(f"file last read: {CSV.stat().st_size / 1e6:.0f} MB")
file last read: 162 MB

Example 1: what an address looks like

PAON and SAON together identify a property. See how often flats have a SAON:

f = P[P.property_type == "F"]
print(f"flats with a SAON (flat number or name): {f.saon.notna().mean():.0%}; houses with a SAON: {P[P.property_type.isin(list('DST'))].saon.notna().mean():.1%}")
print(f"sales with no postcode: {P.postcode.isna().sum():,}")
flats with a SAON (flat number or name): 64%; houses with a SAON: 1.3%
sales with no postcode: 2,749

64% of flat sales have a SAON, such as "FLAT 3", against 1.3% of houses. A property is identified by postcode, PAON, SAON and street together; 2,749 sales have no postcode at all.

Stacked monthly bars of 2024 sales by category Stacked monthly bars of 2024 sales by category
Read in 2026, December is 8% above the monthly average.

Sales appear once registered

What Price Paid Data includes and excludes. scope of Price Paid Dataincludedexcludedsales for value in England and WalesScotland and Northern Irelandstandard sales (category A)gifts, transfers not for valuerepossessions, buy-to-let, company sales (B)some right-to-buy, shared ownershipnew builds and resalescommercial-only salescategory B added from October 2013HM Land Registry guidance spatialworkflow.io
Scope decides what any statistic built on it can mean.

Price Paid Data is published by HM Land Registry from the registration of residential property sales in England and Wales. A sale appears once the transfer is registered, which happens after completion, often weeks and sometimes months later. Each record holds the price, the completion date, the address, and four codes. Property type is detached, semi-detached, terraced, flat or other. Old/new is a new build or an established home. Duration is freehold or leasehold. The category is standard (A) or additional (B). Category B was added in 2013 to include sales such as repossessions, buy-to-let purchases identified by a mortgage, and transfers to companies, which are excluded from the official House Price Index. Type "other" appears only in category B.

Scope matters as much as structure. Scotland and Northern Ireland keep separate registers and are not included. Sales not for value, such as gifts or transfers between spouses, are excluded, and so are some right-to-buy and shared-ownership sales. The yearly files keep growing after the year ends as late registrations arrive, and records are corrected or deleted through monthly change files. So the latest months of any download understate the number of sales, and published totals for a year change for some time afterwards.

Shared ownership, commercial property and licences

Checks before using Price Paid Data. before using the dataread without a headersixteen named columnschoose the categoryA for market pricesmind the lagrecent months fill in laterapply change filesstatus A, C, Dcredit the sourceCrown copyright, OGL2,749 sales in 2024 have no postcode spatialworkflow.io
2,749 sales in 2024 have no postcode.
  • Shared ownership: sales of a share are generally excluded; the price of a full staircasing purchase may appear.
  • Commercial property: only residential sales are included; mixed-use and commercial sales may appear as type "other" in category B.
  • Licence: Open Government Licence v3.0; credit HM Land Registry and note the Crown copyright.
  • Address data: addresses are given as registered; the related data is personal data under UK GDPR when combined with other information.

FAQ

What is HM Land Registry Price Paid Data?

A record of residential property sales in England and Wales registered with HM Land Registry since 1995, with price, date, address and property codes.

Does price paid data include all house sales?

Most sales for value in England and Wales; it excludes Scotland, Northern Ireland, gifts and some shared-ownership and right-to-buy sales.

Why are recent months missing sales?

Sales appear only once registered, often weeks or months after completion, so recent months fill in over time.

What is the difference between category A and B?

A is a standard sale at market value; B covers additional transactions such as repossessions, buy-to-let and company purchases.