# UK Planning Appeals: Inspectorate Decisions by RawTrader (`seaf999ield/uk-planning-appeals`) Actor

UK planning appeals: Planning Inspectorate decisions for England with appeal outcomes (allowed or dismissed) by council, postcode, dwellings and green belt, plus LPA allowed rates and alerts. For developers, planning consultants and property researchers. By RawTrader | UK Industry & Bills

- **URL**: https://apify.com/seaf999ield/uk-planning-appeals.md
- **Developed by:** [RustonRoad](https://apify.com/seaf999ield) (community)
- **Categories:** Real estate, Lead generation, Business
- **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

## UK Planning Appeals: Inspectorate Decisions by RawTrader

**Track UK planning appeal decisions in England from the official Planning Inspectorate Casework Database.** See which appeals were **allowed or dismissed** by **council (LPA)**, **postcode**, **development type**, **number of dwellings** and **green belt**, and get each council's **appeal allowed rate** and decision time. Built for **developers, land promoters, planning consultants, planning lawyers and property researchers**. Official open data under the Open Government Licence. No login, no API key, no portal scraping.

| Output | What you get |
|---|---|
| ⚖️ **Decision rows** | Case reference, casework type, council, council application reference, dates, decision, appeal outcome, procedure, development type, site address and postcode, dwellings, floor space, green belt and heritage flags, case page link |
| 📊 **Allowed rate summary** | Per council (or council and development type): decisions, allowed, split, dismissed, allowed rate %, median weeks from valid to decision |
| 🔔 **New decisions monitor** | Only Planning Inspectorate decisions not seen in your earlier runs, for a weekly or monthly schedule |

### What it does

- Reads the latest **Planning Inspectorate Casework Database** spreadsheet from GOV.UK (5 rolling years of decided appeals for England, updated monthly), and optionally the older 5 to 10 year file
- Filters by **council name**, **postcode prefix**, **casework type** (planning, householder, enforcement, listed building, lawful development certificate, trees and more), **development type**, **appeal outcome**, **decision date**, **minimum dwellings**, **green belt**, **site address words** and **council application reference**
- Builds an **allowed rate summary** by council, development type or casework type
- Remembers what it has already sent, so a scheduled run gives you **only new decisions**
- Export to CSV, Excel or JSON, or call it from the API, Make, Zapier or n8n

### Use cases

- **Planning consultants and agents:** appeal success rates by council and casework type before advising a client to appeal.
- **Developers, land promoters and housebuilders:** allowed appeals for housing sites, green belt cases and major dwellings schemes, council by council.
- **Planning lawyers and barristers:** recent Planning Inspectorate decisions for a council or an issue, with links to the case page.
- **Property researchers and journalists:** local planning appeal outcomes and trends with official numbers.
- **Monitoring:** a weekly or monthly alert of new appeal decisions in your patch, on a schedule.
- Pair it with our **UK Planning Applications** actor: use the council application reference to see whether a refused application went to appeal.

### Input

| Field | Example | Notes |
|---|---|---|
| Output | `both` | `decisions`, `summary`, `both` or `newDecisions` |
| Councils | `["Sevenoaks", "Tandridge"]` | Part of the council name. Empty = all of England |
| Postcode prefixes | `["CR3", "TN13"]` | From the site address |
| Casework types | `["Planning Appeal"]` | Part of the type name |
| Development types | `["dwellings"]` | Matches Major dwellings and Minor Dwellings |
| Outcomes | `["allowed"]` | allowed, split, dismissed, quashed, withdrawn_or_invalid, other |
| Decided from / to | `2026-07-01` / `2026-09-30` | Empty = the last 90 days |
| Minimum dwellings | `10` | Where known |
| Green belt only | `true` | |
| Council application references | `["TA/2025/771"]` | Find the appeal for a planning application |
| Include agent name / inspector name | `false` | Off by default. Appellant names are never output |
| Max decision rows | `1000` | 0 = no cap |

**Example: housing appeals in two Surrey and Kent councils, July to September 2026**

```json
{ "lpaNames": ["Sevenoaks", "Tandridge"], "developmentTypes": ["dwellings"], "decidedFrom": "2026-07-01", "decidedTo": "2026-09-30", "mode": "both" }
```

**Example: allowed rate for every council in England over the last year**

```json
{ "mode": "summary", "days": 365, "summaryGroupBy": "lpa" }
```

**Example: monthly alert of new allowed green belt housing appeals**

```json
{ "mode": "newDecisions", "outcomes": ["allowed"], "greenBeltOnly": true, "developmentTypes": ["dwellings"], "monitorName": "green-belt-wins" }
```

### Output

Real rows from a test run on 25 October 2026 with the first example input (16 decisions, 2 summary rows).

Decision row:

```json
{
  "recordType": "decision",
  "caseReference": "6006497",
  "caseworkType": "Planning Appeal",
  "applicationType": "Planning Appeals - Outline",
  "lpaName": "Tandridge District Council",
  "lpaApplicationReference": "TA/2025/771",
  "lpaDecisionDate": "2025-11-05",
  "validDate": "2026-03-16",
  "decisionDate": "2026-09-25",
  "decision": "Allowed",
  "outcome": "allowed",
  "procedure": "Inquiry",
  "developmentType": "Major dwellings",
  "siteAddress": "Land at Mount Avenue, Chaldon, CR3 5BB",
  "postcode": "CR3 5BB",
  "floorSpaceSqm": 14500,
  "numberOfResidences": 30,
  "greenBelt": true,
  "affectsListedBuildingSetting": true,
  "costsApplied": true,
  "caseUrl": null
}
```

Allowed rate summary row:

```json
{
  "recordType": "summary",
  "groupBy": "lpa",
  "lpaName": "Tandridge District Council",
  "decisions": 12,
  "allowed": 3,
  "split": 0,
  "dismissed": 9,
  "allowedRatePct": 25,
  "medianWeeksValidToDecision": 18.3,
  "decidedFrom": "2026-07-01",
  "decidedTo": "2026-09-30"
}
```

A `RUN_SUMMARY` record in the default key value store has the source update date, the latest decision date in the data, the number of cases scanned and matched, and the charged events.

### Pricing (pay per event)

You pay per row returned. There is no monthly rental.

| Event | When it is charged | Price |
|---|---|---|
| Decision row | Each appeal decision row returned (Decision rows or Both mode) | $0.002 |
| Summary row | Each allowed rate summary row (per council, development type or casework type) | $0.01 |
| New decision | Each appeal decision not seen in earlier runs (New decisions mode) | $0.008 |

Examples:

- The housing example above (16 decisions and 2 summary rows) costs $0.052.
- 1,000 decision rows cost $2.00.
- An allowed rate summary for 100 councils costs $1.00.
- The first New decisions run only saves a baseline and outputs nothing, so it charges no events. Later runs charge only for new decisions.

Set **Max decision rows** or a maximum cost per run to cap your spend.

### API

Run it from any language with the Apify API. Copy the ready made call from the **API** tab, for example the `run-sync-get-dataset-items` endpoint with this body:

```json
{ "lpaNames": ["Cornwall"], "mode": "summary", "days": 365 }
```

### Is it legal?

Yes. The Casework Database is published by the Planning Inspectorate on GOV.UK under the **Open Government Licence v3.0**. The actor downloads the official spreadsheet only, found through the public GOV.UK Content API, once per run. It does not crawl the Appeals Casework Portal; case page links are given for you to open.

**Personal data:** the source lists appellant names. This actor **never outputs appellant names**. Agent and inspector names are off by default and only added if you switch them on. Site addresses are published by the Planning Inspectorate so that appeals can be found; use them for planning purposes and follow UK GDPR. The Planning Inspectorate notes that outcome rates per inspector are not a fair measure of an inspector's work.

### FAQ

**How fresh is the data?** The Planning Inspectorate updates the Casework Database about once a month. The October 2026 file has decisions up to 30 September 2026. Appeals still in progress, withdrawn or turned away are not included.

**Does it cover Wales, Scotland or Northern Ireland?** No. The Casework Database covers England. Welsh appeals are handled by PEDW.

**Does it output appellant names?** No, never. Agent and inspector names are off by default and only added if you switch them on.

**Why do some rows have no case page link?** Cases from the newer Back Office system (references starting with 6) are not on the old Appeals Casework Portal, so the link is left empty. Search the reference on GOV.UK instead.

**What counts as allowed?** Allowed, allowed with conditions and planning permission granted. Split decisions are counted separately and included in the allowed rate.

**Can I get older appeals?** Yes. Switch on Include older cases for decisions from 5 to 10 years ago. That run reads a second file and needs about 2 GB of memory.

**How much does a run cost?** See the Pricing table above. You are charged per row returned, so a narrow filter costs very little.

**Is this legal or investment advice?** No. It is official data, provided as is, for research. Appeal outcomes depend on the facts of each case; take professional advice before acting.

### Data source

Planning Inspectorate Casework Database, published on GOV.UK: https://www.gov.uk/government/publications/planning-inspectorate-appeals-database

*Contains public sector information from the Planning Inspectorate licensed under the Open Government Licence v3.0.*

### About RawTrader | UK Industry & Bills

RawTrader | UK Industry & Bills is a UK newsletter and open data project tracking energy bills, fuel prices, public tenders, company closures and FCA short positions, using official data from Ofgem, DESNZ, ONS, Companies House, Find a Tender and the FCA.

- [RawTrader Data: every UK data tool in one place](https://imrawtrader.beehiiv.com/p/data)
- [UK Industry & Bills newsletter](https://imrawtrader.beehiiv.com)
- [Follow @ImRawTrader on X](https://x.com/ImRawTrader)

# Actor input Schema

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

Decision rows, an allowed rate summary, both, or only decisions not seen in earlier runs (the first monitor run saves a baseline and outputs nothing).

## `lpaNames` (type: `array`):

Part of the council name, e.g. Cornwall, Tower Hamlets, Sevenoaks. Empty = all of England.

## `postcodePrefixes` (type: `array`):

Match the postcode in the site address, e.g. TR, SW11, GU8 6. Only cases whose address has a postcode can match.

## `caseworkTypes` (type: `array`):

Part of the type name, e.g. Planning Appeal, Householder, Enforcement Notice, Listed Building, Lawful Development Certificate, Tree Preservation Order.

## `developmentTypes` (type: `array`):

Part of the development type, e.g. Major dwellings, Minor Dwellings, Change of use, Householder developments.

## `outcomes` (type: `array`):

Leave empty for all outcomes.

## `decidedFrom` (type: `string`):

YYYY-MM-DD. Empty = the last N days.

## `decidedTo` (type: `string`):

YYYY-MM-DD. Empty = today.

## `days` (type: `integer`):

Window when Decided from is empty. The source is updated monthly, so the newest 4 to 8 weeks are not in it yet.

## `minResidences` (type: `integer`):

Only cases with at least this many proposed dwellings (where known).

## `greenBeltOnly` (type: `boolean`):

Only sites recorded as in the green belt.

## `siteKeywords` (type: `array`):

Keep cases whose site address contains one of these words, e.g. a street or village.

## `lpaApplicationReferences` (type: `array`):

Look up the appeal for specific planning application references, e.g. 19/503795/FULL.

## `summaryGroupBy` (type: `string`):

Grouping for the allowed rate summary.

## `includeOlderData` (type: `boolean`):

Also read the older casework file. Slower; only needed for date ranges before the last 5 years.

## `includeAgentName` (type: `boolean`):

Add the planning agent named on the appeal (usually a consultancy). Off by default. Appellant names are never output.

## `includeInspectorName` (type: `boolean`):

Add the inspector's surname and initial. Off by default. The Planning Inspectorate warns that per inspector rates are not a fair measure.

## `monitorName` (type: `string`):

For New decisions mode: a name for this watchlist, so different filters keep separate memories.

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

Cap on decision rows (0 = no cap). Summary rows are always output.

## Actor input object example

```json
{
  "mode": "decisions",
  "lpaNames": [
    "Cornwall"
  ],
  "days": 90,
  "greenBeltOnly": false,
  "summaryGroupBy": "lpa",
  "includeOlderData": false,
  "includeAgentName": false,
  "includeInspectorName": false,
  "maxResults": 1000
}
```

# Actor output Schema

## `decisions` (type: `string`):

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "lpaNames": [
        "Cornwall"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seaf999ield/uk-planning-appeals").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 = { "lpaNames": ["Cornwall"] }

# Run the Actor and wait for it to finish
run = client.actor("seaf999ield/uk-planning-appeals").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 '{
  "lpaNames": [
    "Cornwall"
  ]
}' |
apify call seaf999ield/uk-planning-appeals --silent --output-dataset

```

## MCP server setup

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

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/L1OccVNx35OcyzSJc/builds/cUn8uRJapTJFRyGQo/openapi.json
