Skip to main content

Work

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

List the work queue

GET/api/v1/work

Scopes
work:read

Saved views are relative to the caller ("mine" = engagements where you act next). Needs a person, not an API client. Part of the working_papers product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/work
NameInTypeDescription
limitqueryinteger

1 to 100; default 50

cursorquerystring
qquerystring

Part of the client name.

up to 100 characters

partnerquerystring (uuid)
managerquerystring (uuid)
actorquerystring (uuid)

Whose turn it is: the person assigned to the current stage.

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

yearEndMonthqueryinteger

1 to 12

stagequerystring (EngagementStatus)

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

softwarequerystring (Software)

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

dueFromquerystring (date)

Deadline on or after this date.

dueToquerystring (date)

Deadline on or before this date.

scopequerystring (WorkScope)

mine: engagements where you are preparer, reviewer, manager or partner. Default everyone.

One of: everyone, mine

sortquerystring (WorkSort)

Default: due.

One of: due, client, ye, rounds

viewquerystring (WorkView)

Default: mine. todo/later: your turn, due within 120 days / after; stuck: in review over 14 days; at_risk: not yet overdue but likely to miss the deadline at its current stage (Due within 45 days and not started, 30 days preparing, 21 days returned or 14 days in review.); unassigned: open, no preparer (use scope=everyone); changed: open work only.

One of: mine, review, returned, due30, overdue, changed, open, all, todo, later, stuck, at_risk, unassigned

Responses

200 OK, application/json

Body: object (WorkPage).

200 OK response for GET /api/v1/work
FieldTypeDescription
rowsrequiredarray of WorkRow
rows[].​idrequiredstring (uuid)

Engagement id.

rows[].​clientIdrequiredstring (uuid)
rows[].​clientNamerequiredstring
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[].​periodStartrequiredstring (date)

example "2026-03-31"

rows[].​periodEndrequiredstring (date)

example "2026-03-31"

rows[].​dueDaterequiredstring (date)

Filing deadline.

example "2026-03-31"

rows[].​daysLeftrequiredinteger

Days from today (Europe/London) to the deadline; negative when overdue.

rows[].​provisionalrequiredboolean

The deadline is for a tax year and the return may need provisional figures.

rows[].​statusrequiredstring (EngagementStatus)

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

rows[].​stageIndexrequiredinteger

at least 0

rows[].​stageNamerequiredstring
rows[].​stageCountrequiredinteger

at least 1

rows[].​workflowNamerequiredstring
rows[].​currentActorIdrequiredstring (uuid)nullable

Who acts next.

rows[].​preparerIdrequiredstring (uuid)nullable
rows[].​reviewerIdrequiredstring (uuid)nullable
rows[].​managerIdrequiredstring (uuid)nullable
rows[].​partnerIdrequiredstring (uuid)nullable
rows[].​roundsrequiredinteger

Review rounds (returns to the preparer).

at least 0

rows[].​openPointsrequiredinteger

Open review points.

at least 0

rows[].​syncStaterequiredstring (SyncState)

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

rows[].​softwarerequiredstring (Software)

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

rows[].​lastSyncedAtrequiredstring (date-time)nullable
rows[].​riskrequiredstring (RiskLevel)

One of: standard, high

rows[].​filedOnrequiredstring (date)nullable

When the accounts were filed (recorded by a person).

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

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

Count each saved view, with the KPI cards

GET/api/v1/work/counts

Scopes
work: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/work/counts
NameInTypeDescription
qquerystring

Part of the client name.

up to 100 characters

partnerquerystring (uuid)
managerquerystring (uuid)
actorquerystring (uuid)

Whose turn it is: the person assigned to the current stage.

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

yearEndMonthqueryinteger

1 to 12

stagequerystring (EngagementStatus)

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

softwarequerystring (Software)

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

dueFromquerystring (date)

Deadline on or after this date.

dueToquerystring (date)

Deadline on or before this date.

scopequerystring (WorkScope)

mine: engagements where you are preparer, reviewer, manager or partner. Default everyone.

One of: everyone, mine

Responses

200 OK, application/json

Body: object (WorkCounts).

200 OK response for GET /api/v1/work/counts
FieldTypeDescription
viewsrequiredobject (WorkViewCounts)

Engagements in each saved view.

views.​minerequiredinteger
views.​reviewrequiredinteger
views.​returnedrequiredinteger
views.​due30requiredinteger
views.​overduerequiredinteger
views.​changedrequiredinteger
views.​openrequiredinteger
views.​allrequiredinteger
views.​todorequiredinteger

Your turn, due within 120 days.

views.​laterrequiredinteger

Your turn, due in more than 120 days.

views.​stuckrequiredinteger

In review for more than 14 days.

views.​at_riskrequiredinteger

At risk: not yet overdue, but likely to miss the deadline at its current stage. Due within 45 days and not started, 30 days preparing, 21 days returned or 14 days in review.

views.​unassignedrequiredinteger

Open engagements with no preparer (nobody’s To do until assigned).

kpisrequiredobject (WorkKpis)
kpis.​due30requiredinteger
kpis.​overduerequiredinteger
kpis.​awaitingReviewrequiredinteger
kpis.​awaitingMyReviewrequiredinteger
kpis.​changedrequiredinteger
kpis.​avgRoundsrequirednumber

Average review rounds on complete engagements, to 2 dp.

kpis.​firstTimeRightPctrequiredinteger

0 to 100

totalrequiredinteger

All engagements in the firm, ignoring filters.

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

Count a view grouped by status, deadline day or whose turn it is

GET/api/v1/work/groups

Scopes
work:read

For the Board, Calendar and Workload. Same view, scope and filters as the list. Part of the working_papers product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/work/groups
NameInTypeDescription
qquerystring

Part of the client name.

up to 100 characters

partnerquerystring (uuid)
managerquerystring (uuid)
actorquerystring (uuid)

Whose turn it is: the person assigned to the current stage.

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

yearEndMonthqueryinteger

1 to 12

stagequerystring (EngagementStatus)

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

softwarequerystring (Software)

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

dueFromquerystring (date)

Deadline on or after this date.

dueToquerystring (date)

Deadline on or before this date.

scopequerystring (WorkScope)

mine: engagements where you are preparer, reviewer, manager or partner. Default everyone.

One of: everyone, mine

viewquerystring (WorkView)

One of: mine, review, returned, due30, overdue, changed, open, all, todo, later, stuck, at_risk, unassigned

groupByrequiredquerystring (WorkGroupBy)

One of: status, due, actor

Responses

200 OK, application/json

Body: object (WorkGroups).

200 OK response for GET /api/v1/work/groups
FieldTypeDescription
groupByrequiredstring (WorkGroupBy)

One of: status, due, actor

groupsrequiredarray of WorkGroup
groups[].​keyrequiredstringnullable

A status, a deadline (YYYY-MM-DD) or a person id (null: nobody).

groups[].​countrequiredinteger
totalrequiredinteger

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

Start engagements (one or in bulk)

POST/api/v1/work/start

Scopes
engagements:write and work:read
Role
Preparer or above
Retries
Send an Idempotency-Key to make retries safe.

Each start is billable (engagement.started, source web/api/mcp, or bulk for several). AI tokens come from the plan’s monthly allowance, not from each start. 402 when billing blocks starting (trial over without billing, or an invoice unpaid for 14 days).

Needs the Preparer role or 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/work/start
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 (StartEngagements).

Request body for POST /api/v1/work/start
FieldTypeDescription
engagementIdsrequiredarray of string (uuid)

1 to 500 items

workflowIdstring

Workflow template id; default: the client’s, else the firm default for the entity type.

preparerIdstring (uuid)
reviewerIdstring (uuid)
managerIdstring (uuid)
partnerIdstring (uuid)
pullTrialBalanceboolean

Pull each started engagement’s TB from its client’s bookkeeping connection (reported back in tbPulls).

bringForwardobject (BringForward)

What to carry over from the client’s previous engagement (the year-end roll forward). Each defaults to true.

bringForward.​priorYearFiguresboolean

Last year’s final TB (draft + posted journals) as this year’s comparatives, kept when this year’s TB is imported.

bringForward.​mappingsboolean

Last year’s account mappings, applied when the trial balance is imported.

bringForward.​fixedAssetsboolean

The fixed asset register: closing cost and depreciation as opening balances, disposed assets left out.

bringForward.​taxBroughtForwardboolean

Main and special rate pool WDVs and trading losses carried forward.

bringForward.​notesboolean

Last year’s variance notes, as hints on the lead schedules (never as this year’s explanations).

bringForward.​clientStepsboolean

The client’s own checklist steps, added to the firm’s checklists.

Responses

200 OK, application/json

Body: object (StartResult).

200 OK response for POST /api/v1/work/start
FieldTypeDescription
startedrequiredinteger
alreadyStartedrequiredarray of string (uuid)
notFoundrequiredarray of string (uuid)
blockedrequiredstringnullable

Why the rest of a bulk start stopped (billing).

trialBalancePulledrequiredboolean

pullTrialBalance was asked for and every started engagement with a connection was pulled (or queued) without failure.

tbPullsrequiredarray of TbPullOutcome

Per started engagement, when pullTrialBalance was asked for.

tbPulls[].​engagementIdrequiredstring (uuid)
tbPulls[].​outcomerequiredstring (TbPullOutcomeKind)

pulled: a new TB version from the books; queued: being pulled in the background (large batches); not_connected: no usable connection; failed: see message.

One of: pulled, queued, not_connected, failed

tbPulls[].​messagerequiredstringnullable
broughtForwardrequiredobject (BroughtForward)

What was carried over, totalled across the engagements started.

broughtForward.​mappingsrequiredinteger
broughtForward.​notesrequiredinteger

Variance notes brought forward as hints.

broughtForward.​clientStepsrequiredinteger
broughtForward.​priorYearAccountsrequiredinteger

Accounts in last year’s final TB brought forward as comparatives.

broughtForward.​fixedAssetsrequiredinteger

Fixed assets brought forward with their closing balances.

broughtForward.​taxBroughtForwardrequiredinteger

Engagements whose pools and losses carried forward were brought forward.

notifiedrequiredinteger

Team members told in-app that they were added (the person starting is never told).

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

Record the dates accounts were filed

POST/api/v1/work/filed

Scopes
engagements:write and work:read

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

Request body

Required. application/json: object (MarkFiled).

Request body for POST /api/v1/work/filed
FieldTypeDescription
filedrequiredarray of FiledEntry

1 to 500 items

filed[].​engagementIdrequiredstring (uuid)
filed[].​filedOnrequiredstring (date)

example "2026-03-31"

Responses

200 OK, application/json

Body: object (MarkFiledResult).

200 OK response for POST /api/v1/work/filed
FieldTypeDescription
updatedrequiredinteger

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

List the firm’s people, for filters and assignment

GET/api/v1/work/people

Scopes
work:read

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

Responses

200 OK, application/json

Body: array of Person.

200 OK response for GET /api/v1/work/people
FieldTypeDescription
[].​idrequiredstring (uuid)
[].​namerequiredstring
[].​initialsrequiredstring

example "SP"

[].​rolerequiredstring (StaffRole)nullable

One of: partner, manager, reviewer, preparer, admin

[].​openInRoleintegernullable

Open engagements this person holds in their own role (as preparer, reviewer, manager or partner). Null for practice admin staff.

at least 0

[].​capacityintegernullable

Their role’s capacity (open jobs at once, from the firm’s settings); null for no limit.

at least 0

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

Assign engagements in bulk

POST/api/v1/work/assign

Scopes
engagements:write and work:read
Role
Manager or above
Retries
Send an Idempotency-Key to make retries safe.

All or nothing: if any engagement id is not found in this firm, nothing is changed and the response is a 404 problem listing those ids.

Needs the Manager role or 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/work/assign
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 (AssignRequest).

Give at least one of preparerId, reviewerId, managerId or partnerId.

Request body for POST /api/v1/work/assign
FieldTypeDescription
engagementIdsrequiredarray of string (uuid)

1 to 500 items

preparerIdstring (uuid)
reviewerIdstring (uuid)
managerIdstring (uuid)
partnerIdstring (uuid)

Responses

200 OK, application/json

Body: object (AssignResult).

200 OK response for POST /api/v1/work/assign
FieldTypeDescription
updatedrequiredinteger

Engagements updated (ids from other firms are ignored).

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

Get one engagement with its workflow timeline

GET/api/v1/work/{id}

Scopes
work: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/work/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Engagement id.

Responses

200 OK, application/json

Body: object (WorkDetail).

200 OK response for GET /api/v1/work/{id}
FieldTypeDescription
idrequiredstring (uuid)

Engagement id.

clientIdrequiredstring (uuid)
clientNamerequiredstring
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

periodStartrequiredstring (date)

example "2026-03-31"

periodEndrequiredstring (date)

example "2026-03-31"

dueDaterequiredstring (date)

Filing deadline.

example "2026-03-31"

daysLeftrequiredinteger

Days from today (Europe/London) to the deadline; negative when overdue.

provisionalrequiredboolean

The deadline is for a tax year and the return may need provisional figures.

statusrequiredstring (EngagementStatus)

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

stageIndexrequiredinteger

at least 0

stageNamerequiredstring
stageCountrequiredinteger

at least 1

workflowNamerequiredstring
currentActorIdrequiredstring (uuid)nullable

Who acts next.

preparerIdrequiredstring (uuid)nullable
reviewerIdrequiredstring (uuid)nullable
managerIdrequiredstring (uuid)nullable
partnerIdrequiredstring (uuid)nullable
roundsrequiredinteger

Review rounds (returns to the preparer).

at least 0

openPointsrequiredinteger

Open review points.

at least 0

syncStaterequiredstring (SyncState)

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

softwarerequiredstring (Software)

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

lastSyncedAtrequiredstring (date-time)nullable
riskrequiredstring (RiskLevel)

One of: standard, high

filedOnrequiredstring (date)nullable

When the accounts were filed (recorded by a person).

example "2026-03-31"

workflowTemplateIdrequiredstring
timelinerequiredarray of WorkTimelineStep
timeline[].​namerequiredstring
timeline[].​rolerequiredstring (StaffRole)

One of: partner, manager, reviewer, preparer, admin

timeline[].​assigneeIdrequiredstring (uuid)nullable
timeline[].​staterequiredstring (TimelineStepState)

One of: done, now, todo

timeline[].​mustDifferrequiredboolean

The assignee must differ from the previous stage’s.

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