List planning applications
Search and filter UK planning applications. Supports keyword search, council filtering, exact postcode or outward-code lookup, broad postcode_prefix lookup, status, application type, and date ranges. Results are sorted by applicationDate desc, then firstSeenAt desc. Free keys return historical application identity/location/description and receipt/validation dates only, not current state, documents, check timestamps or enrichment. The access object documents omitted fields. Status, decision, UPRN and include filters require a paid plan; broad harvest-style searches are restricted on free.
Request
- Base URL: https://api.planwire.io
- URL: https://api.planwire.io/v1/applications
- Auth: API key in header X-API-Key
Query parameters
Full-text search across address, description, reference, and postcode
Filter by council ID (e.g. 'camden', 'oxford')
Alias for council. Filter by council ID (e.g. 'camden', 'argyll-bute')
Exact full postcode or exact outward code. For example, postcode=LE2 matches applications whose own outward code is LE2; it does not match LE20. Use postcode_prefix for broad prefix scans.
Broad postcode prefix search. For exact full postcode or exact outward-code matching, use postcode.
Filter to records attached to one Unique Property Reference Number.
Comma-separated list of up to 100 UPRNs for portfolio or internal asset matching.
Filter by status: Pending, Approved, Refused, Withdrawn
Filter by application type (e.g. Householder, Full, Listed Building)
Filter by applicationDate from (receivedDate/validatedDate, YYYY-MM-DD)
Filter by applicationDate to (receivedDate/validatedDate, YYYY-MM-DD)
Inclusive council validatedDate lower bound. No received-date fallback; missing validation dates are excluded. Intersects other filters. Validation-only searches sort by validatedDate and id ascending and use page pagination.
Inclusive council validatedDate upper bound, on or after validated_from when both are provided.
Paid plans: inclusive stored-record updatedAt lower bound, including new records and updates to old or undated applications. ISO timestamp with timezone, up to six fractional digits. Not council publication time, a decision-only log, a deletion feed or an exactly-once stream. Sorts by updatedAt and id ascending. Follow meta.nextCursor with the same filters until null; do not use page offsets. Overlap subsequent polling windows and upsert by id to account for in-flight writes and replica lag. Maintenance writes may be included.
Exclusive stored-record updatedAt upper bound. Requires changed_since; must be later than it and not in the future. Defaults to first request time; meta.changedBefore and cursors retain that bound. Only advance the polling checkpoint after all pages succeed; overlap the next window and periodically reconcile tracked records.
Opaque meta.nextCursor from changed-since results. Repeat the same selection filters. Cannot be used without changed_since or with page other than 1. Date-window responses have meta.hasMore and omit exact totals; change-window responses also have meta.changedSince, meta.changedBefore and meta.nextCursor (null when finished).
Page number for ordinary or validation-only searches. Changed-since searches require cursor pagination instead.
Paid max 100 per page; free keys are capped at 10.
Set to supplier to add pilot-1 supplierInsights: description-rule classifications, literal quantities, explicit references and geographic reasons. No demand or construction-start inference. Existing auth, metering and data-access limits apply.
Response
Success
Example response
{
"data": [
{
"councilId": "camden",
"reference": "2025/0234/P",
"applicationType": "Householder",
"status": "Pending",
"council": {
"id": "hounslow",
"name": "London Borough of Hounslow"
},
"source": {
"type": "assure",
"label": "Assure"
},
"freshness": {
"recordCheckError": "source_timeout"
},
"nearbyPrices": {
"periodYears": 2
},
"supplierInsights": {
"classification": {
"roleEvidence": {
"field": "description"
},
"categories": [
{
"evidence": {
"field": "description"
}
}
]
},
"quantities": {
"dwellingMentions": [
{
"evidence": {
"field": "description"
}
}
],
"floorAreaMentions": [
{
"evidence": {
"field": "description"
}
}
]
},
"history": {
"references": [
{
"evidence": {
"field": "description"
}
}
]
}
}
}
],
"meta": {
"maxLimit": 100,
"sort": "applicationDate desc, firstSeenAt desc"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.