- Data
- REST API
- Property record
- Property reconcile
Property reconcile
GET /v1/property/{uprn}/reconcileCross-source feature reconciliation for a UPRN — surfaces divergence
Same call over MCP
Reconcile a property across sourcesproperty_reconcileAuthenticate with an API key from the API & MCP Hub. The same call is available as an MCP tool at the same price.
Inputs
Before you call it
- 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}/reconcile
curl "https://api.marketcode.ai/v1/property/200003443835/reconcile" \
-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 |
Response
What GET /v1/property/{uprn}/reconcile returns for a real request
curl "https://api.marketcode.ai/v1/property/200003443835/reconcile" \
-H "Authorization: Bearer $MARKETCODE_API_KEY"{
"uprn": "<string>",
"country": "<string>",
"data": {
"data": {
"uprn": 0,
"features": {
"bedrooms": {
"feature_label": "<string>",
"unit": "<string>",
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": null,
"primary_source": null,
"primary_reason": null,
"suspect_sources": "<string>"
},
"bathrooms": {
"feature_label": "<string>",
"unit": "<string>",
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": null,
"primary_source": null,
"primary_reason": null,
"suspect_sources": "<string>"
},
"floor_area_sqm": {
"feature_label": "<string>",
"unit": "<string>",
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": 0,
"primary_source": "<string>",
"primary_reason": "<string>",
"suspect_sources": "<string>"
},
"epc_current": {
"feature_label": "<string>",
"unit": null,
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": null,
"primary_source": null,
"primary_reason": null,
"suspect_sources": "<string>"
},
"council_tax_band": {
"feature_label": "<string>",
"unit": null,
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": null,
"primary_source": null,
"primary_reason": null,
"suspect_sources": "<string>"
},
"tenure_type": {
"feature_label": "<string>",
"unit": null,
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": null,
"primary_source": null,
"primary_reason": null,
"suspect_sources": "<string>"
},
"year_built": {
"feature_label": "<string>",
"unit": null,
"sources": "<string>",
"distinct_non_null_values": "<string>",
"divergence_ratio": null,
"needs_user_confirmation": false,
"primary_value": "<string>",
"primary_source": "<string>",
"primary_reason": "<string>",
"suspect_sources": "<string>"
}
},
"ambiguous_features": [],
"needs_user_confirmation": false,
"execution_time_ms": 0
}
},
"credits_charged": 0
}Shape only. This call returns licensed records, so the keys are real and every value is a placeholder of its type.
Response
Response fields
| Field | Type |
|---|---|
| uprn | string |
| country | string |
| data | object |
| data.data | object |
| data.data.uprn | integer |
| data.data.features | object |
| data.data.features.bedrooms | object |
| data.data.features.bedrooms.feature_label | string |
| data.data.features.bedrooms.unit | string |
| data.data.features.bedrooms.sources | string |
| data.data.features.bedrooms.distinct_non_null_values | string |
| data.data.features.bedrooms.divergence_ratio | null |
| data.data.features.bedrooms.needs_user_confirmation | boolean |
| data.data.features.bedrooms.primary_value | null |
| data.data.features.bedrooms.primary_source | null |
| data.data.features.bedrooms.primary_reason | null |
| data.data.features.bedrooms.suspect_sources | string |
| data.data.features.bathrooms | object |
| data.data.features.bathrooms.feature_label | string |
| data.data.features.bathrooms.unit | string |
| data.data.features.bathrooms.sources | string |
| data.data.features.bathrooms.distinct_non_null_values | string |
| data.data.features.bathrooms.divergence_ratio | null |
| data.data.features.bathrooms.needs_user_confirmation | boolean |
| data.data.features.bathrooms.primary_value | null |
| data.data.features.bathrooms.primary_source | null |
| data.data.features.bathrooms.primary_reason | null |
| data.data.features.bathrooms.suspect_sources | string |
| data.data.features.floor_area_sqm | object |
| data.data.features.floor_area_sqm.feature_label | string |
| data.data.features.floor_area_sqm.unit | string |
| data.data.features.floor_area_sqm.sources | string |
| data.data.features.floor_area_sqm.distinct_non_null_values | string |
| data.data.features.floor_area_sqm.divergence_ratio | null |
| data.data.features.floor_area_sqm.needs_user_confirmation | boolean |
| data.data.features.floor_area_sqm.primary_value | integer |
| data.data.features.floor_area_sqm.primary_source | string |
| data.data.features.floor_area_sqm.primary_reason | string |
| data.data.features.floor_area_sqm.suspect_sources | string |
| data.data.features.epc_current | object |
| data.data.features.epc_current.feature_label | string |
| data.data.features.epc_current.unit | null |
| data.data.features.epc_current.sources | string |
| data.data.features.epc_current.distinct_non_null_values | string |
| data.data.features.epc_current.divergence_ratio | null |
| data.data.features.epc_current.needs_user_confirmation | boolean |
| data.data.features.epc_current.primary_value | null |
| data.data.features.epc_current.primary_source | null |
| data.data.features.epc_current.primary_reason | null |
| data.data.features.epc_current.suspect_sources | string |
| data.data.features.council_tax_band | object |
| data.data.features.council_tax_band.feature_label | string |
| data.data.features.council_tax_band.unit | null |
| data.data.features.council_tax_band.sources | string |
| data.data.features.council_tax_band.distinct_non_null_values | string |
| data.data.features.council_tax_band.divergence_ratio | null |
| data.data.features.council_tax_band.needs_user_confirmation | boolean |
| data.data.features.council_tax_band.primary_value | null |
| data.data.features.council_tax_band.primary_source | null |
| data.data.features.council_tax_band.primary_reason | null |
| data.data.features.council_tax_band.suspect_sources | string |
| data.data.features.tenure_type | object |
| data.data.features.year_built | object |
| data.data.ambiguous_features | array |
| data.data.needs_user_confirmation | boolean |
| data.data.execution_time_ms | number |
| credits_charged | integer |
Fields observed in the example response above; a field the example did not exercise is not listed.
Price and licence
What it costs, and where the data comes from
Property reconcile costs 3 credits per successful call over MCP and over REST, and the two surfaces share one credit balance.
The price covers licensed records in the response, from Ordnance Survey, Valuation Office Agency, Ministry of Housing, Communities and Local Government and Property portals. A call that fails is not charged.
Credits are granted on sign-up and bought in packs; the pricing page lists every call.
Computed by MarketCode from
- Ordnance Survey
National Geographic Database (buildings, land and sites)
Used under licence from Ordnance Survey · Great Britain
- Valuation Office Agency
Council tax valuation list
Crown copyright · England and Wales
- Ministry of Housing, Communities and Local Government
Energy Performance Certificates (domestic and non-domestic)
MHCLG's EPC open data terms · England and Wales
- Property portals
Sale and lettings listings
Collected from publicly marketed listings · Great Britain
How the model or index is built, and where it is weak, is on the methodology page.
Related
Endpoints used with Property reconcile
- 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 - Energy rating, MEES and the retrofit gap1 credit
property_energy_retrofitThe energy picture for one property: current rating against the certificate's own potential, the points and letter bands available, the fabric and heating the assessor recorded, and MEES.Same category - Registered lease: term, unexpired years, flags1 credit
property_leaseHow long is left on the lease, and does it bite: the governing registered lease at this property with its receipt — term, unexpired years computed today, `is_short_lease` (under 80 years, where extension costs marriage value and lenders start refusing) and the under-60 flag, alienation clause, lease price paid, the enfranchisement note and the valuation note (the estimate does not adjust for a short term). `status: no_lease` with the reason when the register holds none; a freehold house is one such reason. UK only.Same category - Registered leases for up to 100 properties1 credit
property_lease_batch`property_lease` for up to 100 properties in one call, per-item outcomes (ok | no_lease | not_found | error) in input order. Charged per property answered — the sum of the single calls, never more. UK only.Same category - Rent estimate with its basis and yield1 credit
property_rental_estimateWhat this property would let for, and on what basis. Always quote the basis: `unit_asking` is the property's OWN live rental listing (an asking rent, not an achieved one); `area_asking` is the median asking rent for its bedroom band in its postcode district — a locality statistic applied to one property, so quote the p25–p75 range with it rather than the median alone. `unit_hedonic`, a per-unit model, does not exist (gap G1).Same category
FAQ
Questions about Property reconcile
How much does `property_reconcile` cost?
+
Property reconcile costs 3 credits per successful call over MCP and over REST, and the two surfaces share one credit balance. The price covers licensed records in the response, from Ordnance Survey, Valuation Office Agency, Ministry of Housing, Communities and Local Government and Property portals. A call that fails is not charged.
Do I need to resolve the address first?
+
Yes. property_reconcile 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_reconcile 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?
+
Computed by MarketCode from Ordnance Survey NGD, Valuation Office Agency council tax list, Ministry of Housing, Communities and Local Government EPC register and Property portals listings. Coverage is the UK. The methodology page describes how the model or index is built.
Can I store or republish the results?
+
The response includes records we license from Ordnance Survey, Valuation Office Agency, Ministry of Housing, Communities and Local Government and Property portals. Use them in your own analysis, reports and products; bulk redistribution of the raw records or building a competing dataset from them is not covered. Ask us if you need a redistribution licence.
Does `property_reconcile` 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.
Try Property reconcile on a real address.
30-minute call. We'll provision a key and walk through the endpoint on your use case.