# UK Pay & Calendar Calculator 2026/27 (`tudorlane/uk-pay-calendar-calculator`) Actor

UK 2026/27 calculator for AI agents: take-home pay (income tax, NI, PAYE), stamp duty, student loan, VAT, minimum wage, SSP, SMP, council tax, working days. GOV.UK-sourced.

- **URL**: https://apify.com/tudorlane/uk-pay-calendar-calculator.md
- **Developed by:** [Tudor Lane](https://apify.com/tudorlane) (community)
- **Categories:** Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 calculations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Pay & Calendar Calculator 2026/27

**What it does:** UK take-home pay, income tax, NI, stamp duty, VAT, minimum wage, SSP/SMP, student loans, council tax, mileage and UK working days for 2026/27, as clean JSON.

**Who it's for:** AI assistants, HR/payroll and personal-finance agents, fintech and property apps that need deterministic UK figures.

**Price:** Pay per event: **$0.01 per calculation**, **$0.003 per simple lookup**. No subscription. You only pay Apify for what you run; there is no monthly fee for this Actor.

**UK income tax, National Insurance, net salary / PAYE take-home pay, stamp duty (SDLT, LBTT, LTT), student loan repayments, VAT, National Minimum Wage / National Living Wage, Statutory Sick Pay (SSP), Statutory Maternity Pay (SMP), council tax, working days and HMRC mileage — 2026/27, from GOV.UK.**

**For AI agents and MCP clients.** One Actor, eleven deterministic UK answers, sourced from GOV.UK. Each result is a single JSON object with `sources[]`, `last_verified`, `tax_year` and a `disclaimer`. There's no scraping, no proxies, and it runs in about 1–2 seconds.

> ⚠️ **Not tax advice.** Estimates for information only, not tax, legal or financial advice. Verify with HMRC/GOV.UK or a qualified adviser.

### When an agent should call this

- "What's my take-home on £45k in Scotland with a Plan 2 loan and 5% salary-sacrifice pension?" → `take_home`
- "How many working days between 21 Dec and 8 Jan in Scotland?" / "What's 10 working days after 24 Dec?" → `working_days`
- "I drove 12,000 business miles and my employer paid 30p. What can I claim?" → `mileage_claim`
- "Roughly what's Band C council tax at CF10 1AA?" → `council_tax_estimate`
- "Student loan repayment on £40k, Plan 2 + postgrad?" → `student_loan`
- "Stamp duty on a £295k house, first-time buyer / second home / Scotland / Wales?" → `stamp_duty`
- "Add or remove 20% VAT from £120" → `vat`
- "What is the minimum wage for a 19-year-old?" → `minimum_wage`
- "How much statutory sick pay for 10 days?" → `ssp`
- "How much maternity pay on £500 a week?" → `smp`
- "What are the current UK tax thresholds / minimum wage / VAT threshold?" → `rates`

### Input

Always set `action`, plus only the fields that action uses:

| action | required | optional |
|---|---|---|
| `take_home` | `salary_gbp` | `pay_period` (annual/monthly/weekly/hourly), `hours_per_week`, `age`, `region` (england/wales/scotland/northern_ireland), `student_loan_plans` \[plan1, plan2, plan4, plan5, postgrad], `pension` {percent, method: relief_at_source/net_pay/salary_sacrifice}, `above_state_pension_age` |
| `working_days` | `start_date` (YYYY-MM-DD) | `end_date` (inclusive count) **or** `add_working_days` (±N); neither = next working day; `region` |
| `mileage_claim` | `business_miles` | `vehicle` (car/van/motorcycle/bicycle), `passengers`, `employer_rate_ppm` (GBP per mile, e.g. 0.30) |
| `council_tax_estimate` | `postcode`, `band` (A–H; I in Wales) | — |
| `rates` | — | — |
| `student_loan` | `income_gbp` | `student_loan_plans` (default \[plan2]), `pay_period` (annual/monthly/weekly) |
| `stamp_duty` | `price_gbp` | `nation` (england/northern_ireland/scotland/wales), `first_time_buyer`, `additional_property`, `non_resident` |
| `vat` | `amount_gbp` | `vat_rate` (standard/reduced/zero), `vat_mode` (add/remove) |
| `minimum_wage` | — | `age`, `apprentice`, `hourly_rate_gbp`, `hours_per_week` |
| `ssp` | `average_weekly_earnings_gbp` | `sick_days`, `qualifying_days_per_week` |
| `smp` | `average_weekly_earnings_gbp` | — |

#### Examples

```json
{"action":"take_home","salary_gbp":45000,"region":"scotland","student_loan_plans":["plan2"],"pension":{"percent":5,"method":"salary_sacrifice"}}
{"action":"working_days","start_date":"2026-12-21","end_date":"2027-01-08","region":"scotland"}
{"action":"mileage_claim","business_miles":12000,"employer_rate_ppm":0.30}
{"action":"council_tax_estimate","postcode":"CF10 1AA","band":"C"}
{"action":"rates"}
{"action":"student_loan","income_gbp":40000,"student_loan_plans":["plan2","postgrad"]}
{"action":"stamp_duty","price_gbp":295000,"first_time_buyer":true}
{"action":"vat","amount_gbp":120,"vat_mode":"remove"}
{"action":"minimum_wage","age":19}
{"action":"ssp","average_weekly_earnings_gbp":450,"sick_days":10}
{"action":"smp","average_weekly_earnings_gbp":500}
```

### Output

The result goes to the default dataset (one item) and the key-value store record `OUTPUT`. Abridged `take_home`:

```json
{"action":"take_home","tax_year":"2026-27","region":"england",
 "gross":{"annual":30000,"monthly":2500,"weekly":576.92},
 "income_tax":3486,"national_insurance":1394.4,"student_loan_total":0,
 "net":{"annual":25119.6,"monthly":2093.3,"weekly":483.07},
 "marginal_rate":0.28,"effective_rate":0.1627,"breakdown":[...],"nmw_check":null,
 "sources":["https://www.gov.uk/guidance/rates-and-thresholds-for-employers-2026-to-2027"],
 "last_verified":"2026-10-20","disclaimer":"Estimates for information only, ..."}
```

On bad input you get `{"action":..., "error":"<what to fix>", ...}` and **no charge**.

### Using it from an agent / MCP

- **Apify MCP server:** add this Actor to your Apify MCP configuration (`https://mcp.apify.com`, or `npx @apify/actors-mcp-server --actors tudorlane/uk-pay-calendar-calculator`). It appears as a tool whose input is the schema above.
- **API:** `POST https://api.apify.com/v2/acts/tudorlane~uk-pay-calendar-calculator/run-sync-get-dataset-items?token=...` with the JSON input. It returns `[result]`.

### Pricing (pay per event)

| Event | When charged | Price |
|---|---|---|
| `actor-start` | each run (Apify default) | $0.00005 |
| `calculation` | successful `take_home`, `council_tax_estimate`, `student_loan`, `stamp_duty`, `vat`, `minimum_wage`, `ssp` or `smp` | $0.01 |
| `lookup` | successful `working_days`, `mileage_claim` or `rates` | $0.003 |

Failed or invalid-input runs only incur `actor-start`.

### Scope and limits

- Tax year **2026/27 only** (6 Apr 2026 – 5 Apr 2027). Employee PAYE on an annual basis, tax code 1257L, NI category A. No benefits in kind, dividends, self-employment, Marriage Allowance or Blind Person's Allowance.
- Higher-rate relief on relief-at-source pensions is claimed via Self Assessment, so it isn't deducted here.
- Council tax uses the council's **average** Band D (incl. police, fire and average parish precepts) × the statutory band ratio. It excludes discounts and reductions and covers England and Wales only. **It does not and will not look up a property's band.**
- Bank holidays come live from GOV.UK with a bundled fallback snapshot. Future years only cover what GOV.UK has announced.
- Rates are updated each April. `last_verified` shows when the figures were last checked.

### Sources & licence

GOV.UK (HMRC, MHCLG), Welsh Government, gov.uk/bank-holidays.json and postcodes.io. Full list in SOURCES.md.
Contains public sector information licensed under the Open Government Licence v3.0. Postcode data: contains OS data © Crown copyright and database right; Royal Mail data © Royal Mail copyright and database right; ONS data © Crown copyright.

### Quick example

**Input**

```json
{
 "action": "take_home",
 "tax_year": "2026-27",
 "salary_gbp": 35000,
 "pay_period": "annual",
 "region": "england",
 "pension": {
  "percent": 0,
  "method": "relief_at_source"
 },
 "above_state_pension_age": false,
 "vehicle": "car",
 "passengers": 0,
 "postcode": "SW1A 1AA",
 "nation": "england",
 "first_time_buyer": false,
 "additional_property": false,
 "non_resident": false,
 "vat_rate": "standard",
 "vat_mode": "add",
 "apprentice": false,
 "qualifying_days_per_week": 5
}
```

**Output** (one dataset item, shortened)

```json
{
 "action": "smp",
 "eligible_on_earnings": true,
 "weeks_1_to_6_weekly": 450,
 "weeks_7_to_39_weekly": 194.32,
 "total_39_weeks": 9112.56,
 "rule": "90% of AWE for 6 weeks, then lower of £194.32 or 90% of AWE for 33 weeks; needs AWE ≥ £129 and 26 weeks' service",
 "assumptions": [
  "Service (26 weeks into the qualifying week) and notice conditions are assumed met.",
  "If not eligible on earnings, Maternity Allowance may apply instead. Taxable."
 ],
 "sources": [
  "https://www.gov.uk/maternity-pay-leave/pay",
  "https://www.gov.uk/maternity-pay-leave/eligibility"
 ],
 "tax_year": "2026-27",
 "last_verified": "2026-10-21",
 "disclaimer": "Estimates for information only, not tax, legal or financial advice. Verify with HMRC/GOV.UK or a qualified adviser.",
 "attribution": "Contains public sector information licensed under the Open Government Licence v3.0."
}
```

### Use it from AI agents (MCP) and code

- **Apify MCP server:** add `https://mcp.apify.com/?tools=tudorlane/uk-pay-calendar-calculator` to Claude, Cursor, ChatGPT connectors, VS Code or any MCP client (sign in with Apify OAuth or an API token). The Actor appears as a tool the model can call.
- **REST (sync):** `POST https://api.apify.com/v2/acts/tudorlane~uk-pay-calendar-calculator/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON as the body; results come back in the response.
- **SDKs / no-code:** `apify-client` (Python/JS), LangChain, LlamaIndex, CrewAI, n8n, Make and Zapier integrations.

### FAQ

**Is it tax advice?** No. Estimates from GOV.UK rates for information only; every answer includes sources and a disclaimer.

**Which tax year?** 2026/27 (England, Wales, NI and Scotland rates).

**How fast?** About 1-2 seconds; no scraping.

**What if the source is down?** You get an `error` row and are not charged for it.

**Support?** Open an issue on the Actor's Issues tab.

***

Keywords: UK tax calculator API, take-home pay API, PAYE calculator, National Insurance calculator, stamp duty calculator API, SDLT, LBTT, minimum wage API, UK bank holidays, working days UK, MCP tool, Apify Actor, AI agent tool.

# Actor input Schema

## `action` (type: `string`):

What to calculate.

## `tax_year` (type: `string`):

Only 2026-27 is supported in v1.

## `salary_gbp` (type: `number`):

take_home: gross pay per `pay_period`.

## `pay_period` (type: `string`):

take_home: what `salary_gbp` represents.

## `hours_per_week` (type: `number`):

Required if pay_period=hourly; also enables the minimum wage check.

## `age` (type: `integer`):

take_home: with hours_per_week, checks National Minimum/Living Wage.

## `region` (type: `string`):

take_home: Scotland uses Scottish income tax. working_days: selects the bank-holiday calendar.

## `student_loan_plans` (type: `array`):

take_home: zero or more plans.

## `pension` (type: `object`):

take_home: {"percent": 5, "method": "relief_at_source" | "net_pay" | "salary_sacrifice"}. Percent of gross pay.

## `above_state_pension_age` (type: `boolean`):

take_home: no employee NI if true.

## `start_date` (type: `string`):

working_days: YYYY-MM-DD (defaults to today).

## `end_date` (type: `string`):

working_days: inclusive end date. Omit to use add_working_days / next working day.

## `add_working_days` (type: `integer`):

working_days: add N (negative = subtract) working days to start_date. Omit both this and end_date for 'next working day'.

## `business_miles` (type: `number`):

mileage_claim: business miles in the tax year.

## `vehicle` (type: `string`):

mileage_claim.

## `passengers` (type: `integer`):

mileage_claim: fellow employees carried.

## `employer_rate_ppm` (type: `number`):

mileage_claim: what the employer pays per mile, e.g. 0.30. Returns relief claimable or taxable excess.

## `postcode` (type: `string`):

council_tax_estimate: full UK postcode (England or Wales).

## `band` (type: `string`):

council_tax_estimate: the property's band (I is Wales only). Not looked up.

## `income_gbp` (type: `number`):

student_loan: gross income per pay_period.

## `price_gbp` (type: `number`):

stamp_duty: purchase price.

## `nation` (type: `string`):

stamp_duty: SDLT (England/NI), LBTT (Scotland), LTT (Wales).

## `first_time_buyer` (type: `boolean`):

stamp_duty.

## `additional_property` (type: `boolean`):

stamp_duty: buyer will own more than one home.

## `non_resident` (type: `boolean`):

stamp_duty: England/NI 2% surcharge.

## `amount_gbp` (type: `number`):

vat: the amount to add VAT to or remove VAT from.

## `vat_rate` (type: `string`):

vat: 20%, 5% or 0%.

## `vat_mode` (type: `string`):

vat: add VAT to a net amount or remove it from a gross amount.

## `apprentice` (type: `boolean`):

minimum_wage.

## `hourly_rate_gbp` (type: `number`):

minimum_wage: rate to check against the legal minimum.

## `average_weekly_earnings_gbp` (type: `number`):

ssp/smp: average weekly earnings before tax.

## `sick_days` (type: `integer`):

ssp: qualifying days off sick.

## `qualifying_days_per_week` (type: `integer`):

ssp.

## Actor input object example

```json
{
  "action": "take_home",
  "tax_year": "2026-27",
  "salary_gbp": 35000,
  "pay_period": "annual",
  "region": "england",
  "pension": {
    "percent": 0,
    "method": "relief_at_source"
  },
  "above_state_pension_age": false,
  "vehicle": "car",
  "passengers": 0,
  "postcode": "SW1A 1AA",
  "nation": "england",
  "first_time_buyer": false,
  "additional_property": false,
  "non_resident": false,
  "vat_rate": "standard",
  "vat_mode": "add",
  "apprentice": false,
  "qualifying_days_per_week": 5
}
```

# Actor output Schema

## `result` (type: `string`):

Single JSON result object, also the first dataset item.

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "action": "take_home",
    "salary_gbp": 35000,
    "pension": {
        "percent": 0,
        "method": "relief_at_source"
    },
    "postcode": "SW1A 1AA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("tudorlane/uk-pay-calendar-calculator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "action": "take_home",
    "salary_gbp": 35000,
    "pension": {
        "percent": 0,
        "method": "relief_at_source",
    },
    "postcode": "SW1A 1AA",
}

# Run the Actor and wait for it to finish
run = client.actor("tudorlane/uk-pay-calendar-calculator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "action": "take_home",
  "salary_gbp": 35000,
  "pension": {
    "percent": 0,
    "method": "relief_at_source"
  },
  "postcode": "SW1A 1AA"
}' |
apify call tudorlane/uk-pay-calendar-calculator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tudorlane/uk-pay-calendar-calculator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/B8ucmnNuzjRITIdcc/builds/woheGrNvWbc98tosA/openapi.json
