# SiteVerdict — UK Property Data (Land Registry, EPC, Planning) (`siteverdict/siteverdict-uk-property-data`) Actor

England and Wales sold prices from HM Land Registry Price Paid Data with median/mean, monthly trend and UK HPI context; EPC certificates and £/sqm with your own free EPC token; planning constraints in England (conservation area, listed buildings, flood zone, Article 4, TPO).

- **URL**: https://apify.com/siteverdict/siteverdict-uk-property-data.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Business, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## SiteVerdict — UK Property Data (Land Registry, EPC, Planning)

**Sold prices (England and Wales), price trends (UK HPI), energy certificates (England and Wales) and planning constraints (England) for a postcode, all from official open sources. See Coverage below. Every row carries its source and licence.**

Type a postcode, outcode, street or area. You get back:

- 🏠 **Sold prices** from HM Land Registry Price Paid Data: price, date, address, property type, tenure and new-build flag.
- 📊 **A free summary for each search**:
  - median, mean and quartile prices
  - prices split by property type, tenure and new-build
  - a monthly trend
  - local **UK House Price Index** context
- ⚡ **Energy Performance Certificates (EPCs)**, if you add your own free token: rating, potential rating, floor area, construction age band, heating, CO₂, running costs and recommendations. Each EPC is **matched to the sale** with a confidence flag, which gives you **£ per m²**.
- 🗺️ **Planning constraints** for a postcode or map point (England): conservation area, listed buildings nearby, Article 4 direction, flood zone 2/3, tree preservation, green belt, AONB/National Landscape, World Heritage Site and more.

No scraping and no proxies. The actor only calls official APIs.

### Who it is for

- **Investors, sourcers and agents**: comparables, £/m² and planning red flags before a viewing.
- **Proptech and data teams**: clean JSON from four official sources joined in one run.
- **Energy-efficiency and retrofit teams**: EPC bands joined to sales, within the EPC licence purposes.
- **Researchers and journalists**: local price trends with HPI context and proper attribution.
- **AI agents**: also available as the MCP tool `uk_property_data` on the SiteVerdict MCP server.

### Quick start

1. Add searches, for example:
   - `PL4 7LG` (full postcode)
   - `PL4 7` (sector)
   - `PL4` (outcode)
   - `Mutley Plain, Plymouth` (street, town)
   - `district:Cornwall`, `town:Bath` or `county:Devon`
   - `point:50.3700,-4.1424` (a map point)
2. Optionally set the dates (default: the last 2 years), property types, tenure, new-build and price range.
3. Run it.
4. Use the dataset views **Sold prices**, **Area summaries**, **Energy certificates**, **Planning constraints** and **Errors**. Each row has a `recordType` (`transaction`, `summary`, `epc`, `planning-check`, `error`). Filter on it when you export.

Try **Sample mode** first. It runs with no network and no charge. It replays recorded official responses for PL4 7LG and a fictional `A0 0AA` demo of EPC matching and £/m².

#### Example input

```json
{
  "searches": ["PL4 7LG", "PL4", "Mutley Plain, Plymouth", "point:50.3700,-4.1424"],
  "dateFrom": "2024-01-01",
  "propertyTypes": ["T", "S"],
  "maxTransactionsPerSearch": 300,
  "includeEpc": true,
  "epcToken": "<your bearer token>",
  "epcPurpose": "sale-rental-market-energy-information"
}
```

#### Example output (abridged)

```json
{ "recordType": "transaction", "search": "A0 0AA (fictional sample-mode demo)", "date": "2023-06-15", "price": 250000, "address": "1, SOME STREET, WHITBURY, A0 0AA",
  "propertyTypeLabel": "Terraced", "tenure": "freehold", "newBuild": false, "category": "A",
  "epcMatch": { "certificateNumber": "0000-0000-0000-0000-0001", "confidence": "high", "currentBand": "E", "floorAreaSqm": 82 }, "pricePerSqm": 3049 }

{ "recordType": "summary", "search": "PL4", "priceStats": { "count": 84, "median": 197500, "mean": 194232, "p25": 140125, "p75": 240375 },
  "byPropertyType": { "T": { "median": 227000 }, "F": { "median": 132000 }, "S": { "median": 278000 } },
  "monthlyTrend": [{ "month": "2026-05", "count": 33, "median": "…", "mean": "…" }],
  "hpi": { "region": "City of Plymouth", "latestMonth": "2026-07", "averagePrice": 223161, "annualChangePct": 2.2 } }

{ "recordType": "planning-check", "search": "point:50.3700,-4.1424", "inConservationArea": true, "conservationAreaNames": ["City Centre"],
  "article4Direction": true, "floodZone": null, "listedBuildingsWithinRadius": 0,
  "findings": [{ "dataset": "park-and-garden", "name": "CIVIC SQUARE, PLYMOUTH", "relation": "contains-point" }] }
```

### How each part works

#### Sold prices (no key needed)

- **Source**: the official HM Land Registry Price Paid Data report builder (`landregistry.data.gov.uk/app/ppd`).
- **How it is fetched**:
  - full postcodes and streets: one request
  - outcodes, sectors, towns, districts and counties: fetched **month by month, newest first**, until *Max transactions per search* is reached
  - the summary says how far back the data goes (`coverage.fetchedFrom`, `coverage.truncated`)
- **Category A and B**:
  - Category A is a standard market-value residential sale. Category B covers repossessions, buy-to-lets identified by a mortgage, sales to companies and "other" property types.
  - Category B is off by default.
  - Summary statistics always use category A only.
- **Not included**: owner names. Price Paid Data does not contain them, and we do not add them.

#### Summary and trend (free)

- **Price statistics**: median, mean, minimum, maximum, 25th and 75th percentile.
- **Splits**: by property type, tenure and new-build.
- **Monthly trend**: count, median and mean per month.
- **Half-on-half median change**: a direction hint only.
- **£/m²**: uses the EPC floor area, and only for high- or medium-confidence matches that are unambiguous.
- **UK HPI context**:
  - uses the most local HM Land Registry UK House Price Index region available: local authority, then county, then region, then country
  - includes the latest month's average price, annual and monthly change, index, prices by property type, and the monthly series for your date range

#### EPC (your own free token)

1. Go to **get-energy-performance-data.communities.gov.uk**. This MHCLG service replaced `epc.opendatacommunities.org` in 2025.
2. Sign in with **GOV.UK One Login**.
3. Open **My account** and copy your **bearer token** into *EPC API bearer token*. Apify stores it encrypted. It is never logged or written to output.
4. Pick your **EPC permitted purpose** (see Licences below). The run will not fetch EPCs without one.

How EPCs are found and matched:

- **Which postcodes are searched**:
  - for a full postcode, that postcode
  - for outcode, street and area searches, the postcodes with the most sales (default 25)
- **Matching** happens only within the same postcode, using normalised address keys: upper case, no punctuation, expanded abbreviations (RD → ROAD and so on), and flat and house numbers compared exactly.
- **Confidence levels**:
  - `high`: same numbers and the street/building words agree
  - `medium`: same numbers and most words agree, or a named house where all its words match
  - `low`: weaker matches
- **Ties**: if different addresses tie for the best match, the confidence is lowered and `ambiguous: true` is set.
- **Multiple certificates**: when one address has several certificates, the one closest in date to the sale is used.
- *Which certificates*:
  - **Matched** (default): only the certificates linked to sales
  - **All**: also every other current certificate in the searched postcodes

#### Planning constraints (England, no key)

- **Source**: the MHCLG Planning Data platform (`planning.data.gov.uk`).
- **Which searches get a check**: full postcodes (at the ONS postcode centroid) and `point:` searches.
- **What it reports**:
  - areas that contain the point
  - features within the radius (default 50 m), including listed buildings and protected trees with their distance
- **Flags returned**:
  - `inConservationArea`
  - `listedBuildingsWithinRadius`, `nearestListedBuildingMetres` and listed-building grades
  - `onListedBuildingOutline`
  - `article4Direction`
  - `floodZone` (`2` or `3`)
  - `treePreservation`
  - `greenBelt`
  - `nationalLandscapeOrPark`
  - `worldHeritageSite`
  - `scheduledMonumentNearby`
  - `sssiNearby`
- **Findings**: each finding comes with its attributes and a link to the platform.

### Coverage: England, Wales, Scotland and Northern Ireland

| Source | England | Wales | Scotland | Northern Ireland |
|---|---|---|---|---|
| Price Paid Data (HMLR) | ✅ | ✅ | ❌ (Registers of Scotland) | ❌ (LPS) |
| UK House Price Index | ✅ | ✅ | ✅ | ✅ |
| EPC API (MHCLG) | ✅ | ✅ | ❌ (Scottish EPC Register) | ❌ |
| Planning Data platform | ✅ (growing) | ❌ | ❌ | ❌ |
| postcodes.io | ✅ | ✅ | ✅ | ✅ |

For Scottish and Northern Ireland postcodes you still get the location and HPI context. The summary notes say what is missing.

### FAQ

**Why are the last couple of months thin?**
Sales reach HM Land Registry 2 weeks to 2 months after completion, so recent months are incomplete.

**Why no planning check for an outcode?**
An outcode has no single location. Use full postcodes or `point:lat,lng`.

**Is "no constraint found" a guarantee?**
**No.** The Planning Data platform is still collecting data from local planning authorities, and postcode centroids can be about 100 m from a property. Always confirm with the local planning authority.

**Why didn't a sale match an EPC?**
There are several common reasons:

- not every home has an EPC
- some owners opted out
- addresses written differently (named houses, flat numbering)
- the EPC lodged under a different postcode

Unmatched sales still appear. They just have no £/m².

**Do you include owner names or contact details?**
No. Price Paid Data has none and we add none.

### Limits

- Up to 200 searches per run and up to 20,000 transactions per search.
- EPC lookups for outcode, street and area searches are limited to the postcodes with the most sales (configurable).
- Requests to each official host are spaced politely, with retry and backoff on 429/5xx errors. Large districts or counties over long date ranges take longer. Narrow the dates or raise the cap.
- EPC code tables (built form, property type, age band, tenure) are decoded for the common England and Wales enumerations. Recommendations are given as `improvementType` / `improvementNumber` codes, plus the cost, saving and rating after the improvement.

### Pricing (pay per event)

| Event | When charged |
|---|---|
| `transaction` | each sold-price row delivered |
| `epc-record` | each EPC certificate row delivered |
| `planning-check` | each completed planning check for one location. A clean "no constraints found" answer counts. A failed check is not charged. |

Summaries, notes, error rows and sample mode are **free**. The run stops cleanly at your **max cost per run**: records that do not fit are never charged, each search that was not reached gets a free `max-charge-reached` row, and the status message and `OUTPUT` say how many records and searches were not processed. A budget that is used up exactly is reported as complete.

### Sources, licences and compliance

Data sources (accessed October 2026):

- **HM Land Registry Price Paid Data**: 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."*
  - The address fields are derived from Ordnance Survey AddressBase Premium and Royal Mail PAF. Royal Mail and OS allow their use for personal or non-commercial use, and **to display for the purpose of providing residential property price information services**. Other uses need a Royal Mail licence.
- **UK House Price Index** (HM Land Registry with ONS, Registers of Scotland and LPS): Open Government Licence v3.0.
- **Energy Performance Certificates** (MHCLG *Get energy performance of buildings data*):
  - Non-address fields are licensed under OGL v3.0.
  - **Address data (address lines and postcode) is restricted.** Ordnance Survey and Royal Mail allow it **only for specific energy-performance purposes**:
    - managing properties to promote energy efficiency
    - energy-efficiency research
    - research into the impact of improvements
    - promoting government energy-efficiency schemes
    - understanding energy efficiency in the sale and rental market
    - enforcement of the EPB Regulations
    - Building Act duties
    - crime prevention and legal proceedings
    - the non-commercial research / private study copyright exception
  - Any other use (for example, general marketing lists) needs a licence from OS or Royal Mail.
  - The required copyright notice is attached to every EPC row (`addressCopyrightNotice`). Keep it with the data when you share it.
  - MHCLG notes that address-level EPC data is **personal data** under UK GDPR. If you process it, you are a data controller. Do not use it for unsolicited direct marketing; PECR applies to electronic marketing.
- **Planning Data platform** (MHCLG): Open Government Licence v3.0, with each dataset's own attribution (Historic England, Natural England, Environment Agency and the local authorities).
- **postcodes.io**: open postcode API. Contains OS data © Crown copyright and database right; Royal Mail data © Royal Mail copyright and database right; National Statistics data © Crown copyright.

Each row includes `source` and `attribution` fields. Each summary lists its `sources` and the PPD `addressDataNotice`.

**Disclaimer:** this is informational data only. It is not legal, financial, valuation, surveying or conveyancing advice. Official sources lag and can be incomplete. Check with the official registers, the local planning authority and a qualified professional before relying on it.

Built by SiteVerdict (BharatFare Travel and Technologies Ltd, UK). Questions or bugs: use the Issues tab on this Actor's Store page.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-uk-property-data/changelog.md

# Actor input Schema

## `searches` (type: `array`):

One per line. Full postcode <code>PL4 7LG</code>, sector <code>PL4 7</code>, outcode <code>PL4</code>, street <code>Mutley Plain, Plymouth</code>, area <code>town:Plymouth</code> / <code>district:Cornwall</code> / <code>county:Devon</code>, or a point <code>point:50.3813,-4.1274</code> (planning check + nearest postcode). Max 200.

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

Inclusive. Default: 2 years ago. Price Paid Data starts January 1995.

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

Inclusive. Default: yesterday.

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

Empty = all. HM Land Registry does not separate bungalows; end-terraces count as terraced.

## `tenure` (type: `array`):

Empty = both.

## `newBuild` (type: `string`):

Filter on HM Land Registry's Old/New flag.

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

Optional.

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

Optional.

## `includeAdditionalPricePaid` (type: `boolean`):

Category B = repossessions, buy-to-lets identified by mortgage, transfers to companies, 'other' property types. Output only; summary statistics always use standard category A sales.

## `maxTransactionsPerSearch` (type: `integer`):

Newest first. Large areas (outcode, town, district) are fetched month by month until this is reached; the summary says how far back it got.

## `outputTransactions` (type: `boolean`):

Off = summaries (free) + EPC/planning only.

## `includeSummary` (type: `boolean`):

Median/mean/quartiles, by type/tenure/new-build, monthly trend, £/sqm (when EPCs match) and UK HPI context.

## `includeHpi` (type: `boolean`):

Local-authority UK HPI (falls back to region/country). Covers the whole UK, including Scotland and Northern Ireland.

## `includeEpc` (type: `boolean`):

Needs your own free bearer token (below) and a permitted purpose. England & Wales.

## `epcToken` (type: `string`):

From your 'My account' page on get-energy-performance-data.communities.gov.uk. Stored encrypted by Apify, never logged or written to output.

## `epcPurpose` (type: `string`):

Ordnance Survey / Royal Mail permit EPC address data only for these energy-performance purposes (or the non-commercial research / private study copyright exception). Pick yours; it is recorded on each EPC row.

## `epcMode` (type: `string`):

<b>Matched</b>: only certificates matched to a sold property (gives £/sqm). <b>All</b>: every current certificate in the searched postcodes too.

## `maxEpcPerSearch` (type: `integer`):

Billable EPC rows per search.

## `maxEpcPostcodesPerSearch` (type: `integer`):

For outcode/street/area searches, EPCs are looked up for the postcodes with the most sales.

## `epcFullDetails` (type: `boolean`):

Fetch each certificate for floor area, heating, age band, CO2, costs and recommendations (needed for £/sqm). Off = band and address only.

## `includePlanning` (type: `boolean`):

For full postcodes and points (England): conservation area, listed buildings nearby, Article 4, flood zone, tree preservation, green belt and more from planning.data.gov.uk.

## `planningDatasets` (type: `array`):

Empty = sensible default set (conservation area, listed buildings + outlines, Article 4, flood zone, TPO zones + trees, scheduled monuments, World Heritage, parks & gardens, green belt, AONB/National Landscape, national park, SSSI, ancient woodland).

## `planningRadiusMetres` (type: `integer`):

Point features (listed buildings, protected trees) and areas within this distance are reported as 'within radius'. Postcode centroids can be ~100 m from a property.

## `maxConcurrency` (type: `integer`):

Per search. Requests to each official host are additionally spaced politely.

## `sampleMode` (type: `boolean`):

Replays recorded official responses for PL4 7LG plus a fictional A0 0AA demo of EPC matching and £/sqm. Ignores your searches. Nothing is charged.

## Actor input object example

```json
{
  "searches": [
    "PL4 7LG",
    "Mutley Plain, Plymouth"
  ],
  "newBuild": "any",
  "includeAdditionalPricePaid": false,
  "maxTransactionsPerSearch": 500,
  "outputTransactions": true,
  "includeSummary": true,
  "includeHpi": true,
  "includeEpc": false,
  "epcMode": "matched",
  "maxEpcPerSearch": 100,
  "maxEpcPostcodesPerSearch": 25,
  "epcFullDetails": true,
  "includePlanning": true,
  "planningRadiusMetres": 50,
  "maxConcurrency": 2,
  "sampleMode": false
}
```

# Actor output Schema

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

No description

## `output` (type: `string`):

No description

## `files` (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 = {
    "searches": [
        "PL4 7LG",
        "Mutley Plain, Plymouth"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-uk-property-data").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 = { "searches": [
        "PL4 7LG",
        "Mutley Plain, Plymouth",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-uk-property-data").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 '{
  "searches": [
    "PL4 7LG",
    "Mutley Plain, Plymouth"
  ]
}' |
apify call siteverdict/siteverdict-uk-property-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siteverdict/siteverdict-uk-property-data"
        }
    }
}
```

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/EdlTGS4PNG3XkbR3i/builds/2uOzbmhfz06ROzl7V/openapi.json
