Getting Started
The HomePortfolio API gives you 300+ data points on any property in England from a single API call. This guide will get you from zero to your first response in under 5 minutes.
1. Get your API key
Email [email protected] with your company name and use case. You'll receive your key within 24 hours.
2. Make your first request
curl "https://api.homeportfolio.com/v1/property/100050675856" \
-H "X-API-Key: your_api_key"
3. That's it
You'll get a JSON response with 19 data sections covering everything from valuations and EPC ratings to crime stats and planning history.
💡 Don't know the UPRN? Use the search endpoint to find it by postcode or address.
Authentication
All API requests (except public endpoints) require an API key. Pass it via:
Header (recommended)
X-API-Key: hp_live_your_key_here
Query parameter
https://api.homeportfolio.com/v1/property/123?api_key=hp_live_your_key_here
Public endpoints that don't require authentication:
| Endpoint | Description |
|---|---|
/health | System health check |
/v1/stats | Database statistics |
/v1/status | System status + data freshness |
/docs | Auto-generated OpenAPI docs |
Rate Limits
Rate limits are applied per API key. Every response includes headers showing your current usage:
X-RateLimit-Limit-Daily: 10000
X-RateLimit-Remaining-Daily: 9847
X-RateLimit-Limit-Minute: 100
X-RateLimit-Remaining-Minute: 98
| Plan | Daily Limit | Per Minute | Bulk Access |
|---|---|---|---|
| Free | 50 | 10 | No |
| Starter (£99/mo) | 1,000 | 30 | No |
| Pro (£299/mo) | 10,000 | 100 | Yes |
| Business (£999/mo) | 50,000 | 300 | Yes |
| Enterprise | Unlimited | 1,000 | Yes |
When you exceed a rate limit, you'll receive a 429 Too Many Requests response with a Retry-After header.
Property Lookup
GET /v1/property/{uprn}
Returns the full property intelligence response — all 19 sections, 300+ fields.
Parameters
| Parameter | Type | Description |
|---|---|---|
uprn | string (path) | Unique Property Reference Number |
Response time
Cached: ~130ms · Uncached: ~1.3s · The first request for a UPRN runs 14+ parallel queries, then caches for 6 hours.
Section Endpoints
GET /v1/property/{uprn}/{section}
Returns just one data section. Faster and smaller than the full response. Available sections:
| Section | Typical Latency | Description |
|---|---|---|
valuation | 142ms | Sale/rent estimates, confidence, last sale |
epc | 152ms | Energy performance certificate data |
listing | 96ms | Active listing details |
investment | 93ms | Yield, growth, market heat |
intelligence | 115ms | property_intelligence row |
broadband | 100ms | Broadband speeds by type |
mobile | 100ms | Mobile signal by provider |
risk | ~1s | Flood, subsidence, radon, air quality |
demographics | 100ms | Census data for the LSOA |
ownership | 151ms | Land Registry owners + covenants |
crime | 116ms | Crime by category + trend |
sale-history | 100ms | Transaction history + area sales |
schools | 160ms | Nearest schools |
amenities | 145ms | POIs nearby |
planning | 124ms | Planning applications |
Search
GET /v1/search
Find properties by postcode, text address, or coordinates.
By postcode
GET /v1/search?postcode=SW1A+1AA
By text
GET /v1/search?q=10+Downing+Street+London
By location
GET /v1/search?lat=51.5034&lon=-0.1276&radius=200
| Parameter | Type | Description |
|---|---|---|
postcode | string | UK postcode (spaces optional) |
q | string | Address text to search |
lat | float | Latitude (with lon + radius) |
lon | float | Longitude |
radius | int | Search radius in metres (max 2000) |
limit | int | Max results (default 20, max 100) |
Autocomplete
GET /v1/autocomplete?q=10+down
Returns address suggestions as the user types. Optimised for speed (~150ms).
Area Intelligence
GET /v1/area/{postcode}
Area-level data: walkability, census demographics, crime stats, planning activity, market stats, flood risk — all for a postcode area. ~170ms.
Compare
GET /v1/compare?uprns=100050675856,100050675857
Side-by-side comparison of up to 5 properties. Returns full data for each.
Bulk Lookup
POST /v1/bulk
Content-Type: application/json
{"uprns": ["100050675856", "100050675857", ...]}
Batch lookup up to 100 UPRNs in one request. Requires Pro plan or above.
Data Sections Reference
address (9 fields)
full, postcode, outcode, country, town, area, county, region, street
property (14 fields)
type, bedrooms, bathrooms, living_rooms, tenure, built_form, construction_age, floor_area_sqm, floor_height_m, habitable_rooms, heated_rooms, extension_count, open_fireplaces, transaction_type
valuation (10 fields)
sale_estimate, sale_range (low/high), sale_confidence, rent_estimate_monthly, rent_range (low/high), last_sale_price, last_sale_date, median_price_12mo, transactions_12mo, gross_rental_yield_pct
epc (22 fields)
current_rating, potential_rating, current_efficiency, potential_efficiency, co2_current_tonnes, co2_potential_tonnes, energy_consumption_current, energy_consumption_potential, environment_impact_current, environment_impact_potential, annual_costs (heating/hot_water/lighting), potential_costs, walls, roof, floor, windows, heating, hot_water, lighting, renewables, ventilation, inspection_date
risk (12 fields)
flood_risk, subsidence_risk, radon_risk_class, mining_risk, landslide_risk, collapsible_ground, compressible_ground, running_sand, soluble_rocks, air_quality_no2, air_quality_pm25, air_quality_pm10
demographics (21 fields)
lsoa_code, lsoa_name, local_authority, population, total_households, median_annual_income, mean_annual_income, area_sqkm, population_density, age_distribution, sex, ethnicity, religion, marital_status, health, qualifications, employment, occupation, housing, tenure_distribution, deprivation
Error Codes
| Code | Meaning | Common Cause |
|---|---|---|
400 | Bad Request | Missing required parameter |
401 | Unauthorized | Missing or invalid API key |
403 | Forbidden | Endpoint not available on your plan |
404 | Not Found | UPRN not in database |
429 | Too Many Requests | Rate limit exceeded |
500 | Server Error | Something went wrong (we're alerted) |
All errors return JSON:
{"detail": "API key required. Pass via X-API-Key header or ?api_key= param."}
Data Sources
Our data is aggregated from 15+ authoritative UK sources, refreshed on different cadences:
| Source | Data | Refresh |
|---|---|---|
| HM Land Registry | Ownership, price paid, covenants, leases | Monthly |
| EPC Register | Energy ratings, building details, heating, insulation | Quarterly |
| ONS / Census 2021 | Demographics, housing, employment, deprivation | Static (decennial) |
| Ordnance Survey | UPRN registry, coordinates, postcodes, geospatial | Quarterly |
| Environment Agency | Flood risk zones (river, surface water, coastal) | Annual |
| Ofcom | Broadband speeds, FTTP availability, mobile coverage | Annual |
| Police UK | Crime data by category, neighbourhood trends | Monthly |
| Council Planning Portals | Planning applications, decisions, development types | Monthly |
| Overture Maps | POIs, amenities, transport, services | Quarterly |
| HomePortfolio AVM | Automated valuations, confidence bands, rent estimates | Continuous |
| Companies House | Corporate property ownership, PSC data | Quarterly |
| DEFRA | Air quality (NO₂, PM2.5, PM10) | Annual |
| HMRC | Stamp duty thresholds, tax band data | Annual |
| DfE | School information, Ofsted ratings, attainment | Annual |
| Valuation Office Agency | Council tax bands, rateable values | Annual |
Code Examples
cURL
# Full property intelligence — 379 fields, 19 sections
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/property/100030048320"
# Single section for speed (~142ms)
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/property/100030048320/valuation"
# Search by address or postcode
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/search?q=10+Downing+Street"
# Real-time autocomplete
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/autocomplete?q=10+down"
# Area intelligence
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/area/SW1A+1AA"
# Compare properties side-by-side
curl -H "X-API-Key: YOUR_KEY" \
"https://api.homeportfolio.com/v1/compare?uprns=100030048320,200004166621"
# Bulk lookup — up to 100 UPRNs (Starter+)
curl -X POST -H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"uprns": ["100030048320", "200004166621"]}' \
"https://api.homeportfolio.com/v1/bulk"
Python
import requests
API_KEY = "hp_live_your_key_here"
BASE = "https://api.homeportfolio.com/v1"
headers = {"X-API-Key": API_KEY}
# Search for a property
results = requests.get(f"{BASE}/search",
params={"q": "10 Downing Street"},
headers=headers
).json()
# Get full property intelligence
uprn = results["results"][0]["uprn"]
data = requests.get(f"{BASE}/property/{uprn}", headers=headers).json()
print(f"Address: {data['full_address']}")
print(f"Value: £{float(data['valuation']['sale_estimate']):,.0f}")
print(f"EPC: {data['epc']['rating']}")
print(f"Flood risk: {data['risk']['flood_zone']}")
# Or fetch a single section for speed (~142ms)
epc = requests.get(f"{BASE}/property/{uprn}/epc", headers=headers).json()
JavaScript / Next.js
const API_KEY = "hp_live_your_key_here";
const BASE = "https://api.homeportfolio.com/v1";
const headers = { "X-API-Key": API_KEY };
// Search for a property
const { results } = await fetch(
`${BASE}/search?q=10+Downing+Street`, { headers }
).then(r => r.json());
// Get full property intelligence
const uprn = results[0].uprn;
const data = await fetch(
`${BASE}/property/${uprn}`, { headers }
).then(r => r.json());
console.log(`Value: £${data.valuation.sale_estimate}`);
console.log(`EPC: ${data.epc.rating}`);
console.log(`Flood: ${data.risk.flood_zone}`);
// Single section for speed
const epc = await fetch(
`${BASE}/property/${uprn}/epc`, { headers }
).then(r => r.json());
Java (JDK 11+)
import java.net.http.*;
import java.net.URI;
HttpClient client = HttpClient.newHttpClient();
// Full property lookup
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.homeportfolio.com/v1/property/100030048320"))
.header("X-API-Key", "hp_live_your_key_here")
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString()
);
// Parse with Jackson, Gson, or your preferred JSON library
System.out.println(response.body());