# Property Sold Prices UK & France - Land Registry + DVF (`far003/property-sold-prices`) Actor

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.

- **URL**: https://apify.com/far003/property-sold-prices.md
- **Developed by:** [Francesco Antonio Russo](https://apify.com/far003) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 property sales

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

## 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)

```json
{
  "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)

```json
{
  "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`:

```json
{
  "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:

```json
{
  "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

1. Put UK areas in `ukAreas`, French areas in `frAreas`, or both.
2. Set a date range (default: the last two years), and optionally a price range and property types.
3. 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:

```json
{
  "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. `dataThrough` in the `SUMMARY` shows 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_covered` note, 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

```js
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');
```

```python
from apify_client import ApifyClient

client = 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.

# Actor input Schema

## `ukAreas` (type: `array`):

Where to look in England and Wales. A full postcode (LS11 8AH), a postcode sector (LS11 8), a postcode district (LS11), a postcode area (LS), or a place name: town, district or county (Leeds, Hebden Bridge, Kent). Add a prefix to say what a name is: town:York, district:Cornwall, county:Kent. Case and spaces do not matter. Each area gets up to 'Max results per area' sales. A sale that fits two areas is delivered once, under the first. Scotland and Northern Ireland are not in this register. Leave empty to search France only.

## `frAreas` (type: `array`):

Where to look in France. A commune name, with its department if the name is not unique (Bordeaux, "Saint-Denis, 93"), an INSEE commune code (33063, 2A004), a postal code with the prefix cp: (cp:33000), or a whole department with dept: (dept:33). Paris, Lyon and Marseille are read through their arrondissements. A name that fits several communes is not guessed: you get a free record that lists the choices. Alsace (67, 68), Moselle (57) and Mayotte are not in DVF. Leave empty to search the UK only.

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

First sale date to include: 2024-01-31, or just 2024-01 or 2024. Empty = two years before today. Reading more years means reading more yearly files: the UK register has one file per year of about 170 MB, DVF has data for 2021 to 2025 (the 2026 sales are not published yet).

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

Last sale date to include: 2025-12-31, or 2025-12 or 2025. Empty = today. Sales appear in the UK register two weeks to two months after completion, so the last weeks are never complete.

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

Only sales at or above this price (GBP for the UK, EUR for France). Empty = no minimum.

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

Only sales at or below this price (GBP for the UK, EUR for France). Empty = no maximum.

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

Keep only these types. Both countries use: house, apartment, other. France also has commercial, land, outbuilding (garage, shed) and mixed (a deed that sells more than one kind of premises). The UK register also lets you ask for detached, semi-detached, terraced or flat. Empty = all types.

## `ukStandardSalesOnly` (type: `boolean`):

The UK register has two categories: A, ordinary sales of a single home at full value, and B, other transfers (repossessions, buy-to-let purchases with a mortgage, sales to companies). Turn this on to keep only category A. Every record says which category it is.

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

Sales delivered for each area, taken newest first (or oldest first). This is your main cost control: you pay for the sales delivered, nothing else.

## `maxResults` (type: `integer`):

Hard stop for the whole run, all areas together. Your own 'maximum cost per run' setting also stops the run exactly.

## `sortOrder` (type: `string`):

Which sales come first, and which ones you keep when an area has more than the limit.

## Actor input object example

```json
{
  "ukAreas": [
    "SW1A 2AA",
    "BS1",
    "town:York"
  ],
  "frAreas": [
    "33063",
    "cp:75011",
    "dept:33"
  ],
  "dateFrom": "2024-01-01",
  "dateTo": "2025-12-31",
  "minPrice": 150000,
  "maxPrice": 600000,
  "propertyTypes": [
    "house",
    "apartment"
  ],
  "ukStandardSalesOnly": false,
  "maxResultsPerArea": 100,
  "maxResults": 1000,
  "sortOrder": "newest"
}
```

# Actor output Schema

## `sales` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "ukAreas": [
        "LS11 8AH"
    ],
    "frAreas": [
        "Bordeaux"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("far003/property-sold-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 = {
    "ukAreas": ["LS11 8AH"],
    "frAreas": ["Bordeaux"],
}

# Run the Actor and wait for it to finish
run = client.actor("far003/property-sold-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 '{
  "ukAreas": [
    "LS11 8AH"
  ],
  "frAreas": [
    "Bordeaux"
  ]
}' |
apify call far003/property-sold-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,far003/property-sold-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/BLfkVHBy2FS9wpcw4/builds/OJd6H4UncdbSeOh1S/openapi.json
