Every figure here, as JSON.
No key, no sign up, no rate limit beyond being reasonable. Twelve addresses covering every price on this site, the nightly energy tariff sweep, the change log and the trade tracker. JSON by default, CSV on request.
What there is
Base address https://tarifftracker.io/api/v1. Everything is a GET. Nothing needs a header.
- /api/v1
The catalogue. Every dataset, when each was last updated, and what it is for. Start here.
JSON only. This one is not a flat table.
- /api/v1/benchmarks
What a typical UK household pays for each of the ten bills, with the source and the date the figure was set.
CSV: add ?format=csv
- /api/v1/prices/{vertical}
Everything behind one bill: the headline, the supporting figures, every table, the help schemes, the sources and the caveats.
Filters: energy, water, broadband-and-mobile, council-tax, rent, rail-fares, nhs-charges, childcare, tv-licence, insurance. JSON only. This one is not a flat table.
- /api/v1/energy/tariffs
Every electricity and gas tariff we can verify, by region. Unit rate, standing charge, contract term, exit fee, and the cost of a year at typical use.
Filters: region, fuel, kind, supplier. CSV: add ?format=csv
- /api/v1/energy/cap
The Ofgem cap unit rate and standing charge for electricity in each of the fourteen regions. What a default tariff charges, which is what you pay when a fix ends.
CSV: add ?format=csv
- /api/v1/lookup
A postcode turned into the things that decide your bills: electricity region, the cap rates there, water company and its average bill.
Filters: postcode, required. JSON only. This one is not a flat table.
- /api/v1/changes
What has already changed and the day it took effect.
Filters: vertical, since. CSV: add ?format=csv
- /api/v1/upcoming
Dated changes that have not happened yet, flagged for whether the amount is published or only the date.
Filters: vertical. CSV: add ?format=csv
- /api/v1/trade/corridors
Twenty nine trade corridors. Duty into the United States and duty coming back, layer by layer with effective dates.
Filters: country. CSV: add ?format=csv
- /api/v1/trade/programmes
United States tariff programmes by legal authority, with rates, scope and who is varied out.
CSV: add ?format=csv
- /api/v1/trade/changes
The trade change log, including measures announced but not yet in force.
CSV: add ?format=csv
- /api/v1/support
Every grant, discount and protection for household bills. The eligibility conditions come as data rather than prose, alongside which of the four nations it covers, the deadline, what could not be verified, and where to apply.
Filters: nation, situation, group. CSV: add ?format=csv
- /api/v1/dictionary
Every field in every dataset: its type, its unit, what it measures, and what a blank in it actually means. A null can be not published, does not apply, or not collected, and this tells them apart.
Filters: dataset. CSV: add ?format=csv
- /api/v1/sources
Every source the site stands on, named and linked, so you can check any figure yourself.
CSV: add ?format=csv
What comes back, and why
Every response has the same envelope. The figures are in rows or data. Everything above them exists so you can decide whether to trust them.
generated is when you called. as_of is when the figures were last checked against their source. A price with no date on it is worse than no price, so both travel with every answer.
Every dataset names the bodies it came from and links them. If you are republishing a figure, this is the thing to carry through with it.
This site does not publish a figure without saying where it could be wrong. The caveats are part of the response for the same reason. Dropping them republishes the number without the warning.
The licence, in plain words
The compilation, the wording, the tables and the figures we worked out ourselves. Use them commercially, change them, build on them. Credit Tariff Tracker and keep the source links intact.
The underlying figures belong to the bodies named in each row. Most are Crown copyright under the Open Government Licence v3, which is generous. Supplier tariff rates belong to the suppliers who publish them.
Citizens Advice supplier satisfaction scores appear on the site under their terms. Handing them out in bulk is a different thing and we have not asked permission, so they are stripped from every API response.
Every field, and what a blank in it means
125 fields across 11 datasets. 37 of them can come back blank, and a blank is not one thing.
It can mean the figure has not been published, that it does not apply to that row, or that we have not been to
collect it. Those are three different facts and a bare null makes them look like one, so each field says which
it is. The same descriptions are served at /api/v1/dictionary, read from the same file, so this
page cannot drift from the data it describes.
The envelope, which every answer has8 fields
| Field | Type | What it is |
|---|---|---|
dataset | string | Which dataset this is, in dotted form, matching the catalogue at /api/v1. |
generated | string, ISO 8601 | The moment you asked. Not the age of the figures. |
as_of | string, ISO 8601 or date | When the figures in this response were last checked against their source. This is the one that matters. |
sources | array | The bodies these figures came from, named and linked. If you republish a figure, republish this with it. |
caveats | array of strings | Where these figures could be wrong or be misread. Part of the data, not decoration. |
licence | object | What you may do with the compilation, and who owns the underlying figures. |
count | number | How many rows follow. Present only on datasets that are tables. |
rows | array | The figures, one object per row. Datasets that are not tables use data instead. |
benchmarks15 fields, 3 of which can be blank
What a typical household pays for each of the ten bills.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
vertical | string | The slug for this bill, which is also its address on the site and in the API. | never blank |
name | string | The bill in words. | never blank |
value | number, GBP | The typical figure as a number, ready to compute with. | Blank means: No primary source publishes a single typical household figure for this bill. Rail fares and NHS charges are both like this. The label says what the display figure actually measures, and inventing a household number for them would be making it up. |
currency | string | Always GBP. Present so nobody has to assume. | never blank |
period | string | What the value covers, such as a year or a month. | Blank means: There is no value to attach a period to. |
display | string | The figure exactly as the site prints it, symbols and all. Use value for arithmetic and this for showing people. | never blank |
unit | string | The suffix the site prints after the figure, such as /yr. | Blank means: The site prints no suffix after this figure, because it is not an amount of money over a period. Rail fares are a percentage and childcare is a count of hours. |
label | string | What the figure actually is, including the period it applies to. Read this before quoting the number. | never blank |
detail | string | The assumptions behind it, such as payment method or consumption. | never blank |
direction | string | up, down or flat against the period before. | never blank |
change | string | How much it moved and over what, as published. | never blank |
source | string | The body that set the figure. | never blank |
as_of | string, date | The date this figure took effect or was published. | never blank |
page | string | The page a person should read. | never blank |
detail_api | string | Everything behind this one figure, including its own sources and caveats. | never blank |
energy.tariffs18 fields, 7 of which can be blank
Every electricity, gas and dual fuel tariff we can verify, by region, refreshed nightly from each supplier's own price endpoint.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
supplier | string | The supplier's trading name. | never blank |
tariff | string | The supplier's own name for the tariff, copied rather than tidied, so it matches what is printed on a bill. | never blank |
product_code | string | The supplier's product code. Use this to join rows across fuels and regions rather than matching on the tariff name. | never blank |
region | string | One of the fourteen Great Britain electricity distribution regions. Price varies by region and this is why. | never blank |
fuel | string | electricity, gas, or dual where the same product code sells both in the same region. | never blank |
kind | string | fixed or variable. | never blank |
payment | string | Always direct debit. Standard credit costs about five and a half per cent more, and mixing the two makes one supplier look cheaper than it is, so only one basis is published. | never blank |
unit_p_kwh | number, pence per kWh | The unit rate, including VAT. On a dual fuel row this is the electricity leg only, and the gas leg is in gas_unit_p_kwh. | never blank |
standing_p_day | number, pence per day | The standing charge, including VAT. On a dual fuel row this is both fuels added together, because that is what the household actually pays each day. | never blank |
gas_unit_p_kwh | number, pence per kWh | The gas unit rate on a dual fuel row. | Blank means: Not a dual fuel row. A gas row carries its unit rate in unit_p_kwh like any other. |
gas_standing_p_day | number, pence per day | The gas standing charge on a dual fuel row, already included in standing_p_day. | Blank means: Not a dual fuel row. |
credit_unit_p_kwh | number, pence per kWh | The same tariff's unit rate for someone paying on receipt of the bill rather than by direct debit. | Blank means: Either the supplier publishes no standard credit rate for this product in this region, or the row is a dual fuel row, where we do not compute a combined credit figure. |
term_months | number, months | How long the contract runs. | Blank means: No contract length was published for this product. On a variable tariff that is expected, because there is no fixed term to publish. On a fixed tariff it means the supplier did not publish one, and your own contract is the thing to check. |
exit_fee_gbp | number, GBP | What the supplier charges to leave early, per fuel. Zero means they publish it as free to leave. Leaving a dual fuel contract early usually means paying this twice, once for each fuel. | Blank means: Not collected for this product. Contract terms are read once per product from the supplier's electricity product detail, which is the only endpoint that carries them, so a product we hold gas prices for but no electricity detail has none. |
exit_fee_type | string | How the supplier structures the fee. FLAT is a single amount. NONE is no fee, and pairs with an exit_fee_gbp of zero. | Blank means: Not collected, for the same reason as exit_fee_gbp. |
annual_est_gbp | number, GBP | What a full year costs at Ofgem's typical consumption: standing charge times 365 plus the unit rate times the typical kWh. This is what the rankings sort on, because a low unit rate with a high standing charge is not a cheap tariff and sorting on the unit rate alone hides that. | never blank |
closes | string, date | The last day the supplier will sign anyone new onto this tariff. | Blank means: The supplier has set no closing date, so it is open. |
source | string | Which supplier endpoint the row was read from. | never blank |
energy.cap3 fields, 0 of which can be blank
The Ofgem price cap for electricity, by region. This is what a default tariff charges, which is what you pay once a fix ends and nothing is done.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
region | string | One of the fourteen Great Britain electricity distribution regions. | never blank |
electricity_standing_p_day | number, pence per day | The capped standing charge in that region, including VAT. | never blank |
electricity_unit_p_kwh | number, pence per kWh | The capped unit rate in that region, including VAT. | never blank |
changes11 fields, 2 of which can be blank
What has already changed, and the day it started costing anyone anything.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
id | string | A stable identifier. It is also the permalink other people cite, so it does not change once published. | never blank |
announced | string, date | The day it was published. | never blank |
effective | string, date | The day it starts to cost anyone anything. Often months after it was announced, and this is the date that matters. | never blank |
vertical | string | Which bill it affects. | never blank |
severity | string | increase, decrease or neutral, from the household's point of view rather than the industry's. | never blank |
actor | string | Who made the change: a regulator, a government department, or a company. | never blank |
title | string | What happened, in one line. | never blank |
summary | string | What happened, with the figures. | never blank |
note | string | Why it matters beyond the figure. | Blank means: There is nothing to add beyond the summary. |
source | string | A link to the primary source. | Blank means: No single URL covers it. These should be rare and are worth reporting. |
source_name | string | The body that published it. | never blank |
upcoming7 fields, 0 of which can be blank
Dated changes that have not happened yet.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
date | string, date | When it takes effect. | never blank |
vertical | string | Which bill it affects. | never blank |
what | string | What is changing. | never blank |
kind | string | price_change where a bill is going up or down, or deadline where it is a date you have to act by, such as a qualifying week. Missing a deadline costs the same as a rise, but it is something you can do something about. | never blank |
status | string | confirmed means the date and the amount are both published. date_only means the date is set but the amount has not been announced, so anybody quoting a figure for it is guessing. expected means it is a date we know is coming, such as a statutory review window, where neither the date nor the amount has been formally confirmed. | never blank |
amount_published | boolean | Whether the figure is published as well as the date. Kept alongside status so anything already built on it keeps working. | never blank |
source | string | Who announced it. | never blank |
lookup11 fields, 7 of which can be blank
A postcode area turned into the things that decide the bills at that address.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
postcode_area | string | The letters at the start, which is all the mapping needs. | never blank |
outcode | string | The first half of the postcode, with the inward code stripped. | never blank |
electricity_region | string | The distribution region, which sets the cap rates and the tariffs available. | Blank means: We hold no region for this area. If it is a real postcode area, that is a gap worth reporting. |
region_straddles | array | Both regions, where a postcode area sits across a boundary. Grid supply point boundaries do not follow postcodes, and where they disagree we name both rather than pick one. | Blank means: This area sits in one region. |
cap_electricity_standing_p_day | number, pence per day | The capped standing charge for that region. | Blank means: No region, so no rates. |
cap_electricity_unit_p_kwh | number, pence per kWh | The capped unit rate for that region. | Blank means: No region, so no rates. |
water_company | string | The water and sewerage company for the area. You cannot switch it. | Blank means: Scotland, where supply is Scottish Water and is not in the England and Wales table, or an area we hold no company for. |
water_company_split | array | Both companies, where an area is served by two. Water boundaries follow river catchments rather than postcodes, so this is approximate by nature. | Blank means: One company serves this area. |
water_average_bill_gbp | number, GBP | That company's average household bill for the year. | Blank means: No company, so no bill. Scottish charges are set differently and are not in this table. |
scotland | boolean | Whether the area is in Scotland, where water and some other charges work differently. | never blank |
council_tax_band_ratios | object | The statutory ratio of each band to band D. Multiply your council's band D charge by your band's ratio. The ratios are fixed in law; the band D charge is set by the council. | never blank |
trade.corridors13 fields, 0 of which can be blank
Duty in both directions for twenty nine trade corridors, layer by layer with effective dates.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
slug | string | The country's address on the site. | never blank |
name | string | The country. | never blank |
code | string | The two letter country code. | never blank |
region | string | Which part of the world. | never blank |
inbound_headline_pct | number, per cent | The highest duty layer charged on goods entering the United States from this country. It is a ceiling, not an average, and most trade moves at a lower rate. | never blank |
inbound_label | string | How that headline should be read in words, such as up to fifty per cent. | never blank |
inbound_layers | array | Each measure separately: its legal authority, its rate, what it covers and when it started. | never blank |
outbound_headline_pct | number, per cent | The highest duty that country charges on goods from the United States. | never blank |
outbound_label | string | The same in words. | never blank |
outbound_layers | array | Each retaliatory or ordinary measure separately. | never blank |
summary | string | What is actually going on in this corridor. | never blank |
notes | array of strings | Detail that does not fit a rate: support packages, carve outs, disputes. | never blank |
page | string | The page for this corridor. | never blank |
trade.programmes10 fields, 6 of which can be blank
United States tariff programmes by legal authority.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
authority | string | The statutory section the programme runs under. | never blank |
authority_name | string | That section in words. | Blank means: The authority code is not one of the ones we hold a definition for. |
legal_basis | string | The Act it comes from. | Blank means: Same as above. |
grounds | string | The legal ground claimed, such as national security. | Blank means: Same as above. |
title | string | What the programme covers. | never blank |
rate | string | The general rate. Variations name who pays something else. | never blank |
status | string | The legal state of the programme: in force, active, phasing, expired or struck down. This vocabulary is the United States government's, not ours. | Blank means: No status is recorded. |
in_force_from | string, date | When it started. | Blank means: No start date is recorded. |
note | string | What the rate does not tell you. | Blank means: There is nothing to add. |
variations | array | Who is charged something other than the general rate, and why. | never blank |
trade.changes10 fields, 5 of which can be blank
The trade change log, including measures announced but not yet in force.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
id | string | A stable identifier. | Blank means: The row is a scheduled measure rather than a logged change, and has no permalink yet. |
announced | string, date | When it was announced. | Blank means: The row is scheduled: we hold the date it takes effect but not the day it was announced. |
effective | string, date | When it takes effect. Announced is not the same as in force, and neither is the same as collected. | never blank |
actor | string | Who imposed it. | never blank |
target | string | Who it is aimed at. | Blank means: It applies by product worldwide rather than at one country. |
direction | string | Which way it runs, or scheduled where it has been announced but is not yet in force. | never blank |
authority | string | The legal authority used. | Blank means: None recorded. |
severity | string | increase, decrease or neutral. | Blank means: The row is scheduled and has not been assessed. |
title | string | What happened, in one line. | never blank |
summary | string | What happened, with the figures. | never blank |
sources3 fields, 1 of which can be blank
Every source the site stands on.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
dataset | string | Which dataset relies on it. | never blank |
name | string | The publication, named as its publisher names it. | never blank |
url | string | Where to check it yourself. | Blank means: The source has no stable public URL. Rare, and worth telling us about. |
support24 fields, 6 of which can be blank
Every grant, discount and protection for household bills, with the eligibility conditions as data.
Scroll sideways to see every column
| Field | Type | What it is | What a blank means |
|---|---|---|---|
id | string | A stable identifier, also the anchor for this scheme on the help page. | never blank |
name | string | What the scheme is called by the body that runs it. | never blank |
group | string | Which bill or theme it sits under: gateway, energy, water, counciltax, broadband, nhs, childcare, tvlicence, travel or debt. | never blank |
amount | string | What you get, in the form the scheme itself states it. Some are a fixed sum, some are a cap or a percentage, and some are protection rather than money. | never blank |
amount_note | string | What that amount actually means, including whether it is paid to you or credited to an account. | never blank |
administered_by | string | Who decides and who pays. This matters because it tells you who to argue with. | never blank |
status | string | open, closed, seasonal or proposed. A closed scheme is one nobody can apply to right now. | never blank |
status_note | string | The status in words, including when a closed scheme reopens. | never blank |
england | string | yes, different, no or unknown. different means the scheme exists there but under other rules. | Blank means: Never blank. Where we do not know, the value is the string unknown rather than a null. |
wales | string | Whether it applies in Wales, on the same four values. | never blank |
scotland | string | Whether it applies in Scotland, on the same four values. | never blank |
northern_ireland | string | Whether it applies in Northern Ireland, on the same four values. | never blank |
nations_note | string | What the differences between the nations actually are. | Blank means: The scheme works the same way everywhere it applies. |
eligibility | array of strings | The conditions, written so somebody can read them and know whether they qualify. This is the substance of the record, not a summary of it. | never blank |
how_to_claim | string | What you actually do, including where a scheme is automatic and there is nothing to do. | never blank |
apply_at | string | The official page to apply or find out more. | Blank means: No single official page covers it. |
deadline | string, date | A qualifying date or window that decides whether you get anything. | Blank means: The scheme is open all year with no dated cut off. |
deadline_what | string | What that date actually decides. | Blank means: There is no deadline. |
worth_knowing | array of strings | The things that catch people out: what a scheme does not cover, why people are refused, and how much goes unclaimed. | never blank |
changing | string | A rule that is confirmed but not yet in force, with what changes and when. | Blank means: Nothing announced is due to change. |
unverified | array of strings | What could not be checked against a primary source, and is therefore deliberately absent from this record. An empty array means everything here was verified. | never blank |
situations | array of strings | Who it is for, from a fixed list: benefits, pension, disability, children, carer, lowincome, arrears, prepay, renting, student. | never blank |
sources | array | The government, regulator or scheme operator pages each fact was checked against. | never blank |
page | string | The section of the help page covering this scheme. | never blank |
Practical notes
How fresh is any of this?
The energy tariff endpoints are refreshed nightly, straight from each supplier's own price endpoint, and the as_of field carries the exact moment. Everything else changes when the site rebuilds, which is whenever a regulator publishes something. The catalogue at /api/v1 reports the freshness of all three streams in one call, so you can check before you pull.
Are there limits?
No key and no quota. Every answer is identical for everyone and changes at most once a night, so responses sit in the edge cache for five minutes and a busy day costs us almost nothing. If you want the whole lot at once, take /data/uk.json and /data/tariffs.json rather than walking every address, and please do not poll faster than the data changes.
Why are some values null?
Because we do not know them. Rail fares and NHS charges have no single typical household figure that any primary source publishes, so value is null and the label says what the display figure actually measures. An upcoming change with amount_published: false has a date but no figure, because the amount has not been announced. Filling either of those in would mean inventing something, which is the one thing this site does not do.
Can I use this in a commercial product?
Yes, with attribution. The compilation is CC BY 4.0. Two cautions worth reading properly: the underlying figures carry their own source terms, and supplier tariff rates belong to the suppliers rather than to us. If your product turns on those rates being right, take them from the suppliers directly and use this to check yourself.
What this is not
It is not advice, it is not a quote, and it is not a switching service. The site publishes statistics only and arranges nothing. There is no insurance quoting anywhere on it or in this API, and there never will be, because arranging insurance without authorisation is a criminal offence rather than a growth opportunity.
30 price changes logged. Every one had a date you could have known in advance.
Tell us which bills you care about and we will email you when one of them changes, with the figure, the date it starts and a link to the regulator that set it. Free, no account, one click to stop.
Email alerts are not running yet. We would rather say that than take your address and send you nothing. Until they are, the change log carries every dated change the day we find it, and you can bookmark it or follow it in a reader.