How Much Is My Council Tax? The Exact Formula (and Why Postcode Estimates Are Wrong)
Your council tax bill depends on your property's band and your local authority's Band D rate — not your postcode. Here's how to calculate the exact annual charge per property, and how to look it up programmatically via API.
The short answer: it depends on two things — your property's council tax band, and the rate your local authority charges. They're related but separate. Your band is set by the Valuation Office Agency (VOA) and is fixed to the property. Your local authority sets the annual charge every April. Multiply one by the other and you have your actual bill.
Most online calculators get this wrong. They estimate by postcode — giving you the average charge in your area, not the actual charge for your specific address. Since three houses on the same street can be in three different bands, a postcode estimate can be hundreds of pounds off.
Here's how to get the real number.
Step 1: Find your council tax band
Every residential property in England, Scotland, and Wales has a council tax band — A through H in England and Scotland (A through I in Wales, which revalued in 2003). The band was assigned by the Valuation Office Agency based on the estimated market value of the property in April 1991. It hasn't been updated since.
Crucially, the band belongs to the property, not the postcode. A large Victorian terrace and a small modern flat in the same postcode will almost certainly be in different bands. Postcode-level estimates paper over this — per-property lookup is the only way to get the right answer.
You can look up your band on the GOV.UK council tax band checker (for England and Wales) or the Scottish Assessors Association for Scotland. If you're building a tool that needs to do this programmatically for many properties, the Homedata Council Tax API handles it at scale.
Step 2: Find your local authority's Band D rate
Band D is the reference rate — the amount a Band D property pays in your council area each year. Every other band is a fixed fraction of it:
| Band | Fraction of Band D | Example: £2,000 Band D | Example: £2,400 Band D |
|---|---|---|---|
| A | 6/9 (66.7%) | £1,333 | £1,600 |
| B | 7/9 (77.8%) | £1,556 | £1,867 |
| C | 8/9 (88.9%) | £1,778 | £2,133 |
| D | 9/9 (100%) | £2,000 | £2,400 |
| E | 11/9 (122.2%) | £2,444 | £2,933 |
| F | 13/9 (144.4%) | £2,889 | £3,467 |
| G | 15/9 (166.7%) | £3,333 | £4,000 |
| H | 18/9 (200%) | £4,000 | £4,800 |
Each local authority publishes its Band D rate annually — usually in February or March, effective from April. For 2024/25, the average across England was approximately £2,171, but rates range from under £900 in central London (Westminster benefits from high business rates income) to over £2,500 in some county areas.
GOV.UK publishes the annual council tax statistics including Band D rates by local authority. There are approximately 350 billing authorities in England — county councils, unitary authorities, metropolitan districts, and London boroughs, each with its own rate.
Step 3: Calculate your actual annual bill
The formula is straightforward:
Annual charge = Band D rate × band multiplier
# Example: Band C property in Manchester (Band D rate ~£2,050/yr)
Annual charge = £2,050 × (8/9) = £1,822
# Example: Band E property in Surrey (Band D rate ~£2,400/yr)
Annual charge = £2,400 × (11/9) = £2,933
This is before any discounts. The standard charge assumes two adults living in the property. Common reductions:
- 25% discount — if only one adult lives there (single person discount)
- 50% discount — if all occupants are "disregarded" (full-time students, severely mentally impaired, care workers, and others)
- 100% exempt — unoccupied properties in certain circumstances, properties occupied solely by students
- Council Tax Support (CTS) — means-tested reduction, varies by local authority
Why postcode estimates are misleading. A postcode in Leeds might contain Band A flats and Band G detached houses on the same street. An estimate based on average charges across that postcode could show £1,900/yr for a property actually in Band A (£1,200) or Band G (£3,400). That's a difference that matters — for buyers budgeting affordability, landlords calculating yield, and mortgage affordability assessments.
Getting exact figures programmatically
If you're building a property tool — a portal, a mortgage calculator, a buy-to-let analyser — you need per-property council tax data, not postcode estimates. The approach: look up the band for the specific UPRN, then apply the local authority rate.
Step 1: Look up the band by UPRN
# cURL
curl "https://api.homedata.co.uk/api/council_tax_band/?uprn=100023336956" \
-H "Authorization: Api-Key YOUR_API_KEY"
# Response
{
"uprn": 100023336956,
"address": "FLAT 4, 22 BRUNSWICK TERRACE, HOVE, BN3 1HJ",
"postcode": "BN3 1HJ",
"council_tax_band": "C",
"source": "cached"
}
Step 2: Apply the local authority Band D rate
With the band confirmed, apply your LA's published Band D rate to get the actual annual charge:
import requests
API_KEY = "your_api_key"
# Band D multipliers — fixed ratios, same across all councils
BAND_MULTIPLIERS = {
"A": 6/9,
"B": 7/9,
"C": 8/9,
"D": 9/9,
"E": 11/9,
"F": 13/9,
"G": 15/9,
"H": 18/9,
}
# 2024/25 Band D rates — sample local authorities
# Source: GOV.UK council tax statistics, updated annually
BAND_D_RATES = {
"Westminster": 882,
"Wandsworth": 900,
"City of London": 1,029,
"City of Birmingham": 2,068,
"Manchester": 2,050,
"Leeds": 1,928,
"Brighton and Hove": 2,262,
"Cornwall": 2,374,
"Somerset": 2,421,
"Dorset": 2,437,
# Average England 2024/25
"_average": 2,171,
}
def council_tax_annual_charge(uprn: int, local_authority: str) -> dict:
"""
Returns the exact annual council tax charge for a property.
Per-property accuracy via UPRN band lookup + local authority Band D rate.
"""
# Step 1: Look up the band for this specific property
resp = requests.get(
"https://api.homedata.co.uk/api/council_tax_band/",
params={"uprn": uprn},
headers={"Authorization": f"Api-Key {API_KEY}"},
)
resp.raise_for_status()
data = resp.json()
band = data["council_tax_band"]
# Step 2: Apply band multiplier to local authority Band D rate
band_d = BAND_D_RATES.get(local_authority, BAND_D_RATES["_average"])
multiplier = BAND_MULTIPLIERS[band]
annual_charge = round(band_d * multiplier)
monthly_estimate = round(annual_charge / 12)
return {
"uprn": uprn,
"address": data["address"],
"band": band,
"local_authority": local_authority,
"band_d_rate": band_d,
"annual_charge": annual_charge,
"monthly_estimate": monthly_estimate,
}
result = council_tax_annual_charge(100023336956, "Brighton and Hove")
print(result)
# {
# "uprn": 100023336956,
# "address": "FLAT 4, 22 BRUNSWICK TERRACE, HOVE, BN3 1HJ",
# "band": "C",
# "local_authority": "Brighton and Hove",
# "band_d_rate": 2262,
# "annual_charge": 2011,
# "monthly_estimate": 168
# }
JavaScript version:
const BAND_MULTIPLIERS = {
A: 6/9, B: 7/9, C: 8/9, D: 9/9,
E: 11/9, F: 13/9, G: 15/9, H: 18/9,
};
async function councilTaxAnnualCharge(uprn, localAuthority, bandDRate) {
const resp = await fetch(
`https://api.homedata.co.uk/api/council_tax_band/?uprn=${uprn}`,
{ headers: { Authorization: "Api-Key YOUR_API_KEY" } }
);
const data = await resp.json();
const band = data.council_tax_band;
const annualCharge = Math.round(bandDRate * BAND_MULTIPLIERS[band]);
return {
address: data.address,
band,
localAuthority,
annualCharge,
monthlyEstimate: Math.round(annualCharge / 12),
};
}
const result = await councilTaxAnnualCharge(100023336956, "Brighton and Hove", 2262);
console.log(result);
// { band: "C", annualCharge: 2011, monthlyEstimate: 168 }
Why this matters for property tools
Mortgage affordability
Mortgage lenders factor council tax into affordability assessments. A buyer looking at two properties in the same postcode — a Band C flat and a Band F house — faces a £1,400/year difference in council tax alone. Showing accurate per-property costs, not postcode averages, helps buyers make informed decisions before they apply.
Rental yield calculators
For buy-to-let investments, council tax affects net yield when the landlord is liable (empty periods, HMOs billed to the owner). A Band G property in a high-rate council area can cost £4,000+/year in council tax during void periods — a material risk that postcode estimates understate.
def net_yield(
annual_rent: float,
property_value: float,
uprn: int,
local_authority: str,
void_weeks_per_year: int = 4,
) -> dict:
"""Rental yield adjusted for council tax during void periods."""
ct = council_tax_annual_charge(uprn, local_authority)
void_ct_cost = ct["annual_charge"] * (void_weeks_per_year / 52)
net_income = annual_rent - void_ct_cost
gross_yield = (annual_rent / property_value) * 100
net_yield = (net_income / property_value) * 100
return {
"gross_yield": round(gross_yield, 2),
"net_yield": round(net_yield, 2),
"council_tax_band": ct["band"],
"void_ct_cost_per_year": round(void_ct_cost),
}
Property listings
Council tax band is one of the most-searched filters on property portals. Buyers want the annual charge estimate alongside the asking price — ideally broken down by month. This is trivial to surface when you have the band and your local authority lookup table. It's also a legal disclosure requirement in Scotland.
Conveyancing and home reports
Solicitors must report council tax band to buyers as part of the property information form. Automating the lookup via UPRN — rather than asking clients to retrieve it themselves — reduces one more round-trip in the transaction.
Getting the local authority rate
The final piece of the puzzle is knowing which local authority a property belongs to, and what that authority's current Band D rate is.
Local authority can be derived from postcode — every postcode in the UK maps to a single billing authority. The Homedata API returns the postcode with every council tax response; you can cross-reference against the GOV.UK statistics table, which is published annually as a CSV. Importing that table (~350 rows) gives you a complete lookup that only needs refreshing once a year.
A fully automated pipeline looks like:
# 1. Address → UPRN
GET /api/address/find/?q=22+Brunswick+Terrace+Hove
# 2. UPRN → Band + postcode
GET /api/council_tax_band/?uprn=100023336956
# 3. Postcode → local authority (from reference table)
# e.g. BN3 → Brighton and Hove
# 4. Local authority → Band D rate (annual GOV.UK import)
# Brighton and Hove Band D 2024/25 = £2,262
# 5. Band × multiplier × Band D rate = annual charge
# C × (8/9) × £2,262 = £2,011/year = £168/month
This chain gives you a per-property annual council tax estimate accurate to the band — the same accuracy as GOV.UK's own checker, delivered programmatically at any scale.
Common questions
Can I challenge my band?
Yes. If you believe your band is wrong, you can challenge it with the VOA. Grounds for a challenge include: the property was incorrectly valued in 1991, there's been a material change to the property, or neighbouring comparable properties are in a lower band. Challenges occasionally succeed — and importantly, can result in backdated refunds. About 1 in 4 challenges succeeds, per VOA data.
Why is my neighbour in a different band?
Same street, different bands is more common than people expect. It happens because the VOA assessed each property individually in 1991 based on size, condition, and features at that time. Extensions, conversions, and improvements since then don't automatically change your band. Two identical-looking properties today might have been very different in 1991 — or one might have been assessed slightly differently.
Does band change when I buy a property?
No. The band stays with the property, not the owner or occupier. When you buy, you inherit the band. The only exception: if significant structural changes have been made that would materially alter the 1991 equivalent value, the VOA can reband — but only if you report the change or they identify it during a routine review.
Scotland and Wales
Scotland uses Bands A-H with different 1991 value thresholds (Band D: £58,001–£80,000 vs England's £68,001–£88,000). Wales revalued in 2003 and uses Bands A-I with values based on 2003 prices. The multipliers and band structure work the same way — look up the band, find your council's Band D rate, apply the ratio.
Getting started with the API
- Create a free Homedata account — 100 calls/month, no credit card
- Get your API key from the developer dashboard
- Look up a band:
GET /api/council_tax_band/?uprn={uprn} - Combine with the full Council Tax API docs and the GOV.UK Band D rates table for exact annual charges
See the Council Tax Bands API guide for a deeper look at the endpoint, parameters, and edge cases.
Per-property council tax data via API
Look up bands for any UK address. 100 free calls/month, no credit card required.