Skip to main content

Tolvi Hub

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

Get the home page

GET/api/v1/hub/home

Scopes
clients:read

How many clients the firm has, your work and your meetings today, in one read. A product’s part is null when you can’t use it or the credential has no scope for it. Part of the hub product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (HubHome).

The accountant’s home page in one read. A product’s part is null when this person can’t use it.

200 OK response for GET /api/v1/hub/home
FieldTypeDescription
clientsrequiredobject (HubClientCounts)
clients.​activerequiredinteger
clients.​prospectrequiredinteger
clients.​formerrequiredinteger
workrequiredobject (HubWork)nullable

Engagements where you are on the team, from Working Papers.

work.​yourTurnrequiredinteger

Your turn, due soon: the Work queue’s to-do view.

work.​toReviewrequiredinteger

Waiting for your review.

work.​overduerequiredinteger
work.​dueIn30Daysrequiredinteger
work.​nextDeadlinesrequiredarray of HubDeadline

The next five filing deadlines.

work.​nextDeadlines[].​engagementIdrequiredstring (uuid)
work.​nextDeadlines[].​clientIdrequiredstring (uuid)
work.​nextDeadlines[].​clientNamerequiredstring
work.​nextDeadlines[].​periodEndrequiredstring (date)

example "2026-03-31"

work.​nextDeadlines[].​dueDaterequiredstring (date)

example "2026-03-31"

work.​nextDeadlines[].​daysLeftrequiredinteger

Days from today to the deadline; negative when overdue.

work.​nextDeadlines[].​stageNamerequiredstring
suiteobject (HubSuite)

Your work across every product you can use. Counts are of work you answer for.

suite.​productsrequiredarray of WorkItemProduct

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

suite.​yourTurnrequiredinteger

You act next.

suite.​toReviewrequiredinteger

Waiting for your review.

suite.​overduerequiredinteger
suite.​dueIn30Daysrequiredinteger
suite.​nextDeadlinesrequiredarray of SuiteDeadline

The next five deadlines, each with its product.

suite.​nextDeadlines[].​productrequiredstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

suite.​nextDeadlines[].​itemIdrequiredstring (uuid)
suite.​nextDeadlines[].​clientIdrequiredstring (uuid)
suite.​nextDeadlines[].​clientNamerequiredstring
suite.​nextDeadlines[].​periodLabelrequiredstring

example "2025/26"

suite.​nextDeadlines[].​stageLabelrequiredstring
suite.​nextDeadlines[].​kindrequiredstring (WorkDeadlineKind)

One of: companies_house, charity_regulator, self_assessment, ct600, ct_payment

suite.​nextDeadlines[].​labelrequiredstring
suite.​nextDeadlines[].​dueDaterequiredstring (date)

example "2026-03-31"

suite.​nextDeadlines[].​daysLeftrequiredinteger

Days from today; negative when overdue.

meetingsTodayrequiredarray of HubMeetingnullable

Note-takers you sent to meetings today (UK time). Null without Meetings.

meetingsToday[].​idrequiredstring (uuid)
meetingsToday[].​titlerequiredstring
meetingsToday[].​clientIdrequiredstring (uuid)nullable
meetingsToday[].​clientNamerequiredstringnullable
meetingsToday[].​joinAtrequiredstring (date-time)
meetingsToday[].​statusrequiredstring

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

List work across the products

GET/api/v1/hub/work-items

Scopes
clients:read

Engagements, self assessment returns, accounts and Company Tax Returns in one list, soonest deadline first. Only products you can use and your credential has a scope for are looked in. Complete work is left out unless you ask for it. Accounts count as complete once approved, because filing at Companies House isn’t recorded. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/hub/work-items
NameInTypeDescription
limitqueryinteger

1 to 500; default 50

cursorquerystring
updatedFromquerystring (date)

Last changed on or after this date.

openPointsquerystring

true: has open review points.

One of: true, false

atRiskquerystring

true: due within 30 days and not yet in review.

One of: true, false

ownerIdquerystring

Who acts next: a person’s id, or none for work nobody holds yet.

includeCompletedquerystring

One of: true, false

overduequerystring

One of: true, false

dueToquerystring (date)

Any of its deadlines on or before this date.

dueFromquerystring (date)

Any of its deadlines on or after this date.

clientIdquerystring (uuid)
qquerystring

Part of the client name.

up to 100 characters

stagequerystring (WorkItemStage)

One of: not_started, preparing, returned, in_review, ready_to_file, filing, complete

productquerystring (WorkItemProduct)

One of: working_papers, self_assessment, accounts, corporation_tax

scopequerystring

mine: work you prepare or review, or whose client you answer for. turn: you act next. review: waiting for your review. Left out: all.

One of: mine, turn, review, all

Responses

200 OK, application/json

Body: object (WorkItemPage).

Work across the products you can use, soonest deadline first.

200 OK response for GET /api/v1/hub/work-items
FieldTypeDescription
rowsrequiredarray of WorkItem
rows[].​productrequiredstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

rows[].​idrequiredstring (uuid)

The engagement, return or set of accounts.

rows[].​clientIdrequiredstring (uuid)
rows[].​clientNamerequiredstring
rows[].​periodLabelrequiredstring

example "YE 31 Mar 2026"

rows[].​periodEndrequiredstring (date)

example "2026-03-31"

rows[].​dueDaterequiredstring (date)

The filing date, by the rule the product uses.

example "2026-03-31"

rows[].​daysLeftrequiredinteger

Days from today; negative when overdue.

rows[].​deadlinesrequiredarray of WorkDeadline

Corporation tax has a payment date as well as a filing date.

rows[].​deadlines[].​kindrequiredstring (WorkDeadlineKind)

One of: companies_house, charity_regulator, self_assessment, ct600, ct_payment

rows[].​deadlines[].​labelrequiredstring

example "CT600 filing"

rows[].​deadlines[].​daterequiredstring (date)

example "2026-03-31"

rows[].​statusrequiredstring

The product’s own status.

rows[].​stagerequiredstring (WorkItemStage)

One of: not_started, preparing, returned, in_review, ready_to_file, filing, complete

rows[].​stageLabelrequiredstring

example "In review"

rows[].​ownerIdrequiredstring (uuid)nullable

Who acts next. Null when that is any partner, or nobody yet.

rows[].​ownerNamerequiredstringnullable
rows[].​openReviewPointsrequiredinteger
rows[].​updatedAtrequiredstring (date-time)
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

totalsrequiredobject (WorkItemTotals)
totals.​totalrequiredinteger

Every row this filter matches, before paging.

totals.​overduerequiredinteger
totals.​dueIn30Daysrequiredinteger
totals.​workingPapersrequiredinteger
totals.​selfAssessmentrequiredinteger
totals.​accountsrequiredinteger
totals.​corporationTaxrequiredinteger
productsrequiredarray of WorkItemProduct

The products looked in: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

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

List the dashboard widgets you can see

GET/api/v1/hub/widgets

Scopes
clients:read

The catalogue: each widget’s purpose, where its figures come from, its usual size and who can see it. Widgets for apps you can’t use are left out. Part of the hub product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (HubWidgetCatalogue).

200 OK response for GET /api/v1/hub/widgets
FieldTypeDescription
widgetsrequiredarray of HubWidgetDefinition

Only widgets you can see.

widgets[].​keyrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

widgets[].​titlerequiredstring
widgets[].​purposerequiredstring
widgets[].​dataSourcerequiredstring
widgets[].​audiencerequiredstring

Who can see it.

widgets[].​wrequiredinteger

Its usual width, in columns of twelve.

widgets[].​hrequiredinteger

Its usual height, in rows.

widgets[].​scopesrequiredarray of string

Whose work it can count; the first is the default. Empty when that doesn’t apply.

One of: mine, all

widgets[].​byProductrequiredboolean

Whether it can be narrowed to one app.

productsrequiredarray of string

The apps whose work you can read.

One of: working_papers, self_assessment, accounts, corporation_tax

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

Get one widget’s figures

GET/api/v1/hub/widgets/{key}

Scopes
clients:read

Read from the product that holds them when you ask, so nothing can go stale. Money is in integer pence. Each number says which query on GET /hub/work-items shows the work behind it. Refused with 403 when the widget needs an app or a scope you don’t have. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/hub/widgets/{key}
NameInTypeDescription
keyrequiredpathstring

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

productquerystring (WorkItemProduct)

Only this app’s work. Refused where the widget doesn’t offer it.

One of: working_papers, self_assessment, accounts, corporation_tax

scopequerystring (HubWidgetScope)

mine: work you answer for. all: everyone’s. Refused where the widget doesn’t offer it.

One of: mine, all

Responses

200 OK, application/json

Body: object (HubWidgetData).

What one widget shows, read from the product that holds it when you ask. Nothing is stored.

200 OK response for GET /api/v1/hub/widgets/{key}
FieldTypeDescription
keyrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

asOfrequiredstring (date)

example "2026-03-31"

summaryrequiredstring

One sentence saying what it shows: the text alternative for a chart.

figurerequiredobject (HubWidgetFigure)nullable
figure.​valuerequiredinteger

In integer pence when the unit is pence.

figure.​unitrequiredstring (HubWidgetFigureUnit)

One of: count, pence, tokens

figure.​labelrequiredstring
figure.​tonerequiredstring (HubWidgetFigureTone)

One of: neutral, warning, danger

chartrequiredstring (HubWidgetChart)

One of: none, bars, stacked_bars, columns

barsrequiredarray of HubWidgetBar
bars[].​keyrequiredstring
bars[].​labelrequiredstring
bars[].​valuerequiredinteger
bars[].​filterrequiredobject (HubWidgetWorkFilter)nullable

The query on GET /hub/work-items that shows the work behind a number.

bars[].​filter.​scopestring (HubWidgetWorkFilterScope)

One of: mine, review, all

bars[].​filter.​productstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

bars[].​filter.​stagestring (WorkItemStage)

One of: not_started, preparing, returned, in_review, ready_to_file, filing, complete

bars[].​filter.​ownerIdstring

A person’s id, or none for work nobody holds.

bars[].​filter.​dueFromstring (date)

example "2026-03-31"

bars[].​filter.​dueTostring (date)

example "2026-03-31"

bars[].​filter.​overdueboolean
bars[].​filter.​atRiskboolean
bars[].​filter.​openPointsboolean
bars[].​filter.​includeCompletedboolean
bars[].​filter.​updatedFromstring (date)

example "2026-03-31"

bars[].​segmentsrequiredarray of HubWidgetSegment
bars[].​segments[].​keyrequiredstring
bars[].​segments[].​labelrequiredstring
bars[].​segments[].​valuerequiredinteger
bars[].​segments[].​filterrequiredobject (HubWidgetWorkFilter)nullable

The query on GET /hub/work-items that shows the work behind a number.

bars[].​segments[].​filter.​scopestring (HubWidgetWorkFilterScope)

One of: mine, review, all

bars[].​segments[].​filter.​productstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

bars[].​segments[].​filter.​stagestring (WorkItemStage)

One of: not_started, preparing, returned, in_review, ready_to_file, filing, complete

bars[].​segments[].​filter.​ownerIdstring

A person’s id, or none for work nobody holds.

bars[].​segments[].​filter.​dueFromstring (date)

example "2026-03-31"

bars[].​segments[].​filter.​dueTostring (date)

example "2026-03-31"

bars[].​segments[].​filter.​overdueboolean
bars[].​segments[].​filter.​atRiskboolean
bars[].​segments[].​filter.​openPointsboolean
bars[].​segments[].​filter.​includeCompletedboolean
bars[].​segments[].​filter.​updatedFromstring (date)

example "2026-03-31"

legendrequiredarray of HubWidgetLegendEntry
legend[].​keyrequiredstring
legend[].​labelrequiredstring
rowsrequiredarray of HubWidgetRow

At most twelve. total says how many there are.

rows[].​idrequiredstring
rows[].​titlerequiredstring
rows[].​detailrequiredstring
rows[].​daterequiredstring (date)nullable

example "2026-03-31"

rows[].​daysLeftrequiredintegernullable
rows[].​amountPencerequiredintegernullable

Integer pence.

rows[].​countrequiredintegernullable
rows[].​linkrequiredobject (HubWidgetLink)nullable

What a row or widget opens.

rows[].​link.​kindrequiredstring (HubWidgetLinkKind)

One of: work_item, meeting, imports, ai_settings, notifications

rows[].​link.​productstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

rows[].​link.​idstring (uuid)
totalrequiredinteger
filterrequiredobject (HubWidgetWorkFilter)nullable

The work behind the whole widget; null when it isn’t work.

filter.​scopestring (HubWidgetWorkFilterScope)

One of: mine, review, all

filter.​productstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

filter.​stagestring (WorkItemStage)

One of: not_started, preparing, returned, in_review, ready_to_file, filing, complete

filter.​ownerIdstring

A person’s id, or none for work nobody holds.

filter.​dueFromstring (date)

example "2026-03-31"

filter.​dueTostring (date)

example "2026-03-31"

filter.​overdueboolean
filter.​atRiskboolean
filter.​openPointsboolean
filter.​includeCompletedboolean
filter.​updatedFromstring (date)

example "2026-03-31"

linkrequiredobject (HubWidgetLink)nullable

Where to go for more when it isn’t work.

link.​kindrequiredstring (HubWidgetLinkKind)

One of: work_item, meeting, imports, ai_settings, notifications

link.​productstring (WorkItemProduct)

The products counted: those you can use.

One of: working_papers, self_assessment, accounts, corporation_tax

link.​idstring (uuid)
noterequiredstringnullable

Something the reader should know, such as what’s left out.

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

List dashboards

GET/api/v1/hub/dashboards

Scopes
clients:read

The presets for the apps you can use, your own and those shared with the firm, with which to open first. A preset’s layout leaves out widgets you can’t see. Part of the hub product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (HubDashboardList).

200 OK response for GET /api/v1/hub/dashboards
FieldTypeDescription
dashboardsrequiredarray of HubDashboard

Presets for the apps you can use, then your own and those shared with the firm, by name.

dashboards[].​idrequiredstring

preset:<key> for a preset, otherwise the dashboard’s id.

example "preset:my_work"

dashboards[].​namerequiredstring
dashboards[].​descriptionrequiredstringnullable
dashboards[].​kindrequiredstring (HubDashboardKind)

preset: read only, can be duplicated. private: only its creator sees it. firm: everyone in the firm sees it.

One of: preset, private, firm

dashboards[].​canEditrequiredboolean

Whether you may change or delete it: its creator, or for a shared one a manager and above.

dashboards[].​minerequiredboolean
dashboards[].​createdByNamerequiredstringnullable

Who made it; null for a preset or someone who has left.

dashboards[].​layoutrequiredarray of HubLayoutItem
dashboards[].​layout[].​widgetrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

dashboards[].​layout[].​wrequiredinteger

Columns of twelve. A phone shows one column.

One of: 3, 4, 6, 8, 12

dashboards[].​layout[].​hrequiredinteger

Rows of the grid.

One of: 1, 2, 3

dashboards[].​layout[].​scopestring (HubWidgetScope)

mine: work you answer for. all: everyone’s. Left out: the widget’s default.

One of: mine, all

dashboards[].​layout[].​productstring (WorkItemProduct)

Only this app’s work.

One of: working_papers, self_assessment, accounts, corporation_tax

dashboards[].​updatedAtrequiredstring (date-time)nullable
defaultIdrequiredstring

Which to open: your choice while it’s still there, otherwise the preset for your role.

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

Save a new dashboard

POST/api/v1/hub/dashboards

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

Anyone in the firm can make a dashboard, private or shared with the firm. To duplicate one, send its layout under a new name. Signed-in people only. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/hub/dashboards
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 (CreateHubDashboard).

Request body for POST /api/v1/hub/dashboards
FieldTypeDescription
namerequiredstring

up to 60 characters

visibilitystring (HubDashboardVisibility)

Left out: private.

One of: private, firm

layoutrequiredarray of HubLayoutItem
layout[].​widgetrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

layout[].​wrequiredinteger

Columns of twelve. A phone shows one column.

One of: 3, 4, 6, 8, 12

layout[].​hrequiredinteger

Rows of the grid.

One of: 1, 2, 3

layout[].​scopestring (HubWidgetScope)

mine: work you answer for. all: everyone’s. Left out: the widget’s default.

One of: mine, all

layout[].​productstring (WorkItemProduct)

Only this app’s work.

One of: working_papers, self_assessment, accounts, corporation_tax

Responses

201 Created, application/json

Body: object (HubDashboard).

A preset, or a dashboard someone saved.

201 Created response for POST /api/v1/hub/dashboards
FieldTypeDescription
idrequiredstring

preset:<key> for a preset, otherwise the dashboard’s id.

example "preset:my_work"

namerequiredstring
descriptionrequiredstringnullable
kindrequiredstring (HubDashboardKind)

preset: read only, can be duplicated. private: only its creator sees it. firm: everyone in the firm sees it.

One of: preset, private, firm

canEditrequiredboolean

Whether you may change or delete it: its creator, or for a shared one a manager and above.

minerequiredboolean
createdByNamerequiredstringnullable

Who made it; null for a preset or someone who has left.

layoutrequiredarray of HubLayoutItem
layout[].​widgetrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

layout[].​wrequiredinteger

Columns of twelve. A phone shows one column.

One of: 3, 4, 6, 8, 12

layout[].​hrequiredinteger

Rows of the grid.

One of: 1, 2, 3

layout[].​scopestring (HubWidgetScope)

mine: work you answer for. all: everyone’s. Left out: the widget’s default.

One of: mine, all

layout[].​productstring (WorkItemProduct)

Only this app’s work.

One of: working_papers, self_assessment, accounts, corporation_tax

updatedAtrequiredstring (date-time)nullable

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

Choose your default dashboard

PUT/api/v1/hub/dashboards/default

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

A preset or a dashboard you can see. If it later goes, Home opens the preset for your role. Signed-in people only. Part of the hub product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (SetHubDefaultDashboard).

Request body for PUT /api/v1/hub/dashboards/default
FieldTypeDescription
dashboardrequiredstring

preset:<key> or a dashboard’s id.

example "preset:deadlines"

Responses

200 OK, application/json

Body: object (SetHubDefaultDashboard).

200 OK response for PUT /api/v1/hub/dashboards/default
FieldTypeDescription
dashboardrequiredstring

preset:<key> or a dashboard’s id.

example "preset:deadlines"

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

Change a dashboard

PATCH/api/v1/hub/dashboards/{id}

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

Name, layout or who sees it. Its creator, or for a shared dashboard a manager and above. Others can duplicate it and change their copy. Only its creator can make a shared one private. Signed-in people only. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for PATCH /api/v1/hub/dashboards/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (UpdateHubDashboard).

Only the fields sent are changed.

Request body for PATCH /api/v1/hub/dashboards/{id}
FieldTypeDescription
namestring

up to 60 characters

visibilitystring (HubDashboardVisibility)

Left out: private.

One of: private, firm

layoutarray of HubLayoutItem
layout[].​widgetrequiredstring (HubWidgetKey)

One of: my_deadlines, team_workload, deadlines_by_week, overdue_at_risk, awaiting_review, open_review_points, work_by_status, completed_this_month, recent_notifications, meetings_today, recently_opened, changed_source_files, ai_tokens, imports_in_progress

layout[].​wrequiredinteger

Columns of twelve. A phone shows one column.

One of: 3, 4, 6, 8, 12

layout[].​hrequiredinteger

Rows of the grid.

One of: 1, 2, 3

layout[].​scopestring (HubWidgetScope)

mine: work you answer for. all: everyone’s. Left out: the widget’s default.

One of: mine, all

layout[].​productstring (WorkItemProduct)

Only this app’s work.

One of: working_papers, self_assessment, accounts, corporation_tax

Responses

200 OK, application/json

Body: object (HubDashboard).

A preset, or a dashboard someone saved.

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

Delete a dashboard

DELETE/api/v1/hub/dashboards/{id}

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

Its creator, or for a shared dashboard a manager and above. Others can duplicate it and change their copy. Signed-in people only. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for DELETE /api/v1/hub/dashboards/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

204 No content

Gone.

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

Get one client across the suite

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

Scopes
clients:read

The record, and what each product holds about the client: status, next deadline, latest figures, tax due, review points. Each part comes from its own product, and is null when you can’t use that product or your credential has no scope for it; unavailable names those. Part of the hub product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (ClientOverview).

200 OK response for GET /api/v1/clients/{clientId}/overview
FieldTypeDescription
clientIdrequiredstring (uuid)
todayrequiredstring (date)

example "2026-03-31"

createdAtrequiredstring (date-time)
recordrequiredobject (ClientRecord)

One client’s central record: what the firm holds, and what each product holds about them. A product’s part is null when this person or credential can’t use it.

record.​clientIdrequiredstring (uuid)
record.​namerequiredstring
record.​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

record.​companyNumberrequiredstringnullable
record.​yearEndDayrequiredintegernullable

1 to 31

record.​yearEndMonthrequiredintegernullable

1 to 12

record.​statusrequiredstring (ClientStatus)

One of: prospect, active, former

record.​servicesrequiredarray of ClientService

One of: accounts, corporation_tax, self_assessment, vat, payroll, bookkeeping

record.​utrrequiredstringnullable

Unique Taxpayer Reference, ten digits.

record.​vatNumberrequiredstringnullable

example "GB123456789"

record.​payeReferencerequiredstringnullable

Employer PAYE reference.

example "123/AB456"

record.​registeredAddressrequiredstringnullable
record.​principalActivitystringnullable

Accounts and Corporation Tax default from this.

record.​signatoryNamestringnullable

Who usually signs the company’s accounts and returns. Accounts and Corporation Tax default from this.

record.​responsiblePartnerIdrequiredstring (uuid)nullable

Set on the record; null when not set.

record.​clientManagerIdrequiredstring (uuid)nullable

Set on the record; null when not set.

record.​responsiblePartnerrequiredobject (ClientRecordPerson)nullable

Who to show: the record’s, else the latest engagement’s.

record.​responsiblePartner.​idrequiredstring (uuid)
record.​responsiblePartner.​namerequiredstring
record.​responsiblePartner.​sourcerequiredstring (ClientRecordPersonSource)

client: set on the record. latest_engagement: not set, so taken from the latest engagement’s team.

One of: client, latest_engagement

record.​clientManagerrequiredobject (ClientRecordPerson)nullable

Who to show: the record’s, else the latest engagement’s.

record.​clientManager.​idrequiredstring (uuid)
record.​clientManager.​namerequiredstring
record.​clientManager.​sourcerequiredstring (ClientRecordPersonSource)

client: set on the record. latest_engagement: not set, so taken from the latest engagement’s team.

One of: client, latest_engagement

record.​contactsrequiredarray of ClientContact

Primary first, then by name.

record.​contacts[].​idrequiredstring (uuid)
record.​contacts[].​namerequiredstring

example "Jo Hartley"

record.​contacts[].​rolerequiredstringnullable

example "Director"

record.​contacts[].​emailrequiredstringnullable
record.​contacts[].​phonerequiredstringnullable
record.​contacts[].​isPrimaryrequiredboolean

The person to contact first. At most one per client.

record.​contacts[].​appointedOnstring (date)nullable

For a director: appointed during the year. Blank means throughout.

example "2026-03-31"

record.​contacts[].​resignedOnstring (date)nullable

For a director: resigned during the year.

example "2026-03-31"

record.​notesrequiredstring

The client’s permanent notes.

record.​workrequiredobject (ClientRecordWork)nullable

From Working Papers.

record.​work.​currentrequiredobject (ClientRecordEngagement)nullable

The latest year end.

record.​work.​current.​idrequiredstring (uuid)
record.​work.​current.​periodEndrequiredstring (date)

example "2026-03-31"

record.​work.​current.​dueDaterequiredstring (date)

example "2026-03-31"

record.​work.​current.​statusrequiredstring

example "in_progress"

record.​work.​current.​stageNamerequiredstring
record.​work.​yearEndsrequiredinteger
record.​work.​openrequiredinteger

Engagements not yet complete.

record.​work.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among engagements not yet complete.

example "2026-03-31"

record.​meetingsrequiredobject (ClientRecordMeetings)nullable

From Meetings.

record.​meetings.​totalrequiredinteger
record.​meetings.​openNextStepsrequiredinteger

Next steps not yet sorted, across this client’s meetings.

record.​meetings.​latestrequiredobject (ClientRecordMeeting)nullable
record.​meetings.​latest.​idrequiredstring (uuid)
record.​meetings.​latest.​titlerequiredstring
record.​meetings.​latest.​joinAtrequiredstring (date-time)
record.​meetings.​latest.​statusrequiredstring
record.​booksrequiredobject (ClientRecordBooks)

Where the client’s books are, from its connection and its Tolvi Books link.

record.​books.​connectionLabelrequiredstringnullable

The connected software, if any.

example "Xero"

record.​books.​connectionStatusrequiredstringnullable

The connection’s state: active, expired, revoked or error.

record.​books.​booksLinkedrequiredboolean

The client is linked to a business in Tolvi Books.

record.​books.​booksLiverequiredboolean

The link is live, so the firm can read those books.

record.​selfAssessmentobject (ClientRecordProductWork)nullable

From Self Assessment.

record.​selfAssessment.​totalrequiredinteger
record.​selfAssessment.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

record.​selfAssessment.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

record.​selfAssessment.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

record.​selfAssessment.​latest.​idrequiredstring (uuid)
record.​selfAssessment.​latest.​periodLabelrequiredstring

example "2025/26"

record.​selfAssessment.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

record.​selfAssessment.​latest.​statusrequiredstring

The product’s own status.

record.​selfAssessment.​latest.​stageLabelrequiredstring

example "In review"

record.​selfAssessment.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

record.​accountsobject (ClientRecordProductWork)nullable

From Accounts.

record.​accounts.​totalrequiredinteger
record.​accounts.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

record.​accounts.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

record.​accounts.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

record.​accounts.​latest.​idrequiredstring (uuid)
record.​accounts.​latest.​periodLabelrequiredstring

example "2025/26"

record.​accounts.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

record.​accounts.​latest.​statusrequiredstring

The product’s own status.

record.​accounts.​latest.​stageLabelrequiredstring

example "In review"

record.​accounts.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

record.​corporationTaxobject (ClientRecordProductWork)nullable

From Corporation Tax.

record.​corporationTax.​totalrequiredinteger
record.​corporationTax.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

record.​corporationTax.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

record.​corporationTax.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

record.​corporationTax.​latest.​idrequiredstring (uuid)
record.​corporationTax.​latest.​periodLabelrequiredstring

example "2025/26"

record.​corporationTax.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

record.​corporationTax.​latest.​statusrequiredstring

The product’s own status.

record.​corporationTax.​latest.​stageLabelrequiredstring

example "In review"

record.​corporationTax.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

deadlinesrequiredarray of ClientOverviewDeadline

Open work’s next deadlines across the products you can use, soonest first.

deadlines[].​productrequiredstring
deadlines[].​itemIdrequiredstring (uuid)
deadlines[].​kindrequiredstring
deadlines[].​labelrequiredstring
deadlines[].​periodLabelrequiredstring
deadlines[].​dueDaterequiredstring (date)

example "2026-03-31"

deadlines[].​daysLeftrequiredinteger
unavailablerequiredarray of ClientOverviewUnavailable

Products you can’t use, so their parts are null.

unavailable[].​keyrequiredstring
unavailable[].​labelrequiredstring
workingPapersrequiredobject (ClientOverviewWorkingPapers)nullable
workingPapers.​totalrequiredinteger
workingPapers.​openrequiredinteger
workingPapers.​nextDueDaterequiredstring (date)nullable

example "2026-03-31"

workingPapers.​latestrequiredobject (ClientOverviewLatest)nullable
workingPapers.​latest.​idrequiredstring (uuid)
workingPapers.​latest.​periodLabelrequiredstring
workingPapers.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

workingPapers.​latest.​statusrequiredstring
workingPapers.​latest.​stageLabelrequiredstring
workingPapers.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

workingPapers.​openReviewPointsrequiredinteger
workingPapers.​periodsrequiredarray of ClientOverviewPeriod

The latest six, newest first.

workingPapers.​periods[].​idrequiredstring (uuid)
workingPapers.​periods[].​labelrequiredstring
workingPapers.​periods[].​periodEndrequiredstring (date)

example "2026-03-31"

workingPapers.​periods[].​statusrequiredstring
workingPapers.​periods[].​stageLabelrequiredstring
workingPapers.​periods[].​dueDaterequiredstring (date)

example "2026-03-31"

workingPapers.​periods[].​daysLeftrequiredinteger
workingPapers.​periods[].​openReviewPointsrequiredinteger
workingPapers.​periods[].​ownerNamerequiredstringnullable
workingPapers.​softwarerequiredstringnullable
workingPapers.​syncStaterequiredstringnullable
workingPapers.​lastSyncedAtrequiredstring (date-time)nullable
workingPapers.​filedOnrequiredstring (date)nullable

example "2026-03-31"

workingPapers.​openPointsrequiredinteger
accountsrequiredobject (ClientOverviewAccounts)nullable
accounts.​totalrequiredinteger
accounts.​openrequiredinteger
accounts.​nextDueDaterequiredstring (date)nullable

example "2026-03-31"

accounts.​latestrequiredobject (ClientOverviewLatest)nullable
accounts.​latest.​idrequiredstring (uuid)
accounts.​latest.​periodLabelrequiredstring
accounts.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

accounts.​latest.​statusrequiredstring
accounts.​latest.​stageLabelrequiredstring
accounts.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

accounts.​openReviewPointsrequiredinteger
accounts.​periodsrequiredarray of ClientOverviewPeriod

The latest six, newest first.

accounts.​periods[].​idrequiredstring (uuid)
accounts.​periods[].​labelrequiredstring
accounts.​periods[].​periodEndrequiredstring (date)

example "2026-03-31"

accounts.​periods[].​statusrequiredstring
accounts.​periods[].​stageLabelrequiredstring
accounts.​periods[].​dueDaterequiredstring (date)

example "2026-03-31"

accounts.​periods[].​daysLeftrequiredinteger
accounts.​periods[].​openReviewPointsrequiredinteger
accounts.​periods[].​ownerNamerequiredstringnullable
accounts.​frameworkrequiredstringnullable
accounts.​approvedOnrequiredstring (date)nullable

example "2026-03-31"

accounts.​signatoryNamerequiredstringnullable
accounts.​figuresrequiredobject (ClientOverviewAccountsFigures)nullable
accounts.​figures.​turnoverPencerequiredintegernullable

Pence.

accounts.​figures.​profitPencerequiredintegernullable

Pence. Negative for a loss.

accounts.​figures.​netAssetsPencerequiredintegernullable

Pence.

accounts.​figures.​nextSteprequiredstringnullable
corporationTaxrequiredobject (ClientOverviewCorporationTax)nullable
corporationTax.​totalrequiredinteger
corporationTax.​openrequiredinteger
corporationTax.​nextDueDaterequiredstring (date)nullable

example "2026-03-31"

corporationTax.​latestrequiredobject (ClientOverviewLatest)nullable
corporationTax.​latest.​idrequiredstring (uuid)
corporationTax.​latest.​periodLabelrequiredstring
corporationTax.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

corporationTax.​latest.​statusrequiredstring
corporationTax.​latest.​stageLabelrequiredstring
corporationTax.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

corporationTax.​openReviewPointsrequiredinteger
corporationTax.​periodsrequiredarray of ClientOverviewPeriod

The latest six, newest first.

corporationTax.​periods[].​idrequiredstring (uuid)
corporationTax.​periods[].​labelrequiredstring
corporationTax.​periods[].​periodEndrequiredstring (date)

example "2026-03-31"

corporationTax.​periods[].​statusrequiredstring
corporationTax.​periods[].​stageLabelrequiredstring
corporationTax.​periods[].​dueDaterequiredstring (date)

example "2026-03-31"

corporationTax.​periods[].​daysLeftrequiredinteger
corporationTax.​periods[].​openReviewPointsrequiredinteger
corporationTax.​periods[].​ownerNamerequiredstringnullable
corporationTax.​taxDuePencerequiredintegernullable

On the latest return, pence. Negative when overpaid.

corporationTax.​paymentDuerequiredstring (date)nullable

example "2026-03-31"

corporationTax.​filedElsewhereOnrequiredstring (date)nullable

The latest date a person recorded a return as filed outside Tolvi. Not HMRC’s word.

example "2026-03-31"

selfAssessmentrequiredobject (ClientOverviewSelfAssessment)nullable
selfAssessment.​totalrequiredinteger
selfAssessment.​openrequiredinteger
selfAssessment.​nextDueDaterequiredstring (date)nullable

example "2026-03-31"

selfAssessment.​latestrequiredobject (ClientOverviewLatest)nullable
selfAssessment.​latest.​idrequiredstring (uuid)
selfAssessment.​latest.​periodLabelrequiredstring
selfAssessment.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

selfAssessment.​latest.​statusrequiredstring
selfAssessment.​latest.​stageLabelrequiredstring
selfAssessment.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

selfAssessment.​openReviewPointsrequiredinteger
selfAssessment.​periodsrequiredarray of ClientOverviewPeriod

The latest six, newest first.

selfAssessment.​periods[].​idrequiredstring (uuid)
selfAssessment.​periods[].​labelrequiredstring
selfAssessment.​periods[].​periodEndrequiredstring (date)

example "2026-03-31"

selfAssessment.​periods[].​statusrequiredstring
selfAssessment.​periods[].​stageLabelrequiredstring
selfAssessment.​periods[].​dueDaterequiredstring (date)

example "2026-03-31"

selfAssessment.​periods[].​daysLeftrequiredinteger
selfAssessment.​periods[].​openReviewPointsrequiredinteger
selfAssessment.​periods[].​ownerNamerequiredstringnullable
selfAssessment.​taxDuePencerequiredintegernullable

On the latest return, pence. Negative when overpaid.

selfAssessment.​returnTyperequiredstringnullable
vatrequiredobject (ClientOverviewVat)nullable
vat.​totalrequiredinteger
vat.​vatNumberrequiredstringnullable

On the record.

vat.​latestrequiredobject (ClientOverviewVatLatest)nullable
vat.​latest.​idrequiredstring (uuid)
vat.​latest.​periodKeyrequiredstring
vat.​latest.​periodStartrequiredstring (date)

example "2026-03-31"

vat.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

vat.​latest.​statusrequiredstring
vat.​latest.​netDuePencerequiredintegernullable

Box 5, pence. Negative when reclaimed.

vat.​latest.​vrnrequiredstring

The number this return was prepared under.

booksrequiredobject (ClientRecordBooks)nullable

Where the client’s books are, from its connection and its Tolvi Books link.

books.​connectionLabelrequiredstringnullable

The connected software, if any.

example "Xero"

books.​connectionStatusrequiredstringnullable

The connection’s state: active, expired, revoked or error.

books.​booksLinkedrequiredboolean

The client is linked to a business in Tolvi Books.

books.​booksLiverequiredboolean

The link is live, so the firm can read those books.

meetingsrequiredobject (ClientRecordMeetings)nullable

From Meetings.

meetings.​totalrequiredinteger
meetings.​openNextStepsrequiredinteger

Next steps not yet sorted, across this client’s meetings.

meetings.​latestrequiredobject (ClientRecordMeeting)nullable
meetings.​latest.​idrequiredstring (uuid)
meetings.​latest.​titlerequiredstring
meetings.​latest.​joinAtrequiredstring (date-time)
meetings.​latest.​statusrequiredstring

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

Get one year end across the products

GET/api/v1/clients/{clientId}/period-chain

Scopes
clients:read

Books, year-end file, accounts, CT return and filing for one year end, each with its status and the id to open. Only products you can use have a step, and only those the client’s type can have. Filing from Tolvi is marked as coming; a date a person recorded is shown as recorded. Part of the hub product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/clients/{clientId}/period-chain
NameInTypeDescription
clientIdrequiredpathstring (uuid)
periodEndquerystring (date)

The year end. Defaults to the latest with work.

Responses

200 OK, application/json

Body: object (PeriodChain).

200 OK response for GET /api/v1/clients/{clientId}/period-chain
FieldTypeDescription
clientIdrequiredstring (uuid)
periodEndrequiredstring (date)nullable

The year end shown. Null when the client has no work yet.

example "2026-03-31"

periodsrequiredarray of string

Year ends with work, newest first, the latest six.

stepsrequiredarray of PeriodChainStep

In order. Only products you can use, and only those the client’s type can have.

steps[].​keyrequiredstring (PeriodChainStepKey)

One of: books, file, accounts, corporation_tax, filing

steps[].​labelrequiredstring
steps[].​itemIdrequiredstring (uuid)nullable

The file, set or return for this year end. Null for books and filing, and when none has been started.

steps[].​stagerequiredstringnullable

not_started, preparing, returned, in_review, ready_to_file, filing or complete. Null when nothing has been started.

steps[].​statusLabelrequiredstring

The status words the product itself shows.

steps[].​dueDaterequiredstring (date)nullable

When the work is due or, on filing, the date a person recorded it as filed outside Tolvi.

example "2026-03-31"

steps[].​openReviewPointsrequiredinteger
steps[].​comingrequiredboolean

Not open in Tolvi yet.

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 central record

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

Scopes
clients:read

Details, identifiers, status, services, people and contacts, with what Working Papers, Meetings and the books hold about the client. A product’s part is null when you can’t use it or the credential has no scope for it. Part of the hub product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (ClientRecord).

One client’s central record: what the firm holds, and what each product holds about them. A product’s part is null when this person or credential can’t use it.

200 OK response for GET /api/v1/clients/{clientId}/record
FieldTypeDescription
clientIdrequiredstring (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

1 to 31

yearEndMonthrequiredintegernullable

1 to 12

statusrequiredstring (ClientStatus)

One of: prospect, active, former

servicesrequiredarray of ClientService

One of: accounts, corporation_tax, self_assessment, vat, payroll, bookkeeping

utrrequiredstringnullable

Unique Taxpayer Reference, ten digits.

vatNumberrequiredstringnullable

example "GB123456789"

payeReferencerequiredstringnullable

Employer PAYE reference.

example "123/AB456"

registeredAddressrequiredstringnullable
principalActivitystringnullable

Accounts and Corporation Tax default from this.

signatoryNamestringnullable

Who usually signs the company’s accounts and returns. Accounts and Corporation Tax default from this.

responsiblePartnerIdrequiredstring (uuid)nullable

Set on the record; null when not set.

clientManagerIdrequiredstring (uuid)nullable

Set on the record; null when not set.

responsiblePartnerrequiredobject (ClientRecordPerson)nullable

Who to show: the record’s, else the latest engagement’s.

responsiblePartner.​idrequiredstring (uuid)
responsiblePartner.​namerequiredstring
responsiblePartner.​sourcerequiredstring (ClientRecordPersonSource)

client: set on the record. latest_engagement: not set, so taken from the latest engagement’s team.

One of: client, latest_engagement

clientManagerrequiredobject (ClientRecordPerson)nullable

Who to show: the record’s, else the latest engagement’s.

clientManager.​idrequiredstring (uuid)
clientManager.​namerequiredstring
clientManager.​sourcerequiredstring (ClientRecordPersonSource)

client: set on the record. latest_engagement: not set, so taken from the latest engagement’s team.

One of: client, latest_engagement

contactsrequiredarray of ClientContact

Primary first, then by name.

contacts[].​idrequiredstring (uuid)
contacts[].​namerequiredstring

example "Jo Hartley"

contacts[].​rolerequiredstringnullable

example "Director"

contacts[].​emailrequiredstringnullable
contacts[].​phonerequiredstringnullable
contacts[].​isPrimaryrequiredboolean

The person to contact first. At most one per client.

contacts[].​appointedOnstring (date)nullable

For a director: appointed during the year. Blank means throughout.

example "2026-03-31"

contacts[].​resignedOnstring (date)nullable

For a director: resigned during the year.

example "2026-03-31"

notesrequiredstring

The client’s permanent notes.

workrequiredobject (ClientRecordWork)nullable

From Working Papers.

work.​currentrequiredobject (ClientRecordEngagement)nullable

The latest year end.

work.​current.​idrequiredstring (uuid)
work.​current.​periodEndrequiredstring (date)

example "2026-03-31"

work.​current.​dueDaterequiredstring (date)

example "2026-03-31"

work.​current.​statusrequiredstring

example "in_progress"

work.​current.​stageNamerequiredstring
work.​yearEndsrequiredinteger
work.​openrequiredinteger

Engagements not yet complete.

work.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among engagements not yet complete.

example "2026-03-31"

meetingsrequiredobject (ClientRecordMeetings)nullable

From Meetings.

meetings.​totalrequiredinteger
meetings.​openNextStepsrequiredinteger

Next steps not yet sorted, across this client’s meetings.

meetings.​latestrequiredobject (ClientRecordMeeting)nullable
meetings.​latest.​idrequiredstring (uuid)
meetings.​latest.​titlerequiredstring
meetings.​latest.​joinAtrequiredstring (date-time)
meetings.​latest.​statusrequiredstring
booksrequiredobject (ClientRecordBooks)

Where the client’s books are, from its connection and its Tolvi Books link.

books.​connectionLabelrequiredstringnullable

The connected software, if any.

example "Xero"

books.​connectionStatusrequiredstringnullable

The connection’s state: active, expired, revoked or error.

books.​booksLinkedrequiredboolean

The client is linked to a business in Tolvi Books.

books.​booksLiverequiredboolean

The link is live, so the firm can read those books.

selfAssessmentobject (ClientRecordProductWork)nullable

From Self Assessment.

selfAssessment.​totalrequiredinteger
selfAssessment.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

selfAssessment.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

selfAssessment.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

selfAssessment.​latest.​idrequiredstring (uuid)
selfAssessment.​latest.​periodLabelrequiredstring

example "2025/26"

selfAssessment.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

selfAssessment.​latest.​statusrequiredstring

The product’s own status.

selfAssessment.​latest.​stageLabelrequiredstring

example "In review"

selfAssessment.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

accountsobject (ClientRecordProductWork)nullable

From Accounts.

accounts.​totalrequiredinteger
accounts.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

accounts.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

accounts.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

accounts.​latest.​idrequiredstring (uuid)
accounts.​latest.​periodLabelrequiredstring

example "2025/26"

accounts.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

accounts.​latest.​statusrequiredstring

The product’s own status.

accounts.​latest.​stageLabelrequiredstring

example "In review"

accounts.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

corporationTaxobject (ClientRecordProductWork)nullable

From Corporation Tax.

corporationTax.​totalrequiredinteger
corporationTax.​openrequiredinteger

Not yet filed, or for accounts not yet approved.

corporationTax.​nextDueDaterequiredstring (date)nullable

The earliest filing deadline among those still open.

example "2026-03-31"

corporationTax.​latestrequiredobject (ClientRecordProductPeriod)nullable

The latest return or set of accounts.

corporationTax.​latest.​idrequiredstring (uuid)
corporationTax.​latest.​periodLabelrequiredstring

example "2025/26"

corporationTax.​latest.​periodEndrequiredstring (date)

example "2026-03-31"

corporationTax.​latest.​statusrequiredstring

The product’s own status.

corporationTax.​latest.​stageLabelrequiredstring

example "In review"

corporationTax.​latest.​dueDaterequiredstring (date)

example "2026-03-31"

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 central record

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

Scopes
clients:write
Role
Preparer or above

Preparers and above. Refused when an identifier isn’t in the right form, or the responsible partner or client manager doesn’t hold that role in this firm. Doesn’t change who is assigned to any engagement.

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

Parameters

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

Request body

Required. application/json: object (UpdateClientRecordRequest).

Send only what changes; null or blank clears a field.

Request body for PATCH /api/v1/clients/{clientId}/record
FieldTypeDescription
namestring

The client’s name. Work in progress reads it from here; an approved return or accounts keep the name they were approved under.

up to 200 characters

entityTypestring (EntityType)

What the client is. Decides what new work can start; work already started keeps what it started with.

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.

yearEndDayintegernullable

Year end day, sent with yearEndMonth.

1 to 31

yearEndMonthintegernullable

Year end month, sent with yearEndDay.

1 to 12

statusstring (ClientStatus)

One of: prospect, active, former

servicesarray of ClientService

One of: accounts, corporation_tax, self_assessment, vat, payroll, bookkeeping

utrstringnullable
vatNumberstringnullable
payeReferencestringnullable
registeredAddressstringnullable

up to 500 characters

principalActivitystringnullable

up to 1000 characters

signatoryNamestringnullable

Who usually signs the company’s accounts and returns.

up to 200 characters

responsiblePartnerIdstring (uuid)nullable

Must be a partner in the firm.

clientManagerIdstring (uuid)nullable

Must be a manager or partner in the firm.

Responses

200 OK, application/json

Body: object (ClientRecord).

One client’s central record: what the firm holds, and what each product holds about them. A product’s part is null when this person or credential can’t use it.

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 company facts on the record

GET/api/v1/clients/{clientId}/company-facts

Scopes
clients:read

Registered office, principal activity, signatory and directors, as Accounts and Corporation Tax read them. Part of the hub product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (CompanyFacts).

What the client’s record says about the company. Accounts and Corporation Tax start from this; a person chooses to save a change back.

200 OK response for GET /api/v1/clients/{clientId}/company-facts
FieldTypeDescription
namerequiredstringnullable

The client’s name on the record.

companyNumberrequiredstringnullable

Companies House number on the record.

registeredOfficerequiredstringnullable
principalActivityrequiredstringnullable
signatoryNamerequiredstringnullable

The record’s, or the only serving director.

directorsrequiredarray of RecordDirector

Contacts whose role says director.

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

example "2026-03-31"

directors[].​resignedOnstring (date)

example "2026-03-31"

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

Save directors to the record

PUT/api/v1/clients/{clientId}/directors

Scopes
clients:write
Role
Preparer or above

Preparers and above. Adds each person as a contact with the role Director, or updates their dates. Nobody is removed: take someone off in Contacts.

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

Parameters

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

Request body

Required. application/json: object (SaveDirectorsRequest).

Adds these people as contacts with the role Director, or updates their dates. Nobody is removed.

Request body for PUT /api/v1/clients/{clientId}/directors
FieldTypeDescription
directorsrequiredarray of RecordDirector
directors[].​namerequiredstring
directors[].​appointedOnstring (date)

example "2026-03-31"

directors[].​resignedOnstring (date)

example "2026-03-31"

Responses

200 OK, application/json

Body: object (CompanyFacts).

What the client’s record says about the company. Accounts and Corporation Tax start from this; a person chooses to save a change back.

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

Add a contact

POST/api/v1/clients/{clientId}/contacts

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

Preparers and above. The client’s first contact becomes its primary contact.

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

Parameters

Parameters for POST /api/v1/clients/{clientId}/contacts
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 (CreateClientContactRequest).

Request body for POST /api/v1/clients/{clientId}/contacts
FieldTypeDescription
namerequiredstring

1 to 200 characters

rolestringnullable

up to 100 characters

emailstring (email)nullable
phonestringnullable

up to 40 characters

isPrimaryboolean

The client’s first contact is primary anyway. Setting this moves it from whoever had it.

appointedOnstring (date)nullable

example "2026-03-31"

resignedOnstring (date)nullable

example "2026-03-31"

Responses

201 Created, application/json

Body: object (ClientContact).

A person at a client.

201 Created response for POST /api/v1/clients/{clientId}/contacts
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring

example "Jo Hartley"

rolerequiredstringnullable

example "Director"

emailrequiredstringnullable
phonerequiredstringnullable
isPrimaryrequiredboolean

The person to contact first. At most one per client.

appointedOnstring (date)nullable

For a director: appointed during the year. Blank means throughout.

example "2026-03-31"

resignedOnstring (date)nullable

For a director: resigned during the year.

example "2026-03-31"

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

Change a contact

PATCH/api/v1/clients/{clientId}/contacts/{contactId}

Scopes
clients:write
Role
Preparer or above

Preparers and above.

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

Parameters

Parameters for PATCH /api/v1/clients/{clientId}/contacts/{contactId}
NameInTypeDescription
clientIdrequiredpathstring (uuid)
contactIdrequiredpathstring (uuid)

Request body

Required. application/json: object (UpdateClientContactRequest).

Send only what changes.

Request body for PATCH /api/v1/clients/{clientId}/contacts/{contactId}
FieldTypeDescription
namestring

1 to 200 characters

rolestringnullable

up to 100 characters

emailstring (email)nullable
phonestringnullable

up to 40 characters

isPrimaryboolean

Setting this moves it from whoever had it.

appointedOnstring (date)nullable

example "2026-03-31"

resignedOnstring (date)nullable

example "2026-03-31"

Responses

200 OK, application/json

Body: object (ClientContact).

A person at a client.

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

Remove a contact

DELETE/api/v1/clients/{clientId}/contacts/{contactId}

Scopes
clients:write
Role
Preparer or above

Preparers and above. If it was the primary contact, the next by name takes over.

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

Parameters

Parameters for DELETE /api/v1/clients/{clientId}/contacts/{contactId}
NameInTypeDescription
clientIdrequiredpathstring (uuid)
contactIdrequiredpathstring (uuid)

Responses

204 No content

Removed.

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