Skip to main content

Corporation Tax

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

List returns

GET/api/v1/corporation-tax/returns

Scopes
corporation_tax:read

Every company’s returns, latest period first. Filter by client or status. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns
NameInTypeDescription
statusquerystring

One of: draft, in_review, approved, filing, filed

clientIdquerystring (uuid)

Responses

200 OK, application/json

Body: object (CtReturnList).

200 OK response for GET /api/v1/corporation-tax/returns
FieldTypeDescription
itemsrequiredarray of CtReturnRow
items[].​idrequiredstring (uuid)
items[].​clientIdrequiredstring (uuid)
items[].​clientNamerequiredstring
items[].​groupIdrequiredstring (uuid)

Shared by the returns of one period of account.

items[].​periodOfAccountStartrequiredstring (date)

example "2026-03-31"

items[].​periodOfAccountEndrequiredstring (date)

example "2026-03-31"

items[].​periodStartrequiredstring (date)

example "2026-03-31"

items[].​periodEndrequiredstring (date)

example "2026-03-31"

items[].​periodIndexrequiredinteger

This return’s place among the accounting periods, from 0.

items[].​periodCountrequiredinteger
items[].​statusrequiredstring (CtReturnStatus)

One of: draft, in_review, approved, filing, filed

items[].​sourcerequiredstring (CtSource)

One of: typed, working_papers, accounts

items[].​dueDaterequiredstring (date)

When the return is due (FA 1998 Sch 18 para 14).

example "2026-03-31"

items[].​openReviewPointsrequiredinteger
items[].​taxDuerequiredintegernullable

Tax still to pay on this return, in integer pence, negative when overpaid. Null until it has figures the tax engine can work out.

items[].​clientConfirmationCurrentrequiredboolean

The client confirmed these figures, not earlier ones.

items[].​lastSubmissionStatusrequiredstring (CtSubmissionStatus)nullable

How the latest attempt to send this return ended. Null if it has never been sent.

One of: pending, acknowledged, accepted, rejected, unknown

items[].​filingEnabledrequiredboolean

Whether filing is switched on: off until HMRC’s test service passes.

items[].​returnTyperequiredstring (CtReturnType)

What goes in the XML’s ReturnType.

One of: new, amended

items[].​amendsReturnIdrequiredstring (uuid)nullable

The return this amends. That one stays unchanged.

items[].​amendmentNumberrequiredinteger

1 for the first amendment. Nil on a new return.

items[].​filedElsewhereOnrequiredstring (date)nullable

A person recorded it as filed outside Tolvi on this day.

example "2026-03-31"

items[].​updatedAtrequiredstring (date-time)

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

Start a return

POST/api/v1/corporation-tax/returns

Scopes
corporation_tax:write
Role
Preparer or above
Retries
Send an Idempotency-Key to make retries safe.

Preparers and above, for limited companies. A period of account over 12 months makes one return per accounting period; this answers with the first, and relatedReturns names the rest. Accounting periods starting before 1 April 2023 are refused with 422. No Working Papers file or Accounts set is needed.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns
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 (CreateCtReturnRequest).

A period of account over 12 months makes one return for each accounting period.

Request body for POST /api/v1/corporation-tax/returns
FieldTypeDescription
clientIdrequiredstring (uuid)
periodStartrequiredstring (date)

Start of the period of account. Accounting periods starting before 1 April 2023 are refused.

example "2026-03-31"

periodEndrequiredstring (date)

End of the period of account, at most 18 months on.

example "2026-03-31"

Responses

201 Created, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

201 Created response for POST /api/v1/corporation-tax/returns
FieldTypeDescription
idrequiredstring (uuid)
clientIdrequiredstring (uuid)
clientNamerequiredstring
groupIdrequiredstring (uuid)

Shared by the returns of one period of account.

periodOfAccountStartrequiredstring (date)

example "2026-03-31"

periodOfAccountEndrequiredstring (date)

example "2026-03-31"

periodStartrequiredstring (date)

example "2026-03-31"

periodEndrequiredstring (date)

example "2026-03-31"

periodIndexrequiredinteger

This return’s place among the accounting periods, from 0.

periodCountrequiredinteger
statusrequiredstring (CtReturnStatus)

One of: draft, in_review, approved, filing, filed

sourcerequiredstring (CtSource)

One of: typed, working_papers, accounts

dueDaterequiredstring (date)

When the return is due (FA 1998 Sch 18 para 14).

example "2026-03-31"

openReviewPointsrequiredinteger
taxDuerequiredintegernullable

Tax still to pay on this return, in integer pence, negative when overpaid. Null until it has figures the tax engine can work out.

clientConfirmationCurrentrequiredboolean

The client confirmed these figures, not earlier ones.

lastSubmissionStatusrequiredstring (CtSubmissionStatus)nullable

How the latest attempt to send this return ended. Null if it has never been sent.

One of: pending, acknowledged, accepted, rejected, unknown

filingEnabledrequiredboolean

Whether filing is switched on: off until HMRC’s test service passes.

returnTyperequiredstring (CtReturnType)

What goes in the XML’s ReturnType.

One of: new, amended

amendsReturnIdrequiredstring (uuid)nullable

The return this amends. That one stays unchanged.

amendmentNumberrequiredinteger

1 for the first amendment. Nil on a new return.

filedElsewhereOnrequiredstring (date)nullable

A person recorded it as filed outside Tolvi on this day.

example "2026-03-31"

updatedAtrequiredstring (date-time)
recordFactsobject (CompanyFacts)

What the client’s record says now, to compare with what the return states.

recordFacts.​namerequiredstringnullable

The client’s name on the record.

recordFacts.​companyNumberrequiredstringnullable

Companies House number on the record.

recordFacts.​registeredOfficerequiredstringnullable
recordFacts.​principalActivityrequiredstringnullable
recordFacts.​signatoryNamerequiredstringnullable

The record’s, or the only serving director.

recordFacts.​directorsrequiredarray of RecordDirector

Contacts whose role says director.

recordFacts.​directors[].​namerequiredstring
recordFacts.​directors[].​appointedOnstring (date)

example "2026-03-31"

recordFacts.​directors[].​resignedOnstring (date)

example "2026-03-31"

boxesrequiredobjectnullable

{ boxes, financialYears, loans }: CT600 and CT600A boxes by number. Money is integer pence, whole pounds where the form says so. Bank details are masked. Null without figures.

problemsrequiredarray of CtProblem
problems[].​severityrequiredstring (CtProblemSeverity)

block: stops filing, not approving or downloading. warn: a person should look.

One of: block, warn

problems[].​coderequiredstring
problems[].​boxstring
problems[].​arearequiredstring (CtProblemArea)

One of: ct600, computation, accounts, source, xml

problems[].​messagerequiredstring
computationrequiredobjectnullable

The engine’s computation for this accounting period, with the period of account’s adjustments. Null without figures.

inputrequiredobjectnullable

The engine input now held, in integer pence.

factsrequiredobject

What a person has answered.

masksrequiredobject

Masked bank details.

sourceStaterequiredobject (CtSourceState)
sourceState.​sourcerequiredstring (CtSource)

One of: typed, working_papers, accounts

sourceState.​engagementIdrequiredstring (uuid)nullable
sourceState.​accountsSetIdrequiredstring (uuid)nullable
sourceState.​sourceChangedrequiredboolean

A linked source differs from what this return holds. The figures here haven’t moved: refresh to bring the change in.

sourceState.​sourceApprovedrequiredbooleannullable

Whether the linked file or set is approved. Null with nothing linked.

sourceState.​messagerequiredstringnullable
sourceChangedrequiredboolean
versionsrequiredarray of CtInputVersion
versions[].​idrequiredstring (uuid)
versions[].​versionrequiredinteger
versions[].​sourcerequiredstring (CtSource)

One of: typed, working_papers, accounts

versions[].​fingerprintrequiredstring
versions[].​sourceLabelrequiredstringnullable
versions[].​createdByNamerequiredstringnullable
versions[].​createdAtrequiredstring (date-time)
relatedReturnsrequiredarray of CtRelatedReturn

The other returns of a long period of account.

relatedReturns[].​idrequiredstring (uuid)
relatedReturns[].​periodStartrequiredstring (date)

example "2026-03-31"

relatedReturns[].​periodEndrequiredstring (date)

example "2026-03-31"

relatedReturns[].​statusrequiredstring (CtReturnStatus)

One of: draft, in_review, approved, filing, filed

returnHashrequiredstring

Send this back when approving: it fingerprints the return.

utrrequiredstringnullable
registrationNumberrequiredstringnullable
approvedByNamerequiredstringnullable
approvedAtrequiredstring (date-time)nullable
clientConfirmedOnrequiredstring (date)nullable

example "2026-03-31"

approverRolerequiredstring (ApproverRole)

Who may approve in this firm: partners only, or managers and partners.

One of: partner, manager

reviewerNamesrequiredarray of string

Who sending for review goes to, by name: the client’s partner, or every partner where the record names none, and its manager.

canApproverequiredboolean
cannotApproveReasonrequiredstringnullable
canFilerequiredboolean

No blocker stands in the way of filing this return, whether or not filing is switched on.

canSubmitrequiredboolean
cannotSubmitReasonrequiredstringnullable
filingModerequiredstring (CtFilingMode)

One of: test, test_in_live, live

declarationrequiredobject

{ version, text }: the declaration to accept before filing.

rolledFromReturnIdrequiredstring (uuid)nullable
canAmendrequiredboolean
cannotAmendReasonrequiredstringnullable
lastAmendmentDayrequiredstring (date)

The last day this return can be amended: 12 months after its filing date (FA 1998 Sch 18 para 15(4)).

example "2026-03-31"

amendedByReturnIdrequiredstring (uuid)nullable

The amendment of this return, once started.

amendmentHistoryrequiredarray of CtAmendmentHistoryItem

Every version of this return, oldest first. Each keeps its own review and approval.

amendmentHistory[].​idrequiredstring (uuid)
amendmentHistory[].​amendmentNumberrequiredinteger
amendmentHistory[].​statusrequiredstring (CtReturnStatus)

One of: draft, in_review, approved, filing, filed

amendmentHistory[].​filedElsewhereOnrequiredstring (date)nullable

example "2026-03-31"

amendmentHistory[].​updatedAtrequiredstring (date-time)
reviewPointsrequiredarray of CtReviewPoint
reviewPoints[].​idrequiredstring (uuid)
reviewPoints[].​boxrequiredstringnullable
reviewPoints[].​textrequiredstring
reviewPoints[].​statusrequiredstring (CtReviewPointStatus)

One of: open, cleared

reviewPoints[].​raisedByNamerequiredstringnullable
reviewPoints[].​createdAtrequiredstring (date-time)
eventsrequiredarray of CtEvent
events[].​idrequiredstring (uuid)
events[].​kindrequiredstring
events[].​actorNamerequiredstringnullable
events[].​noterequiredstringnullable
events[].​createdAtrequiredstring (date-time)
submissionsrequiredarray of CtSubmission
submissions[].​idrequiredstring (uuid)
submissions[].​moderequiredstring (CtFilingMode)

One of: test, test_in_live, live

submissions[].​statusrequiredstring (CtSubmissionStatus)

How the latest attempt to send this return ended. Null if it has never been sent.

One of: pending, acknowledged, accepted, rejected, unknown

submissions[].​correlationIdrequiredstringnullable
submissions[].​irmarkrequiredstring
submissions[].​errorsrequiredarray of objectnullable

HMRC’s errors: { number, text, location, meaning }. meaning says it in plain words.

submissions[].​messagerequiredstringnullable

What happened, in plain words.

submissions[].​receiptAtrequiredstring (date-time)nullable
submissions[].​submittedByNamerequiredstringnullable
submissions[].​createdAtrequiredstring (date-time)

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

Get a return

GET/api/v1/corporation-tax/returns/{id}

Scopes
corporation_tax:read

The boxes, the computation, what would stop it being filed, where the figures came from, review points and history. canFile says whether anything blocks filing; filingEnabled whether filing is switched on. Bank details are only ever masked. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Change a return

PATCH/api/v1/corporation-tax/returns/{id}

Scopes
corporation_tax:write
Role
Preparer or above

Preparers and above. Figures are a new immutable version, shared by every return of the period of account. Any change takes a reviewed or approved return back to draft. Figures from a linked source are refused with 409; refused once it’s with HMRC.

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

Parameters

Parameters for PATCH /api/v1/corporation-tax/returns/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (UpdateCtReturnRequest).

Request body for PATCH /api/v1/corporation-tax/returns/{id}
FieldTypeDescription
inputobject

Parts of the tax engine’s input to change, in integer pence. Applies to every return of the period of account. researchAndDevelopment: null removes a claim. Figures that come from a linked source can’t be changed here.

factsobject

Answers: declarationName, declarationStatus, exports, repaymentClaim, provisionalFigures, rnd (companySize, notificationSubmitted, additionalInformationSubmitted, payeReferences, connectedPayeReferences), amendment (accountsAlreadySubmitted, computationsAlreadySubmitted), outOfScope and so on.

bankobjectnullable

Bank details for a repayment, or null to remove them. Encrypted, and only ever shown masked.

notestring

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Group relief for a return

GET/api/v1/corporation-tax/returns/{id}/group-relief

Scopes
corporation_tax:read

Notices of consent touching this company, the companies its client record connects it with, and an associated company count from those links. The links are suggestions: nothing is applied, and the group test is what a person says. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/group-relief
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtGroupReliefState).

200 OK response for GET /api/v1/corporation-tax/returns/{id}/group-relief
FieldTypeDescription
noticesrequiredarray of CtGroupNotice
notices[].​idrequiredstring (uuid)
notices[].​kindrequiredstring

One of: current, carried_forward

notices[].​surrenderingClientIdrequiredstring (uuid)
notices[].​surrenderingNamerequiredstring
notices[].​surrenderingUtrrequiredstringnullable
notices[].​claimantClientIdrequiredstring (uuid)
notices[].​claimantNamerequiredstring
notices[].​claimantUtrrequiredstringnullable
notices[].​surrenderPeriodStartrequiredstring (date)
notices[].​surrenderPeriodEndrequiredstring (date)
notices[].​amountPencerequirednumber
notices[].​givenOnrequiredstring (date)
notices[].​statusrequiredstring

One of: given, withdrawn

notices[].​gapsrequiredarray of string

What the notice lacks under FA 1998 Sch 18 para 71(1). A notice with gaps is ineffective.

relatedCompaniesrequiredarray of CtGroupCompanySuggestion

Companies the client record connects with this one. Suggestions: nothing is applied.

relatedCompanies[].​clientIdrequiredstring (uuid)
relatedCompanies[].​namerequiredstring
relatedCompanies[].​utrrequiredstringnullable
relatedCompanies[].​whyrequiredstring

How the client record connects the two. A pointer only.

relatedCompanies[].​looksLike75Percentrequiredboolean

The links would meet 75% ownership if they’re complete. Never decides the group test.

associatedCompaniesSuggestedrequirednumber

A count from the links for boxes 326 to 328, for a person to accept or ignore. Never applied by itself.

associatedCompaniesNoterequiredstring

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

Record a notice of consent

POST/api/v1/corporation-tax/returns/{id}/group-relief/notices

Scopes
corporation_tax:write
Role
Preparer or above
Retries
Send an Idempotency-Key to make retries safe.

Preparers and above. Records a notice given to HMRC, between this company and another client of the firm (FA 1998 Sch 18 para 70). A notice can’t be changed: withdraw it and record another. Recording it doesn’t change either return.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/group-relief/notices
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 (CreateCtGroupNoticeRequest).

A notice of consent to surrender group relief, given to HMRC.

Request body for POST /api/v1/corporation-tax/returns/{id}/group-relief/notices
FieldTypeDescription
kindrequiredstring

One of: current, carried_forward

thisCompanyIsrequiredstring

Which side this return’s company is on.

One of: surrendering, claimant

otherClientIdrequiredstring (uuid)

The other company: a client of this firm.

surrenderPeriodobject

The surrendering company’s accounting period.

surrenderPeriod.​startrequiredstring (date)
surrenderPeriod.​endrequiredstring (date)
amountPencerequirednumber

Whole pounds, in pence.

givenOnrequiredstring (date)

When notice was given to HMRC (FA 1998 Sch 18 para 70(3)).

Responses

201 Created, application/json

Body: object (CtGroupNotice).

201 Created response for POST /api/v1/corporation-tax/returns/{id}/group-relief/notices
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring

One of: current, carried_forward

surrenderingClientIdrequiredstring (uuid)
surrenderingNamerequiredstring
surrenderingUtrrequiredstringnullable
claimantClientIdrequiredstring (uuid)
claimantNamerequiredstring
claimantUtrrequiredstringnullable
surrenderPeriodStartrequiredstring (date)
surrenderPeriodEndrequiredstring (date)
amountPencerequirednumber
givenOnrequiredstring (date)
statusrequiredstring

One of: given, withdrawn

gapsrequiredarray of string

What the notice lacks under FA 1998 Sch 18 para 71(1). A notice with gaps is ineffective.

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).

Withdraw a notice of consent

POST/api/v1/corporation-tax/returns/{id}/group-relief/notices/{noticeId}/withdraw

Scopes
corporation_tax:write
Role
Preparer or above
Retries
Send an Idempotency-Key to make retries safe.

Preparers and above. A return that relies on it then can’t be filed until it’s replaced (FA 1998 Sch 18 para 71).

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/group-relief/notices/{noticeId}/withdraw
NameInTypeDescription
idrequiredpathstring (uuid)
noticeIdrequiredpathstring (uuid)
Idempotency-Keyheaderstring

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

1 to 255 characters

Responses

200 OK, application/json

Body: object (CtGroupNotice).

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).

Refresh from the source

POST/api/v1/corporation-tax/returns/{id}/sources/refresh

Scopes
corporation_tax:write
Role
Preparer or above

Preparers and above. Brings in what a linked file or set now holds, as a new version. Nothing changes if they already match. A real change loses an approval.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/sources/refresh
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Start next period’s return

POST/api/v1/corporation-tax/returns/{id}/roll-forward

Scopes
corporation_tax:write
Role
Preparer or above
Retries
Send an Idempotency-Key to make retries safe.

Preparers and above. Carries trading losses, loans to participators, capital allowance pool balances and the answers from this return. This year’s figures start at nil.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/roll-forward
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 (RollForwardCtReturnRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/roll-forward
FieldTypeDescription
periodEndstring (date)

End of the next period of account. Defaults to 12 months on.

example "2026-03-31"

Responses

201 Created, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Send for review

POST/api/v1/corporation-tax/returns/{id}/send-for-review

Scopes
corporation_tax:write
Role
Preparer or above

Preparers and above, from draft.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/send-for-review
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (CtNoteRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/send-for-review
FieldTypeDescription
notestring

up to 2000 characters

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Raise a review point

POST/api/v1/corporation-tax/returns/{id}/review-points

Scopes
review:write
Role
Reviewer or above

Reviewers and above. Open points stop a return being approved.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/review-points
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (RaiseCtReviewPointRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/review-points
FieldTypeDescription
textrequiredstring

1 to 4000 characters

boxstring

The CT600 box it’s about.

Responses

201 Created, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Clear a review point

POST/api/v1/corporation-tax/returns/{id}/review-points/{pointId}/clear

Scopes
review:write
Role
Reviewer or above

Reviewers and above.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/review-points/{pointId}/clear
NameInTypeDescription
idrequiredpathstring (uuid)
pointIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Approve a return

POST/api/v1/corporation-tax/returns/{id}/approve

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

A partner, signed in, or a manager where the firm allows it (403 otherwise). Refused with open review points, with a linked source changed, or if the figures moved since you reviewed them. What stops filing doesn’t stop approval. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/approve
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (ApproveCtReturnRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/approve
FieldTypeDescription
returnHashrequiredstring

The returnHash you reviewed.

notestring

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Reopen a return

POST/api/v1/corporation-tax/returns/{id}/reopen

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

Reviewers and above, signed in. Back to draft, and an approval is lost. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/reopen
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (CtNoteRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/reopen
FieldTypeDescription
notestring

up to 2000 characters

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Start an amended return

POST/api/v1/corporation-tax/returns/{id}/amend

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

Preparers and above, signed in. Only a filed return, within 12 months of its filing date (FA 1998 Sch 18 para 15(4)). A new draft with the filed figures: the original is never changed, and the amendment has its own review, approval and client's confirmation. Filing stays off. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/amend
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (CtNoteRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/amend
FieldTypeDescription
notestring

up to 2000 characters

Responses

201 Created, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Record a return as filed outside Tolvi

POST/api/v1/corporation-tax/returns/{id}/filed-elsewhere

Scopes
review:write
Role
Partner
Access
A signed-in Tolvi session only, never an API token.

A partner, signed in, for an approved return that went to HMRC by other means. It's the partner's record, not HMRC's word, and nothing is sent. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/filed-elsewhere
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (RecordCtFiledElsewhereRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/filed-elsewhere
FieldTypeDescription
filedOnrequiredstring (date)

The day it went to HMRC by other means. This is a record a person makes, not HMRC’s word.

example "2026-03-31"

notestring

up to 2000 characters

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Record the client’s confirmation

POST/api/v1/corporation-tax/returns/{id}/client-confirmation

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

Preparers and above, signed in. The client confirmed the copy they were sent. It counts only for these figures. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/client-confirmation
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (RecordCtClientConfirmationRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/client-confirmation
FieldTypeDescription
confirmedOnrequiredstring (date)

example "2026-03-31"

notestring
returnHashrequiredstring

The returnHash of the copy the client confirmed.

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

File with HMRC

POST/api/v1/corporation-tax/returns/{id}/submit

Scopes
corporation_tax: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.

A manager or partner, signed in with a second factor, once these figures are approved, the client has confirmed them and nothing blocks filing. Answers 503 until filing is switched on, once HMRC’s test service has passed. Never available to API keys or connected assistants.

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

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{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 (SubmitCtReturnRequest).

Request body for POST /api/v1/corporation-tax/returns/{id}/submit
FieldTypeDescription
returnHashrequiredstring
agentAccountIdrequiredstring (uuid)
declarationrequiredobject

{ accepted: true, version }: the declaration on the CT600.

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Ask HMRC for its answer

POST/api/v1/corporation-tax/returns/{id}/submissions/{submissionId}/poll

Scopes
corporation_tax:read

While HMRC is checking a return. Tolvi also asks by itself. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/corporation-tax/returns/{id}/submissions/{submissionId}/poll
NameInTypeDescription
idrequiredpathstring (uuid)
submissionIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtReturn).

A Company Tax Return for one accounting period, with its boxes, computation and what stands in the way of filing.

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).

Download the CT600

GET/api/v1/corporation-tax/returns/{id}/downloads/ct600.pdf

Scopes
corporation_tax:read

The return in the style of HMRC’s form, with CT600A where it applies. Every page gives its status and says it wasn’t issued by HMRC. Bank details appear masked. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/downloads/ct600.pdf
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK

A PDF.

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

Download the computation

GET/api/v1/corporation-tax/returns/{id}/downloads/computation.pdf

Scopes
corporation_tax:read

The tax computation for this accounting period, for people to read. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/downloads/computation.pdf
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK

A PDF.

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

Download the iXBRL accounts

GET/api/v1/corporation-tax/returns/{id}/downloads/accounts.xhtml

Scopes
corporation_tax:read

The tagged accounts from the linked Accounts set. 409 with no set linked. What stops the file being filed is in the return’s problems. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/downloads/accounts.xhtml
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK

iXBRL.

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

Download the iXBRL computation

GET/api/v1/corporation-tax/returns/{id}/downloads/computation.xhtml

Scopes
corporation_tax:read

The tagged computation for this accounting period. What stops the file being filed is in the return’s problems. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/downloads/computation.xhtml
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK

iXBRL.

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

Preview the CT600 XML

GET/api/v1/corporation-tax/returns/{id}/downloads/ct600.xml

Scopes
corporation_tax:read

The return in the order of HMRC’s schema, as it would be sent, without any sign-in and with bank details masked. It isn’t filed by downloading it. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/corporation-tax/returns/{id}/downloads/ct600.xml
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK

XML.

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

List HMRC accounts

GET/api/v1/corporation-tax/agent-accounts

Scopes
corporation_tax:read

Names and status only: a saved sign-in is never returned. Part of the corporation_tax product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (CtAgentAccountList).

200 OK response for GET /api/v1/corporation-tax/agent-accounts
FieldTypeDescription
itemsrequiredarray of CtAgentAccount
items[].​idrequiredstring (uuid)
items[].​namerequiredstring
items[].​credentialStatusrequiredstring (CtCredentialStatus)

One of: not_saved, saved, needs_update

items[].​userIdHintrequiredstringnullable
items[].​lastUsedAtrequiredstring (date-time)nullable
canStoreCredentialsrequiredboolean

Whether sign-ins can be stored on this Tolvi.

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

Add an HMRC account

POST/api/v1/corporation-tax/agent-accounts

Scopes
settings:admin
Access
A signed-in Tolvi session only, never an API token.

Firm admins, signed in. Name it so people can tell them apart, such as Leeds office. Part of the corporation_tax product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (CreateCtAgentAccountRequest).

Request body for POST /api/v1/corporation-tax/agent-accounts
FieldTypeDescription
namerequiredstring

1 to 80 characters; example "Leeds office"

Responses

201 Created, application/json

Body: object (CtAgentAccount).

201 Created response for POST /api/v1/corporation-tax/agent-accounts
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
credentialStatusrequiredstring (CtCredentialStatus)

One of: not_saved, saved, needs_update

userIdHintrequiredstringnullable
lastUsedAtrequiredstring (date-time)nullable

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

Remove an HMRC account

DELETE/api/v1/corporation-tax/agent-accounts/{id}

Scopes
settings:admin
Access
A signed-in Tolvi session only, never an API token.

Firm admins, signed in. Its sign-in is deleted at once. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for DELETE /api/v1/corporation-tax/agent-accounts/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

204 No content

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

Save the HMRC sign-in

PUT/api/v1/corporation-tax/agent-accounts/{id}/credentials

Scopes
settings:admin
Access
A signed-in Tolvi session only, never an API token.

Firm admins, signed in. Encrypted, used only when someone allowed to file files a return, and never shown again. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for PUT /api/v1/corporation-tax/agent-accounts/{id}/credentials
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (SaveCtCredentialsRequest).

Request body for PUT /api/v1/corporation-tax/agent-accounts/{id}/credentials
FieldTypeDescription
userIdrequiredstring

1 to 100 characters

passwordrequiredstring

1 to 200 characters

Responses

200 OK, application/json

Body: object (CtAgentAccount).

200 OK response for PUT /api/v1/corporation-tax/agent-accounts/{id}/credentials
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
credentialStatusrequiredstring (CtCredentialStatus)

One of: not_saved, saved, needs_update

userIdHintrequiredstringnullable
lastUsedAtrequiredstring (date-time)nullable

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

Delete the saved sign-in

DELETE/api/v1/corporation-tax/agent-accounts/{id}/credentials

Scopes
settings:admin
Access
A signed-in Tolvi session only, never an API token.

Firm admins, signed in. Part of the corporation_tax product: the firm must have it and you must have access to it.

Parameters

Parameters for DELETE /api/v1/corporation-tax/agent-accounts/{id}/credentials
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (CtAgentAccount).

200 OK response for DELETE /api/v1/corporation-tax/agent-accounts/{id}/credentials
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
credentialStatusrequiredstring (CtCredentialStatus)

One of: not_saved, saved, needs_update

userIdHintrequiredstringnullable
lastUsedAtrequiredstring (date-time)nullable

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