# UK Land Registry Price Paid Tracker (`conceivable_extension/uk-land-registry-price-paid-tracker`) Actor

Extracts and normalizes HM Land Registry Price Paid transaction records by postcode, region, or date range — real sold prices, property type, tenure, and new-build status from the official free UK government dataset. £0.003 per transaction record.

- **URL**: https://apify.com/conceivable\_extension/uk-land-registry-price-paid-tracker.md
- **Developed by:** [joseph fadero](https://apify.com/conceivable_extension) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 new-build flag includeds

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

## UK Land Registry Price Paid Tracker

Extracts and normalizes real HM Land Registry Price Paid transaction records by postcode, region, or date range — actual sold prices, property type, tenure, and new-build status, straight from the official free UK government dataset (Open Government Licence). £0.003 per transaction record returned.

This is a pure official-data actor: no browser, no scraping, no anti-bot risk. It queries HM Land Registry's own public linked-data API directly.

### Data source

HM Land Registry publishes Price Paid Data as official Linked Open Data at `landregistry.data.gov.uk`. Two real access routes exist:

- **Linked-data REST/JSON API** (used by this actor): `http://landregistry.data.gov.uk/data/ppi/transaction-record.json`, filterable by `propertyAddress.postcode`, `propertyAddress.district` (region/local authority), `min-transactionDate`/`max-transactionDate`, `propertyType`, and `newBuild`, with built-in pagination. Verified live during build — returns real, current transaction records in under 2 seconds for a filtered query.
- **SPARQL endpoint**: `http://landregistry.data.gov.uk/landregistry/query`. Also real and live-tested — a simple unfiltered query returns results in ~1 second — but a realistic filtered query (postcode + date range) repeatedly timed out (>55s) during build testing, likely due to the endpoint doing a broad scan for `REGEX`/date-range filters without an index. The REST/JSON endpoint above answered the equivalent query correctly and quickly, so it is the route this actor uses.

Data update cadence: **HM Land Registry publishes Price Paid Data monthly**, with a real publication lag (typically 1–3 months). There is no value in running this actor more than once a month — new transactions won't appear between monthly publications.

### Inputs

| Field | Default | Description |
|-------|---------|-------------|
| `postcodes` | `["NW6 4JD"]` | Full or outward UK postcodes. Free-text formatting (lowercase, missing space) is normalized automatically. |
| `region` | `""` (Camden used as a documented fallback example) | Local authority / county name, e.g. `Camden`, `Hertfordshire`. Used only when `postcodes` is empty. |
| `dateFrom` | `2026-06-01` | Start of transaction date range (inclusive). |
| `dateTo` | `2026-06-30` | End of transaction date range (inclusive). |
| `propertyType` | `any` | `detached`, `semi-detached`, `terraced`, `flat`, or `any`. |
| `newBuildOnly` | `false` | Only return new-build-flagged transactions. |

The default input queries real transaction data for postcode `NW6 4JD` (Kilburn High Road, London) in June 2026 — chosen and verified live during build to guarantee at least one real matching record with zero manual configuration, so the actor's automated QA test run succeeds against real data rather than an empty result set.

### Output fields (per transaction)

| Field | Description |
|-------|-------------|
| `address` | Full formatted address (flat/house number, street, locality, town, county). |
| `postcode` | Postcode as recorded by HM Land Registry. |
| `price` | Price paid in GBP. |
| `propertyType` | `detached`, `semi-detached`, `terraced`, `flat`, or `other`. |
| `tenure` | `freehold` or `leasehold`. |
| `newBuild` | `true` if flagged as a new-build sale. |
| `transactionDate` | Date of the transaction as recorded. |
| `transactionId` | HM Land Registry's unique transaction ID. |
| `scrapedAt` | ISO timestamp of when this actor run fetched the record. |

### Postcode normalization

UK postcode free text is inconsistent (no space, lowercase, partial). This actor applies the standard, deterministic UK postcode formatting rule: uppercase the input, then insert a single space before the final 3 characters (the standard inward-code length) if one isn't already present. No external lookup is needed — `nw64jd` becomes `NW6 4JD` before querying.

### Pricing (PPE)

| Event | Price | Trigger |
|-------|-------|---------|
| Actor Start | $0.05 | Per run (built-in, one-time) |
| Transaction Record Returned | $0.003 | Per real matching transaction record returned (built-in, via `Actor.pushData()`) |
| Postcode/Region Query No Match | $0.001 | A query runs and zero real matching transactions are found in the requested range |
| New-Build Flag Included | $0.0005 | Charged additionally when a returned record has a confirmed new-build status |

Pricing is set low across the board — this is commodity official government open data, not a scraped or hard-to-reach source, and the price reflects that.

### No overlap with other actors on this account

This account also runs a separate actor covering UK **procurement/tender** data (government contracts, not property sales). This actor is a genuinely distinct dataset — HM Land Registry residential property sale prices — with no overlap in source, schema, or use case.

### Notes

- No API key or authentication required — HM Land Registry's linked-data API is fully public.
- A defensive 25-page (5,000 record) cap is applied per query to keep broad region + wide date-range queries bounded.

# Actor input Schema

## `postcodes` (type: `array`):

Full or outward UK postcodes to search (e.g. 'NW6 4JD' or 'NW6'). Formatting is normalized automatically — spacing and case don't matter. Leave empty to use Region instead.

## `region` (type: `string`):

Alternative to Postcodes — a UK local authority district or county name, e.g. 'Camden' or 'Hertfordshire'. Used only when Postcodes is empty.

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

Start of the transaction date range (inclusive). HM Land Registry publishes with a publication lag, so pick a range a few months in the past to guarantee published data.

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

End of the transaction date range (inclusive).

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

Filter by property type. 'any' returns all types.

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

Only return transactions flagged as new-build properties.

## Actor input object example

```json
{
  "postcodes": [
    "NW6 4JD"
  ],
  "region": "Camden",
  "dateFrom": "2026-06-01",
  "dateTo": "2026-06-30",
  "propertyType": "any",
  "newBuildOnly": false
}
```

# Actor output Schema

## `resultsDatasetUrl` (type: `string`):

Dataset of transaction records produced by this run.

# 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 = {
    "postcodes": [
        "NW6 4JD"
    ],
    "region": "Camden"
};

// Run the Actor and wait for it to finish
const run = await client.actor("conceivable_extension/uk-land-registry-price-paid-tracker").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 = {
    "postcodes": ["NW6 4JD"],
    "region": "Camden",
}

# Run the Actor and wait for it to finish
run = client.actor("conceivable_extension/uk-land-registry-price-paid-tracker").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 '{
  "postcodes": [
    "NW6 4JD"
  ],
  "region": "Camden"
}' |
apify call conceivable_extension/uk-land-registry-price-paid-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conceivable_extension/uk-land-registry-price-paid-tracker"
        }
    }
}
```

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/9wltPRg9gQGj3mpJc/builds/Uz2Z8ygqlPXcotPj4/openapi.json
