Skip to main content

Making Tax Digital for Income Tax

12 operations in the Tolvi API, version 1. Paths are relative to https://api.tolvi.co.uk. Every amount is integer pence.

List income sources

GET/api/v1/mtd-income-tax/sources

Scopes
self_assessment:read

Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/mtd-income-tax/sources
NameInTypeDescription
clientIdquerystring (uuid)

Responses

200 OK, application/json

Body: object (MtdItSourceList).

200 OK response for GET /api/v1/mtd-income-tax/sources
FieldTypeDescription
itemsrequiredarray of MtdItSource
items[].​idrequiredstring (uuid)
items[].​clientIdrequiredstring (uuid)
items[].​kindrequiredstring (MtdItSourceKind)

One of: self_employment, uk_property

items[].​namerequiredstring
items[].​hmrcBusinessIdrequiredstringnullable
items[].​periodTyperequiredstring (MtdItPeriodType)

One of: standard, calendar

items[].​ninoMaskrequiredstringnullable
items[].​sendingEnabledrequiredboolean

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

Add an income source

POST/api/v1/mtd-income-tax/sources

Scopes
self_assessment:write
Role
Preparer or above
Access
A signed-in Tolvi session only, never an API token.

A sole trade or UK property business. Never available to API keys or connected assistants.

Needs the Preparer role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (AddMtdItSource).

Request body for POST /api/v1/mtd-income-tax/sources
FieldTypeDescription
clientIdrequiredstring (uuid)
kindrequiredstring (MtdItSourceKind)

One of: self_employment, uk_property

namerequiredstring
hmrcBusinessIdstring
periodTypestring (MtdItPeriodType)

One of: standard, calendar

ninostring

Sent once and held encrypted. Only a mask comes back.

Responses

200 OK, application/json

Body: object (MtdItSource).

200 OK response for POST /api/v1/mtd-income-tax/sources
FieldTypeDescription
idrequiredstring (uuid)
clientIdrequiredstring (uuid)
kindrequiredstring (MtdItSourceKind)

One of: self_employment, uk_property

namerequiredstring
hmrcBusinessIdrequiredstringnullable
periodTyperequiredstring (MtdItPeriodType)

One of: standard, calendar

ninoMaskrequiredstringnullable
sendingEnabledrequiredboolean

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

The year’s four updates

GET/api/v1/mtd-income-tax/sources/{id}/obligations

Scopes
self_assessment:read

Worked out from the dates, and what’s been accepted here. Not read from HMRC. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/mtd-income-tax/sources/{id}/obligations
NameInTypeDescription
idrequiredpathstring (uuid)
taxYearEndrequiredqueryinteger

Responses

200 OK, application/json

Body: object (MtdItObligations).

200 OK response for GET /api/v1/mtd-income-tax/sources/{id}/obligations
FieldTypeDescription
sourcerequiredobject (MtdItSource)
source.​idrequiredstring (uuid)
source.​clientIdrequiredstring (uuid)
source.​kindrequiredstring (MtdItSourceKind)

One of: self_employment, uk_property

source.​namerequiredstring
source.​hmrcBusinessIdrequiredstringnullable
source.​periodTyperequiredstring (MtdItPeriodType)

One of: standard, calendar

source.​ninoMaskrequiredstringnullable
source.​sendingEnabledrequiredboolean
taxYearEndrequiredinteger
workedOutrequiredboolean

True: from the dates and accepted updates here, not from HMRC.

obligationsrequiredarray of MtdItObligation
obligations[].​quarterrequiredinteger
obligations[].​fromrequiredstring (date)

example "2026-03-31"

obligations[].​obligationEndrequiredstring (date)

example "2026-03-31"

obligations[].​duerequiredstring (date)

example "2026-03-31"

obligations[].​metrequiredboolean
updatesrequiredarray of MtdItUpdate
updates[].​idrequiredstring (uuid)
updates[].​sourceIdrequiredstring (uuid)
updates[].​taxYearEndrequiredinteger
updates[].​periodStartrequiredstring (date)

example "2026-03-31"

updates[].​periodEndrequiredstring (date)

example "2026-03-31"

updates[].​figuresrequiredobject

Cumulative from 6 April, integer pence by HMRC’s field names.

updates[].​originrequiredstring
updates[].​statusrequiredstring (MtdItUpdateStatus)

One of: draft, approved, sending, accepted, rejected, unknown

updates[].​hashrequiredstring
updates[].​lastErrorrequiredstringnullable
updates[].​submittedAtrequiredstring (date-time)nullable

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).

Read a spreadsheet

POST/api/v1/mtd-income-tax/sources/{id}/read-sheet

Scopes
self_assessment:write
Role
Preparer or above

Two columns: HMRC’s field name, and the amount from 6 April. Keeps nothing.

Needs the Preparer role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/mtd-income-tax/sources/{id}/read-sheet
NameInTypeDescription
kindrequiredquerystring

One of: self_employment, uk_property

idrequiredpathstring (uuid)

Request body

Required. application/json: object (SpreadsheetRows).

Request body for POST /api/v1/mtd-income-tax/sources/{id}/read-sheet
FieldTypeDescription
rowsrequiredarray of array of string

Label, then amount in pounds.

Responses

200 OK, application/json

Body: object (MtdItSheetReading).

200 OK response for POST /api/v1/mtd-income-tax/sources/{id}/read-sheet
FieldTypeDescription
figuresrequiredobject
problemsrequiredarray of string
ignoredrequiredarray of string

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).

Save a cumulative update

PUT/api/v1/mtd-income-tax/sources/{id}/updates

Scopes
self_assessment:write
Role
Preparer or above

Figures from 6 April to the date. Nothing is sent.

Needs the Preparer role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for PUT /api/v1/mtd-income-tax/sources/{id}/updates
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (SaveMtdItUpdate).

Request body for PUT /api/v1/mtd-income-tax/sources/{id}/updates
FieldTypeDescription
taxYearEndrequiredinteger
periodEndrequiredstring (date)

example "2026-03-31"

originrequiredstring (MtdItOrigin)

One of: spreadsheet, typed

rowsarray of array of string
figuresobject

Responses

200 OK, application/json

Body: object (MtdItUpdate).

200 OK response for PUT /api/v1/mtd-income-tax/sources/{id}/updates
FieldTypeDescription
idrequiredstring (uuid)
sourceIdrequiredstring (uuid)
taxYearEndrequiredinteger
periodStartrequiredstring (date)

example "2026-03-31"

periodEndrequiredstring (date)

example "2026-03-31"

figuresrequiredobject

Cumulative from 6 April, integer pence by HMRC’s field names.

originrequiredstring
statusrequiredstring (MtdItUpdateStatus)

One of: draft, approved, sending, accepted, rejected, unknown

hashrequiredstring
lastErrorrequiredstringnullable
submittedAtrequiredstring (date-time)nullable

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).

Approve an update

POST/api/v1/mtd-income-tax/updates/{id}/approve

Scopes
self_assessment:write
Role
Reviewer or above
Access
A signed-in Tolvi session only, never an API token.

Never available to API keys or connected assistants.

Needs the Reviewer role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/mtd-income-tax/updates/{id}/approve
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (MtdItHash).

Request body for POST /api/v1/mtd-income-tax/updates/{id}/approve
FieldTypeDescription
hashrequiredstring

Responses

200 OK, application/json

Body: object (MtdItUpdate).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).

Send an update

POST/api/v1/mtd-income-tax/updates/{id}/submit

Scopes
self_assessment:write
Role
Manager or above
Access
A signed-in Tolvi session only, never an API token.
Retries
Send an Idempotency-Key to make retries safe.

Off by default. It has only run against a fake: HMRC has not reviewed or accepted any of it. Never available to API keys or connected assistants.

Needs the Manager role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/mtd-income-tax/updates/{id}/submit
NameInTypeDescription
idrequiredpathstring (uuid)
Idempotency-Keyheaderstring

A unique key (1-255 visible characters) to make retries safe. Replayed for 24 hours.

1 to 255 characters

Request body

Required. application/json: object (SubmitMtdItUpdate).

Request body for POST /api/v1/mtd-income-tax/updates/{id}/submit
FieldTypeDescription
hashrequiredstring
clientFactsrequiredobject

Responses

200 OK, application/json

Body: object (MtdItUpdate).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 409 Conflict, 422 Unprocessable content, 429 Too many requests, as problem details (application/problem+json).

Where a final declaration has got to

GET/api/v1/mtd-income-tax/declarations

Scopes
self_assessment:read

Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/mtd-income-tax/declarations
NameInTypeDescription
taxYearEndrequiredqueryinteger
clientIdrequiredquerystring (uuid)

Responses

200 OK, application/json

Body: object (MtdItDeclaration).

200 OK response for GET /api/v1/mtd-income-tax/declarations
FieldTypeDescription
clientIdrequiredstring (uuid)
taxYearEndrequiredinteger
duerequiredstring (date)

example "2026-03-31"

stagerequiredstring
calculationIdrequiredstringnullable
calculationrequiredobjectnullable
errorsrequiredarray of string
clientConfirmedOnrequiredstring (date)nullable

example "2026-03-31"

declaredAtrequiredstring (date-time)nullable
sendingEnabledrequiredboolean
confirmationrequiredobject

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

Ask for the calculation

POST/api/v1/mtd-income-tax/declarations/calculate

Scopes
self_assessment:write
Role
Manager or above
Access
A signed-in Tolvi session only, never an API token.

HMRC’s intent to finalise. Errors stop the declaration. Off by default. It has only run against a fake: HMRC has not reviewed or accepted any of it. Never available to API keys or connected assistants.

Needs the Manager role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (MtdItDeclarationStep).

Request body for POST /api/v1/mtd-income-tax/declarations/calculate
FieldTypeDescription
clientIdrequiredstring (uuid)
taxYearEndrequiredinteger
calculationIdstring
approvedOnstring (date)

example "2026-03-31"

confirmationobject
clientFactsobject

Responses

200 OK, application/json

Body: object (MtdItDeclaration).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

Mark the calculation reviewed

POST/api/v1/mtd-income-tax/declarations/review

Scopes
self_assessment:write
Role
Manager or above
Access
A signed-in Tolvi session only, never an API token.

Never available to API keys or connected assistants.

Needs the Manager role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (MtdItDeclarationStep).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (MtdItDeclaration).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

Record the client’s approval

POST/api/v1/mtd-income-tax/declarations/client-approval

Scopes
self_assessment:write
Role
Preparer or above
Access
A signed-in Tolvi session only, never an API token.

Never available to API keys or connected assistants.

Needs the Preparer role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (MtdItDeclarationStep).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (MtdItDeclaration).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).

Submit the final declaration

POST/api/v1/mtd-income-tax/declarations/submit

Scopes
self_assessment:write
Role
Manager or above
Access
A signed-in Tolvi session only, never an API token.
Retries
Send an Idempotency-Key to make retries safe.

With the calculation the client agreed to, and the agent’s confirmation. Off by default. It has only run against a fake: HMRC has not reviewed or accepted any of it. Never available to API keys or connected assistants.

Needs the Manager role or above. Part of the self_assessment product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/mtd-income-tax/declarations/submit
NameInTypeDescription
Idempotency-Keyheaderstring

A unique key (1-255 visible characters) to make retries safe. Replayed for 24 hours.

1 to 255 characters

Request body

Required. application/json: object (MtdItDeclarationStep).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (MtdItDeclaration).

The fields are as shown above.

Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 409 Conflict, 422 Unprocessable content, 429 Too many requests, as problem details (application/problem+json).