This version is in beta - expect some breaking changes.

Individuals Expenses (MTD) API

Dates and amounts
Date Amount
Version and status
Available in Sandbox Yes
Sandbox base URL https://test-api.service.hmrc.gov.uk
Available in Production Yes
Production base URL https://api.service.hmrc.gov.uk

Overview

This API allows developers to retrieve, amend and delete expenses for:

  • income for trade union and patent royalties
  • existing employment expenses

This API also allows developers to ignore HMRC provided employment expenses for a user.

For information on how to connect to this API see the Income Tax MTD end-to-end service guide.

Versioning

When an API changes in a way that is backwards-incompatible, we increase the version number of the API. See our reference guide for more on versioning.

Errors

We use standard HTTP status codes to show whether an API request succeeded or not. They are usually in the range:

  • 200 to 299 if it succeeded, including code 202 if it was accepted by an API that needs to wait for further action
  • 400 to 499 if it failed because of a client error by your application
  • 500 to 599 if it failed because of an error on our server

Errors specific to each API are shown in the Endpoints section, under Response. See our reference guide for more on errors.

Single errors will be returned in the following format:

{
    "code": "FORMAT_FIELD_NAME",
    "message": "The provided FieldName is invalid"
}

Where possible, multiple errors will be returned with INVALID_REQUEST in the following format:

{
    "code": "INVALID_REQUEST",
    "message": "Invalid request",
    "errors": [
        {
            "code": "RULE_FIELD_NAME",
            "message": "The provided FieldName is not allowed"
        },
        {
            "code": "FORMAT_FIELD_NAME",
            "message": "The provided FieldName is invalid"
        }
    ]
}

Where it is possible for the same error to be returned multiple times, message will describe the expected format and paths will show the fields which are invalid.

Where arrays are submitted a number indicates the object in the array sequence, for example, /arrayName/1/fieldName.

An example with single error:

{
    "code": "FORMAT_STRING_NAME",
    "message": "The provided field is not valid",
    "paths": [ "/arrayName/0/fieldName" ]
}

An example with multiple errors:

{
    "code": "INVALID_REQUEST",
    "message": "Invalid request",
    "errors": [
        {
           "code": "FORMAT_VALUE",
           "message": "The field should be between 0 and 99999999999.99",
           "paths": [ "/objectName/fieldName1", "/arrayName/0/fieldName2" ]
        },
        {
           "code": "FORMAT_STRING_NAME",
           "message": "The provided field is not valid",
           "paths": [ "/arrayName/0/fieldName3", "/arrayName/1/fieldName3" ]
        }
    ]
}

Changelog

You can find the changelog in the income-tax-mtd-changelog GitHub wiki.

Support

Testing

You can use the sandbox environment to test this API. You can use the Create Test User API or it's frontend service to create test users.

It may not be possible to test all scenarios in the sandbox. You can test some scenarios by passing the Gov-Test-Scenario header. Documentation for each endpoint includes a Test data section, which explains the scenarios that you can simulate using the Gov-Test-Scenario header.

If you have a specific testing need that is not supported in the sandbox, contact our support team.

Some APIs may be marked [test only]. This means that they are not available for use in production and may change.

Skip to main content

Endpoints

/individuals/expenses/other/{nino}/{taxYear}

Retrieve Other Expenses
GET

This endpoint allows a developer to retrieve expenses income for trade union and patent royalties. A National Insurance number and tax year must be provided.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the read:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2020-21

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the read:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 200 (OK)

Example response

{
  "submittedOn": "2019-04-04T01:01:01Z",
  "paymentsToTradeUnionsForDeathBenefits": {
    "customerReference": "TRADE UNION PAYMENTS",
    "expenseAmount": 4528.99
  },
  "patentRoyaltiesPayments": {
    "customerReference": "ROYALTIES PAYMENTS",
    "expenseAmount": 3015.50
  },
  "links":[
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"PUT",
      "rel":"amend-expenses-other"
    },
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"DELETE",
      "rel":"delete-expenses-other"
    }
  ]
}

Response table
Name Description
submittedOn
string
required

The date the expenses were added. It must be provided in the format YYYY-MM-DDThh:mm:ssZ

For example: 2019-04-04T01:01:01Z

paymentsToTradeUnionsForDeathBenefits
object
optional

Payments made to a Trade union or friendly society for death benefits.

customerReference
string
optional

A reference the user supplies to identify the record.

For example: TRADE UNION PAYMENTS

expenseAmount
number
required

The amount spent or cost incurred. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

patentRoyaltiesPayments
object
optional

Payments made by the licensee to the licensor for the use of the patent. They are usually a percentage of the revenue generated by the patent, although they can sometimes be agreed as a fixed fee.

customerReference
string
optional

A reference the user supplies to identify the record.

For example: ROYALTIES PAYMENTS

expenseAmount
number
required

The amount spent or cost incurred. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

links
array
optional

A list of endpoint links that indicate possible actions related to the current resource.

href
string
required

The relative url of the endpoint.

For example: /individuals/expenses/other/TC663795B/2019-20

rel
string
required

A label for the endpoint, which describes how it is related to the current resource. The rel will be self where the action is retrieval of the same resource.

Limited to the following possible values:

self
amend-expenses-other
delete-expenses-other
method
string
required

The HTTP method type for the endpoint.

Limited to the following possible values:

GET
PUT
DELETE

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

The matching resource is not found.

404 (Not Found)

MATCHING_RESOURCE_NOT_FOUND

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulates success response.

NOT_FOUND

Simulates the scenario where no data is found.


Close Section
/individuals/expenses/other/{nino}/{taxYear}

Amend Other Expenses
PUT

This endpoint allows a developer to amend expenses income for trade union and patent royalties. A National Insurance number and tax year must be provided.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the write:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2020-21

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Content-Type
required

Specifies the format of the request body, which must be JSON.

For example: application/json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the write:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Request

Scenario: Default Example

{
  "paymentsToTradeUnionsForDeathBenefits": {
    "customerReference": "TRADE UNION PAYMENTS",
    "expenseAmount": 1223.22
  },
  "patentRoyaltiesPayments":{
    "customerReference": "ROYALTIES PAYMENTS",
    "expenseAmount": 1223.22
  }
}

Request table
Name Description
paymentsToTradeUnionsForDeathBenefits
object
optional

Payments made to a Trade union or friendly society for death benefits.

customerReference
string
optional

A reference the user supplies to identify the record.

For example: TRADE UNION PAYMENTS

expenseAmount
number
required

The amount spent or cost incurred. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

patentRoyaltiesPayments
object
optional

Payments made by the licensee to the licensor for the use of the patent. They are usually a percentage of the revenue generated by the patent, although they can sometimes be agreed as a fixed fee.

customerReference
string
optional

A reference the user supplies to identify the record.

For example: ROYALTIES PAYMENTS

expenseAmount
number
required

The amount spent or cost incurred. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 200 (OK)

Default Example

{
  "links":[
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"PUT",
      "rel":"amend-expenses-other"
    },
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/other/TC663795B/2019-20",
      "method":"DELETE",
      "rel":"delete-expenses-other"
    }
  ]
}

Response table
Name Description
links
array
optional

A list of endpoint links that indicate possible actions related to the current resource

href
string
required

The relative url of the endpoint

For example: /individuals/expenses/other/TC663795B/2019-20

rel
string
required

A label for the endpoint, which describes how it is related to the current resource. The rel will be self where the action is retrieval of the same resource

Limited to the following possible values:

self
amend-expenses-other
delete-expenses-other
method
string
required

The HTTP method type for the endpoint

Limited to the following possible values:

GET
PUT
DELETE

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

One or more values have been added with the incorrect format.

400 (Bad Request)

FORMAT_VALUE

An empty or non-matching body was submitted.

400 (Bad Request)

RULE_INCORRECT_OR_EMPTY_BODY_SUBMITTED

The format of customer reference is not valid.

400 (Bad Request)

FORMAT_CUSTOMER_REFERENCE

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulate success response.


Close Section

Delete Other Expenses
DELETE

This endpoint allows a developer to delete expenses income for trade union and patent royalties. A National Insurance number and tax year must be provided.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the write:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2020-21

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the write:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 204 (No Content)

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

The matching resource is not found.

404 (Not Found)

MATCHING_RESOURCE_NOT_FOUND

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulate success response.

NOT_FOUND

Simulates the scenario where the given expenses could not be found.


Close Section
/individuals/expenses/employments/{nino}/{taxYear}

Retrieve Employment Expenses
GET

This endpoint allows a developer to retrieve existing employment expenses. A National Insurance number and Tax year must be provided.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the read:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2021-22

Query parameters

Query parameters table
Name Description
source
string
optional

Specifies the source of data to be returned. If source is not provided, the latest submitted values will be returned.

Limited to the following possible values:

  1. hmrcHeld
  2. user
  3. latest

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the read:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 200 (OK)

Example user response

{
  "submittedOn": "2020-12-12T12:12:12Z",
  "totalExpenses": 123.12,
  "source": "user",
  "dateIgnored": "2020-12-11T12:12:12Z",
  "expenses": {
    "businessTravelCosts": 123.12,
    "jobExpenses": 123.12,
    "flatRateJobExpenses": 123.12,
    "professionalSubscriptions": 123.12,
    "hotelAndMealExpenses": 123.12,
    "otherAndCapitalAllowances": 123.12,
    "vehicleExpenses": 123.12,
    "mileageAllowanceRelief": 123.12
  },
  "links": [
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"PUT",
      "rel":"amend-employment-expenses"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"DELETE",
      "rel":"delete-employment-expenses"
    }
  ]
}

Example hmrcHeld response

{
  "submittedOn": "2020-12-12T12:12:12Z",
  "totalExpenses": 123.12,
  "source": "hmrcHeld",
  "dateIgnored": "2020-12-11T12:12:12Z",
  "expenses": {
    "businessTravelCosts": 123.12,
    "jobExpenses": 123.12,
    "flatRateJobExpenses": 123.12,
    "professionalSubscriptions": 123.12,
    "hotelAndMealExpenses": 123.12,
    "otherAndCapitalAllowances": 123.12,
    "vehicleExpenses": 123.12,
    "mileageAllowanceRelief": 123.12
  },
  "links": [
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20/ignore",
      "method":"POST",
      "rel":"ignore-employment-expenses"
    }
  ]
}

Example latest response

{
  "submittedOn": "2020-12-12T12:12:12Z",
  "totalExpenses": 123.12,
  "source": "latest",
  "dateIgnored": "2020-12-11T12:12:12Z",
  "expenses": {
    "businessTravelCosts": 123.12,
    "jobExpenses": 123.12,
    "flatRateJobExpenses": 123.12,
    "professionalSubscriptions": 123.12,
    "hotelAndMealExpenses": 123.12,
    "otherAndCapitalAllowances": 123.12,
    "vehicleExpenses": 123.12,
    "mileageAllowanceRelief": 123.12
  },
  "links": [
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"PUT",
      "rel":"amend-employment-expenses"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20",
      "method":"DELETE",
      "rel":"delete-employment-expenses"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2019-20/ignore",
      "method":"POST",
      "rel":"ignore-employment-expenses"
    }
  ]
}

Response table
Name Description
submittedOn
string
optional

The date the expenses were submitted. Must conform to the format YYYY-MM-DDThh:mm:ssZ

For example: 2020-07-13T20:37:27Z

totalExpenses
number
optional

The sum of the expenses provided. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

source
string
optional

Specifies the source of data returned. "latest" combines the HMRC and user-provided overridden values.

Limited to the following possible values:

hmrcHeld
user
latest
dateIgnored
string
optional

The date the expenses were flagged not to be used in the tax calculation. Must conform to the format YYYY-MM-DDThh:mm:ssZ

For example: 2020-07-13T20:37:27Z

expenses
object
optional

Object containing the employment expenses.

businessTravelCosts
number
optional

Expenses associated with business travel where own or company vehicle was not used. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

jobExpenses
number
optional

The actual expense of replacing or maintaining tools or special work clothes. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

flatRateJobExpenses
number
optional

Fixed rate expenses applied for replacing or maintaining tools or special work clothes. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

professionalSubscriptions
number
optional

Fees or subscriptions to professional bodies, required in order to undertake the employment. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

hotelAndMealExpenses
number
optional

Subsistence costs incurred with work. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

otherAndCapitalAllowances
number
optional

The expense from purchasing small items required for this employment. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

vehicleExpenses
number
optional

Fuel and other costs when using a company vehicle. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

mileageAllowanceRelief
number
optional

The shortfall incurred when the employer pays less than the approved mileage rate. The value must be between 0 and 99999999999.99 up to 2 decimal places.

For example: 2000.99

links
array
optional

A list of endpoint links that indicate possible actions related to the current resource.

href
string
required

The relative url of the endpoint.

For example: /individuals/expenses/employments/{nino}/{taxYear}

rel
string
required

A label for the endpoint, which describes how it is related to the current resource. The rel will be self where the action is retrieval of the same resource.

Limited to the following possible values:

self
amend-employment-expenses
delete-employment-expenses
ignore-employment-expenses
method
string
required

The HTTP method type for the endpoint.

Limited to the following possible values:

GET
PUT
POST
DELETE

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The format of the supplied Source field is not valid.

400 (Bad Request)

FORMAT_SOURCE

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

The matching resource is not found.

404 (Not Found)

MATCHING_RESOURCE_NOT_FOUND

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT
?source=user

Requesting user source simulates success response with User provided financial details.

N/A - DEFAULT
?source=hmrcHeld

Requesting hmrcHeld source simulates success response with HMRC held financial details.

N/A - DEFAULT
?source=latest

Requesting latest source simulates success response with Latest financial details submitted.

NOT_FOUND

Simulates the scenario where no data is found.


Close Section
/individuals/expenses/employments/{nino}/{taxYear}

Amend Employment Expenses
PUT

This endpoint allows a developer to add or update existing employment expenses and can only be used after the tax year has ended.
Making an amendment will override the expense and remove the “dateIgnored” flag from HMRC expenses.
This endpoint requires a National Insurance number and tax year.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the write:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2021-22

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Content-Type
required

Specifies the format of the request body, which must be JSON.

For example: application/json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the write:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Request

Scenario: Default Example

{
  "expenses": {
    "businessTravelCosts": 1234.23,
    "jobExpenses": 1223.22,
    "flatRateJobExpenses": 1223.22,
    "professionalSubscriptions": 1223.22,
    "hotelAndMealExpenses": 1223.22,
    "otherAndCapitalAllowances": 1223.22,
    "vehicleExpenses": 1223.22,
    "mileageAllowanceRelief": 1223.22
  }
}

Request table
Name Description
expenses
object
required

Object containing the employment expenses.

businessTravelCosts
number
optional

Expenses associated with business travel. The value must be between 0 and 99999999999.99

For example: 2000.99

jobExpenses
number
optional

The actual expense of replacing or maintaining tools or special work clothes. The value must be between 0 and 99999999999.99

For example: 2000.99

flatRateJobExpenses
number
optional

Fixed rate expenses applied for replacing or maintaining tools or special work clothes. The value must be between 0 and 99999999999.99

For example: 2000.99

professionalSubscriptions
number
optional

Fees or subscriptions to professional bodies, required in order to undertake the employment. The value must be between 0 and 99999999999.99

For example: 2000.99

hotelAndMealExpenses
number
optional

Subsistence costs incurred with work. The value must be between 0 and 99999999999.99

For example: 2000.99

otherAndCapitalAllowances
number
optional

The expense from purchasing small items required for this employment. The value must be between 0 and 99999999999.99

For example: 2000.99

vehicleExpenses
number
optional

Vehicle expenses for using own car, van or motorcycle for business mileage occurred during work. The value must be between 0 and 99999999999.99

For example: 2000.99

mileageAllowanceRelief
number
optional

The shortfall incurred when the employer pays less than the approved mileage rate. The value must be between 0 and 99999999999.99

For example: 2000.99

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 200 (OK)

Default Example

{
  "links":[
    {
      "href":"/individuals/expenses/employments/TC663795B/2021-22",
      "method":"PUT",
      "rel":"amend-employment-expenses"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2021-22",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2021-22",
      "method":"DELETE",
      "rel":"delete-employment-expenses"
    }
  ]
}

Response table
Name Description
links
array
optional

A list of endpoint links that indicate possible actions related to the current resource

href
string
required

The relative url of the endpoint

For example: /individuals/expenses/employments/{nino}/{taxYear}

rel
string
required

A label for the endpoint, which describes how it is related to the current resource. The rel will be self where the action is retrieval of the same resource

Limited to the following possible values:

self
amend-employment-expenses
delete-employment-expenses
method
string
required

The HTTP method type for the endpoint

Limited to the following possible values:

GET
PUT
DELETE

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

One or more values have been added with the incorrect format.

400 (Bad Request)

FORMAT_VALUE

An empty or non-matching body was submitted.

400 (Bad Request)

RULE_INCORRECT_OR_EMPTY_BODY_SUBMITTED

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The submission has been made before the Tax year it relates to has ended.

400 (Bad Request)

RULE_TAX_YEAR_NOT_ENDED

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulate a success response.

NOT_FOUND

Simulates the scenario where the given expenses could not be found.


Close Section

Delete Employment Expenses
DELETE

This endpoint allows a developer to delete employment expenses for a user and can only be used after the tax year has ended.
Deleting an expense will remove the amended expense and remove the “dateIgnored” flag from HMRC expenses.
This endpoint requires a National Insurance number and tax year.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the write:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2021-22

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the write:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 204 (No Content)

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

The matching resource is not found.

404 (Not Found)

MATCHING_RESOURCE_NOT_FOUND

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulate a success response.

NOT_FOUND

Simulates the scenario where the given expenses could not be found.


Close Section
/individuals/expenses/employments/{nino}/{taxYear}/ignore

Ignore Employment Expenses
POST

This endpoint allows a developer to ignore HMRC provided employment expenses for this user and can only be used after the tax year has ended.
Ignoring an expense will remove any amended expenses and add the “dateIgnored” flag to HMRC expenses.
This endpoint requires a National Insurance number and tax year.

Authorisation

This endpoint is user-restricted and requires an Authorization header containing an OAuth 2.0 Bearer Token with the write:self-assessment scope.

Path parameters

Path parameters table
Name Description
nino
string
required

National Insurance number, in the format AA999999A.

For example: TC663795B

taxYear
string
required

The tax year the data applies to, for example, 2021-22. The start year and end year must not span two tax years. The minimum tax year is 2021-22. No gaps are allowed, for example, 2020-22 is not valid. (The minimum tax year in Sandbox is 2019-20.)

For example: 2021-22

Request headers

Request headers Table
Name Description
Accept
required

Specifies the response format and the version of the API to be used.

For example: application/vnd.hmrc.1.0+json
Gov-Test-Scenario
optional

Only in sandbox environment. See Test Data table for all header values.

For example: -
Authorization
required
An OAuth 2.0 Bearer Token with the write:self-assessment scope.

For example: Bearer bb7fed3fe10dd235a2ccda3d50fb

See also fraud prevention.

Response headers

Response headers Table
Name Description
X-CorrelationId
required

Unique ID for operation tracking
String, 36 characters.

For example: c75f40a6-a3df-4429-a697-471eeec46435

See also fraud prevention.

Response

HTTP status: 200 (OK)

Default Example

{
  "links":[
    {
      "href":"/individuals/expenses/employments/TC663795B/2021-22",
      "method":"GET",
      "rel":"self"
    },
    {
      "href":"/individuals/expenses/employments/TC663795B/2021-22",
      "method":"DELETE",
      "rel":"delete-employment-expenses"
    }
  ]
}

Response table
Name Description
links
array
optional

A list of endpoint links that indicate possible actions related to the current resource

href
string
required

The relative url of the endpoint

For example: /individuals/expenses/employments/{nino}/{taxYear}

rel
string
required

A label for the endpoint, which describes how it is related to the current resource. The rel will be self where the action is retrieval of the same resource

Limited to the following possible values:

self
delete-employment-expenses
method
string
required

The HTTP method type for the endpoint

Limited to the following possible values:

GET
DELETE

Error scenarios

Error scenarios table
Scenario HTTP status Code

The format of the supplied NINO field is not valid.

400 (Bad Request)

FORMAT_NINO

The format of the supplied tax year field is not valid.

400 (Bad Request)

FORMAT_TAX_YEAR

The specified tax year is not supported. That is, the tax year specified is before the minimum tax year value.

400 (Bad Request)

RULE_TAX_YEAR_NOT_SUPPORTED

Tax year range invalid. A tax year range of one year is required.

400 (Bad Request)

RULE_TAX_YEAR_RANGE_INVALID

The submission has been made before the Tax year it relates to has ended.

400 (Bad Request)

RULE_TAX_YEAR_NOT_ENDED

The client or agent is not authorised. This is because: the client is not subscribed to MTD, the agent is not subscribed to Agent Services, or the client has not authorised the agent to act on their behalf.

403 (Forbidden)

CLIENT_OR_AGENT_NOT_AUTHORISED

For error scenarios that are common across all APIs, and for error formats, see our reference guide.

Test data

Scenario simulations using Gov-Test-Scenario headers is only available in the sandbox environment.

Header Value (Gov-Test-Scenario) Scenario

N/A - DEFAULT

Simulates a success response.


Close Section

Skip to main content