API Reference

Base URL: https://api.planwire.io  ·  Version: v1

Authentication

Pass your API key in the X-API-Key header. You can also use Authorization: Bearer YOUR_KEY.

Request headers
X-API-Key: pw_live_a1b2c3d4e5f6...

Errors

All errors return JSON with an error field and an appropriate HTTP status code.

Status Meaning
400Bad request — missing or invalid parameters
401Unauthorised — missing or invalid API key
404Not found — resource does not exist
429Rate limit exceeded — upgrade your plan
500Server error — contact support

Pagination

All list endpoints return a meta object. Use ?page=2&limit=50 to paginate. Max limit is 100.

"meta": {
  "total":  4821,  // total matching records
  "page":   1,     // current page (1-indexed)
  "limit":  20,    // records per page
  "pages":  242    // total pages
}

Rate limits

Limits reset at midnight UTC. Exceeding the limit returns 429.

Plan Requests/day Price
Free100£0
Starter1,000£29/mo
Growth10,000£99/mo
EnterpriseUnlimited£299/mo

GET /v1/applications

List planning applications. All parameters are optional and can be combined.

Query Parameters

Parameter
Type
Description
council
string
Council ID (e.g. oxf, cam)
postcode
string
Exact postcode match
status
string
Approved · Refused · Pending · Withdrawn
type
string
Application type substring match
q
string
Full-text search across address + description
date_from
date
Filter by received_date ≥ YYYY-MM-DD
date_to
date
Filter by received_date ≤ YYYY-MM-DD
page
integer
Page number, default 1
limit
integer
Results per page, default 20, max 100
Example
curl "https://api.planwire.io/v1/applications?council=adu&q=extension&status=Approved&limit=5" \
  -H "X-API-Key: YOUR_KEY"
GET /v1/applications/nearby

Find applications within a radius using PostGIS spatial indexing. Extremely fast even over millions of records.

Parameter
Type
Description
lat *
float
Latitude (WGS84)
lng *
float
Longitude (WGS84)
radius_km
float
Search radius in km, default 1, max 50
limit
integer
Max results, default 20, max 100
Example — 1km around Westminster
curl "https://api.planwire.io/v1/applications/nearby?lat=51.4975&lng=-0.1278&radius_km=1" \
  -H "X-API-Key: YOUR_KEY"
GET /v1/applications/:id

Fetch a single planning application by its UUID.

curl "https://api.planwire.io/v1/applications/8f6fac3a-d93a-453e-b5db-6c5ecc631bf0" \
  -H "X-API-Key: YOUR_KEY"
GET /v1/applications/ref/:council/:reference

Fetch an application using the council's own reference number (e.g. 24/01234/FUL).

curl "https://api.planwire.io/v1/applications/ref/adu/AWDM%2F0158%2F25" \
  -H "X-API-Key: YOUR_KEY"

GET /v1/councils

List all 379 supported Local Planning Authorities, with application counts.

Response
{
  "data": [{
    "id":               "adu",
    "name":             "Adur District Council",
    "portalType":       "official",
    "applicationCount": 874
  }]
}
GET /v1/councils/:id

Get a single council's details including the date of the most recent application.

curl "https://api.planwire.io/v1/councils/adu" \
  -H "X-API-Key: YOUR_KEY"

GET /v1/webhooks

List all webhooks registered to your API key.

POST /v1/webhooks

Subscribe to planning application events. You'll receive an HTTP POST to your URL whenever a matching application is new or updated.

Request Body

Field
Type
Description
url *
string
HTTPS endpoint to POST events to
filters.councilId
string
Only fire for this council
filters.postcodePrefix
string
Only fire for postcodes starting with (e.g. SW1)
filters.status
string
Only fire for this status value
Create webhook
curl -X POST "https://api.planwire.io/v1/webhooks" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/hooks/planning",
    "filters": {
      "postcodePrefix": "SW1",
      "status": "Approved"
    }
  }'

Webhook Payload

Requests are signed with HMAC-SHA256 — verify using the X-PlanWire-Signature header.

{
  "event":       "application.new",   // or "application.updated"
  "timestamp":   "2025-03-19T14:23:01Z",
  "application": { /* full application object */ }
}
DELETE /v1/webhooks/:id

Remove a webhook by its UUID.