API Reference

All endpoints return JSON. Base URL: https:/.homedata.co.uk

GET

Property Intelligence

/api/properties/{uprn}/

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.

Auth: API key required
Response time: ~300ms
cURL
curl https:/.homedata.co.uk/api/properties/10093609154/ \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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"])
JavaScript
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,
  ...
}
GET

EPC & Energy

No auth
/api/epc-checker/{uprn}/

Energy Performance Certificate data. Returns current and potential energy efficiency scores (1–100), last EPC date, floor area, construction age band, and certificate ID.

Auth: None required (open endpoint)
Response time: ~190ms
cURL
curl https:/.homedata.co.uk/api/epc-checker/100023336956/
Python
import requests

response = requests.get(
    "https:/.homedata.co.uk/api/epc-checker/100023336956/"
)
epc = response.json()
print(f"Rating: {epc['current_energy_efficiency']}")
JavaScript
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"
}
GET

Environmental Risks

/api/risks/{risk_type}/?uprn={uprn}

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.

Auth: API key required
Response time: ~350ms (single) / ~800ms (all)

Available risk types

flood radon noise landfill coal_mining invasive_plants air_quality_today all
cURL
# 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"
Python
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']})")
JavaScript
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"
      }
    }
  ]
}
GET

Deprivation Index

/api/deprivation/?postcode={postcode}

English Indices of Multiple Deprivation for any postcode. Returns overall score plus individual domains: income, employment, education, health, crime, housing, and environment.

Auth: API key required
Response time: ~165ms
Parameters: postcode (required) — full UK postcode
cURL
curl "https:/.homedata.co.uk/api/deprivation/?postcode=E1%206AN" \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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")
JavaScript
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"
  }
}
GET

Price Distributions

/api/price_distributions/{outcode}/

Price distribution data for an outcode. Shows percentile breakdowns (25th, 50th, 75th) and averages by property type, useful for market segmentation and pricing analysis.

Auth: API key required
Response time: ~500ms (cached) / ~5s (uncached, first request)
Parameters: outcode (path) — UK outcode (e.g. E1, SW1A)
cURL
curl https:/.homedata.co.uk/api/price_distributions/E1/ \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
import requests

response = requests.get(
    "https:/.homedata.co.uk/api/price_distributions/E1/",
    headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
data = response.json()
JavaScript
const response = await fetch(
  "https:/.homedata.co.uk/api/price_distributions/E1/",
  { headers: { "Authorization": "Api-Key YOUR_API_KEY" } }
);
const data = await response.json();
GET

Comparables

Beta
/api/comparables/{uprn}/

Find comparable sold properties near a given UPRN. Uses PostGIS spatial queries to find nearby sales with similar characteristics.

Auth: API key required
Note: This endpoint is in beta. Response times may be elevated for properties with large numbers of nearby sales.
cURL
curl https:/.homedata.co.uk/api/comparables/100023336956/ \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
import requests

response = requests.get(
    "https:/.homedata.co.uk/api/comparables/100023336956/",
    headers={"Authorization": "Api-Key YOUR_API_KEY"}
)
comps = response.json()
GET

Address by Postcode

No auth
/api/address/postcode/{postcode}/

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).

Auth: None required (open endpoint)
Response time: ~195ms
cURL
curl https:/.homedata.co.uk/api/address/postcode/SW1A2AA/
Python
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']})")
JavaScript
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.

GET

Address Search

No auth
/api/address/find/?q={query}

Full-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.

Auth: None required (open endpoint)
Parameters: q (required) — search query (minimum 2 characters)
Response time: ~160ms
cURL
curl "https:/.homedata.co.uk/api/address/find/?q=10%20Downing%20Street"
Python
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']}")
JavaScript
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
}
GET

Address Retrieve

/api/address/retrieve/{uprn}/

Get the full formatted address for a known UPRN. Useful for displaying addresses after a search or lookup.

Auth: API key required
cURL
curl https:/.homedata.co.uk/api/address/retrieve/100023336956/ \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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"])
JavaScript
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"
}
GET

Boundaries Autocomplete

/api/boundaries/autocomplete/?q={query}

Search for administrative boundaries (local authorities, wards, parishes) by name. Returns boundary metadata.

Auth: API key required
Response time: ~280ms
cURL
curl "https:/.homedata.co.uk/api/boundaries/autocomplete/?q=islington" \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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']})")
JavaScript
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
    }
  ]
}
GET

Land Registry Titles

/api/property_lr_titles/{uprn}/

Land Registry title boundary data for a property. Returns a GeoJSON Feature with the title polygon.

Auth: API key required
Response format: GeoJSON Feature
cURL
curl https:/.homedata.co.uk/api/property_lr_titles/100023336956/ \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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']}")
JavaScript
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}`);
GET

Property Sales

/api/property_sales/?uprn={uprn}

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.

Auth: API key required
Parameters: uprn (required), page (optional, pagination)
cURL
curl "https:/.homedata.co.uk/api/property_sales/?uprn=10093609154" \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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')}")
JavaScript
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'}`)
);
GET

Live Listings

/api/live-listings/search/?q={query}

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.

Auth: API key required
Parameters: q (required) — search query (location, address, postcode)
Response time: ~560ms
cURL
curl "https:/.homedata.co.uk/api/live-listings/search/?q=Manchester" \
  -H "Authorization: Api-Key YOUR_API_KEY"
Python
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']}")
JavaScript
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 ↗