> Rates and thresholds with the Check Take Home Pay API, GET /v1/rates: every field, an example request in cURL, Node.js and Python, and the response.

Web version: https://checktakehomepay.co.uk/docs/api/rates · Last updated: 2026-10-09

# Rates and thresholds

`GET /v1/rates` No key

Every rate and threshold for a tax year: income tax bands by region, NI thresholds and rates by category letter, student loans, allowances, employer costs, statutory pay, dividends, the self-employed, corporation tax, the minimum wage and redundancy pay, with gov.uk sources. No key needed.

## Request

Parameters in the path and query string.

| Field | Type | Description |
| --- | --- | --- |
| `tax_year` optional, in the query | string | The tax year, such as 2026-27. The latest when not given. |

## Example

cURL

```
curl https://api.checktakehomepay.co.uk/v1/rates
```

Node.js

```
const response = await fetch('https://api.checktakehomepay.co.uk/v1/rates');
const result = await response.json();
```

Python

```
import requests

response = requests.get("https://api.checktakehomepay.co.uk/v1/rates")
result = response.json()
```

## Response

200, with the result and what produced it: `tax_year`, `engine`, `hmrc_test_data`, `assumptions` and `sources`. This is the example's real response. Every field's type is in the [OpenAPI document](https://api.checktakehomepay.co.uk/openapi.json).

200 OK

```
{
  "tax_year": "2026-27",
  "engine": "2026-27.1",
  "hmrc_test_data": "rest of UK and Welsh tax v1.0, Scottish tax v1.1, NI v1.0, directors NI v1.0, student loans v1.0",
  "income_tax": {
    "personal_allowance": 12570,
    "personal_allowance_taper_threshold": 100000,
    "blind_persons_allowance": 3250,
    "marriage_allowance": 1260,
    "bands": {
      "rest_of_uk": [
        {
          "rate": 20,
          "from": 0,
          "to": 37700
        },
        {
          "rate": 40,
          "from": 37700,
          "to": 125140
        },
        {
          "rate": 45,
          "from": 125140,
          "to": null
        }
      ],
      "scotland": [
        {
          "rate": 19,
          "from": 0,
          "to": 3967
        },
        {
          "rate": 20,
          "from": 3967,
          "to": 16956
        },
        {
          "rate": 21,
          "from": 16956,
          "to": 31092
        },
        {
          "rate": 42,
          "from": 31092,
          "to": 62430
        },
        {
          "rate": 45,
          "from": 62430,
          "to": 125140
        },
        {
          "rate": 48,
          "from": 125140,
          "to": null
        }
      ],
      "wales": [
        {
          "rate": 20,
          "from": 0,
          "to": 37700
        },
        {
          "rate": 40,
          "from": 37700,
          "to": 125140
        },
        {
          "rate": 45,
          "from": 125140,
          "to": null
        }
      ]
    },
    "regulatory_limit": 50
  },
  "national_insurance": {
    "thresholds": {
      "lower_earnings_limit": 6708,
      "primary_threshold": 12570,
      "secondary_threshold": 5000,
      "freeport_upper_secondary_threshold": 25000,
      "upper_earnings_limit": 50270
    },
    "employee": {
      "A": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "M": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "H": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "F": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "V": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "N": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 8,
        "above_upper_earnings_limit": 2
      },
      "B": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 1.85,
        "above_upper_earnings_limit": 2
      },
      "I": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 1.85,
        "above_upper_earnings_limit": 2
      },
      "E": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 1.85,
        "above_upper_earnings_limit": 2
      },
      "C": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 0
      },
      "S": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 0
      },
      "K": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 0
      },
      "J": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 2,
        "above_upper_earnings_limit": 2
      },
      "L": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 2,
        "above_upper_earnings_limit": 2
      },
      "Z": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 2,
        "above_upper_earnings_limit": 2
      },
      "D": {
        "lower_earnings_limit_to_primary_threshold": 0,
        "primary_threshold_to_upper_earnings_limit": 2,
        "above_upper_earnings_limit": 2
      }
    },
    "employer": {
      "A": {
        "secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "B": {
        "secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "C": {
        "secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "J": {
        "secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "H": {
        "secondary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 15
      },
      "M": {
        "secondary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 15
      },
      "V": {
        "secondary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 15
      },
      "Z": {
        "secondary_threshold_to_upper_earnings_limit": 0,
        "above_upper_earnings_limit": 15
      },
      "F": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "I": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "S": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "L": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "D": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "E": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "K": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      },
      "N": {
        "secondary_threshold_to_freeport_upper_secondary_threshold": 0,
        "freeport_upper_secondary_threshold_to_upper_earnings_limit": 15,
        "above_upper_earnings_limit": 15
      }
    }
  },
  "student_loans": {
    "plan_1": {
      "threshold": 26900,
      "rate": 9
    },
    "plan_2": {
      "threshold": 29385,
      "rate": 9
    },
    "plan_4": {
      "threshold": 33795,
      "rate": 9
    },
    "plan_5": {
      "threshold": 25000,
      "rate": 9
    },
    "postgraduate": {
      "threshold": 21000,
      "rate": 6
    }
  },
  "married_couples_allowance": {
    "maximum": 11700,
    "minimum": 4530,
    "income_limit": 39200,
    "rate": 10
  },
  "child_benefit": {
    "eldest_child_weekly": 27.05,
    "other_child_weekly": 17.9,
    "weeks_in_year": 53,
    "high_income_charge_threshold": 60000,
    "high_income_charge_step": 200
  },
  "childcare_vouchers": {
    "weekly": {
      "basic": 55,
      "higher": 28,
      "additional": 25
    },
    "monthly": {
      "basic": 243,
      "higher": 124,
      "additional": 110
    }
  },
  "employer": {
    "class_1a_ni": 15,
    "employment_allowance": 10500,
    "apprenticeship_levy": 0.5,
    "auto_enrolment_minimum": 3,
    "qualifying_earnings": {
      "weekly": {
        "lower": 120,
        "upper": 967
      },
      "two_weekly": {
        "lower": 240,
        "upper": 1934
      },
      "four_weekly": {
        "lower": 480,
        "upper": 3867
      },
      "monthly": {
        "lower": 520,
        "upper": 4189
      }
    }
  },
  "statutory_pay": {
    "sick_pay_weekly": 123.25,
    "sick_pay_earnings_percent": 80,
    "sick_pay_max_weeks": 28,
    "family_pay_weekly": 194.32,
    "family_pay_earnings_percent": 90
  },
  "dividends": {
    "allowance": 500,
    "basic": 10.75,
    "higher": 35.75,
    "additional": 39.35
  },
  "self_employed": {
    "lower_profits_limit": 12570,
    "upper_profits_limit": 50270,
    "class_4_main": 6,
    "class_4_additional": 2,
    "small_profits_threshold": 7105,
    "class_2_weekly": 3.65
  },
  "corporation_tax": {
    "small_profits_rate": 19,
    "main_rate": 25,
    "lower_limit": 50000,
    "upper_limit": 250000,
    "marginal_relief_fraction": "3/200"
  },
  "minimum_wage": {
    "aged_21_and_over": 12.71,
    "aged_18_to_20": 10.85,
    "under_18": 8,
    "apprentice": 8
  },
  "redundancy": {
    "weekly_pay_cap": 751
  },
  "assumptions": [
    "Amounts are pounds a year unless the name says weekly or monthly; rates are percentages.",
    "Income tax bands are taxable income above the allowances. National Insurance thresholds are annual; payroll works them out for each pay period."
  ],
  "sources": [
    "https://www.gov.uk/government/publications/payroll-technical-specifications-income-tax",
    "https://www.gov.uk/government/publications/payroll-technical-specifications-national-insurance",
    "https://www.gov.uk/government/publications/payroll-technical-specifications-student-loans/collection-of-student-loans-from-6-april-2026",
    "https://www.gov.uk/income-tax-rates",
    "https://www.gov.uk/marriage-allowance",
    "https://www.litrg.org.uk/tax-and-nic/income-tax/tax-allowances/blind-persons-allowance",
    "https://www.thepensionsregulator.gov.uk/en/employers/new-employers/im-an-employer-who-has-to-provide-a-pension/declare-your-compliance/ongoing-duties-for-employers/earnings-thresholds",
    "https://www.litrg.org.uk/tax-and-nic/income-tax/tax-allowances/married-couples-allowance",
    "https://www.gov.uk/government/publications/rates-and-allowances-tax-credits-child-benefit-and-guardians-allowance/tax-credits-child-benefit-and-guardians-allowance",
    "https://www.gov.uk/child-benefit-tax-charge",
    "https://www.gov.uk/hmrc-internal-manuals/employment-income-manual/eim22012",
    "https://www.gov.uk/hmrc-internal-manuals/employment-income-manual/eim16056",
    "https://www.gov.uk/expenses-and-benefits-childcare/whats-exempt",
    "https://www.gov.uk/national-minimum-wage-rates",
    "https://www.gov.uk/redundant-your-rights/redundancy-pay",
    "https://www.gov.uk/tax-on-dividends",
    "https://www.gov.uk/self-employed-national-insurance-rates",
    "https://www.gov.uk/corporation-tax-rates",
    "https://www.gov.uk/guidance/corporation-tax-marginal-relief",
    "https://www.gov.uk/guidance/rates-and-thresholds-for-employers-2026-to-2027",
    "https://www.gov.uk/guidance/statutory-sick-pay-manually-calculate-your-employees-payments",
    "https://www.thepensionsregulator.gov.uk/en/business-advisers/automatic-enrolment-guide-for-business-advisers/minimum-contribution-increases-planned-by-law-phasing",
    "https://www.gov.uk/government/publications/software-developers-payroll-test-data-2026-to-2027"
  ]
}
```

## Errors

-   400 `INVALID_INPUT`: the message names each field that is wrong.

Every code, and how to handle them: [Errors](https://checktakehomepay.co.uk/docs/errors).
