Vepler logo
Planning Applications API

All of the UK's planning applications, in one API.

Every planning authority, every application, as far back as each council's record goes. We read the documents, link the people, normalise the statuses and extract the conditions, then keep it all current with every portal.

Read the Docs
Engraved plan and elevation sheet for the new piers and porters' lodges at the Royal Hospital, Greenwich, measured and delineated in July 1752
Royal Hospital, Greenwich · July 1752 Public record

The intelligence layer

Five readings of every application.

A planning application arrives as PDFs and portal fields. We read it five ways: the documents, the people, the type, the status and the conditions. Each reading is served as structured fields you can query, not prose you have to parse.

What it emits

One request · documents
GET /v1/planning/applications/{id}/documents

→ Officer Delegated Report.pdf · 28 pages

recommendation   approve, subject to conditions
objections       3 · heritage impact contested
policies_cited   NPPF ¶11 · Local Plan H3
risks            flood zone 2 · noise amenity

Structured fields, not prose.

Every extracted field links back to its source document and page, so your users can check the original.

The coverage

Every authority publishes differently. You query one API.

Every planning authority in the country, each with its own portal, its own labels and its own way of going down for maintenance. We watch them all, adapt when they change, and keep serving while they wobble.

One request GET /v1/planning/applications?council=oxford → 200 OK
Logos of twenty of the local planning authorities covered, including Birmingham, Leeds, Sheffield and Manchester
Local planning authorities All covered

Oxford

Oxfordshire

Camden

London

Bristol

South West

York

North Yorkshire

Norwich

Norfolk

Brighton & Hove

East Sussex

Cornwall

South West

Milton Keynes

Buckinghamshire

Westminster

London

Durham

North East

Cardiff

Wales

Glasgow

Scotland

…and all the rest

Every authority

The policy graph

Connect national policy to real decisions.

Trace the line from the national framework, through each council's local plan, to the applications it decided. Built for policy teams, appeal preparation and planning risk.

National Planning Policy Framework

¶11 · presumption in favour of sustainable development

One request GET /v1/planning/applications?policy=leeds-h3 → every decision citing Policy H3Worked example

Semantic search

Ask the archive a question.

Search officer reports, decision notices and committee minutes by meaning, not keyword. Every match carries a relevance score and quotes the exact passage, so the answer arrives with its evidence.

"Applications near listed buildings where heritage impact was contested"Worked example

Rear extension adjacent to Grade II listed building

Oxford · 22/09876/FUL

0.92Approved

“…heritage impact was contested by the Conservation Officer due to harm to the listed building.”

Roof terrace within conservation area near Grade II listed building

Camden · 23/04789/FUL

0.89Refused

“Members considered that the proposal would cause unacceptable heritage impact to the adjacent listed building and refused permission.”

Two-storey side extension beside Grade II listed building

Leeds · 22/03147/HSE

0.87Approved

“The Conservation Officer initially contested the heritage impact, but revisions reduced harm to an acceptable level.”

The same search ships as an endpoint, so your users can ask their own questions with scores and sources.

The record

Every portal, one record shape.

Every application arrives in its council's own dialect and leaves in one schema. The raw label is preserved next to the normalised value, and where a mapping involved judgement, the record carries a confidence score instead of pretending certainty.

The Crown & Anchor · Oxford Worked example Approved
The requestGET /v1/planning/applications/24%2F01892%2FFUL
→ 200 OK · the record below
{
"id": "a1b2c3d4-5678-4e9f-b012-3456789abcde",
"council": "oxford",
"key": "24/01892/FUL",
"status": "approved",
"statusExternal": "Permission Granted
Subject to Conditions",
"statusConfidence": 0.98,
"type": "Full Planning Application",
"developmentCategory": "Mixed Use",
"description": "Change of use and conversion
of former public house…",
"receivedDate": "2024-03-15",
"validatedDate": "2024-03-22",
"decidedDate": "2024-06-14",
"constraints": [
{ "name": "Conservation Area", "type": "heritage" },
{ "name": "Listed Building (Grade II)", "type": "heritage" },
{ "name": "Flood Zone 2", "type": "environmental" }
],
"documents": [
{ "fileName": "Decision Notice.pdf",
"type": "decision", "pageCount": 6 },
{ "fileName": "Officer Delegated Report.pdf",
"type": "report", "pageCount": 28 }
],
"spatial": {
"type": "Point",
"coordinates": [-1.2396, 51.7494]
}
}

The cycle

When the portal moves, the API moves.

Applications move. Documents arrive, statuses change, decisions land, conditions discharge. A scrape you ran in the spring knows none of this.

The application wireJun 2026
Thu11
Fri12
Sat13
Sun14
Mon15
Tue16
Wed17
Thu18

2026-06-11 · portal release

Oxford City Council publishes the decision notice

24/01892/FUL · decision issued

2026-06-12 · ingested

fetched 03:12:09Z · documents read · status normalised

conditions extracted · same reference 24/01892/FUL

2026-06-13 · your next call

"reference": "24/01892/FUL"

"status": "approved"

"decisionDate": "2026-06-11"

"fetchedAt": "2026-06-12T03:12:09Z"

You never run a scraper, so you never nurse a broken one.

Try it

See the full picture for any application.

One search opens the whole record: the overview, the documents, the people, the policies it engages and the conditions it carries. The application below is a worked example, shaped the way the API returns it.

12 High Street, Oxford

The use cases

Built for what you're building.

One API, four jobs. Each of these is a question the API answers in one request.

Property & conveyancing

What's the planning story at this address?

Every application at a property and around it: the extensions, the refusals, the conditions still attached. The full history in one call, with the documents linked.

GET /v1/planning/applications?point=51.7519,-1.2445&radius=100

Developers & land teams

How does this council treat schemes like mine?

Approval rates, decision times and committee outcomes by application type, drawn from the decisions themselves. Evidence for a pre-app, not anecdote.

GET /v1/planning/applications?council=oxford&type=major

Policy teams & appeals

Which decisions engaged this policy?

Trace a local-plan policy to the applications that cited it and how each one was decided, with the officer's reasoning quoted from the report.

Policy graph · every decision keeps its policy citations

Risk & portfolio monitoring

What's changing around this asset?

New applications within a radius of any holding, watched for you: the neighbouring development, the change of use, the infrastructure scheme you'd rather hear about now.

GET /v1/planning/applications?point=…&radius=500&since=…

Every week an engineer spends nursing a portal scraper is a week they are not building your product.

The guarantees

Answers you can defend.

Source-linked

Every extracted fact cites its document and page, so the original is always one click away.

Confidence, stated

Normalised mappings carry a score, and the council's raw wording stays on the record beside them.

Freshness

Every portal watched, and every record carries the moment it was fetched. Freshness you can check, not take on trust.

Stable identifiers

Ids survive portal migrations and re-scrapes, so the references you store keep working.

Frequently asked questions

Ready to build on
something you can trust?

View Docs