Download OpenAPI specification:Download
UK tax calculation and optimisation API. Calculate income tax, National Insurance, child benefit charges, and discover tax-saving strategies for PAYE employees and limited company contractors.
Get CSRF token for cross-origin requests.
This endpoint allows frontend applications to obtain a CSRF token before making state-changing requests (POST, PUT, DELETE).
Returns: 200: CSRF token in response body and as cookie
Example response: {"csrfToken": "abc123..."}
Send magic link to user's email for passwordless login.
POST /api/auth/magic-link/login Body: {"email": "user@example.com"} Returns: 204 No Content (doesn't reveal if email exists)
Creates magic link token without creating user (user created on verification). Sends email with magic link that expires in 15 minutes.
| email required | string <email> Email address to send magic link to |
{- "email": "user@example.com"
}{- "email": "user@example.com"
}Get current session information.
GET /api/auth/session Returns: 200 OK always with user data if authenticated, null if not
Response:
{- "id": 0,
- "external_id": "95c35493-41aa-44f8-9154-5a25cbbc1865",
- "email": "user@example.com",
- "tax_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Verify magic link token and log user in.
POST /api/auth/magic-link/verify Body: {"token": "abc123..."} Returns: 204 No Content with session cookie
Validates token is not expired and not already used. Marks token as used after successful verification. Creates Django session for the user.
CSRF exempt because the magic link token itself is the security mechanism.
| token required | string <= 64 characters Magic link token from email |
{- "token": "string"
}{- "token": "string"
}Calculate comprehensive tax report for household.
Accepts household data and returns full calculator report including:
| primary_tax_code | string <= 20 characters Default: "1257L" |
| primary_gross_salary | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_salary_sacrifice_contributions | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_pension_contribution | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_pension_contribution_unit | string Default: "amount" Enum: "amount" "percentage"
|
| primary_pension_contribution_type | string Default: "relief_at_source" Enum: "relief_at_source" "salary_sacrifice" "net_pay"
|
| primary_employer_pension_contribution | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_employer_pension_contribution_unit | string Default: "amount" Enum: "amount" "percentage"
|
| primary_payroll_giving_donations | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_gift_aid_donations | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| primary_taxable_benefits | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| partner_tax_code | string or null <= 20 characters |
| partner_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_salary_sacrifice_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_net_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
(PartnerNetPensionContributionsTypeA40Enum (string or null)) or (NullEnum (any or null)) | |
| partner_employer_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
(PartnerEmployerPensionContributionsTypeA40Enum (string or null)) or (NullEnum (any or null)) | |
| partner_payroll_giving_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_gift_aid_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_taxable_benefits | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
Array of objects (ChildInput) | |
| claims_child_benefit | boolean Default: false |
{- "primary_tax_code": "1257L",
- "primary_gross_salary": "0.00",
- "primary_salary_sacrifice_contributions": "0.00",
- "primary_pension_contribution": "0.00",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "0.00",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_payroll_giving_donations": "0.00",
- "primary_gift_aid_donations": "0.00",
- "primary_taxable_benefits": "0.00",
- "partner_tax_code": "string",
- "partner_gross_salary": "string",
- "partner_salary_sacrifice_contributions": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_payroll_giving_donations": "string",
- "partner_gift_aid_donations": "string",
- "partner_taxable_benefits": "string",
- "children": [
- {
- "age": 18,
- "claims_free_childcare_hours": false,
- "claims_tax_free_childcare": false
}
], - "claims_child_benefit": false
}{- "primary_tax_code": "1257L",
- "primary_gross_salary": "0.00",
- "primary_salary_sacrifice_contributions": "0.00",
- "primary_pension_contribution": "0.00",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "0.00",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_payroll_giving_donations": "0.00",
- "primary_gift_aid_donations": "0.00",
- "primary_taxable_benefits": "0.00",
- "partner_tax_code": "string",
- "partner_gross_salary": "string",
- "partner_salary_sacrifice_contributions": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_payroll_giving_donations": "string",
- "partner_gift_aid_donations": "string",
- "partner_taxable_benefits": "string",
- "children": [
- {
- "age": 18,
- "claims_free_childcare_hours": false,
- "claims_tax_free_childcare": false
}
], - "claims_child_benefit": false
}Calculate contractor results from input payload.
| annual_revenue required | string <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Annual company revenue |
| business_expenses | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" Annual deductible business expenses |
| retained_profits | string <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Default: "0.00" Retained profits from prior years |
| total_pension_contribution | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" Employer pension contribution |
| eligible_for_employment_allowance | boolean Default: false |
| associated_companies | integer >= 0 Default: 0 |
| vat_registered | boolean Default: false |
| vat_using_flat_rate_scheme | boolean Default: false |
| vat_flat_rate_percentage | string or null <decimal> ^-?\d{0,2}(?:\.\d{0,2})?$ |
| quarterly_goods_cost | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| director_salary required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Director salary (e.g. £12,570) |
| director_shareholding_percentage | string <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Default: "100.00" |
| director_self_employment_income | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_other_income | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_tax_code | string <= 20 characters Default: "1257L" |
| director_personal_pension | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_charitable_donations | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| partner_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_shareholding_percentage | string or null <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ |
| partner_self_employment_income | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_other_income | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_tax_code | string or null <= 20 characters |
| partner_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_charitable_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
Array of objects (ChildInput) | |
| claims_child_benefit | boolean Default: false |
| total_dividends | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
| retain_this_year | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
{- "annual_revenue": "string",
- "business_expenses": "0.00",
- "retained_profits": "0.00",
- "total_pension_contribution": "0.00",
- "eligible_for_employment_allowance": false,
- "associated_companies": 0,
- "vat_registered": false,
- "vat_using_flat_rate_scheme": false,
- "vat_flat_rate_percentage": "string",
- "quarterly_goods_cost": "string",
- "director_salary": "string",
- "director_shareholding_percentage": "100.00",
- "director_self_employment_income": "0.00",
- "director_other_income": "0.00",
- "director_tax_code": "1257L",
- "director_personal_pension": "0.00",
- "director_charitable_donations": "0.00",
- "partner_salary": "string",
- "partner_shareholding_percentage": "string",
- "partner_self_employment_income": "string",
- "partner_other_income": "string",
- "partner_tax_code": "string",
- "partner_personal_pension": "string",
- "partner_charitable_donations": "string",
- "children": [
- {
- "age": 18,
- "claims_free_childcare_hours": false,
- "claims_tax_free_childcare": false
}
], - "claims_child_benefit": false,
- "total_dividends": "string",
- "retain_this_year": "string"
}Calculate contractor results using saved settings with overrides.
| annual_revenue required | string <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Annual company revenue |
| business_expenses | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" Annual deductible business expenses |
| retained_profits | string <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Default: "0.00" Retained profits from prior years |
| total_pension_contribution | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" Employer pension contribution |
| eligible_for_employment_allowance | boolean Default: false |
| associated_companies | integer >= 0 Default: 0 |
| vat_registered | boolean Default: false |
| vat_using_flat_rate_scheme | boolean Default: false |
| vat_flat_rate_percentage | string or null <decimal> ^-?\d{0,2}(?:\.\d{0,2})?$ |
| quarterly_goods_cost | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| director_salary required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Director salary (e.g. £12,570) |
| director_shareholding_percentage | string <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Default: "100.00" |
| director_self_employment_income | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_other_income | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_tax_code | string <= 20 characters Default: "1257L" |
| director_personal_pension | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| director_charitable_donations | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| partner_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_shareholding_percentage | string or null <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ |
| partner_self_employment_income | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_other_income | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_tax_code | string or null <= 20 characters |
| partner_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| partner_charitable_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
Array of objects (ChildInput) | |
| claims_child_benefit | boolean Default: false |
| total_dividends | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
| retain_this_year | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
{- "annual_revenue": "string",
- "business_expenses": "0.00",
- "retained_profits": "0.00",
- "total_pension_contribution": "0.00",
- "eligible_for_employment_allowance": false,
- "associated_companies": 0,
- "vat_registered": false,
- "vat_using_flat_rate_scheme": false,
- "vat_flat_rate_percentage": "string",
- "quarterly_goods_cost": "string",
- "director_salary": "string",
- "director_shareholding_percentage": "100.00",
- "director_self_employment_income": "0.00",
- "director_other_income": "0.00",
- "director_tax_code": "1257L",
- "director_personal_pension": "0.00",
- "director_charitable_donations": "0.00",
- "partner_salary": "string",
- "partner_shareholding_percentage": "string",
- "partner_self_employment_income": "string",
- "partner_other_income": "string",
- "partner_tax_code": "string",
- "partner_personal_pension": "string",
- "partner_charitable_donations": "string",
- "children": [
- {
- "age": 18,
- "claims_free_childcare_hours": false,
- "claims_tax_free_childcare": false
}
], - "claims_child_benefit": false,
- "total_dividends": "string",
- "retain_this_year": "string"
}Create or delete a manual contribution entry (pension or charity).
| date required | string <date> Date of contribution |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
| contribution_type required | string Enum: "pension" "charity" Type of contribution (pension or charity)
|
| payment_method required | string Enum: "relief_at_source" "salary_sacrifice" "net_pay" How the contribution was paid
|
{- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}Create or delete a manual contribution entry (pension or charity).
| external_id required | string <uuid> |
| date required | string <date> Date of contribution |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
| contribution_type required | string Enum: "pension" "charity" Type of contribution (pension or charity)
|
| payment_method required | string Enum: "relief_at_source" "salary_sacrifice" "net_pay" How the contribution was paid
|
{- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}Create or delete a manual income entry.
| date required | string <date> Date of income |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual income tax entry.
| date required | string <date> Date of tax payment |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual income tax entry.
| external_id required | string <uuid> |
| date required | string <date> Date of tax payment |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual income entry.
| external_id required | string <uuid> |
| date required | string <date> Date of income |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual national insurance entry.
| date required | string <date> Date of NI contribution |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual national insurance entry.
| external_id required | string <uuid> |
| date required | string <date> Date of NI contribution |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
{- "date": "2019-08-24",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}Create or delete a manual taxable benefit entry.
| date required | string <date> Date of benefit |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
| description required | string <= 200 characters Description of the benefit (e.g., 'Company car', 'Private medical') |
{- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}Create or delete a manual taxable benefit entry.
| external_id required | string <uuid> |
| date required | string <date> Date of benefit |
| amount required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Amount in GBP |
| description required | string <= 200 characters Description of the benefit (e.g., 'Company car', 'Private medical') |
{- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}Retrieve or update user settings for the authenticated user.
GET: Returns user settings data with household information POST/PUT/PATCH: Update user settings (gross_salary, partner, children, etc.) DELETE: Delete all household data (partner, children, tax years)
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_payroll_giving_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Handle POST requests (same as PUT for household endpoint compatibility).
| primary_tax_code | string or null Primary user's tax code |
| primary_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected annual gross salary (user's plan for tax optimisation) |
| primary_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected pension contribution (user's plan for tax optimisation) |
(PrimaryPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether pension contribution is amount or percentage
| |
(PrimaryPensionContributionTypeBabEnum (string or null)) or (NullEnum (any or null)) Type of pension contribution
| |
| primary_employer_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected employer pension contribution |
(PrimaryEmployerPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether employer pension contribution is amount or percentage
| |
| primary_charity_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected charity contribution |
(PrimaryCharityContributionTypeEnum (string or null)) or (NullEnum (any or null)) Type of charity contribution
| |
| partner_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected gross salary |
| partner_net_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected pension contributions |
(PartnerNetPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner pension contribution is amount or percentage
| |
| partner_employer_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected employer pension contributions |
(PartnerEmployerPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner employer pension contribution is amount or percentage
| |
| partner_gift_aid_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected Gift Aid donations |
| partner_tax_code | string or null Partner's tax code (null if no partner) |
object or null Partner information (editable) | |
Array of objects (Child) Children (editable) | |
| claims_child_benefit | boolean Whether child benefit is claimed |
| preferred_strategy | string or null Preferred tax optimisation strategy |
| payslip_reminder_day | integer or null [ 1 .. 31 ] Day of month for payslip reminders (1-31). Null to disable. |
{- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_payroll_giving_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve or update user settings for the authenticated user.
GET: Returns user settings data with household information POST/PUT/PATCH: Update user settings (gross_salary, partner, children, etc.) DELETE: Delete all household data (partner, children, tax years)
| primary_tax_code | string or null Primary user's tax code |
| primary_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected annual gross salary (user's plan for tax optimisation) |
| primary_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected pension contribution (user's plan for tax optimisation) |
(PrimaryPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether pension contribution is amount or percentage
| |
(PrimaryPensionContributionTypeBabEnum (string or null)) or (NullEnum (any or null)) Type of pension contribution
| |
| primary_employer_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected employer pension contribution |
(PrimaryEmployerPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether employer pension contribution is amount or percentage
| |
| primary_charity_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected charity contribution |
(PrimaryCharityContributionTypeEnum (string or null)) or (NullEnum (any or null)) Type of charity contribution
| |
| partner_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected gross salary |
| partner_net_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected pension contributions |
(PartnerNetPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner pension contribution is amount or percentage
| |
| partner_employer_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected employer pension contributions |
(PartnerEmployerPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner employer pension contribution is amount or percentage
| |
| partner_gift_aid_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected Gift Aid donations |
| partner_tax_code | string or null Partner's tax code (null if no partner) |
object or null Partner information (editable) | |
Array of objects (Child) Children (editable) | |
| claims_child_benefit | boolean Whether child benefit is claimed |
| preferred_strategy | string or null Preferred tax optimisation strategy |
| payslip_reminder_day | integer or null [ 1 .. 31 ] Day of month for payslip reminders (1-31). Null to disable. |
{- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_payroll_giving_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve or update user settings for the authenticated user.
GET: Returns user settings data with household information POST/PUT/PATCH: Update user settings (gross_salary, partner, children, etc.) DELETE: Delete all household data (partner, children, tax years)
| primary_tax_code | string or null Primary user's tax code |
| primary_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected annual gross salary (user's plan for tax optimisation) |
| primary_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected pension contribution (user's plan for tax optimisation) |
(PrimaryPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether pension contribution is amount or percentage
| |
(PrimaryPensionContributionTypeBabEnum (string or null)) or (NullEnum (any or null)) Type of pension contribution
| |
| primary_employer_pension_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected employer pension contribution |
(PrimaryEmployerPensionContributionUnitB2eEnum (string or null)) or (NullEnum (any or null)) Whether employer pension contribution is amount or percentage
| |
| primary_charity_contribution | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Expected charity contribution |
(PrimaryCharityContributionTypeEnum (string or null)) or (NullEnum (any or null)) Type of charity contribution
| |
| partner_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected gross salary |
| partner_net_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected pension contributions |
(PartnerNetPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner pension contribution is amount or percentage
| |
| partner_employer_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected employer pension contributions |
(PartnerEmployerPensionContributionsTypeB2eEnum (string or null)) or (NullEnum (any or null)) Whether partner employer pension contribution is amount or percentage
| |
| partner_gift_aid_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Partner's expected Gift Aid donations |
| partner_tax_code | string or null Partner's tax code (null if no partner) |
object or null Partner information (editable) | |
Array of objects (Child) Children (editable) | |
| claims_child_benefit | boolean Whether child benefit is claimed |
| preferred_strategy | string or null Preferred tax optimisation strategy |
| payslip_reminder_day | integer or null [ 1 .. 31 ] Day of month for payslip reminders (1-31). Null to disable. |
{- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "primary_tax_code": "string",
- "primary_gross_salary": "string",
- "primary_pension_contribution": "string",
- "primary_pension_contribution_unit": "amount",
- "primary_pension_contribution_type": "relief_at_source",
- "primary_employer_pension_contribution": "string",
- "primary_employer_pension_contribution_unit": "amount",
- "primary_charity_contribution": "string",
- "primary_charity_contribution_type": "gift_aid",
- "partner_gross_salary": "string",
- "partner_net_pension_contributions": "string",
- "partner_net_pension_contributions_type": "amount",
- "partner_employer_pension_contributions": "string",
- "partner_employer_pension_contributions_type": "amount",
- "partner_gift_aid_donations": "string",
- "partner_payroll_giving_donations": "string",
- "partner_tax_code": "string",
- "partner": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "tax_code": "string"
}, - "children": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "age": 32767,
- "claims_free_childcare_hours": true,
- "claims_tax_free_childcare": true
}
], - "claims_child_benefit": true,
- "preferred_strategy": "string",
- "payslip_reminder_day": 1,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Create or delete a payslip with all related entries.
POST: Creates a Payslip object and all related Income, IncomeTax, NationalInsurance, and optionally Contribution entries in a single database transaction. DELETE: Deletes a payslip and all related entries (via cascade).
This ensures data integrity - either all entries are created/deleted successfully, or none are created/deleted if any validation fails.
| date required | string <date> Date of the payslip |
| gross_salary required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Gross salary amount in GBP |
| tax required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Income tax amount in GBP |
| national_insurance required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ National Insurance amount in GBP |
| pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Pension contribution amount in GBP |
(PensionMethodEnum (string or null)) or (NullEnum (any or null)) Default: "relief_at_source" Payment method for pension (relief_at_source or salary_sacrifice)
| |
| charity | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Charity contribution amount in GBP |
(CharityMethodEnum (string or null)) or (NullEnum (any or null)) Default: "relief_at_source" Payment method for charity (relief_at_source or salary_sacrifice)
|
{- "date": "2019-08-24",
- "gross_salary": "string",
- "tax": "string",
- "national_insurance": "string",
- "pension": "string",
- "pension_method": "relief_at_source",
- "charity": "string",
- "charity_method": "relief_at_source"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24"
}Create or delete a payslip with all related entries.
POST: Creates a Payslip object and all related Income, IncomeTax, NationalInsurance, and optionally Contribution entries in a single database transaction. DELETE: Deletes a payslip and all related entries (via cascade).
This ensures data integrity - either all entries are created/deleted successfully, or none are created/deleted if any validation fails.
Create or delete a payslip with all related entries.
POST: Creates a Payslip object and all related Income, IncomeTax, NationalInsurance, and optionally Contribution entries in a single database transaction. DELETE: Deletes a payslip and all related entries (via cascade).
This ensures data integrity - either all entries are created/deleted successfully, or none are created/deleted if any validation fails.
| external_id required | string <uuid> |
| date required | string <date> Date of the payslip |
| gross_salary required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Gross salary amount in GBP |
| tax required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Income tax amount in GBP |
| national_insurance required | string <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ National Insurance amount in GBP |
| pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Pension contribution amount in GBP |
(PensionMethodEnum (string or null)) or (NullEnum (any or null)) Default: "relief_at_source" Payment method for pension (relief_at_source or salary_sacrifice)
| |
| charity | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Charity contribution amount in GBP |
(CharityMethodEnum (string or null)) or (NullEnum (any or null)) Default: "relief_at_source" Payment method for charity (relief_at_source or salary_sacrifice)
|
{- "date": "2019-08-24",
- "gross_salary": "string",
- "tax": "string",
- "national_insurance": "string",
- "pension": "string",
- "pension_method": "relief_at_source",
- "charity": "string",
- "charity_method": "relief_at_source"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24"
}Create or delete a payslip with all related entries.
POST: Creates a Payslip object and all related Income, IncomeTax, NationalInsurance, and optionally Contribution entries in a single database transaction. DELETE: Deletes a payslip and all related entries (via cascade).
This ensures data integrity - either all entries are created/deleted successfully, or none are created/deleted if any validation fails.
| external_id required | string <uuid> |
OpenApi3 schema for this API. Format can be selected via content negotiation.
| format | string Enum: "json" "yaml" |
| lang | string Enum: "af" "ar" "ar-dz" "ast" "az" "be" "bg" "bn" "br" "bs" "ca" "ckb" "cs" "cy" "da" "de" "dsb" "el" "en" "en-au" "en-gb" "eo" "es" "es-ar" "es-co" "es-mx" "es-ni" "es-ve" "et" "eu" "fa" "fi" "fr" "fy" "ga" "gd" "gl" "he" "hi" "hr" "hsb" "hu" "hy" "ia" "id" "ig" "io" "is" "it" "ja" "ka" "kab" "kk" "km" "kn" "ko" "ky" "lb" "lt" "lv" "mk" "ml" "mn" "mr" "ms" "my" "nb" "ne" "nl" "nn" "os" "pa" "pl" "pt" "pt-br" "ro" "ru" "sk" "sl" "sq" "sr" "sr-latn" "sv" "sw" "ta" "te" "tg" "th" "tk" "tr" "tt" "udm" "ug" "uk" "ur" "uz" "vi" "zh-hans" "zh-hant" |
Contractor expected values stored on the current tax year.
{- "expected_contractor_revenue": "string",
- "expected_contractor_expenses": "3000.00",
- "expected_contractor_retained_profits": "0.00",
- "expected_contractor_director_salary": "string",
- "expected_contractor_partner_salary": "string",
- "expected_contractor_company_pension": "0.00",
- "expected_contractor_director_personal_pension": "0.00",
- "expected_contractor_partner_personal_pension": "0.00"
}Contractor expected values stored on the current tax year.
| expected_contractor_revenue | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
| expected_contractor_expenses | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "3000.00" |
| expected_contractor_retained_profits | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_director_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| expected_contractor_partner_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| expected_contractor_company_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_director_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_partner_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
{- "expected_contractor_revenue": "string",
- "expected_contractor_expenses": "3000.00",
- "expected_contractor_retained_profits": "0.00",
- "expected_contractor_director_salary": "string",
- "expected_contractor_partner_salary": "string",
- "expected_contractor_company_pension": "0.00",
- "expected_contractor_director_personal_pension": "0.00",
- "expected_contractor_partner_personal_pension": "0.00"
}{- "expected_contractor_revenue": "string",
- "expected_contractor_expenses": "3000.00",
- "expected_contractor_retained_profits": "0.00",
- "expected_contractor_director_salary": "string",
- "expected_contractor_partner_salary": "string",
- "expected_contractor_company_pension": "0.00",
- "expected_contractor_director_personal_pension": "0.00",
- "expected_contractor_partner_personal_pension": "0.00"
}Contractor expected values stored on the current tax year.
| expected_contractor_revenue | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ |
| expected_contractor_expenses | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "3000.00" |
| expected_contractor_retained_profits | string or null <decimal> ^-?\d{0,10}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_director_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| expected_contractor_partner_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| expected_contractor_company_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_director_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
| expected_contractor_partner_personal_pension | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ Default: "0.00" |
{- "expected_contractor_revenue": "string",
- "expected_contractor_expenses": "3000.00",
- "expected_contractor_retained_profits": "0.00",
- "expected_contractor_director_salary": "string",
- "expected_contractor_partner_salary": "string",
- "expected_contractor_company_pension": "0.00",
- "expected_contractor_director_personal_pension": "0.00",
- "expected_contractor_partner_personal_pension": "0.00"
}{- "expected_contractor_revenue": "string",
- "expected_contractor_expenses": "3000.00",
- "expected_contractor_retained_profits": "0.00",
- "expected_contractor_director_salary": "string",
- "expected_contractor_partner_salary": "string",
- "expected_contractor_company_pension": "0.00",
- "expected_contractor_director_personal_pension": "0.00",
- "expected_contractor_partner_personal_pension": "0.00"
}Contractor structural setup including VAT and shareholding.
{- "ir35_status": "outside",
- "vat_registered": true,
- "vat_using_flat_rate_scheme": true,
- "vat_flat_rate_percentage": "string",
- "director_shareholding_percentage": "string",
- "partner_shareholding_percentage": "string",
- "eligible_for_employment_allowance": true,
- "associated_companies": -2147483648
}Contractor structural setup including VAT and shareholding.
| ir35_status | string Value: "outside" IR35 status: only outside IR35 is supported (calculator provides dividend optimisation strategies)
|
| vat_registered | boolean Whether company is VAT registered (required if turnover >£90k) |
| vat_using_flat_rate_scheme | boolean Whether using VAT Flat Rate Scheme (simplified VAT) |
| vat_flat_rate_percentage | string or null <decimal> ^-?\d{0,2}(?:\.\d{0,2})?$ Effective FRS percentage you will use (after any discounts/penalties). Examples: 14.5% (standard IT), 13.5% (first year IT), 16.5% (LCT), 15.5% (first year + LCT) |
| director_shareholding_percentage | string <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Director shareholding percentage (0-100) |
| partner_shareholding_percentage | string or null <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Partner shareholding percentage (must sum to 100 with director) |
| eligible_for_employment_allowance | boolean Whether eligible for Employment Allowance (£10,500 for 2025/26). Requirements: (1) At least one other employee/director on payroll besides yourself, AND (2) At least one person earning above secondary threshold (£5,000 for 2025/26) to create employer NI liability. Example: Director + partner both earning £12,570 = eligible. Director alone (even at £12,570) = NOT eligible. |
| associated_companies | integer [ -2147483648 .. 2147483647 ] Number of associated companies (affects corporation tax thresholds). Thresholds divided by (1 + associated companies). E.g., 1 associated company: £25k-£125k marginal relief band. |
{- "ir35_status": "outside",
- "vat_registered": true,
- "vat_using_flat_rate_scheme": true,
- "vat_flat_rate_percentage": "string",
- "director_shareholding_percentage": "string",
- "partner_shareholding_percentage": "string",
- "eligible_for_employment_allowance": true,
- "associated_companies": -2147483648
}{- "ir35_status": "outside",
- "vat_registered": true,
- "vat_using_flat_rate_scheme": true,
- "vat_flat_rate_percentage": "string",
- "director_shareholding_percentage": "string",
- "partner_shareholding_percentage": "string",
- "eligible_for_employment_allowance": true,
- "associated_companies": -2147483648
}Contractor structural setup including VAT and shareholding.
| ir35_status | string Value: "outside" IR35 status: only outside IR35 is supported (calculator provides dividend optimisation strategies)
|
| vat_registered | boolean Whether company is VAT registered (required if turnover >£90k) |
| vat_using_flat_rate_scheme | boolean Whether using VAT Flat Rate Scheme (simplified VAT) |
| vat_flat_rate_percentage | string or null <decimal> ^-?\d{0,2}(?:\.\d{0,2})?$ Effective FRS percentage you will use (after any discounts/penalties). Examples: 14.5% (standard IT), 13.5% (first year IT), 16.5% (LCT), 15.5% (first year + LCT) |
| director_shareholding_percentage | string <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Director shareholding percentage (0-100) |
| partner_shareholding_percentage | string or null <decimal> ^-?\d{0,3}(?:\.\d{0,2})?$ Partner shareholding percentage (must sum to 100 with director) |
| eligible_for_employment_allowance | boolean Whether eligible for Employment Allowance (£10,500 for 2025/26). Requirements: (1) At least one other employee/director on payroll besides yourself, AND (2) At least one person earning above secondary threshold (£5,000 for 2025/26) to create employer NI liability. Example: Director + partner both earning £12,570 = eligible. Director alone (even at £12,570) = NOT eligible. |
| associated_companies | integer [ -2147483648 .. 2147483647 ] Number of associated companies (affects corporation tax thresholds). Thresholds divided by (1 + associated companies). E.g., 1 associated company: £25k-£125k marginal relief band. |
{- "ir35_status": "outside",
- "vat_registered": true,
- "vat_using_flat_rate_scheme": true,
- "vat_flat_rate_percentage": "string",
- "director_shareholding_percentage": "string",
- "partner_shareholding_percentage": "string",
- "eligible_for_employment_allowance": true,
- "associated_companies": -2147483648
}{- "ir35_status": "outside",
- "vat_registered": true,
- "vat_using_flat_rate_scheme": true,
- "vat_flat_rate_percentage": "string",
- "director_shareholding_percentage": "string",
- "partner_shareholding_percentage": "string",
- "eligible_for_employment_allowance": true,
- "associated_companies": -2147483648
}ViewSet for managing tax years with full CRUD operations.
Endpoints:
Note: PUT is not supported. Use PATCH for partial updates.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "year_label": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "has_data": true,
- "entry_count": 0
}
]ViewSet for managing tax years with full CRUD operations.
Endpoints:
Note: PUT is not supported. Use PATCH for partial updates.
{ }{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "year_label": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "expected_gross_salary": "string",
- "claims_child_benefit": true,
- "income_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "contribution_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}
], - "income_tax_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "national_insurance_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "taxable_benefit_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}
], - "monthly_breakdown": [
- {
- "month": "string",
- "gross_salary": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "pension_contributions": "string",
- "charitable_donations": "string"
}
], - "aggregates": {
- "gross_salary": "string",
- "taxable_benefits": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "salary_sacrifice_pension": "string",
- "relief_at_source_pension": "string",
- "employer_pension_contributions": "string",
- "net_pay_pension": "string",
- "charitable_donations": "string"
}, - "projections": {
- "months_completed": 0,
- "projected_annual_income": "string",
- "projected_annual_pension": "string",
- "projected_annual_charity": "string"
}
}ViewSet for managing tax years with full CRUD operations.
Endpoints:
Note: PUT is not supported. Use PATCH for partial updates.
| year_label required | string |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "year_label": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "expected_gross_salary": "string",
- "claims_child_benefit": true,
- "income_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "contribution_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}
], - "income_tax_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "national_insurance_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "taxable_benefit_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}
], - "monthly_breakdown": [
- {
- "month": "string",
- "gross_salary": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "pension_contributions": "string",
- "charitable_donations": "string"
}
], - "aggregates": {
- "gross_salary": "string",
- "taxable_benefits": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "salary_sacrifice_pension": "string",
- "relief_at_source_pension": "string",
- "employer_pension_contributions": "string",
- "net_pay_pension": "string",
- "charitable_donations": "string"
}, - "projections": {
- "months_completed": 0,
- "projected_annual_income": "string",
- "projected_annual_pension": "string",
- "projected_annual_charity": "string"
}
}ViewSet for managing tax years with full CRUD operations.
Endpoints:
Note: PUT is not supported. Use PATCH for partial updates.
| year_label required | string |
| primary_gross_salary | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| primary_net_pension_contributions | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| primary_charitable_donations | string or null <decimal> ^-?\d{0,8}(?:\.\d{0,2})?$ |
| claims_child_benefit | boolean Whether child benefit is claimed for this tax year |
{- "primary_gross_salary": "string",
- "primary_net_pension_contributions": "string",
- "primary_charitable_donations": "string",
- "claims_child_benefit": true
}{- "primary_gross_salary": "string",
- "primary_net_pension_contributions": "string",
- "primary_charitable_donations": "string",
- "claims_child_benefit": true
}ViewSet for managing tax years with full CRUD operations.
Endpoints:
Note: PUT is not supported. Use PATCH for partial updates.
| year_label required | string |
Get or create the current tax year.
GET /api/tax-years/current/ - Returns current tax year with all entries
⚠️ WARNING: This endpoint creates a tax year if it doesn't exist, violating REST idempotency. This is intentional for UX - users shouldn't need a separate POST to create their current tax year.
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "year_label": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "expected_gross_salary": "string",
- "claims_child_benefit": true,
- "income_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "contribution_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "contribution_type": "pension",
- "payment_method": "relief_at_source"
}
], - "income_tax_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "national_insurance_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string"
}
], - "taxable_benefit_entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "amount": "string",
- "description": "string"
}
], - "monthly_breakdown": [
- {
- "month": "string",
- "gross_salary": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "pension_contributions": "string",
- "charitable_donations": "string"
}
], - "aggregates": {
- "gross_salary": "string",
- "taxable_benefits": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "salary_sacrifice_pension": "string",
- "relief_at_source_pension": "string",
- "employer_pension_contributions": "string",
- "net_pay_pension": "string",
- "charitable_donations": "string"
}, - "projections": {
- "months_completed": 0,
- "projected_annual_income": "string",
- "projected_annual_pension": "string",
- "projected_annual_charity": "string"
}
}Get consolidated tracker data for current tax year.
{- "label": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "current_month": "string",
- "current_month_index": 0,
- "completed_months": 0,
- "months_remaining": 0,
- "expected_income": "string",
- "pension_contributions_to_date": "string",
- "charitable_contributions_to_date": "string",
- "has_children": true,
- "projected_adjusted_net_income": "string",
- "projected_annual_tax": "string",
- "target_annual_tax": "string",
- "contribution_gauge": {
- "strategy_label": "string",
- "completed_months": 0,
- "remaining_months": 0,
- "target_pension": "string",
- "target_charity": "string",
- "target_total": "string",
- "pension_ytd": "string",
- "charity_ytd": "string",
- "actual_total": "string",
- "projected_pension": "string",
- "projected_charity": "string",
- "projected_total": "string",
- "time_target": "string",
- "is_on_track": true,
- "difference": "string",
- "monthly_needed": "string"
}, - "tax_savings_card": {
- "projected_tax_saved": "string",
- "projected_child_benefit_retained": "string",
- "projected_loses_free_childcare": true,
- "projected_reduces_free_childcare": true,
- "projected_free_childcare_value": "string",
- "projected_free_childcare_value_lost": "string",
- "projected_loses_tax_free_childcare": true,
- "projected_tax_free_childcare_value": "string",
- "projected_personal_allowance_remaining": "string"
}, - "gross_income_block": {
- "expected": "string",
- "projected": "string"
}, - "monthly_table": {
- "months": [
- {
- "month": "string",
- "gross_salary": "string",
- "income_tax": "string",
- "national_insurance": "string",
- "pension_contributions": "string",
- "charitable_donations": "string"
}
], - "requiredMonthlyPension": "string",
- "requiredMonthlyCharity": "string"
}, - "entries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "date": "2019-08-24",
- "type": "string",
- "amount": "string",
- "payslip_id": "4c69b385-5dae-4225-8596-911518500e4c",
- "contribution_type": "string",
- "payment_method": "string",
- "source": "string"
}
], - "cumulative_chart": {
- "chart": {
- "property1": {
- "index": 0,
- "cumulative_income": "string",
- "cumulative_tax": "string",
- "cumulative_contributions": "string",
- "target_cumulative_income": "string",
- "target_cumulative_contributions": "string",
- "target_cumulative_tax": "string"
}, - "property2": {
- "index": 0,
- "cumulative_income": "string",
- "cumulative_tax": "string",
- "cumulative_contributions": "string",
- "target_cumulative_income": "string",
- "target_cumulative_contributions": "string",
- "target_cumulative_tax": "string"
}
}
}
}Request an authentication code to be sent via email. Creates a 6-character code and sends both magic link and code via email. Returns 204 No Content to avoid leaking whether email exists.
Rate limits:
| email required | string <email> Email address to send authentication code to |
{- "email": "user@example.com"
}{- "email": "user@example.com"
}Verify an authentication code and log the user in. Creates user account if it doesn't exist (passwordless signup). Returns 204 No Content on success with session cookie set.
| email required | string <email> Email address the code was sent to |
| code required | string = 6 characters 6-character authentication code |
{- "email": "user@example.com",
- "code": "string"
}{- "email": "user@example.com",
- "code": "string"
}OpenApi3 schema for this API. Format can be selected via content negotiation.
| format | string Enum: "json" "yaml" |
| lang | string Enum: "af" "ar" "ar-dz" "ast" "az" "be" "bg" "bn" "br" "bs" "ca" "ckb" "cs" "cy" "da" "de" "dsb" "el" "en" "en-au" "en-gb" "eo" "es" "es-ar" "es-co" "es-mx" "es-ni" "es-ve" "et" "eu" "fa" "fi" "fr" "fy" "ga" "gd" "gl" "he" "hi" "hr" "hsb" "hu" "hy" "ia" "id" "ig" "io" "is" "it" "ja" "ka" "kab" "kk" "km" "kn" "ko" "ky" "lb" "lt" "lv" "mk" "ml" "mn" "mr" "ms" "my" "nb" "ne" "nl" "nn" "os" "pa" "pl" "pt" "pt-br" "ro" "ru" "sk" "sl" "sq" "sr" "sr-latn" "sv" "sw" "ta" "te" "tg" "th" "tk" "tr" "tt" "udm" "ug" "uk" "ur" "uz" "vi" "zh-hans" "zh-hant" |
Create a Stripe Checkout session for subscription.
Returns a checkout URL to redirect the user to Stripe's hosted checkout page. Creates a Stripe customer if one doesn't exist. Includes trial period.
| price_id required | string Stripe price ID (price_xxx) |
| success_url required | string <uri> URL to redirect to after successful checkout |
| cancel_url required | string <uri> URL to redirect to if user cancels checkout |
{- "price_id": "string",
}{
}Create a Stripe Customer Portal session.
Returns a portal URL to redirect the user to Stripe's billing portal where they can manage their subscription (cancel, update payment, etc.)
| return_url | string <uri> URL to redirect to after leaving the portal |
{
}{
}