Open data
Every figure this site computes comes from the file on the right. Take it, check it, or build something else with it. If our arithmetic and your arithmetic disagree, the disagreement is in here somewhere and you do not need our permission to find it.
It is written at build time from the same records the calculators read, so the file and the pages cannot diverge. There is no export step, no curation pass and no second copy that could go stale: the download is the store.
ruleset.json
What a rule carries
Each record names the authority and the exact clause, quotes the sentence we read verbatim, and gives the date we read it. contentHash points at our archived copy of that text, because government pages move and a bare URL rots. Money is integer minor units throughout: floats would force a tolerance on the tests, and a tolerance hides real disagreement.
{
"jurisdiction": "GB",
"taxYear": 2026,
"effectiveFrom": "2026-04-06",
"effectiveTo": "2027-04-05",
"verification": {
"status": "ingested",
"testIds": [
"GB/2026/single-150000",
"GB/2026/single-60000"
],
"secondPassBy": "oecd-sdmx",
"secondPassAt": "2026-09-08"
},
"confidence": "high",
"maxAgeDays": 400,
"id": "gb.income_tax.personal_allowance.ty2026",
"domain": "exclusion",
"concept": "incomeTax.personalAllowance",
"label": "UK personal allowance, 2026 to 2027",
"value": {
"kind": "scalar",
"unit": "money",
"value": 1257000,
"currency": "GBP"
},
"source": {
"authorityId": "GB-HMRC",
"authority": "FOREIGN_AUTHORITY",
"authorityName": "HM Revenue and Customs",
"documentTitle": "Income Tax rates and allowances for current and past years",
"url": "https://www.gov.uk/api/content/government/publications/rates-and-allowances-income-tax/income-tax-rates-and-allowances-current-and-past",
"landingUrl": "https://www.gov.uk/government/publications/rates-and-allowances-income-tax/income-tax-rates-and-allowances-current-and-past",
"documentDate": "2026-04-06",
"retrievedAt": "2026-09-06",
"retrievedBy": "api",
"contentHash": "sha256:9f0d78c8e8853394940e165e0d4ae5ebf2a4cb348d97cf9cc6df22a22e37eee4",
"locator": "Personal Allowances table, Personal Allowance, 2026 to 2027 column",
"quote": "Allowances The Personal Allowance is the amount of income a person can get before they pay tax. Allowances 2026 to 2027 2025 to 2026 2024 to 2025 2023 to 2024 Personal Allowance £12,570 £12,570 £12,570 £12,570 Income limit for Personal Allowance £100,000 £100,000 £100,000 £100,000 The Personal Allowance goes down by £1 for every £2 of income above the £100,000 limit. It can go down to zero."
},
"crossCheck": [
{
"authorityId": "OECD",
"authority": "INTERNATIONAL_ORG",
"authorityName": "Organisation for Economic Co-operation and Development",
"documentTitle": "OECD Tax Database, personal income tax rates and thresholds (central government)",
"url": "https://sdmx.oecd.org/public/rest/data/OECD.CTP.TPS,DSD_TAX_PIT@DF_PIT_CENT,/all?startPeriod=2025",
"retrievedAt": "2026-09-08",
"retrievedBy": "api",
"contentHash": "sha256:9f0d78c8e8853394940e165e0d4ae5ebf2a4cb348d97cf9cc6df22a22e37eee4",
"locator": "GBR / incomeTax.personalAllowance / period 2025 (our rule is taxYear 2026; periods do not align)",
"quote": "12570"
}
]
}Nothing is nested more than two levels deep and nothing is a reference to another record, so a single rule can be lifted out of the file and still says everything about itself. That one is real: it is gb.income_tax.personal_allowance.ty2026 as the download holds it, printed rather than described.
Of the 995 records, 935 carry a notes field stating what the figure is not, 25 carry an independent crossCheck, and 8 name a rule they replace. Where a field is absent it is absent because the thing it describes does not exist, never because it was omitted for brevity.
What it does not cover
Only what has been ingested
Only the jurisdictions we have actually read. Where a calculator shows a figure this file does not contain, that figure is prototype data awaiting a source, and it is marked as such on the page rather than quietly mixed in with the sourced ones.
39 jurisdictions appear in the file. 12 are published as calculators. The gap between those two numbers is the point of the refusals list, and it is deliberate rather than a backlog.
No personal circumstances
The file holds statutory figures, not situations. Reliefs, other income, marriage allowances, student loans, salary sacrifice, pension arrangements, residence history and the timing of a move are all absent, and any one of them can move a real answer further than the headline rate does.
Employer social security is held for a few jurisdictions and used by none of them. It never appears in gross pay, so including it would change how a country ranks for a reason that has nothing to do with what lands in an account.
Verified status, on 7 of 995
988 of the 995 records read "status": "ingested". They have neither a golden test against an authority’s own worked example nor a second compiler agreeing for the same tax year, which together are what this project means by verified.
If you build on this file, that field is the one to read first. It is in the data precisely so that your product can be as careful as ours, or more so.
Using it
CC BY 4.0. Attribute Nations Tax Calculator and keep the source references intact, so whoever reads your version can still reach the original document. The rules are ours to transcribe, not ours to own: the underlying legislation belongs to the authorities named in every record.
One condition is not ours to waive. OECD data in this file is used under the OECD Terms and Conditions, which permit commercial reuse with credit in a format the OECD sets. If you take the file you carry those citations with it, and you must impose the same requirement on anyone you pass it to. The citations are printed in full on the source of record and inside the file’s own attribution block.
We would rather you disagreed with us in public than trusted us in private. If your reading of a clause differs from ours, the useful thing to send is the clause, not the result, and it goes in the corrections log whether or not it turns out we were wrong.
The file’s attribution.passThrough field states the same requirement in machine-readable form, so a pipeline can carry it without a human remembering to.
Three ways in
The whole file if you are building something, the table if you are checking one figure, the changelog if you want to know what moved and when. All three render from the same records.