- Data
- REST API
- Market data
- Market index series
Market index series
GET /v1/market/index-seriesThe published repeat-sales house price index for any postcode district or local authority, monthly from 1995, with the forecast tail flagged and provenance saying whether the series is local or national. Free.
Same call over MCP
House price index seriesmarket_index_seriesAuthenticate with an API key from the API & MCP Hub. The same call is available as an MCP tool at the same price.
Reference
What GET /v1/market/index-series returns
The trend, as an index. A repeat-sales index is built from pairs of sales of the same property, so it measures price change without being pulled around by which properties happened to sell that month; it is the method behind the main official indices and behind this one. It is published monthly from 1995 for every district and authority with enough pairs, base period = 100.
Use it to carry a known price to today: price(t2) = price(t1) × value(t2) / value(t1). It is the same series that shapes the back-series in valuation_full, so a value carried with it and a value read from the model agree by construction.
The full description, as the assistant reads it
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.
Reference
When to use it, and when not to
Use it for "how has W14 moved since 2015", "what is the trend in Camden", and for adjusting an old comparable to today. For prices by cohort use market_facts; for the count of sales use market_volume_series; for the asking side, which leads this by months, use asking_price_index_series. The value is an index level, never a price.
Inputs
Before you call it
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 returns an error naming the nearest matches; read them back rather than guessing. start and end are periods ("2015", "2015-06", "2015-Q2"), end inclusive; limit keeps the most recent N periods. Over REST the same bounds are spelled from and to.
- area_code
- The area code is a postcode district ("W14") with
area_typeset to district, or a local authority name ("Camden", not a GSS code) witharea_typeset to lad. No lookup is needed. An unknown area returns an error naming the nearest matches; read them back rather than guessing.
Request
Calling GET /v1/market/index-series
curl "https://api.marketcode.ai/v1/market/index-series?area_code=SE22&area_type=district&limit=6" \
-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 |
|---|---|---|---|---|
| area_code | Query | string | Yes | Postcode district ("W14") or local authority NAME ("Camden") |
| area_type | Query | string | No | district | ladDefault: district |
| frequency | Query | string | No | monthly | quarterlyDefault: monthly |
| from | Query | string | No | YYYY, YYYY-MM or YYYY-Qn |
| to | Query | string | No | YYYY, YYYY-MM or YYYY-Qn (inclusive) |
| limit | Query | integer | No | Default: 400 |
| include_forecast | Query | boolean | No | Default: true |
Response
What GET /v1/market/index-series returns for a real request
curl "https://api.marketcode.ai/v1/market/index-series?area_code=SE22&area_type=district&limit=6" \
-H "Authorization: Bearer $MARKETCODE_API_KEY"{
"country": "UK",
"query": {
"area_code": "SE22",
"area_type": "district",
"frequency": "monthly",
"limit": 6,
"include_forecast": true
},
"data": {
"area": {
"level": "district",
"area_type": "Postcode District",
"area_code": "SE22",
"area_name": "se22",
"area_id": "1520d540-4a9e-4fa2-abda-607791b5b7c3"
},
"frequency": "monthly",
"series": [
{
"period": "2026-07",
"value": 1148.88,
"lo": 1104.368485,
"hi": 1210.511228,
"is_forecast": true,
"yoy_pct": -1.26,
"tx_n": 11
},
{
"period": "2026-08",
"value": 1148.88,
"lo": 1103.073967,
"hi": 1212.289274,
"is_forecast": true,
"yoy_pct": -1.74,
"tx_n": null
},
{
"period": "2026-09",
"value": 1033.72,
"lo": 921.47131,
"hi": 1135.963963,
"is_forecast": true,
"yoy_pct": -10.43,
"tx_n": null
},
"… 3 more"
],
"provenance": {
"source_table": "marts_facts.area_facts",
"cohort": {
"asset_class": "Residential",
"asset_subtype": "ALL",
"bedroom_band": "all",
"hmo_flag": "all"
},
"index_method": "repeat_sales_area",
"index_decision": "repeat_sales;grain=district;settled_end=unknown",
"series_basis": "repeat_sales_area:district:SE22",
"base_period": "1995-01",
"base_value": 100,
"n_periods": 6,
"n_settled": 0,
"n_forecast": 6,
"first_period": "2026-07",
"last_settled_period": null,
"last_period": "2026-12",
"tx_n_meaning": "UPRN-matched, non-anomalous sales the cube attributes to the period — a sample size, not the registry's count. For volume use /market/volume-series.",
"built_at": "2026-09-06T09:18:11.698874",
"build_version": "v1.index.2026-08-30"
},
"notes": [
"6 trailing point(s) are forecast rows (is_forecast=true, with lo/hi bands); the last settled period is unknown."
],
"source": "robosapien",
"cached": true,
"time_ms": 0.4
},
"credits_charged": 0
}A real response, captured from production and trimmed: arrays to three items, long strings shortened, volatile keys dropped.
Response
Response fields
| Field | Type | Example |
|---|---|---|
| country | string | UK |
| query | object | |
| query.area_code | string | SE22 |
| query.area_type | string | district |
| query.frequency | string | monthly |
| query.limit | integer | 6 |
| query.include_forecast | boolean | true |
| data | object | |
| data.area | object | |
| data.area.level | string | district |
| data.area.area_type | string | Postcode District |
| data.area.area_code | string | SE22 |
| data.area.area_name | string | se22 |
| data.area.area_id | string | 1520d540-4a9e-4fa2-abda-607791b5b7c3 |
| data.frequency | string | monthly |
| data.series | array | |
| data.series[].period | string | 2026-07 |
| data.series[].value | number | 1148.88 |
| data.series[].lo | number | 1104.368485 |
| data.series[].hi | number | 1210.511228 |
| data.series[].is_forecast | boolean | true |
| data.series[].yoy_pct | number | -1.26 |
| data.series[].tx_n | integer | 11 |
| data.provenance | object | |
| data.provenance.source_table | string | marts_facts.area_facts |
| data.provenance.cohort | object | |
| data.provenance.cohort.asset_class | string | Residential |
| data.provenance.cohort.asset_subtype | string | ALL |
| data.provenance.cohort.bedroom_band | string | all |
| data.provenance.cohort.hmo_flag | string | all |
| data.provenance.index_method | string | repeat_sales_area |
| data.provenance.index_decision | string | repeat_sales;grain=district;settled_end=unknown |
| data.provenance.series_basis | string | repeat_sales_area:district:SE22 |
| data.provenance.base_period | string | 1995-01 |
| data.provenance.base_value | integer | 100 |
| data.provenance.n_periods | integer | 6 |
| data.provenance.n_settled | integer | 0 |
| data.provenance.n_forecast | integer | 6 |
| data.provenance.first_period | string | 2026-07 |
| data.provenance.last_settled_period | null | |
| data.provenance.last_period | string | 2026-12 |
| data.provenance.tx_n_meaning | string | UPRN-matched, non-anomalous sales the cube attri |
| data.provenance.built_at | string | 2026-09-06T09:18:11.698874 |
| data.provenance.build_version | string | v1.index.2026-08-30 |
| data.notes | array | |
| data.source | string | robosapien |
| data.cached | boolean | true |
| data.time_ms | number | 0.4 |
| credits_charged | integer | 0 |
Fields observed in the example response above; a field the example did not exercise is not listed.
Reference
Things that catch people out
- Read
provenance.index_methodbefore quoting a move.repeat_sales_areameans the area carries its own index.repeat_sales_nationalmeans the area was too thin and the national index was published against it: the turns are national, not local, and you must say so. - The right-hand edge is a forecast.
last_settled_periodis the last month the registry has filled; points after it carryis_forecast: truewithloandhibands. Quote the band with the point. tx_nis a sample, not the registry count. It is the cube's UPRN-matched sample per point. For counts usemarket_volume_series.- Quarterly is not resampled. The index is published monthly; asking for quarterly returns an empty series with a note where no quarterly rows exist.
Price and licence
What it costs, and where the data comes from
Market index series is free over MCP and over REST, and the two surfaces share one credit balance. Free calls need a signed-in account or an API key and appear in your usage, but they never touch your balance.
Credits are granted on sign-up and bought in packs; the pricing page lists every call.
Computed by MarketCode from
- HM Land Registry
Price Paid Data
Open Government Licence v3 · England and Wales
How the model or index is built, and where it is weak, is on the methodology page.
Related
Endpoints used with Market index series
- Asking-price index (portal listings)Free
asking_price_index_seriesHedonic 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.Pairs with this - Market facts for an areaFree
market_factsPrice, rent, yield and days-on-market by geography × asset class ×Pairs with this - Monthly transaction volumeFree
market_volume_seriesMonthly transaction VOLUME for a postcode district, postcode area orPairs with this - Full valuation with back-seriesFree
valuation_fullFull valuation block for a property: the value and its range, a monthlyPairs with this - Resolve an address to a UPRN8 credits
address_resolveResolve free-text address to canonical record (UPRN for UK).Same product - Property summary4 credits
property_summaryOne-call summary of a property: what it is, what building it belongs to,Same product
Glossary
Terms used here
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
FAQ
Questions about Market index series
How much does `market_index_series` cost?
+
Market index series is free over MCP and over REST, and the two surfaces share one credit balance. Free calls need a signed-in account or an API key and appear in your usage, but they never touch your balance.
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 market_index_series 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 HM Land Registry price paid data. Coverage is England and Wales. The methodology page describes how the model or index is built.
Does `market_index_series` 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.
Why does a small area show the national index?
+
Because a repeat-sales index needs enough pairs of sales to be stable, and a thin district does not have them. Rather than publish noise or nothing, the national series is published against the area with the method field saying so. Pages that show it say the turns are national.
Why is the latest month a forecast?
+
HM Land Registry registers sales weeks to months after completion, so the most recent months are incomplete. The settled series stops at the last filled month and the tail is projected with a band; as registrations arrive, the tail settles.
Can I use this to revalue a portfolio?
+
Yes, as the time adjustment: carry each property's last sale to today by the ratio of index levels. For a value that also reflects the property's own attributes and the local comparables, use valuation_full, which uses this same index for its back-series.
Try Market index series on a real address.
30-minute call. We'll provision a key and walk through the endpoint on your use case.