Property Sold Prices UK & France - Land Registry + DVF
Pricing
$1.00 / 1,000 property sales
Property Sold Prices UK & France - Land Registry + DVF
Real sale prices from the official registers: HM Land Registry Price Paid Data (England and Wales) and DVF (France). Search by postcode, town, commune or department, filter by date, price and type. One clean record per sale, with licence and attribution. No listings, no asking prices, no API key.
Pricing
$1.00 / 1,000 property sales
Rating
0.0
(0)
Developer
Francesco Antonio Russo
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Property Sold Prices UK & France - real sale prices from Land Registry and DVF
Real sale prices - what buyers actually paid - from the two official registers: HM Land Registry Price Paid Data (England and Wales) and DVF (France). Search by postcode, town, commune or department, filter by date, price and type, and get one clean record per sale, in the same shape in both countries. No listings, no asking prices, no API key, no proxy.
- Official sources only. Every record carries its licence, the attribution line the licence asks for and a link to the source.
- Pay only for sales. $1.00 per 1,000 sales. Notes about an area (nothing found, name not understood) are free.
- You set the cost. "Max results per area", "Max results in total" and your own "maximum cost per run" stop the run exactly.
Who it is for
- Estate agents, valuers and investors who need comparable sales ("what did flats in this postcode sell for this year?").
- Proptech and data teams who want a stable, normalised feed of sold prices instead of scraping portals.
- Analysts and journalists who compare markets across the Channel with one schema.
What you get
Every sale is one record with the same 35 fields. Fields that do not apply or that the source does not state are null; nothing is guessed.
Real example: a UK sale (HM Land Registry)
{"status": "ok","error": null,"area": "LS11 8AH","country": "GB","sourceId": "uk-ppd:5A7B802D-5AB4-1886-E063-4704A8C021AE","saleDate": "2026-08-26","price": 188000,"currency": "GBP","propertyType": "house","propertyTypeOriginal": "semi-detached","areaSqm": null,"pricePerSqm": null,"landAreaSqm": null,"rooms": null,"newBuild": false,"tenure": "freehold","saleNature": "standard","saleNatureOriginal": "A","postcode": "LS11 8AH","city": "LEEDS","district": "LEEDS","county": "WEST YORKSHIRE","communeCode": null,"departmentCode": null,"address": null,"parcelIds": null,"latitude": null,"longitude": null,"components": null,"source": "HM Land Registry Price Paid Data (England and Wales)","sourceUrl": "https://landregistry.data.gov.uk/data/ppi/transaction/5A7B802D-5AB4-1886-E063-4704A8C021AE/current","license": "Open Government Licence v3.0","attribution": "Contains HM Land Registry data © Crown copyright and database right 2021. This data is licensed under the Open Government Licence v3.0.","dataFileUpdatedAt": "2026-09-28","retrievedAt": "2026-10-20T09:10:36.456Z"}
Real example: a French sale (DVF)
{"status": "ok","error": null,"area": "cp:33000","country": "FR","sourceId": "fr-dvf:2025-399813:000001","saleDate": "2025-12-31","price": 835000,"currency": "EUR","propertyType": "house","propertyTypeOriginal": "Maison","areaSqm": 230,"pricePerSqm": 3630,"landAreaSqm": 324,"rooms": 5,"newBuild": null,"tenure": null,"saleNature": "sale","saleNatureOriginal": "Vente","postcode": "33000","city": "Bordeaux","district": null,"county": null,"communeCode": "33063","departmentCode": "33","address": "37 RUE D ARCACHON","parcelIds": ["33063000DY0098"],"latitude": 44.826827,"longitude": -0.584111,"components": [{"type": "house","typeOriginal": "Maison","builtAreaSqm": 230,"rooms": 5,"landAreaSqm": null,"natureCulture": null}],"source": "DVF - Demandes de valeurs foncieres (DGFiP), geolocated by Etalab (geo-dvf)","sourceUrl": "https://files.data.gouv.fr/geo-dvf/latest/csv/2025/communes/33/33063.csv","license": "Licence Ouverte 2.0 (Etalab), with the DVF conditions of use: no re-identification of people, no indexing by search engines","attribution": "Source: DGFiP, Demandes de valeurs foncieres (DVF), geolocated and normalised by Etalab (geo-dvf), https://www.data.gouv.fr/datasets/demandes-de-valeurs-foncieres-geolocalisees/ - Licence Ouverte 2.0. Data file last updated 2026-05-18; downloaded 2026-10-20. Reuse is bound by the DVF conditions: no re-identification of people, no indexing by search engines.","dataFileUpdatedAt": "2026-05-18","retrievedAt": "2026-10-20T09:14:43.587Z"}
A French deed that sells different kinds of premises is one record with propertyType set to mixed (here a flat and a shop, 204 m2 in total, plus outbuildings, filed under the 5th arrondissement of Lyon). The price is counted once; the premises are listed in components:
{"area": "69123","saleDate": "2025-12-31","price": 950000,"propertyType": "mixed","propertyTypeOriginal": null,"areaSqm": 204,"pricePerSqm": null,"rooms": 5,"postcode": "69005","city": "Lyon 5e Arrondissement","communeCode": "69385"}
Real example: a free note
When an area gives no sale, you get one free record that says why, so a gap in your data is never silent:
{"status": "no_sales","error": "No sale found for \"EH\" between 2026-01-01 and 2026-10-20. The register's latest sale in the files read is dated 2026-08-28; sales appear 2 weeks to 2 months after completion.","area": "EH","country": "GB","sourceId": null,"saleDate": null,"price": null,"currency": null,"propertyType": null,"propertyTypeOriginal": null,"areaSqm": null,"pricePerSqm": null,"landAreaSqm": null,"rooms": null,"newBuild": null,"tenure": null,"saleNature": null,"saleNatureOriginal": null,"postcode": null,"city": null,"district": null,"county": null,"communeCode": null,"departmentCode": null,"address": null,"parcelIds": null,"latitude": null,"longitude": null,"components": null,"source": "HM Land Registry Price Paid Data (England and Wales)","sourceUrl": null,"license": "Open Government Licence v3.0","attribution": "Contains HM Land Registry data © Crown copyright and database right 2021. This data is licensed under the Open Government Licence v3.0.","dataFileUpdatedAt": null,"retrievedAt": "2026-10-20T09:12:33.642Z"}
How to use it
- Put UK areas in
ukAreas, French areas infrAreas, or both. - Set a date range (default: the last two years), and optionally a price range and property types.
- Start. Results appear in the dataset as each yearly file is read, newest sales first.
Input
| Field | What it does |
|---|---|
ukAreas | England and Wales: a full postcode (LS11 8AH), a sector (LS11 8), a district code (LS11; in central London SW1, W1, EC1-EC4, WC1, WC2, N1 also read their lettered districts SW1A-SW1Y, W1A-W1W, EC1A..., never SW10-SW19), a postcode area (LS), or a place: town, district or county (Leeds, Hebden Bridge, Kent). Prefix town:, district: or county: to say what a name is. |
frAreas | France: a commune name (Bordeaux, or Saint-Denis, 93 when the name is not unique), an INSEE code (33063, 2A004), a postal code cp:33000, a department dept:33. Paris, Lyon and Marseille are read through their arrondissements; Paris 7e Arrondissement also works. |
dateFrom, dateTo | Sale dates to include: 2024-01-31, 2024-01 or 2024. Default: two years back, until today. |
minPrice, maxPrice | Price range in the currency of the country (GBP for the UK, EUR for France). |
propertyTypes | house, apartment, commercial, land, outbuilding, mixed, other; the UK register also takes detached, semi-detached, terraced, flat. |
ukStandardSalesOnly | Keep only UK category A sales (one home, full value). Default: all categories; each record says which one it is. |
maxResultsPerArea | Sales delivered per area (default 100, up to 50,000). |
maxResults | Hard stop for the whole run (default 1,000, up to 200,000). |
sortOrder | newest (default) or oldest: which sales come first and which ones you keep when there are more than the limit. |
Names are matched ignoring case, accents, dots and hyphens (St. Albans = ST ALBANS = st-albans). A sale that fits two of your areas is delivered once, under the first. Each area still gets its own best sales, so a narrow area written after a wide one (LS11, then LS11 8AH) is not emptied; the SUMMARY notes how many of its sales were already delivered under the other area, and you are charged once per sale.
Example input:
{"ukAreas": ["LS11 8AH", "town:York"],"frAreas": ["Bordeaux", "cp:75011"],"dateFrom": "2025-01-01","propertyTypes": ["apartment"],"maxResultsPerArea": 50}
Output
| Field | Meaning |
|---|---|
status | "ok" for a sale. Any other value is a free note about an area (nothing is charged for it): no_sales (nothing found for your filters), invalid_area (not understood), area_not_found, not_covered (Alsace-Moselle and Mayotte are not in DVF), area_ambiguous (the name fits several communes, they are listed in "error"), source_unavailable, file_too_large. |
error | Why a record is not a sale: what was wrong or missing, and what to do. Null for sales. |
area | The area from your input that produced this record, as you wrote it. A sale that fits two areas is delivered once, under the first. |
country | GB (England and Wales only: the register does not cover Scotland or Northern Ireland) or FR (not Alsace-Moselle, not Mayotte). |
sourceId | Key of the sale in its register: uk-ppd: + the HM Land Registry transaction ID, or fr-dvf: + the DVF mutation and disposition. Use it as primary key. French IDs come from the source files and can change when DGFiP republishes them: to match across releases use saleDate + price + communeCode + parcelIds. Null on status records. |
saleDate | Date of the sale as the register states it (YYYY-MM-DD): the completion date on the transfer deed in the UK, the date of the deed in France. |
price | Price paid, in the currency of the record. UK: the price on the transfer deed. France: the "valeur fonciere" of the deed, counted once however many parcels or premises it covers. |
currency | Currency of price: GBP for the UK register, EUR for France. Nothing is converted. |
propertyType | Same list in both countries: house, apartment, commercial, land, outbuilding, mixed (a French deed selling different kinds of premises), other. UK: detached, semi-detached and terraced are house, flat is apartment, the register has no other kinds besides "other". |
propertyTypeOriginal | UK: detached, semi-detached, terraced, flat or other. France: the "type_local" of the premises (Maison, Appartement, Local industriel. commercial ou assimile, Dependance). Null for a French deed with several kinds of premises, or only land. |
areaSqm | France only: built living area ("surface reelle bati") added up over the premises of the deed, outbuildings left out. Null when the source does not state it, and always null in the UK (the register has no floor area). |
pricePerSqm | France only: price / built area, rounded to the euro. Only for a sale (or off-plan sale) of houses, apartments or commercial premises of one kind with a built area of at least 9 m2. Null for land, mixed deeds, auctions, exchanges. The price covers any land that comes with the building. |
landAreaSqm | France only: land area ("surface terrain") of the parcels of the deed, each counted once. Null in the UK. |
rooms | France only: main rooms ("pieces principales") of the houses and apartments of the deed, added up. Null in the UK and when not stated. |
newBuild | UK only: true if the property was newly built when sold. Null in France (the register flags off-plan sales in saleNature instead). |
tenure | UK only: freehold or leasehold. Null in France. |
saleNature | UK: standard (category A: one home sold at full value) or additional (category B: repossessions, buy-to-let with a mortgage, sales to companies, other). France: sale, sale-off-plan (VEFA), building-land-sale, auction, exchange, expropriation, other. |
saleNatureOriginal | UK: the category letter A or B. France: the "nature_mutation" text (Vente, Vente en l'etat futur d'achevement, Adjudication...). |
postcode | UK: the postcode used at the time of the sale (postcodes can be reallocated later). France: the postal code. The street-level address of UK sales is NOT delivered, see the README. |
city | UK: the Town/City of the register (upper case). France: the commune name. |
district | UK local authority district as in the register at the time of the sale. Null in France. |
county | UK county as in the register. Null in France. |
communeCode | France only: INSEE code of the commune (arrondissement for Paris, Lyon, Marseille). Null in the UK. |
departmentCode | France only: department code (33, 2A, 974). Null in the UK. |
address | France only: street address of the first premises of the deed (number, suffix, street), as DVF publishes it. Always null in the UK: the Royal Mail / Ordnance Survey terms do not allow street-level addresses in a data service, so they are left out on purpose. |
parcelIds | France only: cadastral parcel identifiers of the deed (up to 25), the same ids as the French cadastre files. Null in the UK. |
latitude | France only: WGS84 latitude of the centre of the first parcel that has coordinates (a parcel, not the building). Null when the source has none, and in the UK (the register has no coordinates). |
longitude | France only: WGS84 longitude, same rule as latitude. |
components | France only: what the deed sells, one entry per premises or land use (up to 25): {type, typeOriginal, builtAreaSqm, rooms, landAreaSqm, natureCulture}. Null in the UK. |
source | Name of the official register the sale comes from. |
sourceUrl | UK: the linked-data page of this very transaction at HM Land Registry. France: the official open-data file the sale was read from (DVF has no page per sale). |
license | Licence of the data and, for France, the conditions of use that go with it. |
attribution | The attribution line the licence asks you to show when you use or publish the data. Keep it with the data. |
dataFileUpdatedAt | Date the official file this record was read from was last updated by its publisher (YYYY-MM-DD). The UK files are rebuilt monthly, the French ones twice a year or less. |
retrievedAt | When this run read the source (ISO 8601, UTC). |
Four views are ready in the Apify console: sales (both countries), France detail, UK detail, and the free area notes. The run's SUMMARY record (key-value store) lists, for each area, how many sales were delivered and why not more, the files read and how fresh the source is (dataThrough).
How much does it cost?
$1.00 per 1,000 sales ($0.001 per delivered sale), pay per event (sale-record). Nothing else is charged: not the start of the run, not the notes about areas, not the files that could not be read.
| You ask for | You pay |
|---|---|
| 100 sales | $0.10 |
| 500 sales | $0.50 |
| 1,000 sales | $1.00 |
| 10,000 sales | $10.00 |
Platform usage (compute) is included in the price. Your "maximum cost per run" setting is respected to the sale: the run stops cleanly with the reason in the SUMMARY.
Limits to know
- UK = England and Wales only. HM Land Registry does not cover Scotland or Northern Ireland; asking for them gives a free note saying so.
- UK neighbourhoods cannot be searched. The register's "locality" column (a district of a city, like Clifton in Bristol) is not a search key here, because street-level address data is left out on purpose. Use the postcode, the sector (
BS8 4), the district code (BS8) or the town instead. - UK sales appear 2 weeks to 2 months after completion (HM Land Registry's own words), so the latest weeks are never complete.
dataThroughin theSUMMARYshows the newest sale in the files read. - France: DVF covers 5 years and is published twice a year. The latest release read by this Actor ends with 2025 (the 2026 sales are not out yet). Alsace (67, 68), Moselle (57) and Mayotte (976) are not in DVF (they keep a separate land registry, the Livre foncier): asking for them gives a free
not_coverednote, never an empty silence. - France: one record per deed (disposition). The file repeats the price on every parcel and premises of a deed; this Actor folds them into one record so you never count a price twice. A deed spanning several communes is reported with the parcels of the commune you asked for.
- Several properties, one deed. In the UK a deed that sells several properties can appear as several lines with the same price and date (each with its own ID): do not add them up as separate sales without checking.
- Prices are as stated on the deed. They are not adjusted, and sales not "for value" (gifts, right-to-buy discounts, court orders) are not in the UK register.
- Run time. The UK register is read as one official file per year (about 170 MB each); a search over a few years takes a minute or two. Wider date ranges take longer, and every year of the range is read only if the earlier ones did not already fill your limit.
- French IDs can change when DGFiP republishes the files. To match sales across releases use
saleDate+price+communeCode+parcelIds.
What it does not do
- No street-level address for UK sales. The UK data contains addresses processed with Royal Mail and Ordnance Survey data; their terms allow use "for personal and/or non-commercial use" and "to display for the purpose of providing residential property price information services", and nothing else. A data feed is not clearly one of those, so house number, flat, street and locality are left out on purpose. You get postcode, town, district and county.
- No owner or buyer names, ever. The registers do not contain them and the Actor never adds any.
- No asking prices, no listings, no valuations.
- No floor area, rooms or coordinates for the UK (the register has none). France has them.
- No data outside the two registers and no mixing with other sources.
FAQ
Where does the data come from? From the official files of HM Land Registry (Price Paid Data, yearly CSV files) and of the French tax administration (DVF, in the geo-dvf version that Etalab publishes on data.gouv.fr, with coordinates and normalised codes). The Actor reads open files and the open commune directory of geo.api.gouv.fr; it does not scrape any website.
Is it legal to use? The UK data is under the Open Government Licence v3.0: commercial use is allowed with the attribution below. The French data is under the Licence Ouverte 2.0 with the specific DVF conditions below. This is not legal advice; read the conditions that apply to what you do with the data.
Why does a French postal code or name need a prefix? A 5-digit number can be an INSEE commune code or a postal code. A bare number is read as INSEE if it is a commune, and the record says so; write cp:33000 for a postal code. Two communes with the same name are never guessed: you get a free note listing the INSEE codes.
Why is my UK area empty? The note says: the dates and filters used, that the register covers England and Wales only, and the date of the newest sale in the files. If no row of the register file carries your postcode, sector or district at all (a typo like BS84, or a code that does not exist), the note says so, so you can tell it from an area that simply had no sale in your dates. Check the postcode (a district code looks like SW1 or LS11, a full postcode like LS11 8AH) and widen the dates.
Does the run say when an area was cut short? Yes. If the run stops at maxResults (or at your maximum cost per run) while an area still had more sales, that area's note in the SUMMARY says it was cut short; areas not reached are not_read.
Does it restart cleanly? Yes. If the platform restarts a run, sales already in the dataset are not delivered or charged again.
Does it need a proxy or a key? No. It identifies itself honestly, reads one file at a time and retries politely (503 and 429 with Retry-After).
Use it from code
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('far003/property-sold-prices').call({ukAreas: ['LS11 8AH'],frAreas: ['Bordeaux'],dateFrom: '2025-01-01',maxResultsPerArea: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const sales = items.filter((item) => item.status === 'ok');
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("far003/property-sold-prices").call(run_input={"ukAreas": ["LS11 8AH"],"frAreas": ["Bordeaux"],"dateFrom": "2025-01-01","maxResultsPerArea": 50,})sales = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i["status"] == "ok"]
Attribution
If you use or publish the data, keep the attribution that comes with every record.
- United Kingdom: "Contains HM Land Registry data (c) Crown copyright and database right 2021. This data is licensed under the Open Government Licence v3.0." (Price Paid Data, https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads)
- France: "Source: DGFiP, Demandes de valeurs foncieres (DVF), geolocated and normalised by Etalab (geo-dvf), Licence Ouverte 2.0", with the date of the last update of the file (in
dataFileUpdatedAt). https://www.data.gouv.fr/datasets/demandes-de-valeurs-foncieres/ - French DVF conditions of use (DGFiP): "La reutilisation des informations publiees ne peut avoir ni pour objet ni pour effet de permettre la reidentification des personnes concernees." and "Les informations diffusees ne peuvent faire l'objet d'une indexation sur les moteurs de recherche en ligne." So: do not cross the data with other sources to identify people, and do not publish it in a form that search engines can index. The Actor itself adds no personal data and publishes nothing; the dataset is private to your account.