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 "https://api.postcodes.io/postcodes/SW1A1AA"This returns a JSON response with latitude and longitude fields. For SW1A 1AA (Buckingham Palace):
{
"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 "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 "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 "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 "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:
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
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:
- 100–200m — immediate neighbours of a specific address (objection/notification tools)
- 500m — typical neighbourhood awareness (property portals, home-owner tools)
- 1–2km — local area monitoring (estate agents, planning consultants)
- 5–10km — regional development pipeline (construction lead gen, site appraisal)
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 -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.