# MarketCode: the operating system for UK real estate One UK property data core, exposed three ways: an MCP server (https://mcp.marketcode.ai/mcp) for AI assistants, a REST API (https://api.marketcode.ai/v1, OpenAPI at /v1/openapi.json) for code, and products for teams. Every MCP tool is a REST endpoint at the same price; one credit balance covers both. Most tools are free. Sign in to the MCP with OAuth (no API key); call REST with a Bearer API key from the API & MCP Hub. Short index: https://marketcode.ai/llms.txt · Pricing: https://marketcode.ai/pricing · Methodology: https://marketcode.ai/methodology · Sources: https://marketcode.ai/data/sources · Glossary: https://marketcode.ai/glossary · Book a demo: https://marketcode.ai/book-demo ## Products - Valuation (early access): A value range with the evidence behind it, for any UK address. https://marketcode.ai/product/valuation - Insights (early access): How any UK market is moving, month by month. https://marketcode.ai/product/insights - Sourcing (early access): Find the sites and units nobody has listed, and who owns them. https://marketcode.ai/product/sourcing - API & MCP Hub (live): Keys, credits, usage and connected apps for the API and the MCP server. https://marketcode.ai/product/hub ## Tools (63; 40 free) Each tool below is also a REST endpoint. Prices are credits per successful call; a failed call is not charged. ### Address & UPRN ### Autocomplete a UK address (address_autocomplete) Price: Free. REST: /v1/address/autocomplete. Page: https://marketcode.ai/data/mcp/address/address-autocomplete Arguments: q* (string), country (string), max_results (integer) Address autocomplete. Returns ranked candidates for a partial address or postcode. Use `address_resolve` to turn a candidate into a canonical UPRN. This is the free entry point: resolve, lookup and postcode listing are priced because they return OS AddressBase content, but narrowing a search is not. Prefer it for anything interactive, and resolve once at the end. UK only. Free. ### Resolve an address to a UPRN (address_resolve) Price: 8 credits (licence). REST: /v1/address/resolve. Page: https://marketcode.ai/data/mcp/address/address-resolve Arguments: query* (string), country (string), max_results (integer) Resolve free-text address to canonical record (UPRN for UK). Costs 8 credits. ### Look up an address by UPRN (address_by_uprn) Price: 8 credits (licence). REST: /v1/address/uprn/{uprn}. Page: https://marketcode.ai/data/mcp/address/address-by-uprn Arguments: uprn* (string) Look up an address by UPRN (UK only). Costs 8 credits. ### List the addresses at a postcode (address_by_postcode) Price: 10 credits (licence). REST: /v1/address/postcode/{postcode}. Page: https://marketcode.ai/data/mcp/address/address-by-postcode Arguments: postcode* (string) Return all addresses at a UK postcode. Costs 10 credits. ### Property record ### Council tax band (council_tax_band) Price: Free. REST: /v1/property/council-tax/{uprn}. Page: https://marketcode.ai/data/mcp/property/council-tax-band Arguments: uprn* (string) VOA council tax band for a property, from the official list. Every band is DECLARED — read from the VOA list, never inferred by a model. `band_source` states which, and a predicted band would arrive as a distinct value rather than folded in, because a caller cannot tell the two apart after the fact. DO NOT PRESENT A BAND AS A BILL. Three fields come back null on purpose and must not be filled in by estimating: * `annual_cost_gbp` — the per-band charge for each billing authority is a separate source we do not hold. * `effective_date` — the crawl records when the VOA refreshed the LIST, which is not when this property's band took effect. * `composite` — same reason; it lives on the per-property detail page. `status` is `not_found` when the band exists in the VOA list but address matching has not linked this UPRN to it. That is a matching gap on OUR side, not evidence the property has no band — report it that way round. England and Wales only: Scotland is the Scottish Assessors Association and Northern Ireland is Land & Property Services, neither of which is in this list. Free. ### Full property record (property_lookup) Price: 5 credits (licence). REST: /v1/property/{uprn}. Page: https://marketcode.ai/data/mcp/property/property-lookup Arguments: uprn* (string) Full property record for a UPRN, grouped into tiers: identity, property, energy, building, land, risk, designations, infrastructure, ownership, provenance. Up to ~300 fields — null fields are omitted, so a typical urban flat returns fewer than a rural site with designations on it. `provenance` carries the `_source` and `_confidence` siblings, so you can trust individual cells and not just rows. UK only. Costs 5 credits. ### Reconcile a property across sources (property_reconcile) Price: 3 credits (licence). REST: /v1/property/{uprn}/reconcile. Page: https://marketcode.ai/data/mcp/property/property-reconcile Arguments: uprn* (string) Cross-source feature reconciliation for a UPRN — surfaces divergence across EPC / Rightmove / council tax / OS NGD. UK only. Costs 3 credits. ### Property summary (property_summary) Price: 4 credits (licence). REST: /v1/property/{uprn}/summary. Page: https://marketcode.ai/data/mcp/property/property-summary Arguments: uprn* (string) One-call summary of a property: what it is, what building it belongs to, and the headline attributes. Start here when asked about a specific property — it usually answers the question on its own. UK only. Costs 4 credits. ### Sold-price history (property_history) Price: Free. REST: /v1/property/{uprn}/history. Page: https://marketcode.ai/data/mcp/property/property-history Arguments: uprn* (string), max_drilldowns (integer) Sold-price history for a property, with per-sale detail. Use `transactions_by_uprn` instead if you only need the raw HMLR rows. UK only. Free. ### Comparable properties (property_comps) Price: 6 credits (licence). REST: /v1/property/{uprn}/comps. Page: https://marketcode.ai/data/mcp/property/property-comps Arguments: uprn* (string), max_backfills (integer) Comparable properties in the same building or block, with missing attributes backfilled from sibling records so the comps are usable rather than sparse. UK only. Costs 6 credits. ### Flood risk for a property (property_flood_risk) Price: Free. REST: /v1/property/{uprn}/flood-risk. Page: https://marketcode.ai/data/mcp/property/property-flood-risk Arguments: uprn* (string) Environment Agency surface-water flood risk for a property. UK only. Free. ### Market data ### Asking-price index (portal listings) (asking_price_index_series) Price: Free. REST: /v1/market/asking-index. Page: https://marketcode.ai/data/mcp/market/asking-price-index-series Arguments: area_code (string), area_type (string), frequency (string), method (string), start (string), end (string), limit (integer) Hedonic ASKING-PRICE index for one postcode district, local authority or Great Britain, from portal listings (Rightmove ~95%), 2022M01 = 100, with 80% bands and posterior standard errors, smoothed toward the parent geography. Use this for "how have asking prices in W14 moved since 2022" or to see whether sellers are ahead of or behind the sold-price index (market_index_series). Asking LEADS sold by months and includes what never sells; `value` is an index level, never a price. For asking-price LEVELS use listing_market_series. `area_code` is a postcode district ("W14") with area_type="district", a local authority NAME ("Camden") with area_type="lad", or "NATIONAL". An unknown area is an error naming the nearest matches; read them back. READ provenance.pub_freq: the pipeline judged which grain this area's data can resolve (posterior SE of the monthly move <= 1 pp). If it says quarterly, prefer frequency="quarterly" and say the monthly series is noisy. `inc_se_pp` on each point is the SE of that period's move. Free. ### Asking-rent index (portal listings, ONS-validated) (asking_rent_index_series) Price: Free. REST: /v1/market/rent-index. Page: https://marketcode.ai/data/mcp/market/asking-rent-index-series Arguments: area_code (string), area_type (string), frequency (string), method (string), start (string), end (string), limit (integer) Hedonic ASKING-RENT index for one postcode district, local authority or Great Britain, from portal lettings, 2022M01 = 100, with bands and SEs. This is the residential rent index; commercial_rent_index_series is the VOA one for commercial property. It is validated every build against the ONS Price Index of Private Rents by local authority and NOT published in a month where the two disagree by more than a few points a year — so a missing recent month is a refusal, not an outage; say so. Asking rents, not achieved; `value` is an index level, never a rent. For rent LEVELS and yields use listing_market_series. Same area and frequency rules as asking_price_index_series. Free. ### Commercial capital index (commercial_index_series) Price: Free. REST: /v1/market/commercial-index. Page: https://marketcode.ai/data/mcp/market/commercial-index-series Arguments: sector (string), area (string), start (string), end (string), limit (integer) Repeat-sales CAPITAL index for UK commercial property, quarterly, 1995Q1 = 100. Three families exist and nothing else: national ALL; national x sector for the sectors that passed the level gate (OFFICE, RETAIL, HOTEL, HOLIDAY_LET); and local authority x ALL for the 19 authorities with enough pooled repeat sales. There is deliberately NO local x sector series — a local sector cell is too thin to carry an index — so for "office values in Manchester" call twice, sector="OFFICE" (national) and area="Manchester" (ALL), and present the two side by side; each is real. `area`: omit for national; a local authority NAME ("Manchester", "South Hams") for the city scope. `sector`: omit for ALL, or a sector name. `start` / `end`: "2015", "2015Q1", "2015-Q1" or "2015-06"; `end` is inclusive. `provenance.method` is repeat_sales for the raw estimator and repeat_sales_shrunk where thin quarters were blended toward the national increment; `n_pairs` per quarter is the straddle count, and a quarter with few pairs is carried by the blend. An empty `series` with `available_sectors` means the area exists but that sector is not published for it; an unknown area is an error naming the nearest matches. This is a capital-value index. For RENTS use commercial_rent_index_series; the two are not interchangeable (capital = rent / yield, and yields moved). UK only. Free. ### Commercial rent index (commercial_rent_index_series) Price: Free. REST: /v1/market/commercial-rent-index. Page: https://marketcode.ai/data/mcp/market/commercial-rent-index-series Arguments: sector (string), area (string), start (string), end (string) Commercial RENT index from the VOA rating lists — FOUR points, one per list (2010 / 2017 / 2023 / 2026), each dated at that list's antecedent valuation date (2008-04-01, 2015-04-01, 2021-04-01, 2024-04-01), with the 2010 list = 100. READ `basis` AND REPEAT IT when you quote a number: the index is derived from VOA rateable values — the Valuation Office Agency's assessment of open-market rent at each valuation date — NOT from advertised rents, and it is not a capital-value index. It moves in four steps; do not interpolate between them as if it were monthly, and date each point by `avd_date`, not `list_year`. Why it exists: it covers the sectors the repeat-sales capital index cannot (INDUSTRIAL_WAREHOUSE trades in portfolios, not Price Paid), for every VOA sector and 320 local authorities. `sector`: omit for ALL, or a VOA sector (OFFICE, RETAIL, INDUSTRIAL_WAREHOUSE, INDUSTRIAL_FACTORY, PUB_BAR, HOTEL, LEISURE, HEALTHCARE, EDUCATION, ...). `area`: omit for national; a local authority GSS code ("E08000003") or NAME ("Manchester", bridged to its code). `start` / `end`: rating-list years, e.g. "2017". `link_ratio` is the median rateable-value ratio between consecutive lists over the hereditaments present in both (`n_constant` of them). An empty `series` with `available_sectors` means the area is published but not that sector; an unknown area is an error. UK only. Free. ### House price index series (market_index_series) Price: Free. REST: /v1/market/index-series. Page: https://marketcode.ai/data/mcp/market/market-index-series Arguments: area_code* (string), area_type (string), frequency (string), start (string), end (string), limit (integer), include_forecast (boolean) The 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. Use this for "how has W14 moved since 2015", "what is the trend in Camden", or to carry a known price to today: price(t2) = price(t1) x value(t2) / value(t1). It is the same series that shapes valuation_full's back-series (`provenance.series_basis` matches its `series_basis`). For PRICES by cohort use market_facts; for sale COUNTS use market_volume_series. `value` is an index level, never a price. `area_code` is a postcode district ("W14"; a full postcode is truncated) with area_type="district", or a local authority NAME ("Camden", "Manchester" — not a GSS code) with area_type="lad". An unknown area is an error naming the nearest matches; read them back to the user. `start` / `end` are periods: "2015", "2015-06" or "2015-Q2"; `end` is inclusive. `limit` keeps the most recent N periods inside the bounds (the default returns the whole monthly series, 1995 to present). READ `provenance` BEFORE QUOTING A MOVE. `index_method` is repeat_sales_area where the area carries its own repeat-sales index, and repeat_sales_national where the area was too thin and the pipeline published the NATIONAL index against it — the turns are then national, not local, and you must say so. `last_settled_period` is the last month the registry has filled; points after it carry is_forecast=true with lo/hi bands. `tx_n` per point is the cube's UPRN-matched sample, not the registry's count. The index is published monthly. frequency="quarterly" returns an empty series with a note wherever no quarterly rows exist. UK only. Free. ### Index factor between two dates (time_adjustment) Price: Free. REST: /v1/market/time-adjustment. Page: https://marketcode.ai/data/mcp/market/time-adjustment Arguments: postcode* (string), from_date* (string), property_type (string), lookback_years (integer) The index factor that carries a price from a past date to today for a postcode district: the from- and to-period index levels, the multiplier and which index it came from. The same arithmetic the valuation applies to each comparable — use it to bring a sale price of your own up to date. `postcode` is a full UK postcode (only the district is used); `from_date` is YYYY-MM-DD; `lookback_years` 1–20. UK only. Free. ### Rank areas on a market metric (market_ranking) Price: Free. REST: /v1/market/ranking. Page: https://marketcode.ai/data/mcp/market/market-ranking Arguments: area_type (string), parent_area_code (string), area_codes (string[]), asset_class (string), bedroom_band (string), hmo (boolean), metrics (string[]), sort (string), order (string), limit (integer), window_months (integer), lag_months (integer), min_stock (integer) Rank areas AGAINST EACH OTHER on a market metric — one row per area, AGGREGATED over a trailing window of whole months. This is the comparison tool. `market_facts` answers for one geography; calling it in a loop to build a league table is slower, costs more and gives you rows from different periods. Use this for "which districts in Greater Manchester turn over fastest", "rank these twelve postcodes by price per sqm", "cheapest LADs in the North West by price_psm". ALWAYS report the `window` block from the response alongside the ranking. It names the months aggregated, and it matters: a 12-month turnover and a 3-month one differ by roughly 4x. `lag_months` (default 3) deliberately drops the most recent months because HM Land Registry registers sales long after completion — the newest month looks near-dead and would rank registration lag rather than liquidity. turnover_rate is exact — it is sales over stock, recomputed at this grain. Price, rent and yield are weighted means of the underlying medians, so describe them as indicative, not as medians. `min_stock` (default 50) skips areas with too few dwellings for a rate to mean anything: one sale in a 2-dwelling district is a turnover of 0.5, which otherwise tops the table. Where a returned area still has a small `stock_count`, say so rather than presenting its rate as comparable. Scope it EITHER by `parent_area_code` (every child of that area, e.g. every district in a county) OR by an explicit `area_codes` allowlist. `area_type` is the grain: "Postcode District" (default) or an administrative type such as "Local Authority District". `sort` defaults to turnover_rate, the liquidity measure — sales as a share of the stock that could have sold. Do NOT sort on gross_yield or days_on_market: they are 0% populated, so every row ties as NULL and the "ranking" is arbitrary order. Populated metrics are sales_price, price_psm and turnover_rate. Whatever you sort on is always returned, and anything empty is named in `metrics_with_no_data`. Distinct from `market_volume_ranking`, which ranks on raw transaction COUNT — that is market size, not liquidity. UK only. Free. ### Market facts for an area (market_facts) Price: Free. REST: /v1/market/facts. Page: https://marketcode.ai/data/mcp/market/market-facts Arguments: postcode (string), lsoa_code (string), ward_code (string), lad_code (string), h3_cell (string), asset_class (string), asset_subtype (string), bedroom_band (string), period (string), max_periods (integer), metrics (string[]) Price, price per sqm and turnover rate for ONE geography × asset class × bedroom band × period, from the pre-cubed area_facts table. Metrics: sales_price, price_psm, turnover_rate are populated today. rental_value, gross_yield and days_on_market are NOT — the pipeline has never backfilled them, so they come back null and are named in the response's `metrics_with_no_data`. Do not compare or rank on them, and do not report a null from them as "no activity"; it means "not collected". turnover_rate is sales as a share of the stock that could have sold. It is the liquidity measure — transaction COUNT is market size, not liquidity (W2 has the largest dwelling stock of any London district and near-bottom turnover). Geography is `postcode` (resolved to its district — the cube has no sector or unit grain) or `lad_code` (a local-authority NAME, e.g. "Lambeth", not a GSS code). There are no LSOA or ward areas in the warehouse; those selectors return 422. To compare AREAS against each other use `market_ranking`, not repeated calls here. For "how many sales" use `market_volume_series` — the `tx_n` here counts only UPRN-matched, non-anomalous sales and runs well short of the registry. The prices are sound; the count is a sample size. READ `tx_decision` BEFORE QUOTING A PRICE. Every row carries one, and it says how much evidence is behind that number. Measured over the whole cube: direct 2.7% 30+ sales in the cell. Quote it plainly. modeled 15.4% 5-29 sales. Sound, lightly smoothed. suppressed 44.0% 1-4 sales. Indicative — say the sample is thin. imputed 17.3% ZERO sales. The price is the prior BORROWED from a parent geography, not a measurement of this cohort. missing 20.7% zero sales and no price at all (null). An `imputed` row looks exactly like a real one — a confident, specific figure — and it repeats: in one district, 25 cohorts all read the same 353,909, because they are all the same borrowed number. Reporting it as "2-bed detached in AL10 sell for £353,909" states a fact the data does not contain. Say the cohort has no recorded sales instead, or aggregate up to a grain that does. `turnover_rate` is 0 on every one of these rows, which is a second tell. Where you want the AREA rather than a cohort, do not read a cohort row and call it the area: aggregate, or use `market_ranking`, which does it for you weighted by the sales behind each cohort. There is no rollup row in this cube — no `bedroom_band="all"` and no `hmo_flag="all"`; filtering on either matches nothing at all. `max_periods` (default 3) bounds how many recent MONTHLY periods come back when `period` is not given. The grain is one row per (asset_subtype × bedroom_band × hmo_flag × period) — about 13 cohorts per period — so a wide window gets large fast. The response reports `period_frequency`, `periods_returned` and `truncated` so you can tell a short answer from a cut-off one. UK only. Free. ### Monthly transaction volume (market_volume_series) Price: Free. REST: /v1/market/volume-series. Page: https://marketcode.ai/data/mcp/market/market-volume-series Arguments: district (string), area (string), county (string), metrics (string[]), start (string), end (string) Monthly transaction VOLUME for a postcode district, postcode area or county — every registered sale, 1995 to present, oldest month first. Use this, not `market_facts`, for "how many sales" questions. `market_facts` reads the area_facts cube, whose count is a UPRN-matched sample that runs 17-66% short of the registry; this reads HMLR price paid directly. Conversely use `market_facts` for price/rent/yield by asset class and bedroom band, which this does not break down. Provide exactly one of district ("SW11", or a full postcode, which is truncated), area ("SW") or county ("GREATER LONDON"). `district` is a POSTCODE district, not a borough — "NW1", not "Camden". `start` and `end` are months: "2024-06" or "2024-06-01", either accepted. Metrics default to txn_count + median_price. Prices are category A only — a median including repossessions is not a market median. ALWAYS check `provisional_from` in the response before reading a trend: HM Land Registry registers sales months after completion, so the trailing months are incomplete and will rise. UK only. Free. ### Rank districts by volume or price (market_volume_ranking) Price: Free. REST: /v1/market/volume-ranking. Page: https://marketcode.ai/data/mcp/market/market-volume-ranking Arguments: county (string), area (string), months (integer), order_by (string), limit (integer) Rank postcode districts by transaction volume or median price over a trailing window — "the busiest districts in Greater London last year", "the priciest districts in SW". Restrict the candidate set with county ("GREATER LONDON") or area ("SW"); omit both to rank nationally. UK only. Free. ### Transactions ### Registered sales for a property (transactions_by_uprn) Price: Free. REST: /v1/transactions/uprn/{uprn}. Page: https://marketcode.ai/data/mcp/transactions/transactions-by-uprn Arguments: uprn* (string) All HMLR Price Paid records joined to this UPRN, newest first. England & Wales only. Free. ### Valuation ### Comparables with their time adjustments (comps_adjustments) Price: 2 credits (marginal). REST: /v1/valuation/{uprn}/comps-adjustments. Page: https://marketcode.ai/data/mcp/valuation/comps-adjustments Arguments: uprn* (integer), lookback_months (integer), relisted_uprns (integer[]) The evidence behind a valuation, itemised: same-building comparable sales for the property, each with its registered price and date, the time adjustment by the district index to today, any relisting penalty (pass `relisted_uprns` for comps known to have been relisted and withdrawn — each takes a deterministic -10%), and the IQR fence that decided which comps count. Use it to show WHY a value is what it is; `valuation_full` gives the value itself. `lookback_months` 12–120. UK only. Costs 2 credits. ### The property's own sale, carried to today (subject_transaction_anchor) Price: Free. REST: /v1/valuation/{uprn}/transaction-anchor. Page: https://marketcode.ai/data/mcp/valuation/subject-transaction-anchor Arguments: uprn* (integer) The property's own last registered sale carried to today by the district index: the price paid, the date, the index factor applied and the anchored value. Where a property has sold, this is the strongest single piece of evidence a valuation has. Returns an empty anchor when no registered sale is linked to the UPRN. UK only. Free. ### Our valuation error, forward-validated monthly (valuation_accuracy) Price: Free. REST: /v1/valuation/accuracy. Page: https://marketcode.ai/data/mcp/valuation/valuation-accuracy Arguments: asset_class (string), model_version (string), since (string) How accurate our valuations have been, measured the only way that cannot leak: each month, every registered sale the model had ALREADY valued is compared with the price actually paid — MdAPE (median absolute percentage error), PPE20 (share within 20%) and n, per asset class and model version. Until the first vintage lands in October 2026 the answer is `status: no_rows_yet` with the metric definitions: an empty table, not a zero error. Filters: `asset_class` (Residential | Commercial | Mixed-Use), `model_version` (e.g. gbm-h3-v4), `since` (YYYY-MM). UK only. Free. ### Automated valuation estimate (valuation_estimate) Price: Free. REST: /v1/valuation/estimate. Page: https://marketcode.ai/data/mcp/valuation/valuation-estimate Arguments: uprn* (integer) Automated value estimate for a property: a point value plus a range. Returns 404 when we hold no valuation for the UPRN — most often because the unit has no floor area on record, which the model requires. UK only. Free. ### Full valuation with back-series (valuation_full) Price: Free. REST: /v1/valuation/full. Page: https://marketcode.ai/data/mcp/valuation/valuation-full Arguments: uprn* (integer) Full valuation block for a property: the value and its range, a monthly back-series (the value scaled by the local £/m² index, so it terminates at the headline figure by construction), a rental estimate where the district benchmark supports one, and a `trust_score` scoring the evidence behind the number — index sample size, floor-area provenance, model confidence. Use `valuation_estimate` if you only need the number; this is materially more expensive. UK only. Free. ### Planning ### Chosen planning designation checks (planning_check) Price: Free. REST: /v1/planning/check. Page: https://marketcode.ai/data/mcp/planning/planning-check Arguments: postcode (string), location (string), checks (string[]) The planning designation checks you choose, for one location, in one call. `checks` is any of: article_4, brownfield, ancient_woodland, heritage_at_risk, tpo, aqma, scheduled_monument, sssi, agricultural_land, flood_risk, green_belt, listed_buildings, aonb, national_park, conservation_area — omit it for all fifteen. Each check reports its own result, and one that could not be read says `status: unknown` rather than disappearing. Use `planning_designations` for the fixed bundle of thirteen; use this when you need SSSI or agricultural land grade, or only two or three checks. Give either `postcode` or `location` as "lat,lng". UK only. Free. ### Planning designations at a location (planning_designations) Price: Free. REST: /v1/planning/designations. Page: https://marketcode.ai/data/mcp/planning/planning-designations Arguments: postcode (string), location (string) Every planning designation affecting a location, in one call: conservation area, listed building, green belt, AONB, national park, flood zone, Article 4, brownfield, ancient woodland, heritage at risk, TPO, AQMA and scheduled monument. Give either `postcode` (full UK postcode) or `location` as "lat,lng". UK only. Free. ### Planning authority for a location (planning_applications) Price: Free. REST: /v1/planning/applications. Page: https://marketcode.ai/data/mcp/planning/planning-applications Arguments: postcode (string), location (string) The local planning authority for a location and its planning-portal URL. This returns WHERE to look, not the applications themselves — council portals are not machine-readable. Give either `postcode` or `location` as "lat,lng". UK only. Free. ### Geography ### Resolve an area name (area_resolve) Price: Free. REST: /v1/areas/resolve. Page: https://marketcode.ai/data/mcp/areas/area-resolve Arguments: area_name* (string), include_h3 (boolean), h3_resolution (integer) Resolve an area name or code ("Hackney", "E5") to its area_id, centroid and full hierarchy as breadcrumbs. Call this first when a question is about a named area rather than a specific address. UK only. Free. ### Area containing a coordinate (area_reverse_geocode) Price: Free. REST: /v1/areas/reverse-geocode. Page: https://marketcode.ai/data/mcp/areas/area-reverse-geocode Arguments: lat* (number), lng* (number), type_id* (string) The area of a given type containing a coordinate. `type_id` is an area type UUID and is required — a point sits inside one area per geography layer, so without it the answer would be ambiguous. UK only. Free. ### Ownership ### Proprietor profile (owner_profile) Price: 5 credits (licence). REST: /v1/ownership/proprietor. Page: https://marketcode.ai/data/mcp/ownership/owner-profile Arguments: company_number (string), name (string), limit (integer) What the Land Registry shows for one proprietor: titles held, company status, country of incorporation, directors and PSCs where known. Give a company number for an EXACT match. A name is a fuzzy substring search — company names repeat across unrelated entities, so a name-matched result is a candidate set, NOT a portfolio, and the response says which kind you got. Report it that way. `n_distinct_titles` is the holding count; `n_rows` is higher because one title appears on several ownership rows over time. UK only. Costs 5 credits. ### Registered proprietors of a title (ownership_by_title) Price: 3 credits (licence). REST: /v1/ownership/title/{title_number}. Page: https://marketcode.ai/data/mcp/ownership/ownership-by-title Arguments: title_number* (string) Registered proprietor(s) for an HMLR title number. England & Wales only. Costs 3 credits. ### Titles held by a company (ownership_by_company) Price: 3 credits (licence). REST: /v1/ownership/company/{company_number}. Page: https://marketcode.ai/data/mcp/ownership/ownership-by-company Arguments: company_number* (string), limit (integer) Titles held by a company, by Companies House number. Useful for mapping a landlord's or developer's portfolio. England & Wales only. Costs 3 credits. ### Direct query ### Governed semantic query (query_semantic) Price: 10 credits (shape). REST: /v1/query/semantic. Page: https://marketcode.ai/data/mcp/query/query-semantic Arguments: entity* (string), select (string[]), metrics (string[]), dimensions (string[]), filters (any[]), period (string), joins (string[]), order_by (any[]), limit (integer) Run a governed query against the semantic layer: choose an entity, then the metrics, dimensions and filters you want. Aliases are resolved to physical columns by the registry, so this cannot reach anything the semantic model does not expose. The result includes the generated SQL. Prefer this over `query_sql` — it is cheaper, bounded, and self-describing. UK only. Costs 10 credits. You are charged if the query reaches the warehouse and then times out or errors there; a rejected query is free. ### Read-only SQL on the warehouse (query_sql) Price: 25 credits (shape). REST: /v1/query/sql. Page: https://marketcode.ai/data/mcp/query/query-sql Arguments: sql* (string), params (object), max_rows (integer) Run a read-only SQL statement against the property warehouse. SELECT and WITH only; reachable schemas are marts_core, marts_facts, dimensions and location. Results are capped by `max_rows` (max 5000). Use :name bound parameters via `params` rather than interpolating values into the string. This is the last resort. If a curated tool or `query_semantic` can answer the question, it will be cheaper and faster. UK only. Costs 25 credits. You are charged if the query reaches the warehouse and then times out or errors there; a query rejected before it runs — bad SQL, an unreachable schema, a column that does not exist — is free, and the error says what to change. ### Market Intelligence ### Estate agent activity in an area (agent_activity) Price: Free. REST: /v1/market/agents/{area_id}. Page: https://marketcode.ai/data/mcp/market-intel/agent-activity Arguments: area_id* (string), months (integer), listing_type (string), limit (integer) Which estate agents actually transact in an area, ranked by listing count. Sale and rental are counted and averaged SEPARATELY — an asking price and a monthly rent do not combine into one median, so read `median_asking_price` and `median_monthly_rent` as answering different questions. `area_id` is the marts area id from `area_resolve`. UK only. Free. ### Equity gain estimate (equity_estimate) Price: Free. REST: /v1/equity/estimate. Page: https://marketcode.ai/data/mcp/market-intel/equity-estimate Arguments: uprns* (integer[]) Current estimated value against the last recorded sale: gain in pounds and percent, and how long it has been held. NOT a loan-to-value: the warehouse holds no mortgage balance, so never describe the result as equity net of debt. The gain is NOMINAL — a 1998 purchase showing +747% has not beaten inflation by that much, and saying so is part of reporting it honestly. A null gain means no recorded sale, not a zero gain. UK only. Free. ### Listing history for a property (listing_history) Price: 3 credits (licence). REST: /v1/listings/history/{uprn}. Page: https://marketcode.ai/data/mcp/market-intel/listing-history Arguments: uprn* (integer) Every 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. `price_trajectory` appears only when at least two snapshots carry a price. No listing at all is a real answer, not a failure — a property sold off-market or never advertised has none. UK only. Costs 3 credits. ### Supply-side listing statistics (listing_market_series) Price: Free. REST: /v1/market/listings. Page: https://marketcode.ai/data/mcp/market-intel/listing-market-series Arguments: area_code (string), area_type (string), channel (string), bedroom_band (string), start (string), end (string), limit (integer) Monthly supply-side statistics from portal listings for one area, channel and bedroom band: listings added and reduced, reduction share (the market-temperature signal), asking price or rent median and quartiles, £/m² where a floor area is stated, new-build share, agent concentration (HHI, top-3 share), and — on rent rows — gross yield on two bases (cell rent over cell price; per-listing rent over the unit's AVM value), and on sale rows the asking-to-sold ratio and days to completion on listings the registry matched to a sale. THREE THINGS TO SAY WHEN YOU QUOTE THIS. (1) listings_added_n is the NEVER-REDUCED cohort — listings later reduced carry no listing date — so it undercounts new listings by reduction_share. (2) sold_matched_n is a match-rate-limited subset; never divide it by listings_added_n and call it a sell-through rate. (3) There is no days-on-market-to-sale here: the portal records no exit dates. Use listing_stock_series for what is on the market NOW. Free. ### Live listings stock, daily (listing_stock_series) Price: Free. REST: /v1/market/listing-stock. Page: https://marketcode.ai/data/mcp/market-intel/listing-stock-series Arguments: area_code (string), area_type (string), channel (string), bedroom_band (string), start (string), end (string), limit (integer) Live listings on the market by day for one area, channel and bedroom band — the stock-on-market series, with the median age of the dated live stock, median asking price or rent, and the new-build count. The series began 2026-09-05 and grows by one point a day: the portal keeps no exit dates, so stock cannot be reconstructed for the past, only observed forwards. A short series is therefore expected, not missing data. `start` / `end` are dates (YYYY-MM-DD). Free. ### Long-held, high-equity properties (long_held_high_equity) Price: 8 credits (licence). REST: /v1/equity/long-held. Page: https://marketcode.ai/data/mcp/market-intel/long-held-high-equity Arguments: area_id* (string), min_years (integer), min_gain_pct (number), limit (integer) Long-held properties in an area carrying a large paper gain — the classic off-market cohort, ordered by gain rather than by value. Typical output for a London district: mid-1990s purchases at £23,000-37,000 now valued at £566,000-758,000. `area_id` is the marts area id from `area_resolve`. UK only. Costs 8 credits. ### Buildings & Land ### Built-stock profile of an area (area_stock_profile) Price: Free. REST: /v1/buildings/stock-profile/{area_id}. Page: https://marketcode.ai/data/mcp/buildings/area-stock-profile Arguments: area_id* (string) Composition of the built stock in an area: unit counts, HMO share, mixed-use share, median building height and footprint, solar penetration. Medians, not means — one tower would skew an average height enough to make a low-rise district read as mid-rise. Percentages are whole percentages. `area_id` is the marts area id from `area_resolve`. UK only. Free. ### Physical form of buildings (building_physical) Price: 3 credits (licence). REST: /v1/buildings/physical. Page: https://marketcode.ai/data/mcp/buildings/building-physical Arguments: uprns* (integer[]) Physical form of the buildings a set of UPRNs sit in: height, volume, footprint area, floor count, construction and roof material, basement, green roof, solar panels, and the residential/commercial unit mix. `year_built` and `num_floors` are thinly populated and come back null rather than estimated — treat null as unknown, not as absent. UK only. Costs 3 credits. ### Hex-binned density for maps (h3_density) Price: Free. REST: /v1/h3/density/{area_id}. Page: https://marketcode.ai/data/mcp/buildings/h3-density Arguments: area_id* (string), limit (integer) Hex-binned stock and transaction density for map layers, at H3 resolution 8. DENSITY ONLY. There is no usable price per cell — the hex cube's price column is populated on about 2% of rows and its rental, EPC and per-m2 columns are empty. The response lists what is and is not available; do not offer a price heatmap from this. `tx_n` is the transaction COUNT and `tx_value` is the total in pounds. UK only. Free. ### Mixed-use buildings in an area (mixed_use_buildings) Price: 6 credits (licence). REST: /v1/buildings/mixed-use. Page: https://marketcode.ai/data/mcp/buildings/mixed-use-buildings Arguments: area_id* (string), min_commercial (integer), min_residential (integer), limit (integer) Buildings holding BOTH residential and commercial units — the conversion and permitted-development cohort. Hard to source elsewhere: it is a property of the building's unit mix, not an attribute of any single property. UK only. Costs 6 credits. ### Plot utilisation of land parcels (plot_utilisation) Price: 6 credits (licence). REST: /v1/land/plot-utilisation. Page: https://marketcode.ai/data/mcp/buildings/plot-utilisation Arguments: area_id* (string), min_area_m2 (number), max_built_coverage (number), limit (integer) Land parcels by size and how much of them is built on. Set `max_built_coverage` to 0.2 to find largely undeveloped plots. Parcels with NO measured coverage are excluded when you set a ceiling, rather than counted as empty — unknown coverage is not evidence of a vacant plot. Coverage is measured on about 41% of parcels. UK only. Costs 6 credits. ### Auctions ### Auction comparables (auction_comps) Price: Free. REST: /v1/auctions/comps. Page: https://marketcode.ai/data/mcp/auctions/auction-comps Arguments: postcode_district (string), postcode_area (string), months (integer), is_commercial (boolean), min_beds (integer), max_beds (integer), limit (integer) Auction comparables on ACHIEVED prices, each against our valuation. A portal tells you a property went to auction. This says what it MADE, and what our AVM thought it was worth at the same address — the difference between a comparable and a listing. Use it to judge whether a guide price is realistic, or what a lot is likely to fetch. `achieved_to_avm` is the hammer price as a share of our AVM. Below 1.0 the lot sold under the estimate; the useful spread is wide, from about 0.45 to 0.95 within a single postcode area. Read it alongside `auction_date`: all AVMs share one snapshot date, so an older lot carries market movement as well as discount. Bedrooms and property type come from the UPRN-matched unit rather than the auction catalogue, which populates property_type on 12% of sold lots and tenure on none at all. Give `postcode_district` or `postcode_area` — auction lots carry a postcode, not an area_id, so there is no area_id path here. UK only. Free. ### Auction discount to valuation (auction_discount) Price: Free. REST: /v1/auctions/discount. Page: https://marketcode.ai/data/mcp/auctions/auction-discount Arguments: postcode_district (string), postcode_area (string), months (integer), is_commercial (boolean), min_lots (integer) How far below our valuation UK auction actually clears — the one auction number nobody else can produce. An achieved hammer price against an automated valuation of the SAME property. EIG covers 530+ auctioneers to our six and sells API data, but runs no AVM; we have less auction data and the valuation. The join is the product, not the feed. Nationally over the last 24 months the median lot cleared at about 0.66 of our estimate — a ~34% discount — and 87% of lots sold below it. The spread by district is large and real: PR2 clears near 47% below, N1 under 8%. READ `by_year` BEFORE QUOTING THE HEADLINE, and read `meta.sufficient`. Every AVM in the warehouse shares ONE snapshot date, so this ratio is an auction discount only where the sale and the valuation are close in time. The series sits near 0.65 from 2021 and falls to ~0.44 in 2016-2019 — that fall is house-price growth sitting between the hammer and the estimate, not a deeper discount. Widening `months` past about 60 measures the market, not the auction. `min_lots` suppresses the headline where too few lots match; a median over three sales is not a market rate, and `meta.sufficient` says which you got. Geography is by POSTCODE, not area_id — auction lots carry a postcode. UK only. Free. ### Auction lots (auction_lots) Price: Free. REST: /v1/auctions/lots. Page: https://marketcode.ai/data/mcp/auctions/auction-lots Arguments: postcode_district (string), postcode_area (string), auctioneer (string), date_from (string), date_to (string), is_commercial (boolean), sold_only (boolean), with_achieved_price (boolean), with_yield (boolean), limit (integer), offset (integer) Individual UK auction lots: the guide price a lot was marketed at, whether it sold, the HAMMER PRICE where the auctioneer published one, and the net yield where quoted. Five auction houses, Allsop back to 1999. Nothing else on the market sells achieved auction outcomes through an API — a listings portal tells you a property went to auction, not what it made. Use this for: what did comparable lots actually sell for, is a guide price realistic, what yields are commercial lots trading at, how does a district's auction market behave. For asking-price or private-treaty sales use market_volume_series or property_history instead — auction is a different market and the prices are not interchangeable. Coverage is a real constraint, not a caveat: about a quarter of lots carry an achieved price and a fifth a net yield, because most auctioneers publish a guide and never the result. Set `with_achieved_price` or `with_yield` to restrict to lots that can answer an outcomes question, and read `meta.coverage` on the way out so a thin result reads as thin. `auctioneer` is one of: allsop, savills, acuitus, barnettross, agentsproperty. Acuitus is the one that publishes net yield beside the achieved price, so filter to it when yield is the question. Dates are ISO (YYYY-MM-DD). UK only. Free. ### Auction statistics by district (auction_stats) Price: Free. REST: /v1/auctions/stats. Page: https://marketcode.ai/data/mcp/auctions/auction-stats Arguments: postcode_district (string), quarter_from (string), quarter_to (string), is_commercial (boolean), limit (integer) Quarterly UK auction statistics by postcode district: lots offered, lots sold, the sale rate, and average guide, achieved and net yield. Use this for the shape of a local auction market over time — is it clearing, are yields moving, is stock rising. For individual comparables use auction_lots. READ `n_guide` AND `n_achieved` BEFORE COMPARING THE AVERAGES. They are computed over DIFFERENT POPULATIONS: a guide price is published for most lots, a hammer price by a minority of auctioneers. Subtracting one average from the other does not give an uplift, a discount, or any meaningful number — the two sets are not the same lots. Each row carries a `comparable` flag that is false when the two populations are too unbalanced for the difference to mean anything. When it is false, report the two figures separately with their counts, and say why. `quarter_from`/`quarter_to` are the first day of a quarter (2024-01-01, 2024-04-01, ...). UK only. Free. ### Distressed assets: repeatedly unsold lots (distressed_assets) Price: Free. REST: /v1/auctions/distressed. Page: https://marketcode.ai/data/mcp/auctions/distressed-assets Arguments: postcode_district (string), postcode_area (string), min_auctions (integer), years (integer), max_guide_to_avm (number), is_commercial (boolean), limit (integer), offset (integer) Properties that keep going to auction and NEVER SELL — the distress screen. The clearest distress signal in the warehouse: a vendor who wants out and a market that has said no more than once, both on the public record. Ranked by how many separate auctions the lot has failed at, then by how long it has been on the circuit. READ `guide_to_avm` BEFORE CALLING ANY ROW AN OPPORTUNITY. It is the latest guide divided by our AVM, and it is the difference between the two reasons a lot fails: * above 1.0 — guided ABOVE our estimate. It keeps failing because it is priced wrong. That is a repricing conversation, not a discount. * 0.5-1.0 — guided below estimate and repeatedly unsold. The cohort worth a call. * below ~0.5 — check the lease before anything else. A flat guided at a fraction of a freehold estimate is usually short lease, ground rent or a garage, not a bargain. `max_guide_to_avm` filters on that ratio; 0.8 keeps only lots guided at least 20% below estimate. Lots with no guide or no AVM are EXCLUDED when it is set, because an unknown ratio is not a low one. Rows are grouped by ADDRESS, not UPRN. Flat-level UPRN matching in this table collapses separate flats onto one id — five flats in one Nottingham block share a single UPRN — so a per-UPRN count over-reports. `uprn` is returned for onward lookups but is not what rows are counted by, and for a subdivided building it may name a neighbouring unit. Geography is postcode district or area, not area_id — the auction table carries postcodes and the UPRN join is too weak to filter on. UK only. Free. ### Sourcing ### Construction cost index series (cost_index) Price: Free. REST: /v1/site/cost-index. Page: https://marketcode.ai/data/mcp/sourcing/cost-index Arguments: basis* (string), sector (string), freq (string), from_period (string), to_period (string) Construction cost index series for a development appraisal's cost side: `basis` is tender (tender price indices), output (output price indices), deflator (the construction deflator) or labour. Optional `sector` (residential, commercial, industrial, infrastructure, all, …), `freq` (monthly | quarterly | annual) and an inclusive period window in the series' own format (2014Q1, 2014M01, 2014). Each series carries its base period and method. UK-wide; regional factors come with the site appraisal. UK only. Free. ### Site appraisal dossier (site_appraisal) Price: 5 credits (licence). REST: /v1/site/appraisal. Page: https://marketcode.ai/data/mcp/sourcing/site-appraisal Arguments: uprn (integer), land_id (string), include_designations (boolean) Everything known about ONE site, assembled and judged — the site dossier. Give a `uprn` (from address_resolve or address_autocomplete) or a `land_id` (from sourcing_search). Returns in one call what would otherwise be six: * `site` — the land parcel: area, land use, built coverage, and the boundary as GeoJSON you can put straight on a map * `valuation` — our AVM against the last recorded sale, with gain and years held * `ownership` — the registered proprietor, type, company number * `energy` — the latest EPC * `auction_history` — every appearance, matched on address as well as UPRN, and whether it ever sold * `designations` — LIVE checks: conservation area, green belt, AONB, national park, flood risk, listed buildings * `signals` — the judgement READ `signals` FIRST. It is why this exists rather than being six calls. Each entry names what fired it and carries its evidence: repeat auction failure with the guide-to-estimate ratio, long_held with the nominal gain, mees_unlettable with the EPC band (F and G cannot legally be let), under_built with the plot coverage, corporate_owner with the company number. A site with nothing to say returns `signal: "none"` explicitly. ABSENCE IS A REAL ANSWER, NOT AN ERROR. No registered proprietor means the polygon-to-title backfill has not reached this parcel — it covers about 44% — not that the land is unregistered. No EPC, no auction history and no valuation are all normal, and each says so in its own block. A designation check that FAILS is reported as UNKNOWN, never as absent. Do not tell a user a site is unconstrained on the strength of a failed check. `include_designations=False` skips the live lookups and answers from the warehouse alone, which is faster. UK only. Costs 5 credits. ### Owners of sourced parcels (sourcing_owners) Price: 5 credits (licence). REST: /v1/sourcing/owners. Page: https://marketcode.ai/data/mcp/sourcing/sourcing-owners Arguments: parcel_ids* (string[]), asset (string) Resolve registered owners for parcels returned by `sourcing_search`. Uses the bulk HM Land Registry corporate and overseas ownership registers, so it names companies, public bodies and overseas entities. Individually owned titles are not in the bulk data and come back unresolved — that is a gap in the free register, not a failed lookup, and naming an individual requires a paid per-title purchase which this tool does not make. UK only. Costs 5 credits. ### Search land or units by criteria (sourcing_search) Price: 8 credits (licence). REST: /v1/sourcing/search. Page: https://marketcode.ai/data/mcp/sourcing/sourcing-search Arguments: asset (string), location (string), bbox (any), landuse (string[]), max_built_coverage (number), property_types (string[]), min_beds (integer), max_beds (integer), epc_in (string[]), tenure (string), owner_types (string[]), exclude_owner_types (string[]), require_owner (boolean), min_years_owned (integer), company_status (string[]), min_score (integer), min_rlv (integer), opportunities_only (boolean), include_undevelopable (boolean), limit (integer) Find land parcels or residential units matching investment criteria — the sourcing tool. Give a `location` (place or area name) or a `bbox`. Filter land by use class and `max_built_coverage` (built footprint as a share of plot, so 0.2 finds substantially empty plots), units by type, bedrooms, EPC band and tenure, and either by owner — `min_years_owned` is the usual off-market signal, and `owner_types` separates companies from public bodies. Returns parcels with ownership attached where the bulk register knows it. Use `sourcing_owners` to resolve a specific set afterwards. PARKS, HEATHS, RAILWAYS, CEMETERIES AND UTILITY LAND ARE EXCLUDED BY DEFAULT. The scan is ordered by parcel size, and the largest parcels in any area are its open spaces — unfiltered, a Camden search returned Regent's Park, Hampstead Heath, a cemetery and railway land as its top six, while 13,047 residential parcels in the same borough never appeared. Pass `include_undevelopable=True` to see them; they come back with no indicative land value, because a residual on a heath is a meaningless number that reads as an authoritative one. Some land constraints (green belt, brownfield register, conservation area, flood zone) are accepted but NOT YET ENFORCED — the backing columns are still being populated. When you pass one, the response names it under `filters_not_yet_enforced`; treat those results as unfiltered on that dimension and say so rather than implying the constraint was applied. UK only. Costs 8 credits. ### Energy ### Energy profile of an area (energy_profile) Price: Free. REST: /v1/energy/profile/{area_id}. Page: https://marketcode.ai/data/mcp/energy/energy-profile Arguments: area_id* (string) Energy composition of an area: EPC band mix, mains gas / electric / oil split, heat-pump penetration. `area_id` is the marts area id from `area_resolve` — pass `analytics_area_id`, not `area_id`, if the resolve response gives both. Percentages are of properties HOLDING an EPC, not of all stock, and are whole percentages (0-100). EPCs are lodged on sale or let, so long-held and social housing are under-represented — say so when reporting a figure. UK only. Free. ### EPC certificates for a property (epc_certificates) Price: Free. REST: /v1/energy/epc/{uprn}. Page: https://marketcode.ai/data/mcp/energy/epc-certificates Arguments: uprn* (integer) Every Energy Performance Certificate lodged against a property, newest first, with current and potential efficiency, CO2, heating fuel and system, floor area and construction age. Returns the HISTORY, not just the latest: a property re-assessed after work has two certificates, and the difference between them is the evidence the work happened. Each carries a `retrofit_gap`, or null where it cannot be computed. Null means unknown, NOT zero — a zero gap means the property is already at its potential, which is a different claim. No certificate is a real answer, not a failure: EPCs are lodged on sale or let, so a long-held property may never have had one. UK only. Free. ### Retrofit candidates in an area (retrofit_candidates) Price: 6 credits (licence). REST: /v1/energy/retrofit-candidates. Page: https://marketcode.ai/data/mcp/energy/retrofit-candidates Arguments: area_id* (string), bands (string[]), fuel (string), limit (integer) Properties in an area with the most improvement headroom, ranked by potential efficiency. Defaults to the sub-standard bands E, F and G. A targeting tool: it returns a list to act on, not a fact about one property. Combine with `fuel='gas'` for the fossil-heated cohort that carries the largest retrofit case. `area_id` is the marts area id from `area_resolve`. UK only. Costs 6 credits. ### Solar potential of roofs (solar_potential) Price: 4 credits (licence). REST: /v1/energy/solar-potential. Page: https://marketcode.ai/data/mcp/energy/solar-potential Arguments: uprns* (integer[]) Roof characteristics for solar screening: footprint area, roof shape and material, building height, and whether panels are already present. Returns NO generation estimate, deliberately. Pitch, orientation and shading are not in the warehouse, and a kWp figure derived from footprint alone would read as a yield forecast without being one. Report the usable roof area as a screening figure and say what it excludes. UK only. Costs 4 credits. ### Finance ### Local Housing Allowance rate (lha_rate) Price: Free. REST: /v1/housing/lha-rate. Page: https://marketcode.ai/data/mcp/finance/lha-rate Arguments: postcode* (string), bedrooms* (integer) Local Housing Allowance for a postcode and bedroom category — the ceiling on housing benefit, and therefore the effective rent floor for a benefit-funded tenancy. Nothing else in this API tells you what the state will pay for a property. THE RATE IS WEEKLY. `rate_unit` says `gbp_per_week` and the figure is exactly as the rate-setting bodies publish it. Comparing it against a monthly rent — from `market_facts` rental_value, or a listing's monthly_rent — understates it by about 4.33x. Convert with 52/12, NOT by multiplying by 4: a "monthly" figure built from four weeks is 7.7% low and the error is invisible once it is in a spreadsheet. Resolved through the Broad Rental Market Area containing the postcode, not the local authority — a BRMA is its own geography and they do not align. `brma` names which one answered, and `shared_accommodation_rate` is the separate, lower figure for under-35 single claimants. Needs a FULL postcode (a district is not enough to place a BRMA), and there is no category above 4 bedrooms. Three bodies set these rates: the VOA in England, Rent Service Scotland, and Rent Officers Wales. Free. ### Bank of England mortgage rates (mortgage_rates) Price: Free. REST: /v1/market/mortgage-rates. Page: https://marketcode.ai/data/mcp/finance/mortgage-rates Average UK mortgage rates from the Bank of England: 2-year fixed, 3-year fixed at 75% LTV, and the standard variable rate. This is the BoE's published market average — an input to an appraisal, not a quote. It carries no applicant, product or lender, so do not present it as a rate someone can get. Pair it with a yield figure or an appraisal (`site_appraisal`) rather than quoting it alone. No parameters: it is one national series. Free. ## Sources - HM Land Registry: Price Paid Data. Every registered residential sale in England and Wales since 1995: price, date, address, tenure, property type and whether it was a standard market sale. Licence: Open Government Licence v3.0 Coverage: England and Wales. Refresh: Monthly, when HM Land Registry publishes the change file; the trailing months are provisional because registration lags completion. Tools: transactions_by_uprn, property_history, market_volume_series, market_volume_ranking, market_index_series, market_facts, market_ranking, commercial_index_series, equity_estimate, long_held_high_equity, property_comps, valuation_estimate, valuation_full, site_appraisal, h3_density, auction_comps. https://marketcode.ai/data/sources/hm-land-registry-price-paid - HM Land Registry: Commercial and Corporate Ownership (CCOD) and Overseas Companies Ownership (OCOD). Every freehold and leasehold title in England and Wales registered to a company, public body or overseas entity: title number, proprietor, company number, address and price paid where recorded. Licence: HM Land Registry's dataset licence for CCOD and OCOD: free of charge, with conditions on onward use. Coverage: England and Wales. Refresh: Monthly, from the full and change files. Tools: ownership_by_title, ownership_by_company, owner_profile, sourcing_owners, sourcing_search, site_appraisal, property_lookup. https://marketcode.ai/data/sources/hm-land-registry-ownership - Ordnance Survey: AddressBase. The national address register: every addressable location in Great Britain with its Unique Property Reference Number (UPRN), postcode, coordinates and classification. Licence: Used under licence from Ordnance Survey. Responses that carry AddressBase records are priced as licensed data. Coverage: Great Britain. Refresh: Reloaded on each AddressBase release we take, roughly every six weeks. Tools: address_autocomplete, address_resolve, address_by_uprn, address_by_postcode, property_summary, property_lookup. https://marketcode.ai/data/sources/ordnance-survey-addressbase - Ordnance Survey: National Geographic Database (buildings, land and sites). Building footprints, heights and form; land parcels with their land use and built coverage; the residential and commercial unit mix of each building. Licence: Used under licence from Ordnance Survey. Responses that carry NGD-derived records are priced as licensed data. Coverage: Great Britain. Refresh: Periodic full reloads; each record carries its source and load in the provenance block of a full property record. Tools: building_physical, area_stock_profile, plot_utilisation, mixed_use_buildings, solar_potential, h3_density, site_appraisal, sourcing_search, property_reconcile, property_lookup. https://marketcode.ai/data/sources/ordnance-survey-ngd - Valuation Office Agency: Council tax valuation list. The council tax band of every domestic property in England and Wales, as declared on the VOA list. Licence: Crown copyright. Published by the VOA; reused here as the declared band per property. Coverage: England and Wales. Refresh: Refreshed by postcode on a rolling basis; the list itself changes as the VOA processes appeals and new builds. Tools: council_tax_band, property_reconcile, property_lookup, property_summary. https://marketcode.ai/data/sources/voa-council-tax - Valuation Office Agency: Non-domestic rating lists (2010, 2017, 2023, 2026). The rateable value of every non-domestic hereditament at each revaluation, with its sector and address. Licence: Crown copyright, published by the VOA. Coverage: England and Wales. Refresh: At each rating list and its subsequent amendments. Tools: commercial_rent_index_series. https://marketcode.ai/data/sources/voa-rating-lists - Ministry of Housing, Communities and Local Government: Energy Performance Certificates (domestic and non-domestic). Every EPC lodged in England and Wales: current and potential rating, floor area, construction age, heating fuel and system, CO2 and the recommendations. Licence: MHCLG's EPC open data terms. Crown copyright; the terms forbid using the data to market to an address. Coverage: England and Wales. Refresh: Monthly, from the full register extract. Tools: epc_certificates, energy_profile, retrofit_candidates, property_summary, property_lookup, property_reconcile, site_appraisal, sourcing_search, valuation_estimate, valuation_full. https://marketcode.ai/data/sources/epc-register - planning.data.gov.uk: National planning designations and the local planning authority register. Conservation areas, listed buildings, green belt, National Landscapes, national parks, flood zones, Article 4 directions, brownfield land, ancient woodland, tree preservation orders, air quality management areas, scheduled monuments and the boundaries and portals of every local planning authority. Licence: Open Government Licence v3.0 for the datasets we read; each dataset page states its own licence. Coverage: England. Refresh: Live: read from the service at the time of each call. Tools: planning_designations, planning_applications, site_appraisal, sourcing_search. https://marketcode.ai/data/sources/planning-data-gov-uk - Environment Agency: Risk of Flooding from Surface Water and Flood Zones. Surface-water flood risk bands and the fluvial and tidal flood zones for England. Licence: Open Government Licence v3.0 Coverage: England. Refresh: On each Environment Agency release. Tools: property_flood_risk, planning_designations, site_appraisal. https://marketcode.ai/data/sources/environment-agency-flood - Historic England: National Heritage List for England. Listed buildings by grade, scheduled monuments and the Heritage at Risk register. Licence: Open Government Licence v3.0, via planning.data.gov.uk. Coverage: England. Refresh: Live, with the planning designations check. Tools: planning_designations, site_appraisal. https://marketcode.ai/data/sources/historic-england - Natural England: National Landscapes, national parks and ancient woodland. The boundaries of Areas of Outstanding Natural Beauty (National Landscapes), national parks and the Ancient Woodland Inventory. Licence: Open Government Licence v3.0, via planning.data.gov.uk. Coverage: England. Refresh: Live, with the planning designations check. Tools: planning_designations, site_appraisal. https://marketcode.ai/data/sources/natural-england - Companies House: Company register, officers and persons with significant control. Company status, incorporation, registered office, directors and persons with significant control for every UK company. Licence: Free to use under Companies House terms; Crown copyright. Coverage: UK. Refresh: Read live for profiles; the bulk register is refreshed monthly. Tools: owner_profile, ownership_by_company, sourcing_search, sourcing_owners. https://marketcode.ai/data/sources/companies-house - Bank of England: Quoted household interest rates. The Bank’s monthly average quoted mortgage rates: 2-year and 3-year fixed at 75% LTV and the standard variable rate. Licence: Bank of England data terms; free to reuse with attribution. Coverage: UK. Refresh: Monthly. Tools: mortgage_rates. https://marketcode.ai/data/sources/bank-of-england - Office for National Statistics: Price Index of Private Rents and geography lookups. The official rent index by local authority, used to validate our asking-rent index, and the geography codes that join postcodes to authorities and regions. Licence: Open Government Licence v3.0 Coverage: UK. Refresh: Monthly, with the ONS release. Tools: asking_rent_index_series, area_resolve, market_ranking. https://marketcode.ai/data/sources/ons - Property portals: Sale and lettings listings. Asking prices and rents, reductions, days listed, agent, floor plans and status changes for properties marketed on the main UK portals, matched to a UPRN where the address allows. Licence: Collected from publicly marketed listings. We publish indices and aggregate statistics; per-property listing history is priced as licensed data. Coverage: Great Britain. Refresh: Daily for stock; the indices are rebuilt monthly. Tools: asking_price_index_series, asking_rent_index_series, listing_market_series, listing_stock_series, agent_activity, listing_history, property_reconcile. https://marketcode.ai/data/sources/portal-listings - UK auction houses: Auction catalogues and results (Allsop, Savills, Acuitus, Barnett Ross, Agents Property Auction). Every lot offered by five auction houses, Allsop back to 1999: guide price, whether it sold, the hammer price where published and the net yield where quoted, matched to an address and a UPRN. Licence: Published catalogues and results, collected and matched by MarketCode. Coverage: UK. Refresh: After each auction. Tools: auction_lots, auction_stats, auction_comps, auction_discount, distressed_assets, site_appraisal. https://marketcode.ai/data/sources/auction-houses - VOA, Rent Service Scotland and Rent Officers Wales: Local Housing Allowance rates by Broad Rental Market Area. The weekly LHA rate for each bedroom category in each Broad Rental Market Area, and the shared accommodation rate. Licence: Open Government Licence v3.0 Coverage: Great Britain. Refresh: Annually, each April. Tools: lha_rate. https://marketcode.ai/data/sources/local-housing-allowance ## Skills (marketcode-plugin) - Property research (marketcode-property-research, live): A sourced answer to any UK property question: the right tool for the job, the credit cost stated first, the wording rules that keep an estimate an estimate. https://marketcode.ai/skills/marketcode-property-research - Connect and sign in (marketcode-setup, live): A connected assistant: OAuth sign-in, the read-only scope, what to do when a call says "authentication required", how to disconnect. https://marketcode.ai/skills/marketcode-setup - Valuation report (marketcode-valuation, live): An indicative valuation for one address: the range, the comparables and adjustments, the index position, the EPC, flood and planning context, and the reasoning, with every figure cited to the tool it came from. https://marketcode.ai/skills/marketcode-valuation - Area insights (marketcode-area-insights, live): A market brief for any UK area: the published indices, volumes, listing stock, agent activity and auction outcomes, compared and ranked against neighbours. https://marketcode.ai/skills/marketcode-area-insights - Site and unit sourcing (marketcode-sourcing, live): A shortlist of land or units matching your criteria, scored, with the registered owner resolved for each and a recipient list ready for outreach. https://marketcode.ai/skills/marketcode-sourcing - Due diligence report (marketcode-due-diligence, live): A property due diligence report: title and ownership, history, EPC and council tax, flood and designations, nearby activity, cross-source disagreements and the cross-reference findings that join them, with a traffic light. https://marketcode.ai/skills/marketcode-due-diligence - Deal analysis (marketcode-deal-analysis, live): A first-pass appraisal of a site or asset: plot utilisation, planning position, market evidence, value and a residual against the cost assumptions you supply. https://marketcode.ai/skills/marketcode-deal-analysis - Planning check (marketcode-planning-check, live): Every designation and constraint at an address, recent applications nearby and the flood position, laid out the way a planner reads them. https://marketcode.ai/skills/marketcode-planning-check ## Glossary - UPRN: The Unique Property Reference Number: a 12-digit identifier every addressable location in Great Britain carries, and the key MarketCode joins property records on. https://marketcode.ai/glossary/uprn - Postcode district, area and sector: The parts of a UK postcode: the area ("SW"), the district ("SW11") and the sector ("SW11 1"); most MarketCode area statistics are published at district grain. https://marketcode.ai/glossary/postcode-district - Local authority district (LAD): The council area a property sits in: about 360 in Great Britain, the second geography MarketCode publishes indices and rankings for. https://marketcode.ai/glossary/local-authority-district - GSS code: The nine-character statistical code the ONS gives every UK administrative area; MarketCode accepts names in most places and bridges them to codes internally. https://marketcode.ai/glossary/gss-code - H3 cell: A hexagon in the H3 global grid; MarketCode uses resolution-8 cells (about 0.7 km² each) for map density layers and as the spatial unit inside the valuation model. https://marketcode.ai/glossary/h3-cell - 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. https://marketcode.ai/glossary/price-paid-data - Registration lag: The weeks to months between a sale completing and HM Land Registry registering it, which makes the most recent months of any sold-price series incomplete. https://marketcode.ai/glossary/registration-lag - Repeat-sales index: A price index built from pairs of sales of the same property, so it measures price change without being pulled by which properties happened to sell; the method behind MarketCode's sold-price and commercial capital indices. https://marketcode.ai/glossary/repeat-sales-index - Hedonic index: A price index that prices the attributes of each property (type, bedrooms, size, location) so that a change in what is on the market does not read as a change in prices; the method behind the asking indices. https://marketcode.ai/glossary/hedonic-index - Forecast tail: The points at the end of an index series that fall after the last settled month, projected rather than measured, flagged is_forecast with a lower and upper band. https://marketcode.ai/glossary/forecast-tail - Price per square metre (£/m²): Sale or asking price divided by internal floor area; the one number that makes properties of different sizes comparable, and what the valuation back-series is scaled by. https://marketcode.ai/glossary/price-per-square-metre - Market cube: MarketCode's pre-computed table of price, price per square metre and turnover for every area, asset class, bedroom band and month, with a graded decision on how much evidence sits behind each cell. https://marketcode.ai/glossary/market-cube - Turnover rate: Sales in a period as a share of the dwellings that could have sold; the liquidity measure, distinct from the raw count of sales, which measures market size. https://marketcode.ai/glossary/turnover-rate - Transaction volume: The count of registered sales in an area and period, read straight from HM Land Registry Price Paid rather than from a matched sample. https://marketcode.ai/glossary/transaction-volume - Automated valuation model (AVM): A statistical model that estimates a property's current value from comparable evidence without an inspection; MarketCode's is trained on registered sales joined to floor area and building form. https://marketcode.ai/glossary/automated-valuation-model - Valuation range: The interval around a valuation estimate that expresses the model's own uncertainty for that property; it widens where evidence is thin. https://marketcode.ai/glossary/valuation-range - Trust score: A score on a full valuation that grades the evidence behind the number: the index sample behind the area, where the floor area came from and the model's own confidence. https://marketcode.ai/glossary/trust-score - 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. https://marketcode.ai/glossary/comparable - Floor area: The internal area of a property in square metres, taken from its energy certificate or measured from building geometry; the input the valuation model cannot do without. https://marketcode.ai/glossary/floor-area - Equity gain (nominal): The difference between a property's current estimated value and its last recorded sale price, in pounds and percent, before inflation and without any mortgage. https://marketcode.ai/glossary/equity-gain - Title number: HM Land Registry's identifier for a registered title: a prefix for the office and a number, such as TGL123456; the key ownership records are held against. https://marketcode.ai/glossary/title-number - Registered proprietor: The person or entity HM Land Registry records as owning a title; for companies, public bodies and overseas entities MarketCode reads it from the bulk ownership registers. https://marketcode.ai/glossary/registered-proprietor - CCOD and OCOD: HM Land Registry's two bulk datasets of titles owned by UK companies and public bodies (CCOD) and by overseas companies (OCOD), the source of MarketCode's ownership answers. https://marketcode.ai/glossary/ccod-ocod - Person with significant control (PSC): The individual or entity Companies House records as owning or controlling more than 25% of a company; how a corporate proprietor is traced to a person. https://marketcode.ai/glossary/person-with-significant-control - 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. https://marketcode.ai/glossary/tenure - Conservation area: An area a local planning authority has designated for its special architectural or historic character, where demolition and many external changes need consent. https://marketcode.ai/glossary/conservation-area - Listed building: A building on the National Heritage List for England, protected by grade (I, II* or II); any work affecting its character needs listed building consent. https://marketcode.ai/glossary/listed-building - Article 4 direction: A direction by a local planning authority withdrawing specified permitted development rights in an area, so work that is normally automatic needs a planning application. https://marketcode.ai/glossary/article-4-direction - Permitted development: Changes an owner may make without a planning application, granted nationally by the General Permitted Development Order, subject to limits and to local withdrawal by Article 4. https://marketcode.ai/glossary/permitted-development - Green belt: Land around cities designated to prevent urban sprawl, where new building is inappropriate except in defined circumstances; one of the designations MarketCode checks live. https://marketcode.ai/glossary/green-belt - Brownfield land: Previously developed land; local authorities keep a register of brownfield sites suitable for housing, which MarketCode reads as a designation. https://marketcode.ai/glossary/brownfield-land - Flood zone and surface water risk: The Environment Agency's two flood layers: fluvial and tidal flood zones (1 low, 2 medium, 3 high) and the Risk of Flooding from Surface Water, both returned per property. https://marketcode.ai/glossary/flood-zone - Plot utilisation (built coverage): The share of a land parcel covered by building footprint; a low figure on a large parcel is the signature of an under-built site. https://marketcode.ai/glossary/plot-utilisation - Mixed-use building: A building that holds both residential and commercial units; a property of the building's unit mix rather than of any single unit, and the conversion cohort. https://marketcode.ai/glossary/mixed-use-building - House in multiple occupation (HMO): A property let to three or more tenants from more than one household who share facilities; licensed by the council above five occupants and often restricted by Article 4. https://marketcode.ai/glossary/hmo - EPC rating: The A to G energy efficiency band on an Energy Performance Certificate, lodged when a property is built, sold or let; MarketCode returns the full history of certificates, not just the latest. https://marketcode.ai/glossary/epc-rating - Retrofit gap: The difference between a property's current EPC score and the potential score its certificate says the recommended work would reach. https://marketcode.ai/glossary/retrofit-gap - Minimum energy efficiency standard (MEES): The rule that privately rented property in England and Wales must reach at least EPC band E, so F and G stock cannot legally be let without a registered exemption. https://marketcode.ai/glossary/mees - Council tax band: The A to H (A to I in Wales) valuation band the Valuation Office Agency assigns every domestic property, based on its value at 1 April 1991 (2003 in Wales); read from the list, never predicted. https://marketcode.ai/glossary/council-tax-band - Rateable value and hereditament: The VOA's assessment of a non-domestic property's open-market annual rent at a fixed valuation date; the unit assessed is a hereditament, and the assessments form the rating list. https://marketcode.ai/glossary/rateable-value - Asking price and asking-to-sold ratio: The price a property is marketed at, as against the price it sells for; asking leads sold by months and includes what never sells, and the ratio between them is a temperature gauge. https://marketcode.ai/glossary/asking-price - Days on market: How long a listing has been marketed; MarketCode reports the age of live stock and the days to completion on matched sales, and is explicit that a true days-to-sale is not observable from portals. https://marketcode.ai/glossary/days-on-market - Listing stock (stock on market): The number of properties live on the market in an area on a given day, by channel and bedroom band; a series MarketCode observes forward from September 2026 because it cannot be reconstructed. https://marketcode.ai/glossary/listing-stock - Gross yield: Annual rent as a percentage of price, before costs; net yield deducts costs. MarketCode computes gross yield from listing rents and prices and reports net yield only where an auctioneer quoted one. https://marketcode.ai/glossary/gross-yield - Local Housing Allowance (LHA): The maximum housing benefit for private tenants, set weekly per bedroom category for each Broad Rental Market Area; the effective rent floor for a benefit-funded tenancy. https://marketcode.ai/glossary/local-housing-allowance - Agent market share: Which estate and letting agents actually list in an area, ranked by listings, with concentration measured by the Herfindahl index and the top-three share. https://marketcode.ai/glossary/agent-market-share - Guide price and hammer price: The price a lot is marketed at before auction (the guide) and the price it sells for under the hammer (the achieved price); most auctioneers publish the first and few publish the second. https://marketcode.ai/glossary/guide-price - Auction discount: How far below an automated valuation of the same property an auction lot actually sells; a ratio MarketCode can compute because it holds both the hammer price and the valuation. https://marketcode.ai/glossary/auction-discount - Distressed asset: A property that has gone to auction more than once and never sold; on the public record, a vendor who wants out and a market that has said no. https://marketcode.ai/glossary/distressed-asset - Model Context Protocol (MCP): An open protocol that lets an AI assistant discover and call tools on a remote server; MarketCode exposes every data operation as an MCP tool that Claude, ChatGPT, Codex and Cursor can call. https://marketcode.ai/glossary/model-context-protocol - Credit (MarketCode): The unit MarketCode meters calls in: most tools are free, licensed and model-run tools cost a fixed number per successful call, and one balance covers MCP, REST and the products. https://marketcode.ai/glossary/marketcode-credit - Read-only tool: A tool annotated on the server as never changing anything, so an assistant can call it without a confirmation step; every MarketCode tool is read-only. https://marketcode.ai/glossary/read-only-tool ## Methodology, in brief Everything is keyed on the UPRN. The valuation is a MarketCode model (gradient-boosted over spatial cells, trained on registered sales joined to EPC floor areas and building form, re-based monthly to the local index) returning an estimate, a range, a back-series and a trust score; it is not a RICS Red Book valuation. The sold-price index is repeat-sales, monthly from 1995 by district and authority, with provenance and a flagged forecast tail. Asking-price and asking-rent indices are hedonic, 2022M01 = 100, with standard errors; the rent index is validated against the ONS. Commercial capital is repeat-sales quarterly; commercial rent is derived from VOA rating lists in four dated steps. The market cube grades every price by evidence (direct, modelled, suppressed, imputed, missing). Rankings aggregate over a trailing window with registration-lag months dropped. The auction discount is hammer price over the valuation of the same property. Full text: https://marketcode.ai/methodology