# UK Land Registry Scraper — Price Paid & House Price Index (`logiover/uk-land-registry-scraper`) Actor

Scrape HM Land Registry Price Paid Data and UK House Price Index by postcode, town, district or region. Extract sale price, date, address, property type, tenure and new-build flag. No API key, no login.

- **URL**: https://apify.com/logiover/uk-land-registry-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## UK Land Registry Scraper — Price Paid & House Price Index

Extract 31 million real property sales and monthly House Price Index data straight from HM Land Registry open data for England & Wales — no API key, no login, just clean structured records you can pipe into a spreadsheet or your data warehouse.

### What does this scraper do?

This actor pulls official property data from **HM Land Registry** (England & Wales) using their **Linked-Data REST API** as the engine. It talks directly to the indexed endpoints — `landregistry.data.gov.uk/data/ppi/transaction-record.json` for individual sales and `/data/ukhpi/region/{slug}/month.json` for regional averages — so responses are fast, cleanly paginated, and returned as normalized JSON records rather than scraped HTML.

You get **two modes**. "Price Paid Data" returns individual property transactions: the price, address, property type, tenure, and completion date for real sales. "House Price Index" returns monthly regional averages and index values, broken down by property type, buyer type, and funding method.

The whole thing is **keyless** — HM Land Registry publishes this as open data under the Open Government Licence, so there is no key to buy, no account to create, and no rate-limit token to manage. Coverage runs from **1995 to the present**, spanning roughly **31 million residential sales** across England & Wales.

### Who is it for?

- **Estate agents & valuers** who need comparable sold-price evidence for a street, postcode, or town.
- **Property investors** hunting for undervalued areas, yield hotspots, and price momentum before they commit capital.
- **PropTech & data teams** building AVMs, dashboards, or lead-gen tools that need a reliable, structured feed of UK transactions.
- **Mortgage & valuation analysts** who validate loan-to-value ratios and track regional price movements for risk models.
- **Researchers & journalists** studying housing affordability, market cycles, and regional inequality with authoritative source data.

### Use cases

- Build a **sold-price comparables** table for any postcode to support a valuation or a purchase offer.
- Track **average price and annual change** across regions to spot markets that are heating up or cooling down.
- Feed a **property investment model** with real transaction history to estimate yields and capital growth.
- Populate an **AVM or pricing dashboard** with millions of clean, dated sales records.
- Produce **housing market reports** and data journalism backed by official government figures.

### Why use this scraper?

- **Keyless & no login** — nothing to register, no credentials to rotate. Run it and get data.
- **Official open data** — sourced from HM Land Registry under the Open Government Licence, not a third-party aggregator.
- **Two datasets in one actor** — individual Price Paid transactions *and* monthly House Price Index, switchable with a single `mode` field.
- **Rich filters** — narrow by postcode, town, district, county, date range, price band, property type, tenure, new-build, and transaction category.
- **Real numbers** — prices come back as proper numeric values (`180000`), dates as ISO strings, and booleans as booleans, ready to sort and aggregate.
- **Export & pay-per-result** — download to CSV, JSON, or Excel, push to any integration, and only pay for the rows you actually get.

### What data can you extract?

Depending on the `mode` you choose, the actor returns one of two record shapes. Every field below is included in the output.

#### Price Paid mode — output fields

| Field | Type | Description |
|---|---|---|
| `transactionId` | string | HM Land Registry unique transaction identifier |
| `pricePaid` | number | Sale price in £ |
| `transactionDate` | string | Completion date, ISO `YYYY-MM-DD` |
| `transactionDateRaw` | string | Raw date value as returned by the API |
| `propertyType` | string | Detached / Semi-detached / Terraced / Flat-Maisonette / Other |
| `newBuild` | boolean | `true` if the property was newly built at the time of sale |
| `estateType` | string | Freehold / Leasehold |
| `transactionCategory` | string | Standard / Additional price paid transaction |
| `recordStatus` | string | Add / Change / Delete (Land Registry record lifecycle) |
| `paon` | string | Primary Addressable Object Name (house number/name) |
| `saon` | string | Secondary Addressable Object Name (flat/unit) |
| `street` | string | Street name |
| `locality` | string | Locality |
| `town` | string | Town or city |
| `district` | string | Local authority district |
| `county` | string | County |
| `postcode` | string | Full postcode |
| `address` | string | Composed, human-readable address |
| `transactionUrl` | string | Link to the source record on landregistry.data.gov.uk |
| `scrapedAt` | string | ISO timestamp of when the record was fetched |

#### House Price Index mode — output fields

| Field | Type | Description |
|---|---|---|
| `region` | string | Region name |
| `regionSlug` | string | Region slug used in the API |
| `refMonth` | string | Reference month `YYYY-MM` |
| `refPeriodStart` | string | ISO start date of the reference period |
| `averagePrice` | number | Average price for the region in £ |
| `housePriceIndex` | number | House Price Index (Jan 2015 = 100) |
| `percentageAnnualChange` | number | Year-on-year percentage change |
| `percentageChange` | number | Month-on-month percentage change |
| `salesVolume` | number | Number of sales in the month |
| `averagePriceDetached` | number | Average price, detached properties (£) |
| `averagePriceSemiDetached` | number | Average price, semi-detached properties (£) |
| `averagePriceTerraced` | number | Average price, terraced properties (£) |
| `averagePriceFlatMaisonette` | number | Average price, flats/maisonettes (£) |
| `averagePriceNewBuild` | number | Average price, new-build properties (£) |
| `averagePriceExistingProperty` | number | Average price, existing (resold) properties (£) |
| `averagePriceCash` | number | Average price, cash purchases (£) |
| `averagePriceMortgage` | number | Average price, mortgage purchases (£) |
| `averagePriceFirstTimeBuyer` | number | Average price, first-time buyers (£) |
| `averagePriceFormerOwnerOccupier` | number | Average price, former owner-occupiers (£) |
| `housePriceIndexDetached` | number | HPI for detached properties |
| `housePriceIndexSemiDetached` | number | HPI for semi-detached properties |
| `housePriceIndexTerraced` | number | HPI for terraced properties |
| `housePriceIndexFlatMaisonette` | number | HPI for flats/maisonettes |
| `scrapedAt` | string | ISO timestamp of when the record was fetched |

Here is a real Price Paid record exactly as the actor returns it:

```json
{
  "transactionId": "5340B1C5-3EC5-8052-E063-4804A8C06EE4",
  "pricePaid": 180000,
  "transactionDate": "2026-05-27",
  "propertyType": "semi-detached",
  "newBuild": false,
  "estateType": "Freehold",
  "transactionCategory": "Standard price paid transaction",
  "recordStatus": "Add",
  "paon": "32",
  "street": "CARDINAL AVENUE",
  "town": "PLYMOUTH",
  "district": "CITY OF PLYMOUTH",
  "county": "CITY OF PLYMOUTH",
  "postcode": "PL5 1UW",
  "address": "32, CARDINAL AVENUE, PLYMOUTH, PL5 1UW",
  "transactionUrl": "https://landregistry.data.gov.uk/data/ppi/transaction/5340B1C5-3EC5-8052-E063-4804A8C06EE4/current",
  "scrapedAt": "2026-07-26T09:16:34Z"
}
````

### How to use

Running the actor takes three steps: pick your mode, tell it what to search, and start. Here are the two most common recipes.

#### Option A — Price Paid by town or postcode

Use this when you want individual sales. Set `searchBy` to the address field you want to match on, then put your values in `queries`.

1. Set `mode` to `price-paid`.
2. Set `searchBy` to `town` (or `postcode`, `district`, `county`).
3. Add your values to `queries`, e.g. `["PLYMOUTH", "EXETER"]`.
4. Optionally filter by `dateFrom`, `minPrice`, `propertyType`, etc.
5. Set `maxResults` and click **Start**.

```json
{
  "mode": "price-paid",
  "searchBy": "town",
  "queries": ["PLYMOUTH", "EXETER"],
  "dateFrom": "2026-01-01",
  "minPrice": 150000,
  "propertyType": "semi-detached",
  "estateType": "freehold",
  "sort": "newest",
  "maxResults": 500
}
```

#### Option B — House Price Index by region

Use this when you want monthly averages and trends rather than individual sales. Switch the mode and provide region slugs.

1. Set `mode` to `house-price-index`.
2. Add region slugs to `regions`, e.g. `["england", "london", "south-west", "city-of-plymouth"]`.
3. Optionally bound the period with `dateFrom` and `dateTo`.
4. Click **Start**.

```json
{
  "mode": "house-price-index",
  "regions": ["england", "london", "south-west", "city-of-plymouth", "united-kingdom"],
  "dateFrom": "2020-01-01",
  "dateTo": "2026-06-30",
  "maxResults": 500
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | select (`price-paid`, `house-price-index`) | `price-paid` | Which dataset to scrape: individual sales or monthly regional index. |
| `searchBy` | select (`postcode`, `town`, `district`, `county`) | `town` | Which address field your `queries` are matched against (Price Paid mode). |
| `queries` | array of strings | — | Values matching `searchBy`, e.g. `["PLYMOUTH","EXETER"]` or `["PL6 6AA"]`. Empty → demos with `PLYMOUTH`. |
| `dateFrom` | string (`YYYY-MM-DD`) | — | Only include records on or after this date. |
| `dateTo` | string (`YYYY-MM-DD`) | — | Only include records on or before this date. |
| `minPrice` | integer (£) | — | Minimum sale price. |
| `maxPrice` | integer (£) | — | Maximum sale price. |
| `propertyType` | select (`any`, `detached`, `semi-detached`, `terraced`, `flat-maisonette`, `other`) | `any` | Filter by property type. |
| `estateType` | select (`any`, `freehold`, `leasehold`) | `any` | Filter by tenure. |
| `newBuildOnly` | boolean | `false` | Return only newly built properties. |
| `categoryType` | select (`any`, `standard`, `additional`) | `any` | `standard` = ordinary residential sales; `additional` = repossessions, buy-to-let, and other non-private transfers. |
| `sort` | select (`newest`, `oldest`, `price-desc`, `price-asc`) | `newest` | Order of returned records. |
| `regions` | array of strings | — | Region slugs for HPI mode, e.g. `["england","london","south-west","city-of-plymouth","united-kingdom"]`. |
| `maxResults` | integer | `500` | Maximum number of records to return. |
| `proxyConfiguration` | proxy | — | Optional. Proxy settings; not required for this actor. |

A full input using every relevant field:

```json
{
  "mode": "price-paid",
  "searchBy": "postcode",
  "queries": ["PL5 1UW", "PL6 6AA"],
  "dateFrom": "2024-01-01",
  "dateTo": "2026-06-30",
  "minPrice": 100000,
  "maxPrice": 400000,
  "propertyType": "any",
  "estateType": "freehold",
  "newBuildOnly": false,
  "categoryType": "standard",
  "sort": "price-desc",
  "maxResults": 1000
}
```

### Output example

```json
{
  "transactionId": "5340B1C5-3EC5-8052-E063-4804A8C06EE4",
  "pricePaid": 180000,
  "transactionDate": "2026-05-27",
  "propertyType": "semi-detached",
  "newBuild": false,
  "estateType": "Freehold",
  "transactionCategory": "Standard price paid transaction",
  "recordStatus": "Add",
  "paon": "32",
  "street": "CARDINAL AVENUE",
  "town": "PLYMOUTH",
  "district": "CITY OF PLYMOUTH",
  "county": "CITY OF PLYMOUTH",
  "postcode": "PL5 1UW",
  "address": "32, CARDINAL AVENUE, PLYMOUTH, PL5 1UW",
  "transactionUrl": "https://landregistry.data.gov.uk/data/ppi/transaction/5340B1C5-3EC5-8052-E063-4804A8C06EE4/current",
  "scrapedAt": "2026-07-26T09:16:34Z"
}
```

### Tips for best results

- **Scope by town or postcode** for the fastest runs — narrow queries hit the indexed endpoints hardest and return quickest.
- **Postcode is the fastest search** of all; if you know the postcode, use `searchBy: postcode`.
- **Use `dateFrom`** to pull only recent sales instead of the entire history back to 1995.
- **Mind the registration lag** — sales from the last 2–8 weeks may not appear yet, because the date shown is the completion date and records take time to register.
- **Use House Price Index mode for trends** — if you want direction and averages rather than individual comparables, HPI is the right tool.
- **Sort deliberately** — `newest` for the latest comparables, `price-desc` to surface the top of the market, `oldest` for historical baselines.
- **Raise `maxResults`** when you need a full dataset for a busy town; lower it for quick spot checks.
- **Filter tenure and property type** to keep outputs relevant — e.g. `estateType: leasehold` for flats.
- **Use `categoryType: standard`** to exclude repossessions and non-private transfers that can skew averages.
- **Combine with other datasets** — join Price Paid comparables with HPI trends, or enrich with listings and company data (see Related scrapers) for a fuller market picture.

### Integrations

Once you have your data, connect this actor to the tools you already use:

- **Google Sheets** — push transactions straight into a spreadsheet for sharing and analysis.
- **Slack** — get notified when a run finishes or new sales appear in a watched postcode.
- **Zapier** — trigger thousands of downstream apps from each run.
- **Make** — build no-code automation flows around the dataset.
- **Webhooks** — POST results to your own backend the moment a run completes.
- **Schedule** — run the actor daily, weekly, or monthly to keep your data fresh automatically.

### API usage

You can run the actor programmatically with the Apify API. Replace `YOUR_API_TOKEN` with your token.

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~uk-land-registry-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "price-paid",
    "searchBy": "town",
    "queries": ["PLYMOUTH"],
    "dateFrom": "2026-01-01",
    "maxResults": 500
  }'
```

**Node.js (apify-client)**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const input = {
    mode: 'price-paid',
    searchBy: 'town',
    queries: ['PLYMOUTH'],
    dateFrom: '2026-01-01',
    maxResults: 500,
};

const run = await client.actor('logiover/uk-land-registry-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python (apify-client)**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "mode": "price-paid",
    "searchBy": "town",
    "queries": ["PLYMOUTH"],
    "dateFrom": "2026-01-01",
    "maxResults": 500,
}

run = client.actor("logiover/uk-land-registry-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Use with AI agents (MCP)

This actor works as a tool for AI agents through the Apify MCP (Model Context Protocol) server, so an LLM-powered assistant can fetch UK property data on demand as part of a larger workflow. Point your MCP-compatible client at the Apify MCP server, expose `logiover/uk-land-registry-scraper`, and let the agent call it directly.

> Example prompt: *"Get the 20 most recent semi-detached freehold sales in Plymouth over £150,000, then summarise the average price and the price range."*

### FAQ

#### Is it keyless?

Yes. HM Land Registry publishes Price Paid and House Price Index data as open data, so there is no API key, no login, and no account to set up. You just run the actor.

#### What area does it cover?

England & Wales. The data comes from HM Land Registry, which records residential property transactions across those two nations from 1995 to the present — roughly 31 million sales.

#### What's the difference between Price Paid and House Price Index?

Price Paid mode returns **individual property sales** (price, address, type, tenure, date). House Price Index mode returns **monthly regional averages and index values** broken down by property type, buyer type, and funding method. Use `mode` to switch between them.

#### Why are some recent sales missing?

There is a **registration lag**. The transaction date is the completion date, and it takes time for a sale to be lodged and registered. As a result, sales from roughly the **last 2–8 weeks may be incomplete or absent**. Rerun later and they will appear.

#### Can I get postcode-level data?

Yes. Set `searchBy` to `postcode` and pass full postcodes in `queries`, e.g. `["PL5 1UW"]`. Postcode is also the fastest way to search.

#### How many rows can I get per run?

As many as you set with `maxResults` (default 500). Because the underlying API is indexed and paginates cleanly, you can raise this to pull large datasets for a busy town or wide date range.

#### Are prices real numbers?

Yes. `pricePaid` and all the HPI averages come back as proper numeric values (e.g. `180000`), not strings, so you can sort, filter, and aggregate them directly.

#### How do I export the data?

From the run's dataset you can download to **CSV, JSON, or Excel**, or push it live to Google Sheets, a webhook, or any of the integrations listed above.

#### Is it legal?

Yes. This is public open government data released under the Open Government Licence. See the "Is it legal?" section below for detail.

#### How often is the data updated?

HM Land Registry updates its Price Paid and House Price Index datasets on a regular monthly cycle. Because of registration timing, the most recent weeks fill in gradually, so scheduling a recurring run keeps your copy current.

#### Are there related scrapers?

Yes — see the Related scrapers section at the end for UK company data and property listing scrapers that pair well with this one.

### Is it legal?

Yes. HM Land Registry Price Paid Data and the UK House Price Index are **public, open government datasets** published for anyone to use. They are made available under the **Open Government Licence (OGL)**, which permits copying, publishing, distributing, and adapting the data — including for commercial purposes — provided the source is acknowledged. This actor simply reads that officially published open data through HM Land Registry's own Linked-Data REST API; it does not access private records, bypass authentication, or scrape gated content. You should attribute HM Land Registry as the source and follow the terms of the Open Government Licence in your own use.

### Related scrapers

Pair this actor with other **logiover** scrapers to build a complete property and market intelligence stack:

- **UK Companies House Scraper** — enrich transactions with the companies behind corporate buyers and landlords.
- **Zoopla Scraper** — combine sold-price history with current listings and asking prices.
- **Rightmove-style Property Scraper** — track live UK listings alongside registered sales.
- **Bayut Scraper** — extend your property coverage into the UAE market.

# Actor input Schema

## `mode` (type: `string`):

Which HM Land Registry dataset to query. 'Price Paid Data' = individual property sales (England & Wales). 'House Price Index' = monthly average prices & indices per region.

## `searchBy` (type: `string`):

Which address field your queries match (Price Paid mode only). 'Postcode' expects a full postcode (e.g. PL6 6AA). 'Town' / 'District' / 'County' expect a place name (e.g. PLYMOUTH, CITY OF WESTMINSTER, DEVON).

## `queries` (type: `array`):

One or more values matching the 'Search by' field above. Each runs as a separate task. Examples: \['PLYMOUTH','EXETER'] for towns, or \['PL6 6AA','EX4 4QD'] for postcodes. Leave empty to demo with 'PLYMOUTH'.

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

Only include transactions on/after this date (YYYY-MM-DD). In House Price Index mode this filters the reporting month. Leave empty for no lower bound.

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

Only include transactions on/before this date (YYYY-MM-DD). Leave empty for no upper bound.

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

Minimum sale price in GBP (Price Paid mode). 0 = no minimum.

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

Maximum sale price in GBP (Price Paid mode). 0 = no maximum.

## `propertyType` (type: `string`):

Filter Price Paid sales by property type.

## `estateType` (type: `string`):

Filter by tenure / estate type.

## `newBuildOnly` (type: `boolean`):

If enabled, only return newly-built properties (first sale). Price Paid mode only.

## `categoryType` (type: `string`):

'Standard' = ordinary residential sales at full market value. 'Additional' = repossessions, buy-to-let, transfers to non-private individuals and other non-standard sales.

## `sort` (type: `string`):

Ordering of Price Paid results.

## `regions` (type: `array`):

Region slugs for House Price Index mode. Examples: 'england', 'wales', 'london', 'south-west', 'city-of-plymouth', 'united-kingdom'. Each is a separate task. Leave empty to demo with 'england'.

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

Maximum total rows to collect across all tasks. Raise to pull everything for an area/region.

## `proxyConfiguration` (type: `object`):

Optional. The Land Registry endpoint is open, so proxy is not required; enable Apify Proxy only if you run very large volumes.

## Actor input object example

```json
{
  "mode": "price-paid",
  "searchBy": "town",
  "queries": [
    "PLYMOUTH"
  ],
  "dateFrom": "",
  "dateTo": "",
  "minPrice": 0,
  "maxPrice": 0,
  "propertyType": "any",
  "estateType": "any",
  "newBuildOnly": false,
  "categoryType": "any",
  "sort": "newest",
  "regions": [
    "england"
  ],
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "queries": [
        "PLYMOUTH"
    ],
    "regions": [
        "england"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/uk-land-registry-scraper").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 = {
    "queries": ["PLYMOUTH"],
    "regions": ["england"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/uk-land-registry-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "PLYMOUTH"
  ],
  "regions": [
    "england"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call logiover/uk-land-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/uk-land-registry-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "UK Land Registry Scraper — Price Paid & House Price Index",
        "description": "Scrape HM Land Registry Price Paid Data and UK House Price Index by postcode, town, district or region. Extract sale price, date, address, property type, tenure and new-build flag. No API key, no login.",
        "version": "1.0",
        "x-build-id": "1nhLm8yehsGL2gT13"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~uk-land-registry-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-uk-land-registry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~uk-land-registry-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-uk-land-registry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~uk-land-registry-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-uk-land-registry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Dataset",
                        "enum": [
                            "price-paid",
                            "house-price-index"
                        ],
                        "type": "string",
                        "description": "Which HM Land Registry dataset to query. 'Price Paid Data' = individual property sales (England & Wales). 'House Price Index' = monthly average prices & indices per region.",
                        "default": "price-paid"
                    },
                    "searchBy": {
                        "title": "Search Price Paid by",
                        "enum": [
                            "postcode",
                            "town",
                            "district",
                            "county"
                        ],
                        "type": "string",
                        "description": "Which address field your queries match (Price Paid mode only). 'Postcode' expects a full postcode (e.g. PL6 6AA). 'Town' / 'District' / 'County' expect a place name (e.g. PLYMOUTH, CITY OF WESTMINSTER, DEVON).",
                        "default": "town"
                    },
                    "queries": {
                        "title": "Queries",
                        "type": "array",
                        "description": "One or more values matching the 'Search by' field above. Each runs as a separate task. Examples: ['PLYMOUTH','EXETER'] for towns, or ['PL6 6AA','EX4 4QD'] for postcodes. Leave empty to demo with 'PLYMOUTH'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "dateFrom": {
                        "title": "Date from",
                        "type": "string",
                        "description": "Only include transactions on/after this date (YYYY-MM-DD). In House Price Index mode this filters the reporting month. Leave empty for no lower bound.",
                        "default": ""
                    },
                    "dateTo": {
                        "title": "Date to",
                        "type": "string",
                        "description": "Only include transactions on/before this date (YYYY-MM-DD). Leave empty for no upper bound.",
                        "default": ""
                    },
                    "minPrice": {
                        "title": "Minimum price (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum sale price in GBP (Price Paid mode). 0 = no minimum.",
                        "default": 0
                    },
                    "maxPrice": {
                        "title": "Maximum price (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum sale price in GBP (Price Paid mode). 0 = no maximum.",
                        "default": 0
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "any",
                            "detached",
                            "semi-detached",
                            "terraced",
                            "flat-maisonette",
                            "other"
                        ],
                        "type": "string",
                        "description": "Filter Price Paid sales by property type.",
                        "default": "any"
                    },
                    "estateType": {
                        "title": "Tenure",
                        "enum": [
                            "any",
                            "freehold",
                            "leasehold"
                        ],
                        "type": "string",
                        "description": "Filter by tenure / estate type.",
                        "default": "any"
                    },
                    "newBuildOnly": {
                        "title": "New builds only",
                        "type": "boolean",
                        "description": "If enabled, only return newly-built properties (first sale). Price Paid mode only.",
                        "default": false
                    },
                    "categoryType": {
                        "title": "Transaction category",
                        "enum": [
                            "any",
                            "standard",
                            "additional"
                        ],
                        "type": "string",
                        "description": "'Standard' = ordinary residential sales at full market value. 'Additional' = repossessions, buy-to-let, transfers to non-private individuals and other non-standard sales.",
                        "default": "any"
                    },
                    "sort": {
                        "title": "Sort by",
                        "enum": [
                            "newest",
                            "oldest",
                            "price-desc",
                            "price-asc"
                        ],
                        "type": "string",
                        "description": "Ordering of Price Paid results.",
                        "default": "newest"
                    },
                    "regions": {
                        "title": "Regions (House Price Index)",
                        "type": "array",
                        "description": "Region slugs for House Price Index mode. Examples: 'england', 'wales', 'london', 'south-west', 'city-of-plymouth', 'united-kingdom'. Each is a separate task. Leave empty to demo with 'england'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Maximum total rows to collect across all tasks. Raise to pull everything for an area/region.",
                        "default": 500
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. The Land Registry endpoint is open, so proxy is not required; enable Apify Proxy only if you run very large volumes."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
