Planning Portal APIplanningportal.co.uk ↗
Access UK Local Planning Authority data by postcode, LPA contact details, planning service URLs, consent types, and guidance content via the Planning Portal API.
What is the Planning Portal API?
The Planning Portal API exposes 6 endpoints covering UK planning authority lookup, contact data, service URLs, consent types, and guidance content. Use find_lpa_by_postcode to resolve any UK postcode to its responsible Local Planning Authority — including the LPA code, name, county, and spatial coordinates — then chain into get_lpa_details or get_lpa_urls for contact information and direct links to that authority's planning decision register.
curl -X GET 'https://api.parse.bot/scraper/57dc4109-4a1c-44b5-b0a6-c5429260e98a/get_lpa_details?lpa_code=X5990' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace planningportal-co-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Planning Portal UK API — find your local planning authority and explore guidance."""
from parse_apis.planning_portal_uk_api import PlanningPortal, Path, PageNotFound
client = PlanningPortal()
# Look up the Local Planning Authority for a UK postcode.
lookup = client.postcodelookups.get(postcode="SW1A 2AA")
print(f"Postcode: {lookup.postcode}, Coordinates: ({lookup.coordinates.x}, {lookup.coordinates.y})")
for auth in lookup.lpa_lookup:
print(f" LPA: {auth.lpa_name} ({auth.lpa_code}), GLA: {auth.is_gla}")
# Get full authority details and its planning service URLs.
authority = client.authorities.get(lpa_code="X5990")
print(f"Authority: {authority.contact_information.name}")
print(f" Email: {authority.contact_information.email_address}")
print(f" Phone: {authority.contact_information.telephone_one}")
for url_item in authority.urls.list(limit=3):
print(f" Service: {url_item.name} -> {url_item.url}")
# List consent types available in England.
consent = client.consenttypes.list(limit=3).first()
if consent:
print(f"First consent type: {consent.title} ({consent.slug})")
# Retrieve page content with typed-error handling.
try:
page = client.pages.get(path=Path.PLANNING_PLANNING_APPLICATIONS)
print(f"Page: {page.path}, template: {page.component_chunk_name}")
print(f" Description: {page.page_context.description}")
except PageNotFound as exc:
print(f"Page not found: {exc}")
# Discover available guidance paths.
for p in client.pages.list_paths(limit=5):
print(f" Available path: {p}")
print("Exercised: postcodelookups.get / authorities.get / authority.urls.list / consenttypes.list / pages.get / pages.list_paths")
Retrieves detailed contact and website information for a specific Local Planning Authority by its code. Returns contact details including name, email, website URL, address, and telephone numbers. LPA codes use a proprietary X-prefixed format (e.g. 'X5990' for Westminster City Council). Use find_lpa_by_postcode to discover the lpa_code for a given location.
| Param | Type | Description |
|---|---|---|
| lpa_coderequired | string | The unique X-prefixed code of the LPA (e.g. 'X5990' for Westminster City Council). Discoverable via find_lpa_by_postcode endpoint. |
{
"type": "object",
"fields": {
"lpa_code": "string, the LPA code",
"attributes": "object with additional LPA attributes",
"tenantInformation": "object with terms and conditions URL",
"contactInformation": "object containing LPA name, email, website URL, address, telephone, and other contact details",
"paymentInformation": "object with payment details or null"
},
"sample": {
"data": {
"lpa_code": "X5990",
"attributes": {},
"tenantInformation": {
"termsAndConditionsUrl": null
},
"contactInformation": {
"name": "Westminster City Council",
"town": "Redhill",
"isGla": true,
"postCode": "EH1 9FL",
"websiteUrl": "https://www.westminster.gov.uk/planning-building-and-environmental-regulations/planning-applications/making-planning-application",
"addressLine1": "Town Planning – Westminster City Council",
"emailAddress": "[email protected]",
"telephoneOne": "+1 (555) 012-3456",
"isNationalPark": false
},
"paymentInformation": null
},
"status": "success"
}
}About the Planning Portal API
LPA Lookup and Contact Data
The find_lpa_by_postcode endpoint accepts any UK postcode (spaces optional) and returns two key structures: an addresses array with UPRN identifiers, easting/northing coordinates, and formatted address strings, plus an lpa_lookup array identifying the responsible Local Planning Authority by lpaCode, lpaName, countyCode, and GLA membership flag. The lpaCode uses a proprietary X-prefixed format (e.g. X5990 for Westminster City Council) that feeds directly into the other LPA endpoints.
LPA Details and Service URLs
get_lpa_details takes an lpa_code and returns structured contactInformation (name, email, website, postal address, telephone), tenantInformation with terms URLs, and a paymentInformation object. get_lpa_urls returns the localPlanningAuthorityUrls array — each entry includes an id, human-readable name, url, and sortOrder — giving direct links to the LPA's searchable planning application register and decision history.
Consent Types and Guidance Content
get_consent_types returns all 14 planning consent types in England, each with a title, slug, description, and full_url. These cover householder planning, full planning, outline planning, listed building consent, lawful development certificates, prior approval, and more. get_page_content retrieves structured guidance pages by path slug, returning pageContext with codename, breadcrumbs, SEO keywords, and nested content sections. Valid path slugs are discoverable via get_common_paths, which returns a curated array of available guidance routes.
The Planning Portal API is a managed, monitored endpoint for planningportal.co.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when planningportal.co.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official planningportal.co.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Resolve a customer's postcode to their Local Planning Authority and surface the correct planning register URL automatically
- Build a planning pre-application tool that displays LPA contact details (email, telephone, address) before a user submits
- Populate a consent type selector in a planning application form using the 14 types from get_consent_types
- Index Planning Portal guidance pages by fetching slugs from get_common_paths and content from get_page_content for a search tool
- Validate which LPA has jurisdiction over a property by comparing the lpa_lookup result with a known address UPRN
- Generate a directory of LPA planning decision register URLs across multiple authority codes using get_lpa_urls
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Planning Portal have an official developer API?+
What does find_lpa_by_postcode return beyond just the LPA name?+
addresses array with UPRN identifiers, easting/northing coordinates (used for the spatial lookup), and formatted address strings for each address at that postcode. The lpa_lookup array includes lpaCode, lpaName, countyCode, countyName, isGLA, isoCode, organisationTypeId, and boundaryCode. The coordinates object shows the easting/northing values used to resolve the authority.Does the API cover planning applications or individual decision records?+
get_lpa_urls, but does not return individual application records, decision notices, or case statuses. You can fork this API on Parse and revise it to add an endpoint that retrieves application records from a specific LPA's register URL.What happens if an unrecognized LPA code is passed to get_lpa_details or get_lpa_urls?+
find_lpa_by_postcode, which returns valid lpaCode values in its lpa_lookup array.Does the API cover planning guidance for Wales, Scotland, or Northern Ireland?+
get_consent_types endpoint explicitly covers consent types in England, and LPA data is drawn from English and Welsh authorities registered on the portal. Coverage of devolved nations' distinct planning systems is limited. You can fork this API on Parse and revise it to add endpoints targeting the relevant national planning portals for Scotland or Northern Ireland.