Property data API
for investors.
Comparables, price history, listing event signals, and motivated seller identification. Built for property investors who want to assess deals, source opportunities, and analyse markets — without manual portal research.
Free tier: 100 calls/month. No credit card required.
29M
properties covered
30 years
of listing history
0.5 mile
comparables radius
6 event types
per property trail
What investors use it for
One API, multiple investment strategies.
Motivated seller identification
Filter listing events by days on market, price reduction count, and status changes. Properties with 90+ DOM, multiple reductions, and a prior withdrawn instruction show the highest seller motivation — identify them before anyone else does.
Comparable evidence for offers
Pull the nearest comparable sold prices for any property by UPRN — distance-ranked, with property type, bedrooms, floor area, and sale date. Build your own AVM or justify below-market offers with real evidence.
BTL portfolio analysis
Bulk enrich an entire portfolio — EPC ratings, council tax, flood risk, construction age — in a single pass. Surface listing events on properties you own (landlord exit signals) or target areas with high rental demand and suppressed prices.
Price history & market timing
30 years of listing events per property — every price change, status update, and instruction going back to 1995. Use it to understand a property's history before bidding, or to model local market cycles.
Property risk assessment
Flood risk, radon, subsidence, landfill proximity, noise, and air quality — all available per UPRN. Know what's hidden behind every opportunity before you commit to a survey.
Development opportunity sourcing
Combine planning applications data with price growth and deprivation scores to identify areas early in the gentrification cycle. Layer in listing velocity to spot pockets of undersupply.
The Investor Package — endpoints included
Everything you need to assess a deal, find the next one, and track your portfolio.
| Endpoint | What it returns | Call weight | Plan required |
|---|---|---|---|
| /api/v1/comparables/{uprn}/ | Nearest comparable sold + listed properties, distance-ranked | 10 calls | Growth |
| /api/v1/listing_events/ | Full listing event trail — price changes, status, DOM | 1 call | Free tier |
| /api/v1/property_sales/ | HMLR sold prices by UPRN or postcode | 1 call | Free tier |
| /api/v1/properties/{uprn}/ | Beds, baths, floor area, type, tenure, construction age | 1 call | Free tier |
| /api/v1/epc-checker/{uprn}/ | EPC rating, energy score, floor area, assessment date | 1 call | Free tier |
| /api/v1/risks/flood_risk/ | River, surface, coastal, groundwater flood risk bands | 1 call | Starter |
| /api/v1/risks/radon/ | Radon level indicator | 1 call | Starter |
| /api/v1/council_tax_band/ | Council tax band (A–H) | 1 call | Free tier |
| /api/v1/planning_applications/ | Planning history — decision, type, dates | 1 call | Starter |
| /api/v1/deprivation/ | IMD deprivation scores across 10 domains | 1 call | Starter |
| /api/v1/price_trends/ | Monthly median prices and volatility by postcode | 1 call | Starter |
| /api/v1/address/find/ | Address search → UPRN | 2 calls | Free tier |
Assess a deal in seconds
Pass a UPRN — get back comparables, listing history, EPC, flood risk, council tax, and planning history. Everything you need to decide whether a property is worth pursuing, in one API session.
Run the same logic across a list of 200 off-market targets and you've automated a week of manual research.
import requests, concurrent.futures
UPRN = "100090914832"
H = {"Authorization": "Api-Key YOUR_KEY"}
B = "https://homedata.co.uk/api/v1"
def fetch(path):
return requests.get(f"{B}{path}", headers=H).json()
# Run all deal-assessment calls in parallel
with concurrent.futures.ThreadPoolExecutor() as pool:
futures = {
"comparables": pool.submit(fetch, f"/comparables/{UPRN}/"),
"events": pool.submit(fetch, f"/listing_events/?uprn={UPRN}"),
"property": pool.submit(fetch, f"/properties/{UPRN}/"),
"epc": pool.submit(fetch, f"/epc-checker/{UPRN}/"),
"flood": pool.submit(fetch, f"/risks/flood_risk/?uprn={UPRN}"),
"council_tax": pool.submit(fetch, f"/council_tax_band/?uprn={UPRN}"),
"planning": pool.submit(fetch, f"/planning_applications/?uprn={UPRN}"),
}
deal = {k: v.result() for k, v in futures.items()}
# Motivated seller score
events = deal["events"].get("events", [])
reductions = sum(1 for e in events if e["event_type"] == "price_reduction")
days_on_market = deal["events"].get("days_on_market", 0)
print(f"DOM: {days_on_market} days, {reductions} price reductions")
# → DOM: 127 days, 3 price reductions
const UPRN = '100090914832';
const headers = { 'Authorization': 'Api-Key YOUR_KEY' };
const BASE = 'https://homedata.co.uk/api/v1';
const fetch = (path) =>
globalThis.fetch(`${BASE}${path}`, { headers }).then(r => r.json());
// Run deal-assessment calls in parallel
const [comparables, events, property, epc, flood, councilTax, planning] =
await Promise.all([
fetch(`/comparables/${UPRN}/`),
fetch(`/listing_events/?uprn=${UPRN}`),
fetch(`/properties/${UPRN}/`),
fetch(`/epc-checker/${UPRN}/`),
fetch(`/risks/flood_risk/?uprn=${UPRN}`),
fetch(`/council_tax_band/?uprn=${UPRN}`),
fetch(`/planning_applications/?uprn=${UPRN}`),
]);
// Motivated seller scoring
const reductions = events.events?.filter(
e => e.event_type === 'price_reduction'
).length ?? 0;
console.log(`DOM: ${events.days_on_market} days, ${reductions} reductions`);
// → DOM: 127 days, 3 reductions
# Comparables — comparable sold prices within 0.5 miles
curl -H 'Authorization: Api-Key YOUR_KEY' \
'https://homedata.co.uk/api/v1/comparables/100090914832/'
# Listing events — full event trail (DOM, price changes, status)
curl -H 'Authorization: Api-Key YOUR_KEY' \
'https://homedata.co.uk/api/v1/listing_events/?uprn=100090914832'
# Property characteristics (beds, type, floor area)
curl -H 'Authorization: Api-Key YOUR_KEY' \
'https://homedata.co.uk/api/v1/properties/100090914832/'
# EPC rating + energy score
curl -H 'Authorization: Api-Key YOUR_KEY' \
'https://homedata.co.uk/api/v1/epc-checker/100090914832/'
# Flood risk (river, surface, coastal, groundwater)
curl -H 'Authorization: Api-Key YOUR_KEY' \
'https://homedata.co.uk/api/v1/risks/flood_risk/?uprn=100090914832'
Motivated seller signals — how to read the data
Homedata tracks listing events back to 1995 via Home.co.uk. Each property's event trail tells a story. Here's how investors read it.
Long DOM 60–90 days on market
Seller may be open to negotiation. Market may be pricing them above actual value. Worth contacting before competitors do.
Multiple reductions 2+ price reductions
Each reduction is a data point about seller motivation. Three reductions + 90+ DOM is one of the strongest motivated seller indicators in the market.
Withdrawn and re-listed Status change: withdrawn → active
Failed sale or decision to re-market. Seller has already been through one transaction process. Often willing to accept less to avoid repeating it.
Long DOM, no reductions Over-priced, not motivated
Seller still holding their price. May come good eventually — worth monitoring, not prioritising.
Recent instruction, clean price Under 30 days, no reductions
Standard market listing. Focus elsewhere unless below-market opportunity.
Pricing
Start free. Upgrade when you're ready to run at scale.
Free
£0/month
100 calls/month
- ✓ Address lookup
- ✓ Property characteristics
- ✓ Listing events
- ✓ EPC ratings
- ✓ Council tax
Starter
£49/month
2,000 calls/month
- ✓ Everything in Free
- ✓ Flood risk + environmental
- ✓ Planning applications
- ✓ Deprivation index
- ✓ Price trends
Growth
£149/month
10,000 calls/month
- ✓ Everything in Starter
- ✓ Comparables API (10 calls)
- ✓ Higher volume for bulk runs
- ✓ AVM / valuation endpoint
Frequently asked questions
Do I need to provide UPRNs or can I search by address?
Both. Use /api/v1/address/find/?query= to search by address string or postcode — it returns matching properties with UPRNs. Then use each UPRN to pull property-level data. Two API calls to go from address string to full enrichment.
How far back does the listing event history go?
30 years — back to 1995. The history is sourced from Home.co.uk, which has been tracking UK listing events since before Rightmove launched. You can see every time a property came to market, was reduced, was withdrawn, or completed.
Can I do bulk lookups for portfolio screening?
Yes — there's no batch endpoint, but the API is fast enough to process lists of UPRNs in parallel (typically <200ms per call). A 1,000-property portfolio screen with 5 data points takes around 30 seconds with concurrent requests. See the Python example above.
Does the comparables endpoint include off-market sales?
Yes — the comparables endpoint pulls from HMLR completed transactions, so it includes off-market sales that never appeared on portals. It also returns active listings for live market context.
Is Scotland included?
Core coverage is England and Wales. HMLR title and sold price data is England and Wales only (Scotland uses the Registers of Scotland). Listing events, addresses, and EPC have partial Scotland coverage. Full Scotland support is on the roadmap.
Can I use the letter campaign service with my Homedata searches?
Yes — Homedata's letter drop service lets you turn any property search (long-DOM motivated sellers, new listings in a postcode, recent completions) into a physical letter campaign. Contact sales@homedata.co.uk for a quote.