API Reference
All endpoints return JSON. Base URL: https:/.homedata.co.uk
Endpoints
Property Intelligence
Full property record including address, type, tenure, bedrooms, floor area, EPC, construction age, and sold dates. Returns data for any of the UK's 29M+ addressable properties.
curl https:/.homedata.co.uk/api/properties/10093609154/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/properties/10093609154/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
property_data = response.json()
print(property_data["full_address"])
const response = await fetch( "https:/.homedata.co.uk/api/properties/10093609154/", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); console.log(data.full_address);
View example response
{
"uprn": 10093609154,
"full_address": "APARTMENT 1009, CHAPMAN HOUSE, SALFORD, M3 5FH",
"postcode": "M3 5FH",
"property_type": "Flat",
"built_form": "Purpose Built",
"construction_age_band": "2007-2011",
"habitable_rooms": 3,
"epc_floor_area": 56.0,
"current_energy_efficiency": 84,
"current_energy_rating": "B",
"tenure": "Leasehold",
"last_sold_date": "2019-11-15",
"last_sold_price": 135000,
...
}
EPC & Energy
No authEnergy Performance Certificate data. Returns current and potential energy efficiency scores (1–100), last EPC date, floor area, construction age band, and certificate ID.
curl https:/.homedata.co.uk/api/epc-checker/100023336956/
import requests
response = requests.get(
"https:/.homedata.co.uk/api/epc-checker/100023336956/"
)
epc = response.json()
print(f"Rating: {epc['current_energy_efficiency']}")
const response = await fetch(
"https:/.homedata.co.uk/api/epc-checker/100023336956/"
);
const epc = await response.json();
console.log(`Rating: ${epc.current_energy_efficiency}`);
View example response
{
"uprn": 10093609154,
"current_energy_efficiency": 84,
"potential_energy_efficiency": 84,
"last_epc_date": "2020-07-28",
"epc_floor_area": 59,
"construction_age_band": "2007-2011",
"epc_id": "1813679032512020072814144822200478"
}
Environmental Risks
Environmental risk assessment for any UK property. Returns risk level, score, and contextual data. Use all to get every risk type in a single request.
Available risk types
flood
radon
noise
landfill
coal_mining
invasive_plants
air_quality_today
all
# Single risk type curl "https:/.homedata.co.uk/api/risks/flood/?uprn=100023336956" \ -H "Authorization: Api-Key YOUR_API_KEY" # All risk types in one call curl "https:/.homedata.co.uk/api/risks/all/?uprn=100023336956" \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/risks/flood/",
params={"uprn": "100023336956"},
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
for risk in data["results"]:
print(f"{risk['risk_type']}: {risk['label']} (score {risk['score']})")
const response = await fetch( "https:/.homedata.co.uk/api/risks/flood/?uprn=100023336956", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); data.results.forEach(r => console.log(`${r.risk_type}: ${r.label} (score ${r.score})`) );
View example response
{
"risk_type": "flood",
"uprn": 100023336956,
"location": {
"lat": 51.503541,
"lon": -0.12767
},
"results": [
{
"risk_type": "flood_rivers_sea",
"label": "Very low",
"score": 1,
"score_unit": "band",
"intersects": true,
"distance_m": 0,
"radius_description": "At property",
"properties": {
"description": "Less than 1 in 1,000 chance of flooding each year"
}
},
{
"risk_type": "flood_surface_water",
"label": "Low",
"score": 2,
"score_unit": "band",
"intersects": true,
"distance_m": 0,
"radius_description": "At property",
"properties": {
"description": "Between 1 in 1,000 and 1 in 100 chance of flooding each year"
}
}
]
}
Deprivation Index
English Indices of Multiple Deprivation for any postcode. Returns overall score plus individual domains: income, employment, education, health, crime, housing, and environment.
postcode (required) — full UK postcodecurl "https:/.homedata.co.uk/api/deprivation/?postcode=E1%206AN" \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/deprivation/",
params={"postcode": "E1 6AN"},
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
imd = response.json()
print(f"Decile: {imd['overall']['decile']}/10")
const response = await fetch( "https:/.homedata.co.uk/api/deprivation/?postcode=E1%206AN", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const imd = await response.json(); console.log(`Decile: ${imd.overall.decile}/10`);
View example response
{
"postcode": "E1 6AN",
"lsoa": { "code": "E01032739", "name": "City of London 001F" },
"lad": { "code": "E09000001", "name": "City of London" },
"overall": {
"rank": 25325,
"decile": 8,
"score": 3,
"label": "Fairly High Deprivation",
"short_label": "Fairly High",
"lad_rank": 267,
"lad_rank_description": "Local authority ranks 267 out of 317"
},
"domains": [
{
"domain": "income",
"label": "Income",
"description": "Proportion of population experiencing deprivation relating to low income",
"rank": 33530,
"decile": 10,
"score": 1,
"score_label": "Very High Deprivation"
},
{ "domain": "employment", "rank": 29007, "decile": 9, "score": 2, ... },
{ "domain": "education", "rank": 29964, "decile": 9, "score": 2, ... },
{ "domain": "health", "rank": 20214, "decile": 6, "score": 5, ... },
{ "domain": "crime", "rank": 31628, "decile": 10, "score": 1, ... },
{ "domain": "housing", "rank": 17995, "decile": 6, "score": 5, ... },
{ "domain": "environment", "rank": 2191, "decile": 1, "score": 10, ... }
],
"metadata": {
"source": "MHCLG English Indices of Deprivation 2019",
"total_lsoas": 33755,
"score_explanation": "Score is 1-10 where 10 = least deprived"
}
}
Price Trends
Monthly median asking prices by outcode (e.g. E1, SW1A, M3) over the past 12 months. Also returns a volatility score (0–100) based on month-to-month price variation.
outcode (path) — UK outcode (e.g. E1, SW1A)curl https:/.homedata.co.uk/api/price_trends/SW1A/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/price_trends/SW1A/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
for month, price in data["monthly_average_prices"].items():
print(f"{month}: £{price:,}")
const response = await fetch( "https:/.homedata.co.uk/api/price_trends/SW1A/", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); Object.entries(data.monthly_average_prices).forEach(([month, price]) => console.log(`${month}: £${price.toLocaleString()}`) );
View example response
{
"outcode": "SW1A",
"monthly_average_prices": {
"2025-03": 5750000,
"2025-04": 5147500,
"2025-05": 1000000,
"2025-06": 8600000,
"2025-07": 1900000,
"2025-08": 1850000,
"2025-09": 2000000,
"2025-11": 8600000,
"2025-12": 6269900,
"2026-01": 5225000,
"2026-02": 5975000
},
"volatility_score": 100
}
Price Distributions
Price distribution data for an outcode. Shows percentile breakdowns (25th, 50th, 75th) and averages by property type, useful for market segmentation and pricing analysis.
outcode (path) — UK outcode (e.g. E1, SW1A)curl https:/.homedata.co.uk/api/price_distributions/E1/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/price_distributions/E1/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
const response = await fetch( "https:/.homedata.co.uk/api/price_distributions/E1/", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json();
Comparables
BetaFind comparable sold properties near a given UPRN. Uses PostGIS spatial queries to find nearby sales with similar characteristics.
curl https:/.homedata.co.uk/api/comparables/100023336956/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/comparables/100023336956/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
comps = response.json()
Address by Postcode
No auth
List all addresses in a postcode. Returns UPRNs so you can chain into other endpoints. Use URL-encoded or concatenated postcodes (e.g. SW1A2AA or SW1A%202AA).
curl https:/.homedata.co.uk/api/address/postcode/SW1A2AA/
import requests
response = requests.get(
"https:/.homedata.co.uk/api/address/postcode/SW1A2AA/"
)
data = response.json()
for addr in data["addresses"]:
print(f"{addr['address']} (UPRN: {addr['uprn']})")
const response = await fetch(
"https:/.homedata.co.uk/api/address/postcode/SW1A2AA/"
);
const data = await response.json();
data.addresses.forEach(a =>
console.log(`${a.address} (UPRN: ${a.uprn})`)
);
View example response
{
"postcode": "SW1A 2AA",
"count": 1,
"addresses": [
{
"uprn": 100023336956,
"address": "PRIME MINISTER & FIRST LORD OF THE TREASURY, 10 DOWNING STREET, LONDON, SW1A 2AA",
"building_name": "",
"building_number": "10",
"sub_building": "",
"street": "Downing Street",
"town": "London"
}
]
}
⚠️ URL encoding: Use %20 or remove spaces entirely in the URL path. Do NOT use + — it's treated literally in URL paths.
Address Search
No authFull-text address search powered by Elasticsearch (36M+ UK addresses). Type-ahead autocomplete for address forms and property lookup interfaces. Returns matched addresses with UPRNs. Free — doesn't count against your monthly allowance.
q (required) — search query (minimum 2 characters)curl "https:/.homedata.co.uk/api/address/find/?q=10%20Downing%20Street"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/address/find/",
params={"q": "10 Downing Street"}
)
results = response.json()
for addr in results["suggestions"]:
print(f"{addr['address']}, {addr['postcode']}")
const response = await fetch(
"https:/.homedata.co.uk/api/address/find/?q=10%20Downing%20Street"
);
const data = await response.json();
data.suggestions.forEach(a =>
console.log(`${a.address}, ${a.postcode}`)
);
View example response
{
"suggestions": [
{
"uprn": 100023336956,
"address": "10 Downing Street",
"postcode": "SW1A 2AA",
"town": "London"
},
{
"uprn": 10004862792,
"address": "10 Downing Street",
"postcode": "SA15 2UA",
"town": "Llanelli"
}
],
"count": 7
}
Address Retrieve
Get the full formatted address for a known UPRN. Useful for displaying addresses after a search or lookup.
curl https:/.homedata.co.uk/api/address/retrieve/100023336956/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/address/retrieve/100023336956/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
addr = response.json()
print(addr["full_address"])
const response = await fetch( "https:/.homedata.co.uk/api/address/retrieve/100023336956/", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const addr = await response.json(); console.log(addr.full_address);
View example response
{
"uprn": 100023336956,
"udprn": 7832854,
"usrn": 8400709,
"full_address": "10 DOWNING STREET, LONDON, SW1A 2AA",
"address_line_1": "10 Downing Street",
"building_number": "10",
"street_name": "Downing Street",
"town_name": "London",
"postcode": "SW1A 2AA",
"outward_postcode": "SW1A",
"latitude": 51.5033,
"longitude": -0.1276,
"level": "address"
}
Boundaries Autocomplete
Search for administrative boundaries (local authorities, wards, parishes) by name. Returns boundary metadata.
curl "https:/.homedata.co.uk/api/boundaries/autocomplete/?q=islington" \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/boundaries/autocomplete/",
params={"q": "islington"},
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
for b in data["results"]:
print(f"{b['name']} (level {b['admin_level']})")
const response = await fetch( "https:/.homedata.co.uk/api/boundaries/autocomplete/?q=islington", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); data.results.forEach(b => console.log(`${b.name} (level ${b.admin_level})`) );
View example response
{
"results": [
{
"id": 14445,
"name": "London Borough of Islington",
"display_name": "London Borough of Islington, Greater London, England",
"admin_level": 8
}
]
}
Land Registry Titles
Land Registry title boundary data for a property. Returns a GeoJSON Feature with the title polygon.
curl https:/.homedata.co.uk/api/property_lr_titles/100023336956/ \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/property_lr_titles/100023336956/",
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
feature = response.json() # GeoJSON Feature
print(f"Geometry type: {feature['geometry']['type']}")
const response = await fetch( "https:/.homedata.co.uk/api/property_lr_titles/100023336956/", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const feature = await response.json(); // GeoJSON Feature console.log(`Geometry: ${feature.geometry.type}`);
Property Sales
Sale records including listing dates, prices, and associated agent listings. Paginated results. A filter parameter (uprn, property, or id) is required — requests without a filter return 400.
uprn (required), page (optional, pagination)curl "https:/.homedata.co.uk/api/property_sales/?uprn=10093609154" \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/property_sales/",
params={"uprn": "10093609154"},
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
for sale in data["results"]:
print(f"{sale['transaction_type']}: £{sale.get('sold_let_price', 'N/A')}")
const response = await fetch( "https:/.homedata.co.uk/api/property_sales/?uprn=10093609154", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); data.results.forEach(s => console.log(`${s.transaction_type}: £${s.sold_let_price ?? 'N/A'}`) );
Live Listings
Search currently active property listings aggregated from major UK portals. Returns paginated results with price, bedrooms, agent details, and property UPRN for chaining into other endpoints.
q (required) — search query (location, address, postcode)curl "https:/.homedata.co.uk/api/live-listings/search/?q=Manchester" \ -H "Authorization: Api-Key YOUR_API_KEY"
import requests
response = requests.get(
"https:/.homedata.co.uk/api/live-listings/search/",
params={"q": "Manchester"},
headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
print(f"Found {data['count']} listings")
for listing in data["results"][:5]:
print(f"£{listing['latest_price']:,} — {listing['display_address']}")
const response = await fetch( "https:/.homedata.co.uk/api/live-listings/search/?q=Manchester", { headers: { "Authorization": "Api-Key YOUR_API_KEY" } } ); const data = await response.json(); console.log(`Found ${data.count} listings`); data.results.slice(0, 5).forEach(l => console.log(`£${l.latest_price?.toLocaleString()} — ${l.display_address}`) );
View example response
{
"count": 3616,
"page": 1,
"page_size": 200,
"total_pages": 19,
"results": [
{
"listing_id": "R173127803",
"property_uprn": 10093895962,
"display_address": "Jurston Fields, Wellington",
"transaction_type": "Sale",
"latest_status": "For sale",
"latest_price": 270000,
"source": "Rightmove",
"bedrooms": 2,
"bathrooms": 2
},
...
]
}
Want the full OpenAPI spec?
Our interactive Swagger UI includes all endpoints, request schemas, and live testing.
Open API Explorer ↗