Market Activity
Every step of every UK property's journey through the market. Not just the final sale price — the full timeline from listing to completion, including the ones that never completed. 30 years of data, UPRN-linked.
The full property journey
Land Registry only records completions. We record everything — including the ones that went under offer and then fell through. Each event is timestamped and priced.
Event types
Every state change is tracked with a timestamp and price where applicable.
Pass any UPRN to get the full listing event timeline. Filter by event_type to isolate specific state changes.
curl "https://api.homedata.co.uk/api/property_sale_events/ ?uprn=100023336956" \ -H "Authorization: Api-Key YOUR_KEY"
{
"count": 5,
"results": [
{
"id": 84912,
"event_type": "Added",
"date": "2024-01-12",
"price": 595000,
"source": "Home.co.uk",
"listing": 4821
},
{
"id": 84913,
"event_type": "Reduced",
"date": "2024-02-28",
"price": 575000,
"source": "Home.co.uk",
"listing": 4821
},
{
"id": 84914,
"event_type": "Sold STC",
"date": "2024-03-22",
"price": 568000,
"source": "Home.co.uk",
"listing": 4821
}
]
}
What this data unlocks
Deal flow intelligence
Track properties going under offer and watch for Withdrawn events — the signal that a deal fell through. Portfolio managers and investors use this to spot buying opportunities before they're re-listed.
AVM velocity signals
Time-to-offer, price reduction frequency, and listing churn are leading indicators of market velocity. Weight your AVM models with current market conditions rather than historic completions alone.
Cross-cycle property tracking
Events are UPRN-linked, so you can trace the same physical address across decades of listing cycles. See how many times a property has been listed, at what prices, and how long it typically takes to sell.
Why not just use Land Registry?
| Data point | Land Registry | Homedata |
|---|---|---|
| Completed sales | ✓ Yes (3–6 month lag) | ✓ Yes (real-time) |
| Properties that were listed but never sold | ✗ No | ✓ Yes |
| Price reductions during listing | ✗ No | ✓ Yes |
| Time between listing and offer accepted | ✗ No | ✓ Yes |
| Withdrawn listings / failed deals | ✗ No | ✓ Yes |
| History depth | 1990s–present | 1995–present (30 years) |
| UPRN-linked for cross-cycle tracking | ✗ No | ✓ Yes |
Field reference
| Field | Type | Description |
|---|---|---|
| id | integer | Unique event identifier |
| event_type | string | State change type: Added, Reduced, Under Offer, Sold STC, Withdrawn, Completed, Let, Sale Cancelled |
| date | date | When this event occurred (YYYY-MM-DD) |
| price | integer | Price at this event in pence (divide by 100 for pounds). 0 for events without a price change. |
| source | string | Always "Home.co.uk" (30 years of continuous data collection), or "Land registry" for completed sales sourced from HM Land Registry. |
| listing | integer | PropertyListing ID — groups events belonging to the same listing cycle. Use with /api/property_sales/ to get full sale context. |
| sale | integer | null | PropertySale ID if this event is associated with a confirmed sale. Null for listings that did not complete. |
Code examples
import requests
API_KEY = "your_api_key"
UPRN = "100023336956"
resp = requests.get(
"https://api.homedata.co.uk/api/property_sale_events/",
params={"uprn": UPRN},
headers={"Authorization": f"Api-Key {API_KEY}"}
)
events = resp.json()["results"]
for event in events:
price = f"£{event['price']:,}" if event['price'] else "—"
print(f"{event['date']} {event['event_type']:<15} {price}")
const API_KEY = 'your_api_key';
const UPRN = '100023336956';
// Get only Withdrawn events (fallen-through deals)
const res = await fetch(
`https://api.homedata.co.uk/api/property_sale_events/` +
`?uprn=${UPRN}&event_type=Withdrawn`,
{ headers: { 'Authorization': `Api-Key ${API_KEY}` } }
);
const { results } = await res.json();
console.log(`${results.length} withdrawn listings found`);
curl "https://api.homedata.co.uk/api/property_sale_events/ ?uprn=100023336956 &event_type=Sold+STC" \ -H "Authorization: Api-Key YOUR_KEY"
import requests
API_KEY = "your_api_key"
def get_withdrawn_listings(uprn: str) -> list:
"""Properties that went Sold STC then Withdrawn"""
resp = requests.get(
"https://api.homedata.co.uk/api/property_sale_events/",
params={"uprn": uprn},
headers={"Authorization": f"Api-Key {API_KEY}"}
)
events = resp.json()["results"]
types = [e["event_type"] for e in events]
# Deal fell through: Sold STC followed by Withdrawn
if "Sold STC" in types and "Withdrawn" in types:
return [e for e in events if e["event_type"] == "Withdrawn"]
return []
Start tracking market activity
Free tier includes 100 API calls. No credit card required. The market activity endpoint is available on all plans.