- Data
- REST API
- Property record
- Property history
Property history
GET /v1/property/{uprn}/historyThe sale history of one property with per-sale detail and optional drill-downs; the readable version of the registry rows. Free.
Same call over MCP
Sold-price historyproperty_historyAuthenticate with an API key from the API & MCP Hub. The same call is available as an MCP tool at the same price.
Reference
What GET /v1/property/{uprn}/history returns
The story of a property's sales. Each registered sale with its detail, in order, so a reader can see when it changed hands, for how much, how long each owner held it and what each sale implies against the market of its day. max_drilldowns bounds how much per-sale detail is fetched. It is free, because the source is HM Land Registry Price Paid Data under the Open Government Licence.
transactions_by_uprn returns the same sales as raw registry rows; use that when you only need the rows and this when you want them explained.
Reference
When to use it, and when not to
Use it for the narrative a report needs: the last sale as the anchor for a valuation, the holding period behind a nominal gain, a pattern of quick resales that hints at a flip or a problem. Carry an old sale to today with market_index_series. For the current estimated value against the last sale in one number use equity_estimate; for how the property was marketed between sales use listing_history.
Inputs
Before you call it
A UPRN. address_autocomplete (free) narrows the address; address_resolve (8 credits) returns the UPRN.
- uprn
- A UPRN is the Unique Property Reference Number every UK address carries. Narrow the address with address_autocomplete, which is free, then address_resolve returns the UPRN for 8 credits. property_summary and address_by_postcode return UPRNs too.
Request
Calling GET /v1/property/{uprn}/history
curl "https://api.marketcode.ai/v1/property/200003443835/history" \
-H "Authorization: Bearer $MARKETCODE_API_KEY"Send your API key as a Bearer token. Every response carries credits_charged and credits_remaining.
Inputs
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| uprn | Path | string | Yes | |
| limit | Query | integer | No | Default: 200 |
Response
What GET /v1/property/{uprn}/history returns for a real request
curl "https://api.marketcode.ai/v1/property/200003443835/history" \
-H "Authorization: Bearer $MARKETCODE_API_KEY"{
"uprn": "200003443835",
"country": "UK",
"data": {
"uprn": 200003443835,
"count": 0,
"transactions": [],
"cached": false,
"time_ms": 4.1
},
"credits_charged": 0
}A real response, captured from production and trimmed: arrays to three items, long strings shortened, volatile keys dropped.
Response
Response fields
| Field | Type | Example |
|---|---|---|
| uprn | string | 200003443835 |
| country | string | UK |
| data | object | |
| data.uprn | integer | 200003443835 |
| data.count | integer | 0 |
| data.transactions | array | |
| data.cached | boolean | false |
| data.time_ms | number | 4.1 |
| credits_charged | integer | 0 |
Fields observed in the example response above; a field the example did not exercise is not listed.
Reference
Things that catch people out
- No history is a real answer. A property last sold before 1995, or never sold, or held by a company since it was built, has no Price Paid rows. The response says so.
- Category B sales are not market prices. Transfers under a power of sale, right-to-buy and below-market transfers are in the registry and marked as such. Read the category before treating a price as evidence.
- Registration lags completion. The most recent sale may not be registered yet; a sale completed weeks ago can be missing and arrive next month.
- A new-build first sale is not a comparable for the resale market. The registry marks new builds; the first sale of a new flat carries a premium the second does not.
Price and licence
What it costs, and where the data comes from
Property history is free over MCP and over REST, and the two surfaces share one credit balance. Free calls need a signed-in account or an API key and appear in your usage, but they never touch your balance.
Credits are granted on sign-up and bought in packs; the pricing page lists every call.
Sources
- HM Land Registry
Price Paid Data
Open Government Licence v3 · England and Wales
Related
Endpoints used with Property history
- Registered sales for a propertyFree
transactions_by_uprnAll HMLR Price Paid records joined to this UPRN, newest first.Pairs with this - House price index seriesFree
market_index_seriesThe published house-price INDEX for one postcode district or local authority: the level per month (base period = 100), the forecast tail flagged, and provenance saying how the index was built.Pairs with this - Equity gain estimateFree
equity_estimateCurrent estimated value against the last recorded sale: gain in pounds and percent, and how long it has been held.Pairs with this - Listing history for a property3 credits
listing_historyEvery marketing snapshot for a property: asking price over time, price reductions, days listed, status changes, agent, image count and whether it had a floor plan.Pairs with this - Commercial property report: RV, indexes, yield, owner2 credits
commercial_propertyThe commercial property report, by UPRN or by VOA UARN: the hereditament as the 2026 rating list describes it (rateable value, sector, description), the sector's rent index across the 2010/2017/2023/2026 lists and its capital index (national, plus the local authority where one exists), an income-basis value that capitalises the RV at the district's commercial auction net yield — with the yield's receipt, and `not_available` where the district published none — the auction history at the address, the district's commercial auction market by quarter, the registered owner and the lease. Blocks that cannot be derived today say `not_available` with the reason (the RV history per hereditament; the VOA measured area). RV is a rating measure at the antecedent valuation date, not passing rent — say so when you quote the income-basis figure. UK only.Same category - Council tax bandFree
council_tax_bandVOA council tax band for a property, from the official list.Same category
Glossary
Terms used here
- Price Paid Data: HM Land Registry's record of every registered residential sale in England and Wales since 1995: price, date, address, type, tenure and whether it was a standard market sale.
- Comparable (comp): A recent sale or listing of a similar property nearby, used to support or challenge a valuation; MarketCode draws them from the same building and street first.
- Tenure (freehold and leasehold): How a property is held: freehold outright, or leasehold for a fixed term under a lease from the freeholder; recorded on every registered sale and every title.
FAQ
Questions about Property history
How much does `property_history` cost?
+
Property history is free over MCP and over REST, and the two surfaces share one credit balance. Free calls need a signed-in account or an API key and appear in your usage, but they never touch your balance.
Do I need to resolve the address first?
+
Yes. property_history takes a UPRN, not an address. Start with address_autocomplete (free) to narrow the address, then address_resolve (8 credits) to get the UPRN. An assistant with the MarketCode skills installed does both steps on its own.
How do I authenticate?
+
Send your API key as a Bearer token in the Authorization header. Keys are created in the API & MCP Hub, shown once and revocable. Every response carries the credits charged and your remaining balance.
Is there an MCP version?
+
Yes. The property_history tool on the MarketCode MCP server is the same call at the same price, signed in with OAuth rather than a key, so Claude, ChatGPT, Codex and Cursor can run it in a conversation.
Where does the data come from?
+
Read from HM Land Registry price paid data. Coverage is England and Wales.
Does `property_history` change anything?
+
No. The tool is annotated read-only on the server, so it never writes to your data or ours and an assistant can call it without a confirmation step.
What do the drill-downs add?
+
Per-sale context the raw row lacks: what the property's attributes were around that sale where the platform can say, and how the price sat against the area at the time. max_drilldowns caps how many sales are expanded.
How do I adjust an old sale to today?
+
Multiply by the ratio of index levels from market_index_series for the property's district or authority: price today = price then × index now / index then. The valuation's back-series does the same thing with the price-per-square-metre index.
Why does the history differ from a portal's sold-price page?
+
Portals show the same registry data, sometimes with a lag and occasionally with a mismatched address. Where the two disagree, the registry row here is the record; the portal's listing history is in listing_history.
Try Property history on a real address.
30-minute call. We'll provision a key and walk through the endpoint on your use case.