Blog ·Tutorial·March 2026

How to Search UK Planning Applications by Postcode

The most common use case for planning data: find every application within a radius of a postcode. Here's how to do it with a single API call.

Why postcode search matters

Nearly every proptech and construction product that uses planning data starts with the same question: "What planning applications are near this address?" Whether you're building a property alert tool, a site appraisal platform, a neighbour notification service, or a lead generation tool for architects and builders — the core query is the same.

The problem is that UK planning data doesn't come with coordinates out of the box. Council portals store addresses as free-text strings. To search by proximity, you need geocoded data and a spatial index — which is exactly what PlanWire provides.

Step 1: Convert a postcode to coordinates

Before you can do a radius search, you need a latitude and longitude for your postcode. The free postcodes.io API is the standard tool for this in the UK — no API key required.

curl
curl "https://api.postcodes.io/postcodes/SW1A1AA"

This returns a JSON response with latitude and longitude fields. For SW1A 1AA (Buckingham Palace):

response
{ "status": 200, "result": { "postcode": "SW1A 1AA", "latitude": 51.501009, "longitude": -0.141588, ... } }

Step 2: Query planning applications by radius

With coordinates in hand, use the PlanWire /applications endpoint with the lat, lng, and radius parameters. Radius is in metres.

curl
curl "https://api.planwire.io/v1/applications?lat=51.501009&lng=-0.141588&radius=500&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY"

This returns planning applications within 500 metres of SW1A 1AA, sorted by distance. Each result includes the application reference, address, description, status, decision date, and a distance_m field showing how far it is from your search point.

Step 3: Combine with filters

You can layer additional filters on top of the radius search. Common combinations:

Only pending applications

curl
curl "https://api.planwire.io/v1/applications?lat=51.501009&lng=-0.141588&radius=500&status=Pending" \ -H "Authorization: Bearer YOUR_API_KEY"

Applications from the last 30 days

curl
curl "https://api.planwire.io/v1/applications?lat=51.501009&lng=-0.141588&radius=1000&received_after=2026-02-25" \ -H "Authorization: Bearer YOUR_API_KEY"

Extensions and householder applications near a property

curl
curl "https://api.planwire.io/v1/applications?lat=51.501009&lng=-0.141588&radius=200&q=householder" \ -H "Authorization: Bearer YOUR_API_KEY"

Full example in JavaScript

Here's a complete function that takes a UK postcode and returns nearby planning applications:

JavaScript
async function getPlanningByPostcode(postcode, radiusMetres = 500) { // Step 1: geocode the postcode const geo = await fetch( `https://api.postcodes.io/postcodes/${encodeURIComponent(postcode)}` ).then(r => r.json()); if (geo.status !== 200) throw new Error(`Invalid postcode: ${postcode}`); const { latitude, longitude } = geo.result; // Step 2: query planning applications const url = new URL('https://api.planwire.io/v1/applications'); url.searchParams.set('lat', latitude); url.searchParams.set('lng', longitude); url.searchParams.set('radius', radiusMetres); url.searchParams.set('limit', 50); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.PLANWIRE_API_KEY}` } }); const data = await res.json(); return data.applications; } // Usage const apps = await getPlanningByPostcode('SW1A 1AA', 500); console.log(`Found ${apps.length} applications within 500m`);

Python example

Python
import requests import os def get_planning_by_postcode(postcode, radius_m=500): # Geocode the postcode geo = requests.get( f"https://api.postcodes.io/postcodes/{postcode.replace(' ', '')}" ).json() if geo["status"] != 200: raise ValueError(f"Invalid postcode: {postcode}") lat = geo["result"]["latitude"] lng = geo["result"]["longitude"] # Query PlanWire response = requests.get( "https://api.planwire.io/v1/applications", params={"lat": lat, "lng": lng, "radius": radius_m, "limit": 50}, headers={"Authorization": f"Bearer {os.environ['PLANWIRE_API_KEY']}"} ) return response.json()["applications"] # Usage apps = get_planning_by_postcode("SW1A 1AA", radius_m=500) print(f"Found {len(apps)} applications within 500m")

What radius should I use?

The right radius depends on what you're building:

Tip: If you need to monitor multiple postcodes continuously, set up a webhook instead of polling. PlanWire webhooks deliver a POST request to your endpoint the moment a new application is submitted within your area — no polling required.

Bulk postcode lookups

If you have a list of postcodes to query at once, postcodes.io supports bulk lookups (up to 100 postcodes per request):

curl — bulk geocode
curl -X POST "https://api.postcodes.io/postcodes" \ -H "Content-Type: application/json" \ -d '{"postcodes": ["SW1A 1AA", "EC1A 1BB", "W1A 1AA"]}'

Coverage

PlanWire covers 384 active council sources across England, Wales, Scotland, and Northern Ireland, with applications geocoded to a point location using address matching against Ordnance Survey data. Coverage varies by council — you can check which councils have data at the API documentation page.

Free tier

The free tier includes 100 requests per day — enough to build and test a postcode search feature without a credit card. Spatial search (radius queries) is included on all tiers including free.

Start querying planning data by postcode

Free tier, no credit card. 100 requests/day. Spatial search included.