Skip to main content

Clients

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

What a linked client’s other work suggests here

GET/api/v1/cross-product-suggestions

Scopes
clients:read

Reads only, and only from products this person holds. Each comes with its source.

Parameters

Parameters for GET /api/v1/cross-product-suggestions
NameInTypeDescription
idrequiredquerystring (uuid)

The return or set of accounts.

productrequiredquerystring

One of: self_assessment, corporation_tax, accounts

Responses

200 OK, application/json

Body: object (CrossProductSuggestions).

200 OK response for GET /api/v1/cross-product-suggestions
FieldTypeDescription
itemsrequiredarray of CrossProductSuggestion
items[].​keyrequiredstring
items[].​kindrequiredstring (CrossProductSuggestionKind)

One of: dividends, loan, partnership, accounts

items[].​headlinerequiredstring
items[].​sourcerequiredstring

Where it comes from, in words: product, client and period.

items[].​noterequiredstring

What to check first.

items[].​suggestedPencerequiredintegernullable

The suggested figure in integer pence. Null when it can’t be worked out, such as with no shareholding on the link.

items[].​currentPencerequiredintegernullable

What the target holds now, in integer pence.

items[].​writesFigurerequiredboolean

Accepting writes a figure to the target. If false, accepting only records that a person has dealt with it.

items[].​targetrequiredstringnullable

The box or field it would change.

items[].​fingerprintrequiredstring
decisionsrequiredarray of CrossProductDecision

What people have decided already, kept for the record.

decisions[].​keyrequiredstring
decisions[].​decisionrequiredstring (CrossProductDecisionKind)

One of: accepted, dismissed

decisions[].​amountPencerequiredintegernullable

Integer pence (GBP).

decisions[].​sourcerequiredstring
decisions[].​decidedByNamerequiredstringnullable
decisions[].​decidedAtrequiredstring (date-time)
hiddenSourcesrequiredinteger

Sources this person can’t see because they don’t hold that product, so what’s from them isn’t shown.

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

Accept or dismiss a suggestion

POST/api/v1/cross-product-suggestions/decide

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

A signed-in person only, never an API key or connected assistant. Accepting writes through the target product’s own save, so an approved return goes back to draft. The decision is kept. A suggestion comes back if its source changes.

Request body

Required. application/json: object (DecideCrossProductSuggestionRequest).

Request body for POST /api/v1/cross-product-suggestions/decide
FieldTypeDescription
productrequiredstring (CrossProductTarget)

One of: self_assessment, corporation_tax, accounts

idrequiredstring (uuid)
keyrequiredstring
fingerprintrequiredstring
decisionrequiredstring (CrossProductDecisionKind)

One of: accepted, dismissed

amountPenceinteger

Integer pence: what to put in, if the person changed the figure.

Responses

200 OK, application/json

Body: object (CrossProductSuggestions).

The fields are as shown above.

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

List or search clients

GET/api/v1/clients

Scopes
clients:read

Sorted by name. Each row has the latest engagement’s partner and manager, the bookkeeping connection and the next filing deadline.

Parameters

Parameters for GET /api/v1/clients
NameInTypeDescription
limitqueryinteger

1 to 100; default 50

cursorquerystring
statusquerystring (ClientStatus)

One of: prospect, active, former

connectionquerystring (ClientConnectionState)

One of: connected, reconnect, error, not_connected

yearEndMonthqueryinteger

Year end month (the client’s own, or its latest engagement’s).

1 to 12

entityTypequerystring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

softwarequerystring (Software)

One of: xero, qbo, sage, freeagent, tolvi_books, manual

managerquerystring (uuid)
partnerquerystring (uuid)

Partner on any of the client’s engagements.

qquerystring

Part of the client name or company number.

up to 100 characters

Responses

200 OK, application/json

Body: object (ClientPage).

200 OK response for GET /api/v1/clients
FieldTypeDescription
rowsrequiredarray of Client
rows[].​idrequiredstring (uuid)
rows[].​firmIdrequiredstring (uuid)
rows[].​namerequiredstring

example "Hartley Joinery Ltd"

rows[].​entityTyperequiredstring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

rows[].​companyNumberrequiredstringnullable

Companies House number.

example "01234567"

rows[].​yearEndDayrequiredintegernullable

Financial year end day (with yearEndMonth); null when not known.

1 to 31

rows[].​yearEndMonthrequiredintegernullable

Financial year end month (1-12).

1 to 12

rows[].​createdAtrequiredstring (date-time)
rows[].​statusstring (ClientStatus)

Prospect, active or former.

One of: prospect, active, former

rows[].​latestPeriodEndstring (date)nullable

Lists only: the period end of the client’s latest engagement (null when it has none), so a year end can be shown when yearEndDay/yearEndMonth are not set.

example "2026-03-31"

rows[].​partnerIdstring (uuid)nullable

Lists only: the partner on the client’s latest engagement.

rows[].​managerIdstring (uuid)nullable

Lists only: the manager on the client’s latest engagement.

rows[].​connectionstring (ClientConnectionState)

Lists only: connected (Tolvi can read the books), reconnect (access expired or removed), error (the last call failed) or not_connected (manual upload).

One of: connected, reconnect, error, not_connected

rows[].​connectionProviderstringnullable

Lists only: the client’s source: connected software (xero, quickbooks, sage or freeagent), or tolvi_books when the client’s books are in Tolvi Books and that is the source in use.

example "xero"

rows[].​nextDueDatestring (date)nullable

Lists only: the earliest filing deadline among engagements not yet complete.

example "2026-03-31"

nextCursorrequiredstringnullable

Opaque cursor for the next page (pass as cursor); null on the last page.

pageSizerequiredinteger

The page size that was used.

1 to 100

totalrequiredinteger

Clients matching the search and filters (all pages).

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

Create a client

POST/api/v1/clients

Scopes
clients:write
Retries
Send an Idempotency-Key to make retries safe.

Parameters

Parameters for POST /api/v1/clients
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 (CreateClientRequest).

Request body for POST /api/v1/clients
FieldTypeDescription
namerequiredstring

1 to 200 characters

entityTyperequiredstring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

companyNumberstringnullable

Companies House number (upper-cased on save).

pattern ^(?:[0-9]{8}|[A-Z]{2}[0-9]{6})$

yearEndDayintegernullable

Financial year end day; send with yearEndMonth.

1 to 31

yearEndMonthintegernullable

Financial year end month.

1 to 12

Responses

201 Created, application/json

Body: object (Client).

201 Created response for POST /api/v1/clients
FieldTypeDescription
idrequiredstring (uuid)
firmIdrequiredstring (uuid)
namerequiredstring

example "Hartley Joinery Ltd"

entityTyperequiredstring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

companyNumberrequiredstringnullable

Companies House number.

example "01234567"

yearEndDayrequiredintegernullable

Financial year end day (with yearEndMonth); null when not known.

1 to 31

yearEndMonthrequiredintegernullable

Financial year end month (1-12).

1 to 12

createdAtrequiredstring (date-time)
statusstring (ClientStatus)

Prospect, active or former.

One of: prospect, active, former

latestPeriodEndstring (date)nullable

Lists only: the period end of the client’s latest engagement (null when it has none), so a year end can be shown when yearEndDay/yearEndMonth are not set.

example "2026-03-31"

partnerIdstring (uuid)nullable

Lists only: the partner on the client’s latest engagement.

managerIdstring (uuid)nullable

Lists only: the manager on the client’s latest engagement.

connectionstring (ClientConnectionState)

Lists only: connected (Tolvi can read the books), reconnect (access expired or removed), error (the last call failed) or not_connected (manual upload).

One of: connected, reconnect, error, not_connected

connectionProviderstringnullable

Lists only: the client’s source: connected software (xero, quickbooks, sage or freeagent), or tolvi_books when the client’s books are in Tolvi Books and that is the source in use.

example "xero"

nextDueDatestring (date)nullable

Lists only: the earliest filing deadline among engagements not yet complete.

example "2026-03-31"

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

Find existing clients a new one may duplicate

GET/api/v1/clients/duplicates

Scopes
clients:read

Call before creating a client. Matches the name ignoring case, punctuation and spacing ("&" = "and", "Limited" = "Ltd"), and the Companies House number when given. Advisory: creating a client is never blocked, so show the matches and let the person open one or add anyway.

Parameters

Parameters for GET /api/v1/clients/duplicates
NameInTypeDescription
companyNumberquerystring

The new client’s Companies House number.

up to 8 characters

namequerystring

The new client’s name.

up to 200 characters

Responses

200 OK, application/json

Body: object (DuplicateClients).

200 OK response for GET /api/v1/clients/duplicates
FieldTypeDescription
matchesrequiredarray of DuplicateClient
matches[].​clientrequiredobject (Client)
matches[].​client.​idrequiredstring (uuid)
matches[].​client.​firmIdrequiredstring (uuid)
matches[].​client.​namerequiredstring

example "Hartley Joinery Ltd"

matches[].​client.​entityTyperequiredstring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

matches[].​client.​companyNumberrequiredstringnullable

Companies House number.

example "01234567"

matches[].​client.​yearEndDayrequiredintegernullable

Financial year end day (with yearEndMonth); null when not known.

1 to 31

matches[].​client.​yearEndMonthrequiredintegernullable

Financial year end month (1-12).

1 to 12

matches[].​client.​createdAtrequiredstring (date-time)
matches[].​client.​statusstring (ClientStatus)

Prospect, active or former.

One of: prospect, active, former

matches[].​client.​latestPeriodEndstring (date)nullable

Lists only: the period end of the client’s latest engagement (null when it has none), so a year end can be shown when yearEndDay/yearEndMonth are not set.

example "2026-03-31"

matches[].​client.​partnerIdstring (uuid)nullable

Lists only: the partner on the client’s latest engagement.

matches[].​client.​managerIdstring (uuid)nullable

Lists only: the manager on the client’s latest engagement.

matches[].​client.​connectionstring (ClientConnectionState)

Lists only: connected (Tolvi can read the books), reconnect (access expired or removed), error (the last call failed) or not_connected (manual upload).

One of: connected, reconnect, error, not_connected

matches[].​client.​connectionProviderstringnullable

Lists only: the client’s source: connected software (xero, quickbooks, sage or freeagent), or tolvi_books when the client’s books are in Tolvi Books and that is the source in use.

example "xero"

matches[].​client.​nextDueDatestring (date)nullable

Lists only: the earliest filing deadline among engagements not yet complete.

example "2026-03-31"

matches[].​matchedOnrequiredarray of DuplicateClientMatch

name: the same name ignoring case, punctuation and spacing ("&" = "and", "Limited" = "Ltd"); company_number: the same Companies House number.

One of: name, company_number

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

List a client’s own checklist steps

GET/api/v1/clients/{clientId}/checklist-steps

Scopes
clients:read

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

Parameters

Parameters for GET /api/v1/clients/{clientId}/checklist-steps
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: array of ClientChecklistStep.

200 OK response for GET /api/v1/clients/{clientId}/checklist-steps
FieldTypeDescription
[].​idrequiredstring (uuid)
[].​sectionCoderequiredstring
[].​textrequiredstring
[].​createdAtrequiredstring (date-time)

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

Add a checklist step for this client

POST/api/v1/clients/{clientId}/checklist-steps

Scopes
clients:write
Retries
Send an Idempotency-Key to make retries safe.

Added to the section’s checklist on each new engagement. Part of the working_papers product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/clients/{clientId}/checklist-steps
NameInTypeDescription
clientIdrequiredpathstring (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 (CreateClientChecklistStep).

Request body for POST /api/v1/clients/{clientId}/checklist-steps
FieldTypeDescription
sectionCoderequiredstring
textrequiredstring

1 to 500 characters

Responses

201 Created, application/json

Body: object (ClientChecklistStep).

201 Created response for POST /api/v1/clients/{clientId}/checklist-steps
FieldTypeDescription
idrequiredstring (uuid)
sectionCoderequiredstring
textrequiredstring
createdAtrequiredstring (date-time)

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

Get a client with its settings, notes and year-end history

GET/api/v1/clients/{clientId}

Scopes
clients:read

Parameters

Parameters for GET /api/v1/clients/{clientId}
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (ClientDetail).

200 OK response for GET /api/v1/clients/{clientId}
FieldTypeDescription
idrequiredstring (uuid)
firmIdrequiredstring (uuid)
namerequiredstring
entityTyperequiredstring (EntityType)

One of: LTD_FRS102_1A, LTD_FRS105_MICRO, LLP, SOLE_TRADER, INDIVIDUAL, PARTNERSHIP, TRUST, ESTATE, CHARITY_UNINCORPORATED, CHARITY_TRUST, CIO, SCIO, CHARITABLE_COMPANY

companyNumberrequiredstringnullable
yearEndDayrequiredintegernullable

Financial year end day; null when not known.

1 to 31

yearEndMonthrequiredintegernullable

1 to 12

createdAtrequiredstring (date-time)
partnerIdrequiredstring (uuid)nullable

From the latest engagement.

managerIdrequiredstring (uuid)nullable
preparerIdrequiredstring (uuid)nullable

From the latest engagement.

reviewerIdrequiredstring (uuid)nullable

From the latest engagement.

softwarerequiredstring (Software)

One of: xero, qbo, sage, freeagent, tolvi_books, manual

syncStaterequiredstring (SyncState)

One of: in_sync, changed, expired_token, error, never_synced, manual

overridesrequiredobject (ClientOverrides)

A client’s settings that differ from the firm’s (null: use the firm default).

overrides.​riskrequiredstring (RiskLevel)nullable

One of: standard, high

overrides.​workflowTemplateIdrequiredstringnullable
overrides.​thresholdAbsPencerequiredintegernullable

Integer pence (GBP).

overrides.​thresholdPctrequiredintegernullable
overrides.​materialityPencerequiredintegernullable

Integer pence (GBP).

overrides.​deadlineOverriderequiredstring (date)nullable

e.g. an extension or a changed accounting reference date.

example "2026-03-31"

overrides.​syncIgnoreUnderPencerequiredintegernullable

Integer pence (GBP).

overrides.​syncExcludeCodesarray of stringnullable

Account codes the sign-off check leaves out for this client. Always present in responses.

up to 200 items

overrides.​syncOnChangestring (SyncOnChange)nullable

What the sign-off check does when this client’s books change. Always present in responses.

One of: notify, reopen, none

overrideCountrequiredinteger
notesrequiredstring
extraChecklistStepsrequiredarray of ClientStepRef
extraChecklistSteps[].​idrequiredstring (uuid)
extraChecklistSteps[].​sectionCoderequiredstring
extraChecklistSteps[].​textrequiredstring
extraChecklistSteps[].​createdAtrequiredstring (date-time)
engagementsrequiredarray of ClientEngagement

Year-end history, newest first.

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

example "2026-03-31"

engagements[].​periodEndrequiredstring (date)

example "2026-03-31"

engagements[].​dueDaterequiredstring (date)

example "2026-03-31"

engagements[].​statusrequiredstring (EngagementStatus)

One of: not_started, in_progress, submitted, returned, complete

engagements[].​stageNamerequiredstring
engagements[].​filedOnrequiredstring (date)nullable

example "2026-03-31"

engagements[].​preparerIdrequiredstring (uuid)nullable
engagements[].​reviewerIdrequiredstring (uuid)nullable
engagements[].​roundsrequiredinteger

Times sent back by a reviewer (amendment rounds).

at least 0

engagements[].​openReviewPointsrequiredinteger

at least 0

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

List the client’s remembered mappings

GET/api/v1/clients/{clientId}/mappings

Scopes
clients:read

Changing an account’s mapping in section B remembers it for the client; next year it is applied ahead of the firm rules.

Parameters

Parameters for GET /api/v1/clients/{clientId}/mappings
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: array of ClientMapping.

A remembered mapping: applied to this client’s code ahead of the firm rules.

200 OK response for GET /api/v1/clients/{clientId}/mappings
FieldTypeDescription
[].​coderequiredstring
[].​namerequiredstringnullable

The account’s name on the latest trial balance that has it.

[].​lineIdrequiredstring (LeadLineId)

One of: C.cost, C.dep, D.stk, E.td, E.pre, F.bank, G.tc, G.acc, H.vat, I.paye, J.dla, J.loanst, J.loan, K.cap, K.res, K.div, L.sales, L.intrec, M.cos, M.adm, M.dis, M.dep, M.int, M.disp, T.chg, T.liab, T.dtc, P.dt, J.cap, J.draw

[].​updatedAtrequiredstring (date-time)

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

Get the client’s overrides of the firm settings

GET/api/v1/clients/{clientId}/settings

Scopes
clients:read

Parameters

Parameters for GET /api/v1/clients/{clientId}/settings
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (ClientOverrides).

A client’s settings that differ from the firm’s (null: use the firm default).

200 OK response for GET /api/v1/clients/{clientId}/settings
FieldTypeDescription
riskrequiredstring (RiskLevel)nullable

One of: standard, high

workflowTemplateIdrequiredstringnullable
thresholdAbsPencerequiredintegernullable

Integer pence (GBP).

thresholdPctrequiredintegernullable
materialityPencerequiredintegernullable

Integer pence (GBP).

deadlineOverriderequiredstring (date)nullable

e.g. an extension or a changed accounting reference date.

example "2026-03-31"

syncIgnoreUnderPencerequiredintegernullable

Integer pence (GBP).

syncExcludeCodesarray of stringnullable

Account codes the sign-off check leaves out for this client. Always present in responses.

up to 200 items

syncOnChangestring (SyncOnChange)nullable

What the sign-off check does when this client’s books change. Always present in responses.

One of: notify, reopen, none

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

Change the client’s overrides

PATCH/api/v1/clients/{clientId}/settings

Scopes
clients:write
Role
Manager or above

Send only what changes; null goes back to the firm default. Used by engagements started from now on.

Needs the Manager role or above.

Parameters

Parameters for PATCH /api/v1/clients/{clientId}/settings
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Request body

Required. application/json: object (ClientOverrides).

A client’s settings that differ from the firm’s (null: use the firm default).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (ClientOverrides).

A client’s settings that differ from the firm’s (null: use the firm default).

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

Get the client’s permanent notes

GET/api/v1/clients/{clientId}/notes

Scopes
clients:read

Parameters

Parameters for GET /api/v1/clients/{clientId}/notes
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (ClientNotes).

200 OK response for GET /api/v1/clients/{clientId}/notes
FieldTypeDescription
notesrequiredstring

up to 20000 characters

updatedByrequiredstring (uuid)nullable
updatedAtrequiredstring (date-time)nullable

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

Replace the client’s permanent notes

PATCH/api/v1/clients/{clientId}/notes

Scopes
clients:write

Parameters

Parameters for PATCH /api/v1/clients/{clientId}/notes
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Request body

Required. application/json: object (SetClientNotes).

Request body for PATCH /api/v1/clients/{clientId}/notes
FieldTypeDescription
notesrequiredstring

up to 20000 characters

Responses

200 OK, application/json

Body: object (ClientNotes).

200 OK response for PATCH /api/v1/clients/{clientId}/notes
FieldTypeDescription
notesrequiredstring

up to 20000 characters

updatedByrequiredstring (uuid)nullable
updatedAtrequiredstring (date-time)nullable

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

Preview starting a client’s books from its final trial balance

POST/api/v1/clients/{clientId}/books-link/opening/preview

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

Uses the client’s latest engagement approved at every stage, or the one named. Each final balance is placed on the books’ account by mapping, the same code on the same lead line, or the lead line’s default account; anything else is listed to map. problems says what stands in the way. Nothing is posted. Session only; reviewers and above. Part of the working_papers product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/clients/{clientId}/books-link/opening/preview
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Client id.

Request body

Optional. application/json: object (StartBooksFromFinalTbInput).

Request body for POST /api/v1/clients/{clientId}/books-link/opening/preview
FieldTypeDescription
engagementIdstring (uuid)

Defaults to the client’s latest engagement approved at every stage.

mappingobject

Final TB code to an account code in the books.

Responses

200 OK, application/json

Body: object (StartBooksFromFinalTbPreview).

The opening entry the client’s books would get from a final trial balance, mapped through the lead lines. Nothing is posted.

200 OK response for POST /api/v1/clients/{clientId}/books-link/opening/preview
FieldTypeDescription
readyrequiredboolean
problemsrequiredarray of string

What stands in the way, in words.

warningsrequiredarray of string
engagementIdrequiredstring (uuid)nullable
periodEndrequiredstring (date)nullable

example "2026-03-31"

startDaterequiredstring (date)nullable

The day after the period end.

example "2026-03-31"

businessIdrequiredstring (uuid)nullable
businessNamerequiredstringnullable
alreadyPostedrequiredboolean
planrequiredarray of BooksOpeningPlanLine
plan[].​sourceCoderequiredstring
plan[].​sourceNamerequiredstring
plan[].​balancePencerequiredinteger

Integer pence (GBP).

plan[].​targetCoderequiredstring
plan[].​targetNamerequiredstring
plan[].​viarequiredstring (BooksOpeningPlanVia)

One of: mapping, code, lead_line

unmappedrequiredarray of BooksOpeningUnmapped
unmapped[].​coderequiredstring
unmapped[].​namerequiredstring
unmapped[].​balancePencerequiredinteger

Integer pence (GBP).

unmapped[].​leadLinerequiredstringnullable
linesrequiredarray of BooksOpeningEntryLine
lines[].​accountIdrequiredstring (uuid)
lines[].​accountCoderequiredstring
lines[].​accountNamerequiredstring
lines[].​ownerNamerequiredstring
lines[].​normalBalancerequiredstring (BooksNormalBalance)

One of: debit, credit

lines[].​amountPencerequiredinteger

Integer pence (GBP).

Debit positive, credit negative.

lines[].​contactNamerequiredstringnullable

The customer or supplier, on a control account line split by unpaid invoice or bill.

suspensePencerequiredinteger

Integer pence (GBP).

accountsrequiredarray of BooksOpeningAccountRef

The books’ accounts, to map an unplaced balance to.

accounts[].​coderequiredstring
accounts[].​namerequiredstring
accounts[].​ownerNamerequiredstring

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

Start a client’s books from its final trial balance

POST/api/v1/clients/{clientId}/books-link/opening

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

Posts the preview’s opening entry to the client’s books, dated the period end, through the firm’s practice link (year-end or full bookkeeping access). 409 with the reasons when the preview isn’t ready. Reversible from the books until the year is locked. Session only; reviewers and above; not available through the MCP server. Part of the working_papers product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/clients/{clientId}/books-link/opening
NameInTypeDescription
clientIdrequiredpathstring (uuid)

Client id.

Idempotency-Keyheaderstring

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

1 to 255 characters

Request body

Optional. application/json: object (StartBooksFromFinalTbInput).

Request body for POST /api/v1/clients/{clientId}/books-link/opening
FieldTypeDescription
engagementIdstring (uuid)

Defaults to the client’s latest engagement approved at every stage.

mappingobject

Final TB code to an account code in the books.

Responses

201 Created, application/json

Body: object (StartBooksFromFinalTbResult).

201 Created response for POST /api/v1/clients/{clientId}/books-link/opening
FieldTypeDescription
entryIdrequiredstring (uuid)
seqrequiredinteger
startDaterequiredstring (date)

example "2026-03-31"

suspensePencerequiredinteger

Integer pence (GBP).

statusrequiredstring (StartBooksFromFinalTbStatus)

One of: posted

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