UkRealEstateData

UK Planning Applications

Planning applications across councils in England, Scotland and Wales. Search by property, postcode or council, or pull the planning history of a UPRN.

Base URL https://api.ukrealestatedata.com

Provided as is. Planning data is compiled from council planning registers and other sources. It may be incomplete, delayed or inaccurate, and some councils are not covered or are updated less often. UPRNs are matched automatically and may be wrong or missing. We make no warranty as to accuracy, completeness or fitness for any purpose and accept no responsibility for decisions made in reliance on it. Always verify with the relevant local planning authority.

Authentication

Send X-RapidAPI-Key and X-RapidAPI-Host on RapidAPI. GET /v1/planning/health is public and returns {"status":"ok","version":"1.0.0","service":"planning-api"}.

GET /v1/planning/applications

Returns applications, newest first by received date. At least one of uprn, postcode, outcode or council is required. Filters combine.

ParameterTypeValues
uprnstring1 to 12 digits, for example 2465214361.
postcodestringFull UK postcode, for example LE1 5DE. Spaces and case are ignored. If sent with outcode, postcode is used.
outcodestringFor example LE1.
councilstringA council name as listed by /v1/planning/councils. Case is ignored.
decision_statusstringOne value from Values.
typestringOne value from Values.
sizestringsmall, medium or large.
received_fromdateYYYY-MM-DD. Received on or after this day.
received_todateYYYY-MM-DD. Received on or before this day.
updated_sincedateYYYY-MM-DD. Record changed on or after this day.
limitinteger1 to 50. Default 25.
cursorstringpage.next_cursor from the previous page.

Searches by outcode or council cover the last 12 months unless you set received_from. The response says so in query.received_from_defaulted. Searches by uprn or postcode cover all years.

GET /v1/planning/applications?postcode=LE1%205DE
GET /v1/planning/applications?outcode=LE1&decision_status=permitted&type=full
GET /v1/planning/applications?council=Leicester&received_from=2026-01-01&limit=50
{
  "data": [ { "application_id": "ExampleCouncil/26/00123/HOU", "council": "ExampleCouncil", ... } ],
  "page": { "limit": 25, "next_cursor": "MjAyNi0wNy0xNXw0Mg" },
  "query": { "received_from": null, "received_from_defaulted": false, "received_to": null },
  "disclaimer": "Planning data is provided \"as is\" ..."
}

next_cursor is null on the last page. Every response includes disclaimer.

Planning history for a UPRN

GET /v1/planning/uprn/{uprn}/applications

Every application we hold for that UPRN, newest first, all years. Accepts decision_status, type, limit and cursor. An unknown UPRN returns an empty list, not an error.

One application

GET /v1/planning/applications/{application_id}

Use the application_id exactly as returned by a search. It contains slashes; leave them as they are. Returns 404 if there is no such application.

Councils

GET /v1/planning/councils

Every council in the data, with latest_received (the most recent received date we hold), days_since_latest_received, freshness, latest_update (when we last changed one of its records) and applications_last_90_days. freshness is current (a new application within 2 weeks), delayed (2 to 6 weeks) or stalled (longer). A stalled council has stopped publishing to our source, so treat its newest applications as missing. The list covers councils with applications in the last two years. as_of says when it was last built, which happens every few hours. If you call it in the minute after a restart it may answer 503 while the first build finishes; try again.

The record

Every field is always present. A field is null when we have no value for it.

FieldTypeMeaning
application_idstringStable identifier for the application. Use it with /applications/{application_id}.
councilstringCouncil name, as in /councils.
council_referencestringThe council's own reference.
alt_referencestringAnother reference used by the council, if any.
related_tostringReference of a related application, if recorded.
uprnstringProperty UPRN, when matched. See About UPRNs.
site_addressstringSite address as given on the application.
site_postcodestringPostcode of the site, when recorded.
latitude, longitudenumberWGS84 coordinates of the site. Both are null if either is missing or outside Great Britain.
proposalstringThe proposal, as written by the council. Free text.
typestringApplication class. See Values.
council_typestringThe council's own application type wording.
sizestringsmall, medium or large.
decision_statusstringOutcome class. See Values.
council_statusstringThe council's own status wording.
council_decisionstringThe council's own decision wording, such as Pending.
decision_routestringThe route to the decision, such as Delegated or Committee. A body, not a person.
receiveddateThe date the council recorded as the start of the application.
validateddateDate the application was validated, where recorded.
consultation_start, consultation_enddateConsultation period, where recorded.
target_datedateDate by which the council aims to decide.
decided_ondateDate of the decision, once decided.
permission_expiresdateWhen a permission lapses, where recorded.
updated_attimestampWhen this record last changed in our data.
ward, parishstringWhere recorded.
documents_count, comments_count, constraints_count, statutory_days, dwellings_proposedintegerCounts as published by the council: documents, public comments, constraints, statutory days for the decision, and dwellings proposed.
links.council_pagestringThe application on the council's website.
links.documents, links.comment, links.mapstringThe council's documents, comment form and map for the application, where available.

Dates are YYYY-MM-DD. Fields are filled in as the council publishes them, so recent applications have fewer than older ones.

{
  "application_id": "ExampleCouncil/26/00123/HOU",
  "council": "ExampleCouncil",
  "council_reference": "26/00123/HOU",
  "alt_reference": null,
  "related_to": null,
  "uprn": "100000000001",
  "site_address": "1 Example Road, Exampletown",
  "site_postcode": "AB1 2CD",
  "latitude": 52.1,
  "longitude": -2.2,
  "proposal": "Single storey rear extension",
  "type": "full",
  "council_type": "Householder Planning",
  "size": "small",
  "decision_status": "undecided",
  "council_status": "Pending Decision (Consultation)",
  "council_decision": "Pending",
  "decision_route": "Delegated",
  "received": "2026-07-15",
  "validated": "2026-07-16",
  "consultation_start": null,
  "consultation_end": "2026-08-05",
  "target_date": null,
  "decided_on": null,
  "permission_expires": null,
  "updated_at": "2026-07-16T12:24:23",
  "ward": null,
  "parish": null,
  "documents_count": null,
  "comments_count": null,
  "constraints_count": null,
  "statutory_days": null,
  "dwellings_proposed": null,
  "links": {
    "council_page": "https://planning.example.gov.uk/application/26-00123-HOU",
    "documents": null,
    "comment": null,
    "map": null
  }
}

The example is illustrative.

Values

decision_status

undecidedStill being considered.
permittedPermission or consent granted.
conditionsGranted subject to conditions, or a conditions-related decision.
rejectedRefused.
withdrawnWithdrawn by the applicant or the council.
unresolvedClosed or lapsed without a recorded outcome.
referredReferred to another body for decision.

For the exact wording the council used, read council_status and council_decision.

type

full, outline, amendment, conditions, trees, heritage, advertising, telecoms, other. Use council_type for the council's own category.

About UPRNs

The UPRN is matched to the address on the application. It is a match to the address, not a guarantee about the proposal.

Coverage and freshness

The data covers councils in England, Scotland and Wales, with applications going back to 2000. Councils publish at different speeds, and a few are updated less often than the rest, or are not covered. Use /v1/planning/councils to see each council's latest application and recent volume, and judge freshness for the places you rely on. New applications usually appear a few days after the council receives them, because councils publish on their own schedule, so the most recent days are always incomplete. Changes to existing applications, such as decisions, are picked up every day or two. A recent application may not appear yet, and recent records change as councils update them.

London

From 2019, applications for most London planning authorities come from the Planning London Datahub, which the Greater London Authority runs and the boroughs' own planning systems feed. These records have the same fields as the rest and nearly always carry a UPRN. A few fields are always null for them: alt_reference, related_to, parish, consultation_start, the counts, and the documents, comment and map links. validated is the same as received. Their application_id looks like Harrow-PL_1881_26, with no slash. Bromley, Brent, Ealing and Kensington and Chelsea are not yet current in the Datahub, so they come from our main source, as do all London applications received before 2019.

Contains public sector information licensed under the Open Government Licence v3.0. London applications from 2019: Planning London Datahub, Greater London Authority. While London data is included, every response carries this in attribution.

What is not included

Applicant and agent names and addresses, agent contact details and the case officer's name are not returned. The council's own pages, which links point to, may show them; that content is outside this API.

Errors

Errors return JSON: {"error": "bad_request", "message": "..."}.

StatusMeaning
400The request is not valid: no uprn, postcode, outcode or council; a value that does not parse; an unknown decision_status, type, size or council; or a bad cursor. The message says which.
401Missing or invalid credentials.
404No application with that application_id.
422A parameter failed validation, such as limit=100 or a date that is not YYYY-MM-DD.
503The service is temporarily unavailable.