Open government housing data, cut into small files so a web page can fetch the one piece it needs instead of a whole database.
Served from https://data.savvyrenter.co.uk/ and used by savvyrenter.co.uk. There is no server and no API: every file is static JSON, fetched straight from the browser.
Anyone else is welcome to use it. See licence below.
| Path | What it holds | Size |
|---|---|---|
/v1/outcodes/<OUTCODE>.json |
Every live UK postcode in that outcode, with its local authority, police force and coordinates | ~18 KB each, 2,976 files |
/v1/outcodes-index.json |
A list of every outcode that exists, and which NSPL release it came from | ~20 KB |
/v1/brma/<OUTCODE>.json |
Which Broad Rental Market Area (the area Local Housing Allowance is set for) each postcode in that outcode is in | mostly under 1 KB, 2,943 files |
/v1/brma-index.json |
Every BRMA name, the build date and the boundary sources | ~5 KB |
/v1/lha-rates.json |
Local Housing Allowance rates for all 192 Broad Rental Market Areas, April 2022 onwards | ~52 KB |
/v1/rents/<AREA CODE>.json |
Average private rent by month for one local authority, January 2015 onwards | ~8 KB each, 350 files |
/v1/rents-index.json |
Area code to area name | ~9 KB |
/v1/councils.json |
Band D council tax for every council in England, Scotland and Wales, the band ratios and the main discounts | ~42 KB |
Take the postcode and split it at the space: PL4 6JJ → outcode PL4, unit 6JJ.
Then fetch only what the page needs:
| To find | Fetch | Read |
|---|---|---|
| The council and coordinates | /v1/outcodes/PL4.json |
the entry for 6JJ |
| The rent history | /v1/rents/<local authority code>.json |
months |
| The housing allowance area | /v1/brma/PL4.json |
b, or the entry for 6JJ |
| The housing allowance rates | /v1/lha-rates.json |
the BRMA’s rates |
| The council tax | /v1/councils.json |
la[<local authority code>] |
The local authority code from the outcode file is the key for both the rents
and the council tax. The index files and lha-rates.json change at most a few
times a year, so they cache well.
{
"lad": ["E06000026"],
"pfa": ["E23000035"],
"p": {
"6JJ": [0, 0, 50.3841, -4.1401]
}
}
lad and pfa are lookup tables for that file: local authority codes and police
force codes, listed once and referred to by position. Each postcode entry is
[index into lad, index into pfa, latitude, longitude]. Coordinates are to four
decimal places, about 11 metres — the accuracy of a postcode centroid, not of a
building.
Only live postcodes are included. Terminated ones are dropped.
Most outcodes sit wholly inside one Broad Rental Market Area, and their file is one line:
{ "b": "Plymouth" }
Where an outcode straddles a boundary, the file lists the areas once and gives each postcode a position in that list:
{
"n": ["Highland and Islands", "Aberdeen and Shire"],
"p": { "4AA": 0, "4AB": 0, "5XY": 1 }
}
The names are the ones lha-rates.json uses as display names, so a BRMA from
here can be looked up there directly (normalise it the same way: uppercase,
“&” spelled out as “AND”).
{
"years": ["2022", "2023", "2024", "2025", "2026"],
"brma": {
"PLYMOUTH": {
"name": "Plymouth",
"nation": "E",
"rates": { "2026": [325.0, 450.0, 575.0, 695.0, 895.0] }
}
}
}
Each year is [shared accommodation, 1 bed, 2 bed, 3 bed, 4 bed], monthly, in
pounds. The year is the April the rate takes effect. Keys are normalised names
(uppercase, “and” spelled out); name is the published spelling.
{
"code": "E06000026",
"name": "Plymouth",
"months": [["2015-01", 595, 450, 575, 675, 895]]
}
Each month is [month, all properties, 1 bed, 2 bed, 3 bed, 4+ bed], in pounds
per month. A null means ONS did not publish a figure for that series.
{
"years": ["2026-27", "2025-26"],
"ratios": {
"E": { "den": 9, "bands": { "A": 6, "B": 7, "C": 8, "D": 9, "E": 11, "F": 13, "G": 15, "H": 18 } }
},
"discounts": [
{ "key": "single", "off": 0.25, "label": "One adult" }
],
"la": {
"E06000026": { "name": "Plymouth", "nation": "E", "region": "South West",
"bandD": { "2026-27": 2400.00 } }
}
}
Only Band D is held, because every other band is a fixed fraction of it in
law: band charge = Band D × bands[band] ÷ den, using the ratios for the
council’s nation (E, W or S; Wales has a band I). Figures are annual and
include the police, fire and adult social care precepts, but not parish or
town council precepts, so a bill in a parished area will be somewhat higher.
discounts lists the common reductions as a fraction off the bill.
Nothing here is hand-edited. Every file is written by a build script from the published source files, so if a figure is wrong, it is wrong in the source or in the script, and re-running the build fixes it.
The scripts live in Savvy Renter’s shared modules, not in this repository:
| Files | Built by | Rebuild when |
|---|---|---|
outcodes/, outcodes-index.json |
data-builders/build-postcodes.php |
ONS publish a new NSPL (a few times a year) |
brma/, brma-index.json |
brma-lookup/build-brma.php |
after every postcode rebuild, or if a boundary changes |
rents/, rents-index.json |
data-builders/build-rents.php |
ONS publish the rent index (monthly; each release holds the whole history) |
councils.json |
data-builders/build-councils.php |
each April, when the new year’s council tax is set |
lha-rates.json |
no script yet | each April, when DWP publish the new rates |
The postcode files must be built before the BRMA files, because the BRMA build places each postcode from them.
Everything lives under /v1/. If the shape of a file has to change, the new
shape is published under /v2/ and /v1/ is left alone until nothing is using
it. That way a data rebuild can never break a page that is already live.
Two licences, because there are two kinds of thing here.
/v1/ — Open Government Licence v3.0, with
one exception: councils.json is a compilation by PlainCouncilTax under
CC BY 4.0 (the figures inside it are themselves OGL).
See DATA-LICENCE.md.If you reuse the data you must carry the attribution for whichever source it came
from. They are all set out in ATTRIBUTION.md. The rent files,
the index files, lha-rates.json and councils.json also carry their own source
and licence inside them; the per-outcode postcode and BRMA files are kept bare to
stay small, so take their attribution from ATTRIBUTION.md.
None of this is legal or financial advice, and none of it is a substitute for the original publications, which are linked for every dataset.
Suggestions, corrections, or a dataset worth adding: there is a feedback button on savvyrenter.co.uk.