HM Land Registry Price Paid Scraper (UK Sales)
Pricing
$2.00 / 1,000 sale returneds
HM Land Registry Price Paid Scraper (UK Sales)
Property sales in England and Wales from HM Land Registry Price Paid Data: price paid, transfer date, full address, postcode, property type, tenure, new build.
Pricing
$2.00 / 1,000 sale returneds
Rating
0.0
(0)
Developer
Jason
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Pulls property sales in England and Wales from HM Land Registry Price Paid Data (PPD) - the official record of every property sold for value and lodged with HM Land Registry since 1 January 1995 - through the two channels HM Land Registry publishes itself: the linked-data endpoint at landregistry.data.gov.uk and the yearly bulk files at price-paid-data.publicdata.landregistry.gov.uk. No API key, no account, no browser automation. You get one flat JSON record per sale with the price paid, the date of transfer, the full address in its BS7666 parts and as a single line, the postcode, property type, tenure, new-build flag and the PPD category - filtered by transfer-date window, postcode (full or an outward code such as CB2), town, local-authority district, county, property type, tenure, new build, price range and PPD category. The Actor picks whichever channel answers your filters fastest and returns identical records either way - a live cross-check of both routes over the same window is part of npm run test:smoke.
On 8 September 2026 the published dataset held 31,525,946 transaction records, the newest transfer being 31 July 2026, with 930,559 sales in the last complete year (2024) and 323,461 published so far for 2026.
What you get
Every record contains:
| Field | Description |
|---|---|
id | HM Land Registry transaction unique identifier, e.g. 5834E4E8-7471-29C7-E063-4804A8C015BC. The bulk files wrap it in braces; this Actor always publishes it without them, so it matches the URL below |
source | hm-land-registry, constant |
url | https://landregistry.data.gov.uk/data/ppi/transaction/{id}/current - the public record for that transaction |
pricePaid | Price paid in pounds, as an integer. It is the consideration in the transfer deed, exclusive of VAT where the deed separates it |
currency | GBP, constant |
transferDate | Date of transfer, YYYY-MM-DD. This is the date on the deed, not the date HM Land Registry published it |
postcode | Postcode as published, e.g. CB2 9EF. null for the 0.3% of sales HM Land Registry publishes without one |
propertyType | Detached, Semi-detached, Terraced, Flat/Maisonette or Other |
propertyTypeCode | The source's own letter: D, S, T, F, O |
newBuild | true when the sale was of a newly built property (the source's old/new field). See Limits and freshness - this flag is heavily under-represented in recent months |
tenure | freehold or leasehold (the source's duration field). Leases of seven years or less are not in PPD at all |
paon | Primary Addressable Object Name: the house number or name, e.g. 84 or GREENWAY HOUSE |
saon | Secondary Addressable Object Name: the flat or unit within the building, e.g. FLAT 8. null when there is none (87% of sales) |
street / locality / town / district / county | The rest of the address as HM Land Registry publishes it, in upper case. town is the postal town and district the local authority, so a sale in Willingham is town: CAMBRIDGE, district: SOUTH CAMBRIDGESHIRE |
address | The same parts as one line, e.g. FLAT 8, GREENWAY HOUSE, OTTER CLOSE, TRUMPINGTON, CAMBRIDGE, CB2 9EF. A numbered PAON runs into the street (84 HIGH STREET), a named one takes a comma, and a locality equal to the town is not repeated |
category | PPD category type. A = standard price paid: a single residential property sold at full market value. B = additional price paid: transfers under a power of sale (repossessions), buy-to-lets identifiable by a mortgage, transfers to non-private individuals, and sales of property typed Other. HM Land Registry does not say which of those a B record is |
recordStatus | A added, C changed, D deleted. The yearly files carry only A; a C or D can appear on the linked-data route when a record has been corrected |
fetchedAt | ISO timestamp of the run that produced the record |
Records come back newest transfer first, so a maxItems below the window's volume keeps the most recent sales. The dataset has three views: Overview (date, price, address, type, tenure, link), Address parts (the BS7666 fields on their own, ready to join to your own address data) and Sale classification (type, tenure, new build, PPD category, record status).
Input
| Input | Type | Default | Description |
|---|---|---|---|
daysBack | integer | 60 | Look-back window in days on transferDate, ending today. Ignored when dateFrom/dateTo are set. Max 12,000, which reaches 1 January 1995. |
dateFrom | string | - | Start of the transfer-date window, YYYY-MM-DD, inclusive. Clamped to 1995-01-01. |
dateTo | string | today | End of the transfer-date window, YYYY-MM-DD, inclusive. |
postcodes | string[] | none | Full postcodes (CB2 9EF, with or without the space) or prefixes: an area (CB), an outward code (CB2, SW1A) or a sector (CB2 9). A prefix never cuts a number in half, so CB2 keeps CB2 9EF but not CB21 4JT, and M1 keeps M1 1AE but not M11 1AA. |
towns | string[] | ["CAMBRIDGE"] prefilled | Postal town, exactly as HM Land Registry writes it, case-insensitive. |
districts | string[] | none | Local authority district: BIRMINGHAM, CITY OF WESTMINSTER, SOUTH CAMBRIDGESHIRE. |
counties | string[] | none | County: GREATER LONDON, CAMBRIDGESHIRE, WEST MIDLANDS. |
propertyTypes | string[] | all | D detached, S semi-detached, T terraced, F flat/maisonette, O other. |
tenure | string | any | freehold, leasehold or any. |
newBuildOnly | boolean | false | Keep only sales flagged as newly built. |
minPrice / maxPrice | integer | none | Price bounds in pounds, inclusive. |
categories | string[] | both | A standard price paid, B additional price paid. |
route | string | auto | auto, api (linked-data only) or csv (bulk files only). See Limits and freshness. |
maxItems | integer | 1000 | Stop after this many sales. You are charged per sale, so this is also the cost cap. Newest transfer first, so a value below the window's volume drops the oldest sales in it - and says so (windowExhausted: false). |
Filters inside one group are ORed; the groups are ANDed. {"postcodes": ["CB1", "CB2"], "propertyTypes": ["F"]} means "a flat in CB1 or CB2".
Example - every sale in one town in the last quarter, the fast route:
{ "towns": ["CAMBRIDGE"], "daysBack": 120, "maxItems": 2000 }
Example - leasehold flats over £250,000 in two London boroughs, for a comparables table:
{"districts": ["CITY OF WESTMINSTER", "CAMDEN"],"propertyTypes": ["F"],"tenure": "leasehold","minPrice": 250000,"daysBack": 365,"maxItems": 5000}
Example - the sale history of one address, back to 1995:
{ "postcodes": ["CB2 9EF"], "daysBack": 12000, "maxItems": 500 }
Example - everything that sold anywhere in England and Wales in the last complete month:
{ "dateFrom": "2026-07-01", "dateTo": "2026-07-31", "maxItems": 30000 }
Bad input fails fast: an unknown property type, tenure, category or route, a malformed postcode, a minPrice above the maxPrice, or a window whose ends are the wrong way round stops the run with the validation message as its status, before any request is made.
Output example
A real record from a live run on 8 September 2026 ({"towns": ["CAMBRIDGE"], "daysBack": 90, "maxItems": 5}), unedited:
{"id": "5834E4E8-7471-29C7-E063-4804A8C015BC","source": "hm-land-registry","url": "https://landregistry.data.gov.uk/data/ppi/transaction/5834E4E8-7471-29C7-E063-4804A8C015BC/current","pricePaid": 580000,"currency": "GBP","transferDate": "2026-07-29","postcode": "CB21 4JT","propertyType": "Semi-detached","propertyTypeCode": "S","newBuild": false,"tenure": "freehold","paon": "84","saon": null,"street": "HIGH STREET","locality": "LINTON","town": "CAMBRIDGE","district": "SOUTH CAMBRIDGESHIRE","county": "CAMBRIDGESHIRE","address": "84 HIGH STREET, LINTON, CAMBRIDGE, CB21 4JT","category": "A","recordStatus": "A","fetchedAt": "2026-09-08T05:39:03.413Z"}
A flat from the same run carries the sub-building name: "id": "5834E4E8-754F-29C7-E063-4804A8C015BC", "pricePaid": 305000, "transferDate": "2026-07-27", "postcode": "CB2 9EF", "propertyType": "Flat/Maisonette", "tenure": "leasehold", "paon": "GREENWAY HOUSE", "saon": "FLAT 8", "address": "FLAT 8, GREENWAY HOUSE, OTTER CLOSE, TRUMPINGTON, CAMBRIDGE, CB2 9EF".
Every run also writes a SUMMARY record to the key-value store with the resolved window, the filters used, which route and which source files were read, how many rows were scanned and matched, the newest and oldest transfer delivered, the limitReached and windowExhausted completeness flags, and the attribution statement below.
Pricing
Pay per result: US$0.002 per sale delivered (US$2 per 1,000 sales). You are charged only for records pushed to the dataset; a run that returns nothing costs nothing, and a run that downloads a 56 MB bulk file to find three matching sales is charged for the three. Runs on the Apify free plan are limited by the platform's free-tier usage allowance.
Data source and licence
-
Linked-data route.
GET https://landregistry.data.gov.uk/data/ppi/transaction-record.jsonwithpropertyAddress.postcode/propertyAddress.town/propertyAddress.district,min-transactionDate,max-transactionDate,min-pricePaid,max-pricePaid,_pageSize,_pageand_sort=-transactionDate. Documentation: https://landregistry.data.gov.uk/app/root/doc/ppd (read 8 September 2026). -
Bulk route.
GET https://price-paid-data.publicdata.landregistry.gov.uk/pp-YYYY.csv, the yearly files linked from https://www.gov.uk/government/statistical-data-sets/price-paid-data-yearly-file, with the long-standing S3 endpointhttp://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-YYYY.csvas an automatic fallback (byte-identical files, verified 8 September 2026; the S3 host is HTTP-only). The 5.5 GBpp-complete.csvis never downloaded. -
Licence: Open Government Licence v3.0, https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/ (read 8 September 2026). HM Land Registry states that under the OGL it "permits you to use the Price Paid Data for commercial or non-commercial purposes".
-
Mandatory attribution. HM Land Registry requires anyone who uses or publishes Price Paid Data to add this statement, reproduced here exactly as it stands on https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads (page last updated 28 August 2026, read 8 September 2026):
Contains HM Land Registry data © Crown copyright and database right 2021. This data is licensed under the Open Government Licence v3.0.
The year in HM Land Registry's published wording is 2021, and it is reproduced unaltered rather than silently updated. The same string is written into every run's
SUMMARYrecord so it travels with the data; it is deliberately not repeated on every dataset item, where it would add about 130 bytes to each of them. -
Third-party rights in the address fields - read this before using the data for marketing. The OGL does not cover third-party rights, and the address fields (
postcode,paon,saon,street,locality,town,district,county, and thereforeaddress) are processed against Ordnance Survey's AddressBase Premium, which incorporates Royal Mail's PAF® database. HM Land Registry states that Royal Mail and Ordnance Survey permit your use of that Address Data "for personal and/or non-commercial use" and "to display for the purpose of providing residential property price information services", and that any other use requires contacting Royal Mail (address.management@royalmail.com). The price, date, property type, tenure, new-build flag and category carry no such restriction. Read the current terms yourself before building an address-driven product on it. -
Personal data. Price Paid Data contains no names, emails or phone numbers - no buyer, seller, owner or agent is identified, and this Actor adds none. HM Land Registry's own position is that "Price Paid Data is not personal information about individuals but property related information", published from the public register of title. A price and date attached to a specific address can still identify a household indirectly, so if you combine it with occupancy data you are the controller of the result: UK GDPR and the Data Protection Act 2018 apply to you, not to HM Land Registry, and HM Land Registry says explicitly that OGL users "have an obligation ... to ensure that their use of the data does not breach the Data Protection Act 2018 or the Privacy and Electronic Communication (EC Directive) Regulations 2003". Direct marketing off the back of this data is your legal risk, and the Address Data restriction above bites first.
Limits and freshness
- Update schedule and lag. HM Land Registry updates Price Paid Data "on the 20th working day of each month". The release current on 8 September 2026 was the July 2026 release, published 28 August 2026, and the newest transfer in it was 31 July 2026 - so a
daysBackunder about 40 returns nothing at all. HM Land Registry puts the gap between sale and registration at "between 2 weeks and 2 months" and warns that "data for the two most recent months is therefore incomplete". Both routes serve the same release: a live run of the same 120-day Cambridge window through each returned the same 20 CB2 sales with every field identical (npm run test:smoke, 8 September 2026). - Recent months under-report new builds. This is the biggest completeness trap in PPD and it is the source's, not the Actor's. New builds reach the register much later than resales: measured 8 September 2026,
newBuildistruefor 9.53% of the 930,559 sales in the settled 2024 file but only 0.23% of the 323,461 published so far for 2026 - 0.41% for January 2026 falling to 0.02% for July 2026. The back-dated additions in HM Land Registry's own change-only file for August 2026 were 27.7% new builds for 2025 transfer dates. UsenewBuildOnlyon a window at least a year old, or expect to miss most of them. - Volumes, measured 8 September 2026. England and Wales: 930,559 sales in 2024; 2026 to date 323,461 (January 52,243, February 55,616, March 55,911, April 44,450, May 46,381, June 46,025, July 22,835 and still filling). The default 60-day window held 12,720 sales. In 2024, 27.1% were semi-detached, 26.9% terraced, 22.7% detached, 17.6% flats and 5.8%
Other; 23.1% were leasehold and 18.0% were category B. Town of Cambridge: 1,174 sales in 2026 to date, 353 in a 120-day window, of which 20 were in the CB2 district. A single postcode is small enough to hold its whole history in one page - the full 1995-2026 window forCB2 9EFreturns 18 sales, the oldest from September 2016. - Which route a run takes, and why it matters.
autouses the linked-data API when your filters give it a list of full postcodes, or a town, or a district - the three things it answers quickly - and the yearly bulk files otherwise (an outward code such asCB2, a county on its own, or no area filter). Measured 8 September 2026 against the live endpoint: an exact postcode 1.2 s a page, a town 5-12 s, a district 5-24 s, a county 26 s, a postcode range scan (which is what an outward code would need) 57-83 s, and a date window with no area filter at all returned HTTP 500 after 90 s. The bulk files sidestep all of that by filtering locally.routeforces the choice;route: "api"with filters the endpoint cannot answer is refused up front rather than run slowly. - What the bulk route costs. One file per calendar year in the window:
pp-2026.csvis 56 MB / 323,461 rows,pp-2025.csv166 MB / 954,145 rows,pp-2024.csv162 MB. Measured 8 September 2026 on this machine: the whole of England and Wales for the default 60-day window, 1,000 records delivered, 31.8 s; the same window with every one of its 12,720 records delivered, 108.6 s (about 117 records a second, most of it the per-record write); a two-year window (pp-2025+pp-2026, 1,277,606 rows scanned) delivering 786 Cambridge sales, 60.8 s. A window spanning more than six calendar years is refused with a message telling you to narrow it or add a town, district or full postcode. The yearly files are used rather than HM Land Registry's smaller monthly change-only file (pp-monthly-update-new-version.csv, 17.7 MB / 101,600 rows on 8 September 2026) because, in HM Land Registry's words, "the single large file and yearly files have amendments and/or deletions applied to the data, ensuring the data is complete, up to date and accurate", whereas the monthly file is a feed of A/C/D changes a consumer has to apply for itself. - API paging. The linked-data endpoint caps a page at 200 items whatever
_pageSizeasks for, so this Actor requests 200 and pages until the endpoint returns a short page. Offset paging is consistent: six pages of a full-year Cambridge query returned 1,174 items with no duplicate and no gap, exactly matching the 1,174 rows for that town inpp-2026.csv. Each area value is its own page walk, and at most 25 values are allowed in one run. - Rate limits and errors. HM Land Registry documents no rate limit for the linked-data endpoint. Six consecutive page requests all returned HTTP 200, but requests issued while an earlier expensive query was still running came back HTTP 429 - it behaves like a concurrency guard rather than a request-per-second limit, so this Actor never issues two requests at once. 429, 500 and 5xx responses are retried with exponential back-off, honouring
Retry-After; a page that keeps timing out ends the run with a message telling you to narrow the window or the area rather than a bare HTTP status. A bulk file that fails on the HTTPS host is retried on HM Land Registry's S3 endpoint, and rows already read are recognised as duplicates rather than delivered twice. windowExhaustedis the completeness signal. It istrueonly when every source the run needed was read to the end and every matching record was delivered. WhenmaxItems(or your spend limit) cuts the result short, the run warnsthe OLDEST transfers in the window are the ones missingandSUMMARYcarrieslimitReached: true,windowExhausted: false, andmatched- the number of records that actually matched your filters - so you can see exactly how much you did not buy.- What PPD leaves out, in HM Land Registry's own words: sales not lodged for registration, sales not for value, right-to-buy sales at a discount, transfers subject to an existing mortgage, transfers of a share (for example on divorce), gifts, compulsory purchases, court orders, transfers to trustees, and vesting deeds covering more than one property. Commercial transactions whose deed states a price inclusive of VAT are excluded entirely. So an absent sale is usually a real exclusion, not a missing record.
- Corrections happen in place. HM Land Registry amends and deletes records in later releases, and a transaction that changes PPD category is deleted under its old id and re-added under a new id. Re-run an overlapping window rather than assuming a transaction id is permanent, and treat
recordStatusother thanAas a record that has been revised. - Address quirks. In the settled 2024 file, 0.30% of sales have no postcode, 1.6% have no street and 13.1% carry a SAON. Text is published in upper case and is passed through unchanged rather than re-cased, so
ST JOHN'Sis not mangled. Property characteristics are recorded as at registration, so a house later converted into flats keeps the old type on its old sale.
Use cases
- Comparable-sales and valuation tools. Pull every sale in a postcode district or town over a date window with type, tenure and new-build already on the record, and build the comparables table an agent, surveyor or lender actually uses - the display purpose Royal Mail and Ordnance Survey explicitly permit for the address fields.
- Local market research and dashboards. A scheduled monthly run over a district or county tracks volumes and price distributions by property type and tenure, with
categoryletting you separate ordinary sales from repossessions and portfolio transfers instead of quietly averaging them together. - Property data pipelines and enrichment. Join
idto HM Land Registry's own UPRN and INSPIRE ID lookup tables, or match on the BS7666 address parts, to attach a verified sale price and date to your own property records - a full historical download is{"dateFrom": "1995-01-01", "dateTo": "1995-12-31", "maxItems": 100000}repeated a year at a time.
Support
Open an issue on the Actor's Issues tab on Apify Store. Replies within 14 days. Bug reports that name the run id and the input used are fixed fastest.