Open API

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 a typical household pays for everything, in one call curl https://tarifftracker.io/api/v1/benchmarks # the same thing as a spreadsheet curl https://tarifftracker.io/api/v1/benchmarks?format=csv # every tariff we can verify in one region curl https://tarifftracker.io/api/v1/energy/tariffs?region=Yorkshire&kind=fixed # turn a postcode into the things that set the bill curl https://tarifftracker.io/api/v1/lookup?postcode=L1

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.

{ "dataset": "energy.tariffs", "generated": "2026-08-27T11:41:02.113Z", // when you asked "as_of": "2026-08-27T11:03:53.687Z", // when the figures were checked "sources": [ { "name": "...", "url": "..." } ], "caveats": [ "Only suppliers who publish openly are here..." ], "licence": { "compilation": "CC BY 4.0", ... }, "count": 168, "rows": [ ... ] }
as_ofNot the same as now

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.

sourcesNamed, not implied

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.

caveatsThe doubt, as data

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.

An empty answer is an honest answer. If the nightly fetch has not run, the tariff endpoints return no rows and say so in the caveats. They will never hand you a fixture, a cached guess or last week's prices wearing today's date.

The licence, in plain words

OursCC BY 4.0

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.

TheirsCheck the source

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.

Deliberately absentStar ratings

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.

A request rather than a condition. Date whatever you cache, and if you spot an error tell us before you build on it. We would far rather fix it once here than watch it propagate into a dozen other places, which is exactly how a wrong price cap figure ends up on half the internet by lunchtime. Corrections go to [email protected] and we record that we made them.

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
FieldTypeWhat it is
datasetstringWhich dataset this is, in dotted form, matching the catalogue at /api/v1.
generatedstring, ISO 8601The moment you asked. Not the age of the figures.
as_ofstring, ISO 8601 or dateWhen the figures in this response were last checked against their source. This is the one that matters.
sourcesarrayThe bodies these figures came from, named and linked. If you republish a figure, republish this with it.
caveatsarray of stringsWhere these figures could be wrong or be misread. Part of the data, not decoration.
licenceobjectWhat you may do with the compilation, and who owns the underlying figures.
countnumberHow many rows follow. Present only on datasets that are tables.
rowsarrayThe 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

FieldTypeWhat it isWhat a blank means
verticalstringThe slug for this bill, which is also its address on the site and in the API.never blank
namestringThe bill in words.never blank
valuenumber, GBPThe 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.
currencystringAlways GBP. Present so nobody has to assume.never blank
periodstringWhat the value covers, such as a year or a month.Blank means: There is no value to attach a period to.
displaystringThe figure exactly as the site prints it, symbols and all. Use value for arithmetic and this for showing people.never blank
unitstringThe 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.
labelstringWhat the figure actually is, including the period it applies to. Read this before quoting the number.never blank
detailstringThe assumptions behind it, such as payment method or consumption.never blank
directionstringup, down or flat against the period before.never blank
changestringHow much it moved and over what, as published.never blank
sourcestringThe body that set the figure.never blank
as_ofstring, dateThe date this figure took effect or was published.never blank
pagestringThe page a person should read.never blank
detail_apistringEverything 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

FieldTypeWhat it isWhat a blank means
supplierstringThe supplier's trading name.never blank
tariffstringThe supplier's own name for the tariff, copied rather than tidied, so it matches what is printed on a bill.never blank
product_codestringThe supplier's product code. Use this to join rows across fuels and regions rather than matching on the tariff name.never blank
regionstringOne of the fourteen Great Britain electricity distribution regions. Price varies by region and this is why.never blank
fuelstringelectricity, gas, or dual where the same product code sells both in the same region.never blank
kindstringfixed or variable.never blank
paymentstringAlways 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_kwhnumber, pence per kWhThe 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_daynumber, pence per dayThe 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_kwhnumber, pence per kWhThe 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_daynumber, pence per dayThe gas standing charge on a dual fuel row, already included in standing_p_day.Blank means: Not a dual fuel row.
credit_unit_p_kwhnumber, pence per kWhThe 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_monthsnumber, monthsHow 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_gbpnumber, GBPWhat 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_typestringHow 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_gbpnumber, GBPWhat 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
closesstring, dateThe last day the supplier will sign anyone new onto this tariff.Blank means: The supplier has set no closing date, so it is open.
sourcestringWhich 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

FieldTypeWhat it isWhat a blank means
regionstringOne of the fourteen Great Britain electricity distribution regions.never blank
electricity_standing_p_daynumber, pence per dayThe capped standing charge in that region, including VAT.never blank
electricity_unit_p_kwhnumber, pence per kWhThe 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

FieldTypeWhat it isWhat a blank means
idstringA stable identifier. It is also the permalink other people cite, so it does not change once published.never blank
announcedstring, dateThe day it was published.never blank
effectivestring, dateThe day it starts to cost anyone anything. Often months after it was announced, and this is the date that matters.never blank
verticalstringWhich bill it affects.never blank
severitystringincrease, decrease or neutral, from the household's point of view rather than the industry's.never blank
actorstringWho made the change: a regulator, a government department, or a company.never blank
titlestringWhat happened, in one line.never blank
summarystringWhat happened, with the figures.never blank
notestringWhy it matters beyond the figure.Blank means: There is nothing to add beyond the summary.
sourcestringA link to the primary source.Blank means: No single URL covers it. These should be rare and are worth reporting.
source_namestringThe 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

FieldTypeWhat it isWhat a blank means
datestring, dateWhen it takes effect.never blank
verticalstringWhich bill it affects.never blank
whatstringWhat is changing.never blank
kindstringprice_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
statusstringconfirmed 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_publishedbooleanWhether the figure is published as well as the date. Kept alongside status so anything already built on it keeps working.never blank
sourcestringWho 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

FieldTypeWhat it isWhat a blank means
postcode_areastringThe letters at the start, which is all the mapping needs.never blank
outcodestringThe first half of the postcode, with the inward code stripped.never blank
electricity_regionstringThe 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_straddlesarrayBoth 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_daynumber, pence per dayThe capped standing charge for that region.Blank means: No region, so no rates.
cap_electricity_unit_p_kwhnumber, pence per kWhThe capped unit rate for that region.Blank means: No region, so no rates.
water_companystringThe 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_splitarrayBoth 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_gbpnumber, GBPThat 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.
scotlandbooleanWhether the area is in Scotland, where water and some other charges work differently.never blank
council_tax_band_ratiosobjectThe 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

FieldTypeWhat it isWhat a blank means
slugstringThe country's address on the site.never blank
namestringThe country.never blank
codestringThe two letter country code.never blank
regionstringWhich part of the world.never blank
inbound_headline_pctnumber, per centThe 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_labelstringHow that headline should be read in words, such as up to fifty per cent.never blank
inbound_layersarrayEach measure separately: its legal authority, its rate, what it covers and when it started.never blank
outbound_headline_pctnumber, per centThe highest duty that country charges on goods from the United States.never blank
outbound_labelstringThe same in words.never blank
outbound_layersarrayEach retaliatory or ordinary measure separately.never blank
summarystringWhat is actually going on in this corridor.never blank
notesarray of stringsDetail that does not fit a rate: support packages, carve outs, disputes.never blank
pagestringThe 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

FieldTypeWhat it isWhat a blank means
authoritystringThe statutory section the programme runs under.never blank
authority_namestringThat section in words.Blank means: The authority code is not one of the ones we hold a definition for.
legal_basisstringThe Act it comes from.Blank means: Same as above.
groundsstringThe legal ground claimed, such as national security.Blank means: Same as above.
titlestringWhat the programme covers.never blank
ratestringThe general rate. Variations name who pays something else.never blank
statusstringThe 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_fromstring, dateWhen it started.Blank means: No start date is recorded.
notestringWhat the rate does not tell you.Blank means: There is nothing to add.
variationsarrayWho 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

FieldTypeWhat it isWhat a blank means
idstringA stable identifier.Blank means: The row is a scheduled measure rather than a logged change, and has no permalink yet.
announcedstring, dateWhen it was announced.Blank means: The row is scheduled: we hold the date it takes effect but not the day it was announced.
effectivestring, dateWhen it takes effect. Announced is not the same as in force, and neither is the same as collected.never blank
actorstringWho imposed it.never blank
targetstringWho it is aimed at.Blank means: It applies by product worldwide rather than at one country.
directionstringWhich way it runs, or scheduled where it has been announced but is not yet in force.never blank
authoritystringThe legal authority used.Blank means: None recorded.
severitystringincrease, decrease or neutral.Blank means: The row is scheduled and has not been assessed.
titlestringWhat happened, in one line.never blank
summarystringWhat 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

FieldTypeWhat it isWhat a blank means
datasetstringWhich dataset relies on it.never blank
namestringThe publication, named as its publisher names it.never blank
urlstringWhere 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

FieldTypeWhat it isWhat a blank means
idstringA stable identifier, also the anchor for this scheme on the help page.never blank
namestringWhat the scheme is called by the body that runs it.never blank
groupstringWhich bill or theme it sits under: gateway, energy, water, counciltax, broadband, nhs, childcare, tvlicence, travel or debt.never blank
amountstringWhat 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_notestringWhat that amount actually means, including whether it is paid to you or credited to an account.never blank
administered_bystringWho decides and who pays. This matters because it tells you who to argue with.never blank
statusstringopen, closed, seasonal or proposed. A closed scheme is one nobody can apply to right now.never blank
status_notestringThe status in words, including when a closed scheme reopens.never blank
englandstringyes, 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.
walesstringWhether it applies in Wales, on the same four values.never blank
scotlandstringWhether it applies in Scotland, on the same four values.never blank
northern_irelandstringWhether it applies in Northern Ireland, on the same four values.never blank
nations_notestringWhat the differences between the nations actually are.Blank means: The scheme works the same way everywhere it applies.
eligibilityarray of stringsThe 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_claimstringWhat you actually do, including where a scheme is automatic and there is nothing to do.never blank
apply_atstringThe official page to apply or find out more.Blank means: No single official page covers it.
deadlinestring, dateA qualifying date or window that decides whether you get anything.Blank means: The scheme is open all year with no dated cut off.
deadline_whatstringWhat that date actually decides.Blank means: There is no deadline.
worth_knowingarray of stringsThe things that catch people out: what a scheme does not cover, why people are refused, and how much goes unclaimed.never blank
changingstringA rule that is confirmed but not yet in force, with what changes and when.Blank means: Nothing announced is due to change.
unverifiedarray of stringsWhat 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
situationsarray of stringsWho it is for, from a fixed list: benefits, pension, disability, children, carer, lowincome, arrears, prepay, renting, student.never blank
sourcesarrayThe government, regulator or scheme operator pages each fact was checked against.never blank
pagestringThe 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.

Everything, freeAll ten trackers, no account
Ranked on costNever on what a link pays us
SourcedEvery figure links to the body that set it