# England Property Planning Constraints Bulk Checker (`shelly_fen/england-planning-constraints-checker`) Actor

Check lists of English postcodes, coordinates or UPRNs for conservation areas, listed buildings (grade), green belt, flood zones 2/3, tree preservation and Article 4 directions. Official planning.data.gov.uk open data (OGL v3). One row per property, "no" vs "no data" kept apart.

- **URL**: https://apify.com/shelly_fen/england-planning-constraints-checker.md
- **Developed by:** [shelly_fen](https://apify.com/shelly_fen) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 property checkeds

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

## Planning Constraints Checker by Postcode – Conservation Area, Listed Building, Flood Zone (England)

**Conservation area checker and listed building lookup in bulk:** paste English postcodes, coordinates or UPRNs and get one row per property with conservation area, listed building grade, green belt, flood zone 2/3, tree preservation and Article 4 direction.

| | |
|---|---|
| **Data source** | planning.data.gov.uk (MHCLG); postcodes.io for postcode lookup |
| **Licence** | Open Government Licence v3.0 (postcodes: OS OpenData) |
| **Update frequency** | Queried live on every run – as current as what councils have published |
| **Coverage** | England only. Not Wales, Scotland or Northern Ireland. Some councils have not published every dataset yet (shown as `no_data`). |
| **Cost example** | 100 properties = $0.005 + 100 × $0.005 = **$0.505 per run**. Not-found rows are not charged. |

**What it can do:** fast first-pass screening of site lists, lending books or portfolios, with links to every source record.
**What it can't do:** replace formal local authority searches or legal advice; give a flood risk assessment; guarantee "no" where a council hasn't published data. Postcodes are checked at the centroid – use coordinates/UPRN for exact buildings.

***

Check a list of English properties for common planning constraints and get **one row per property**:

- **Conservation area** (yes / no / no data) + area name
- **Listed building** (yes / no / no data) + **grade** (I, II\*, II) and list entry name
- **Green belt** (yes / no)
- **Flood zone** (Environment Agency flood zone 2 or 3, or "not in zone 2 or 3")
- **Tree preservation** (tree preservation zones and individual TPO trees)
- **Article 4 direction** (yes / no / no data) + direction name
- Local planning authority, source dataset names, links to every matching record on planning.data.gov.uk, and the retrieval date

Input can be **UK postcodes**, **latitude/longitude** and/or **UPRNs**, in any mix. It replaces opening each address on a map and copying designations into a spreadsheet, for example when screening a list of sites, a lending book or a property portfolio.

### Data sources

- **[planning.data.gov.uk](https://www.planning.data.gov.uk)** (Ministry of Housing, Communities and Local Government). Datasets used: `conservation-area`, `listed-building`, `listed-building-outline`, `green-belt`, `flood-risk-zone`, `tree-preservation-zone`, `tree-preservation-order`, `article-4-direction-area`, `local-planning-authority`. All are published under the Open Government Licence v3.0.
- **[postcodes.io](https://postcodes.io)** for turning postcodes into coordinates (Great Britain postcode data under the OS OpenData licence; Northern Ireland postcodes are not supported).

This Actor does **not** use planning applications, land title boundaries or any other data about people. Output contains designations of places and buildings only.

### "No" vs "no data" — please read

planning.data.gov.uk **does not yet cover all of England**. Many designations (conservation areas, Article 4 directions, tree preservation, listed building outlines) are published by each local planning authority, and some councils have not published some datasets yet.

- `yes` — a current record covers the property.
- `no` — the planning authority (or the national dataset) has published this dataset and no record covers the property.
- `no_data` — the planning authority has not published this dataset on planning.data.gov.uk. **The property may still be affected.** Check with the council.
- `unknown` — coverage could not be determined (e.g. the planning authority could not be matched or a request failed).

The field `localDataPublished` shows, per dataset, whether the authority has published data. Green belt and flood zones come from national datasets, so they are always `yes`/`no`.

Other limits:

- Postcodes are checked at the **postcode centroid**, not a specific building. For exact results use coordinates or UPRNs.
- Listed buildings and individual protected trees are published as points; they count as a match within `nearbyPointRadiusM` (default 20 m) of your coordinates. This can miss a large building or match a neighbour. UPRN-only rows rely on listed building outlines.
- Flood zones are the planning flood zones (2 and 3); they are not a flood risk assessment and ignore defences and surface water.
- Data is only as current as what authorities have published. Each row has `retrievedAt`.

**This is not a substitute for formal local authority searches, a planning consultant or legal advice.** Always confirm constraints with the local planning authority before relying on them.

### Input example

```json
{
  "postcodes": ["SW1A 1AA", "YO1 7HH"],
  "coordinates": ["51.500753,-0.142913"],
  "uprns": ["10008315764"],
  "maxProperties": 100
}
```

### Output example (shortened)

```json
{
  "input": "51.500753,-0.142913",
  "status": "checked",
  "localPlanningAuthority": "Westminster LPA",
  "conservationArea": "yes",
  "conservationAreaNames": ["Royal Parks"],
  "listedBuilding": "yes",
  "listedBuildingGrades": ["I"],
  "greenBelt": "no",
  "floodZone": "zone 2",
  "treePreservation": "no",
  "article4Direction": "yes",
  "matches": [{"name": "Royal Parks", "dataset": "conservation-area", "entityUrl": "https://www.planning.data.gov.uk/entity/44002902"}],
  "localDataPublished": {"Conservation area": true, "Article 4 direction area": true},
  "license": "Contains public sector information licensed under the Open Government Licence v3.0.",
  "retrievedAt": "2026-10-12T01:40:00Z"
}
```

Rows with `status` `not_found` (postcode or UPRN not found, or outside England), `invalid_input` or `error` are saved so you can see what happened, and are **not charged**.

### Pricing

Pay per event:

- **Actor start:** $0.005 per run
- **Property checked:** $0.005 per property that was located in England and checked

Example: 100 properties ≈ $0.005 + 100 × $0.005 = **$0.505**. Inputs that cannot be located are free. Use `maxProperties` and Apify's maximum cost per run to cap spending.

### Polite use and large portfolios

Requests are sent **one at a time** with a delay (default 0.5 s), repeated lookups are cached within a run, and each run is capped by `maxProperties` (max 2,000). A typical property takes a few seconds. For tens of thousands of properties, the [bulk downloads on planning.data.gov.uk](https://www.planning.data.gov.uk/dataset/) (CSV / GeoJSON per dataset) are a better choice than any API-based tool.

### Attribution and disclaimer

Contains public sector information licensed under the Open Government Licence v3.0.
Dataset attributions include: © Historic England 2026. Contains Ordnance Survey data © Crown copyright and database right 2026. © Crown copyright and database right 2026. Postcode data: Contains OS data © Crown copyright and database right; Contains Royal Mail data © Royal Mail copyright and database right; Contains National Statistics data © Crown copyright and database right.

This Actor is independent and is **not affiliated with, endorsed by or operated by** the UK Government, MHCLG, Historic England, the Environment Agency, Ordnance Survey or postcodes.io.

### More from this author

- [Italy Fuel Prices for Fleets & Logistics](https://apify.com/shelly_fen/eu-fuel-prices-official) — official MIMIT station prices for Italy (diesel, petrol, LPG, CNG, LNG).
- [Finland Port Calls & Vessel ETA Tracker](https://apify.com/shelly_fen/finland-port-calls-vessel-eta) — ETA/ETD and berth changes for Finnish ports (Fintraffic Digitraffic, CC BY 4.0).

### Further reading

- Source data: [planning.data.gov.uk](https://www.planning.data.gov.uk/)
- Postcodes: [postcodes.io](https://postcodes.io/)
- [SEO for Actors (Apify Help)](https://help.apify.com/en/articles/2644024-seo-for-actors)

# Changelog

This Actor's version history is a separate document: https://apify.com/shelly_fen/england-planning-constraints-checker/changelog.md

# Actor input Schema

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

e.g. "SW1A 1AA". Geocoded to the postcode centroid with postcodes.io, so the check is for the centre of the postcode, not a specific building. For exact results use coordinates or UPRNs.

## `coordinates` (type: `array`):

One property per line as "latitude,longitude" in decimal degrees (WGS84), e.g. "51.500753,-0.142913".

## `uprns` (type: `array`):

Unique Property Reference Numbers, e.g. "10008315764". Resolved by planning.data.gov.uk. The nearby listed-building / TPO point check needs coordinates, so for UPRN-only rows listed building status relies on published outlines.

## `maxProperties` (type: `integer`):

Safety cap; each checked property is one billable result. For very large portfolios (tens of thousands), the official bulk downloads on planning.data.gov.uk are a better fit.

## `nearbyPointRadiusM` (type: `integer`):

Listed buildings (Historic England) and individual tree preservation orders are published as points. They count as a match if within this distance of the coordinates. 0 = off. Postcode centroids are approximate, so treat matches near postcodes as indicative.

## `requestDelaySecs` (type: `number`):

Requests are sent one at a time with this pause, to be polite to the public APIs. Minimum 0.3.

## Actor input object example

```json
{
  "postcodes": [
    "SW1A 1AA",
    "YO1 7HH"
  ],
  "coordinates": [
    "51.500753,-0.142913"
  ],
  "maxProperties": 100,
  "nearbyPointRadiusM": 20,
  "requestDelaySecs": 0.5
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `full` (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 = {
    "postcodes": [
        "SW1A 1AA",
        "YO1 7HH"
    ],
    "coordinates": [
        "51.500753,-0.142913"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("shelly_fen/england-planning-constraints-checker").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": [
        "SW1A 1AA",
        "YO1 7HH",
    ],
    "coordinates": ["51.500753,-0.142913"],
}

# Run the Actor and wait for it to finish
run = client.actor("shelly_fen/england-planning-constraints-checker").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": [
    "SW1A 1AA",
    "YO1 7HH"
  ],
  "coordinates": [
    "51.500753,-0.142913"
  ]
}' |
apify call shelly_fen/england-planning-constraints-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shelly_fen/england-planning-constraints-checker"
        }
    }
}
```

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/ZaKCtXeNFlVyKZK0S/builds/GcHgmlmgyhIdkv6pb/openapi.json
