What changed in the API, newest first — and how we handle change.
Building something and want a heads-up on changes, or a field you need? Get in touch.
One call, everything we hold about a site: planning history and outcomes, live constraints, flood zone, LPA performance, appeals, heritage, market context, EPC where present, and area ownership statistics. Every layer carries its own provenance and degrades honestly; the dossier states its own outcome-coverage grade. Locate by postcode, coordinates, UPRN or address. Metered per tier (Free 25 / Starter 250 / Pro 1,500 lookups per month; Enterprise unlimited). Also available as the get_property_dossier tool on the hosted MCP server and in both SDKs.
Section 73 (England & Wales) and Section 42 (Scotland) variation-of-condition applications — including minor material amendments — now carry their own application_type, variation_conditions, instead of being mixed into discharge_conditions or coarser buckets. Additive: no existing type values were renamed. Historical records have been re-derived, so type filters return cleaner sets — most visibly in Glasgow, where a reference-suffix quirk had over-counted discharge_conditions.
Where a property has an EPC, the application detail endpoint now includes it: rating band, efficiency scores, floor area and CO₂ figures, matched by the property reference number (UPRN) and served to all tiers under the Open Government Licence with attribution carried on the object. Additive — the epc field is null where no certificate matches. Property owners can ask us to stop showing their EPC (see the privacy policy §3a); suppressed properties return epc: null.
Application responses (GET /v1/applications and the detail endpoint) now include a parsed breakdown of the site address alongside the existing address string: address_line1, address_town, address_county and address_confidence ("high" | "low"). Parsed with libpostal from the public-register address — no new gating (free and paid both receive it), and address remains the authoritative source. Additive: the fields are null where an address hasn't been parsed yet, so existing clients are unaffected.
The /site-appraisal page now lets you tap your exact plot on an interactive map before buying — the deep report then identifies your registered land parcel (highlighted against its neighbours) instead of the postcode-level parcel pattern. Powered by a new open endpoint, GET /v1/reports/parcels?lat=&lng=, returning nearby HM Land Registry INSPIRE parcel boundaries as GeoJSON. Report checkout accepts lat & lng alongside postcode.
The £99 deep report (via /v1/reports/*) now opens with an indicative planning verdict and an at-a-glance scorecard, draws your registered land-parcel boundary (HM Land Registry INSPIRE) on the location map with a plot close-up, and point-checks the site against national datasets: the precise EA flood zone the site sits in, listed buildings named with grade and distance, scheduled monuments, the Brownfield Land Register, recent sales at the site's postcode and district-level corporate ownership. Maps are rendered from OS Open Zoomstack (OGL) served in-house.
Every constraint in constraints.summary is now the same object shape — { present, label, count } — where present is a boolean, label is the headline name/grade/level (or null), and count is the number of overlapping entities. Previously a value could be a string, a boolean, an integer or null depending on the constraint, which couldn't be modelled in a typed client. The full per-entity data in constraints.details is unchanged. This in-place reshape is the change that prompted the policy above; from here, changes like it are made additively.
The benchmarking leaderboards under /v1/analytics/* — appeals overturn rates, energy efficiency, property market and planning timeliness — no longer require an API key.
Agent, applicant and case-officer details on the application detail endpoint are available on paid tiers. Free responses include a redacted_fields list naming exactly what is withheld, so you always know what a paid key would add — no field silently disappears.