Find anything on this site69 of 69 records
69 records indexed: every page, every jurisdiction with its reconciliation result, the guides, the rules cited here and every correction.
Provenance · two of four

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.

The rulesetgenerated 2026-09-08

ruleset.json

995
rules
9
authorities
39
jurisdictions
4
tax years
version sha256:fe993d9d072cbcac · 2023, 2024, 2025, 2026 · CC BY 4.0

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.

One record, in full
{
  "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.

Field by field
idPermanent and readable: jurisdiction, concept, tax year. Never reissued, so a correction can always be tied to the figure it corrected.
jurisdictionISO country code, or a country and a sub-central code where a figure belongs to a region rather than a nation.
taxYearA first-class field, never inferred from the clock. The exclusion for the year you earned the income is a different number from the one for the year you file.
effectiveFrom / effectiveToThe window the figure actually governs. A UK tax year starts on 6 April, and a rule that pretended otherwise would be wrong for three months of every calendar year.
domainWhat kind of thing this is: a rate, an allowance, a threshold, a band schedule, a rounding rule.
conceptThe dotted name the engine looks the rule up by. Two jurisdictions expressing the same idea share a concept, which is what makes a comparison possible at all.
value.kindscalar, brackets, cap or rounding. The shape tells you how to apply it without guessing from the label.
value.valueInteger minor units for money: 1257000 is £12,570. Ratios are decimals. No floats anywhere in a money field.
source.authorityNameWho said so, spelled as they spell it.
source.documentTitleThe publication, named as the authority names it, not as we would summarise it.
source.urlThe machine-readable endpoint or document we actually read, and source.landingUrl the human page beside it where the two differ.
source.locatorThe clause, table row or data key inside the document. Enough to find the figure again without reading the whole page.
source.quoteThe sentence we actually read, verbatim, including the authority's own punctuation and currency formatting.
source.contentHashsha256 of our archived copy of that text. Government pages move; this is how a dead URL stays checkable.
source.retrievedAtThe day we read it. A real date per record, not one build timestamp stamped across the file.
source.retrievedByHow it was read: an API, a document, a person. A figure read by machine and a figure typed by a human carry different risks and the file says which.
verification.statusingested, verified, derived, estimated or needs-review. Read this before you trust any figure in the file.
verification.testIdsThe golden fixtures covering this rule, each one an authority's own worked example. An empty array is the honest state of most of the file.
crossCheckThe independent second source, where one exists. A rule cannot reach verified without it.
confidencehigh, medium or low. A rule sourced from a compilation of national law rather than from the law itself may not claim high.
supersedesPresent only on a revision, naming the rule it replaces. The old rule stays in the file, so a rate change is additive rather than destructive.
maxAgeDaysHow long this figure may go unread before it counts as stale. Past that limit the site refuses to publish it rather than serving it anyway.
notesWhat the figure is not. Scope limits, excluded categories, and why a reference figure exists where we cannot compute one.

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.

Attribution, ready to paste
Nations Tax Calculator, 2026-09-08, CC BY 4.0. Contains data from the OECD, used under the OECD Terms and Conditions.

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.

licenceCC BY 4.0 over this compilation
schemaA Dataset node with one citation per source document, declared once and referenced by id from every article on the site
stabilityRule ids are permanent. A superseded rule stays in the file and the replacement names it, so a change is additive rather than destructive
freshnessEvery record carries maxAgeDays, and a figure past its own limit is refused publication rather than served stale

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.

ruleset.jsonSource of recordRate changelog