Skip to main content

Books: bank and inbox

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

Can a bank be connected?

GET/api/v1/books/bank/providers

Scopes
books:read

Whether open-banking connections are available to this business (and if not, why), and the banks to pick from when the provider doesn’t show its own picker. Statement files always work. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (BooksBankProviderInfo).

200 OK response for GET /api/v1/books/bank/providers
FieldTypeDescription
availablerequiredboolean

Whether this business can connect a bank. Statement files always work.

reasonrequiredstring (BooksBankUnavailableReason)nullable

Why available is false: not_configured (the provider’s keys aren’t set), or sandbox_restricted (the provider is in its sandbox and this business isn’t one of the few allowed to try it). Null when available.

One of: not_configured, sandbox_restricted

messagerequiredstringnullable

Why, in plain English, when available is false.

providerrequiredstring (BooksBankProvider)nullable

One of: truelayer, yapily, fake

environmentrequiredstring (BooksBankEnvironment)

One of: sandbox, live

banksrequiredarray of BooksBankOption

Banks to pick from; empty when the provider shows its own picker.

banks[].​idrequiredstring
banks[].​namerequiredstring
chooseBankrequiredboolean

The person chooses their bank in Tolvi before connecting (send its id as bankId): Yapily has no picker of its own.

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

List bank accounts

GET/api/v1/books/bank/accounts

Scopes
books:read

Each account with its connection (and where it stands against the 90-day reconfirmation), its balance in the books, the bank’s balance, pending lines and how many lines are still to explain. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (BooksBankAccountList).

200 OK response for GET /api/v1/books/bank/accounts
FieldTypeDescription
itemsrequiredarray of BooksBankAccount
items[].​idrequiredstring (uuid)
items[].​namerequiredstring
items[].​kindrequiredstring (BooksBankAccountKind)

One of: current, savings, credit_card, other

items[].​bankNamerequiredstringnullable
items[].​sortCoderequiredstringnullable
items[].​accountNumberEndingrequiredstringnullable

The last four digits only.

items[].​currencyrequiredstring
items[].​ledgerAccountIdrequiredstring (uuid)
items[].​ledgerAccountCoderequiredstring
items[].​ledgerAccountNamerequiredstring
items[].​connectionrequiredobject (BooksBankConnection)nullable

Null for an account kept up to date with statement files.

items[].​connection.​idrequiredstring (uuid)
items[].​connection.​providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

items[].​connection.​statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

items[].​connection.​bankNamerequiredstringnullable
items[].​connection.​consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

items[].​connection.​consentExpiresAtrequiredstring (date-time)nullable
items[].​connection.​daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

items[].​connection.​lastSyncedAtrequiredstring (date-time)nullable
items[].​connection.​lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

items[].​connection.​createdAtrequiredstring (date-time)
items[].​lastSyncedAtrequiredstring (date-time)nullable
items[].​bankBalancePencerequiredintegernullable

Integer pence (GBP).

The bank’s own balance at the last sync.

items[].​bankBalanceAtrequiredstring (date-time)nullable
items[].​statementBalancePencerequiredintegernullable

Integer pence (GBP).

items[].​statementBalanceDaterequiredstring (date)nullable

example "2026-03-31"

items[].​ledgerBalancePencerequiredinteger

Integer pence (GBP).

The balance in the books (money in the account positive).

items[].​toExplainrequiredinteger

Lines still to explain.

items[].​pendingrequiredarray of BooksBankPendingLine
items[].​pending[].​daterequiredstring (date)

example "2026-03-31"

items[].​pending[].​descriptionrequiredstring
items[].​pending[].​amountPencerequiredinteger

Integer pence (GBP).

Money in positive, money out negative.

items[].​createdAtrequiredstring (date-time)
connectionsrequiredarray of BooksBankConnection

Every bank connection, including ones waiting for the person to pick accounts.

connections[].​idrequiredstring (uuid)
connections[].​providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

connections[].​statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

connections[].​bankNamerequiredstringnullable
connections[].​consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

connections[].​consentExpiresAtrequiredstring (date-time)nullable
connections[].​daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

connections[].​lastSyncedAtrequiredstring (date-time)nullable
connections[].​lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

connections[].​createdAtrequiredstring (date-time)

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

Add a bank account kept by statements

POST/api/v1/books/bank/accounts

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

For a bank without a feed: upload its statements. Tied to an account in the books (the one given, a free bank account, or a new one). The business’s owners and admins, or an accountant whose access can post. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/accounts
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 (BooksBankCreateAccount).

Request body for POST /api/v1/books/bank/accounts
FieldTypeDescription
namerequiredstring

up to 120 characters

kindstring (BooksBankAccountKind)

One of: current, savings, credit_card, other

bankNamestring
sortCodestring

example "12-34-56"

accountNumberstring
ledgerAccountIdstring (uuid)

The ledger account; left out, Tolvi picks a free one or adds one.

Responses

201 Created, application/json

Body: object (BooksBankAccount).

A business bank, savings or card account, tied to one account in the books.

201 Created response for POST /api/v1/books/bank/accounts
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
kindrequiredstring (BooksBankAccountKind)

One of: current, savings, credit_card, other

bankNamerequiredstringnullable
sortCoderequiredstringnullable
accountNumberEndingrequiredstringnullable

The last four digits only.

currencyrequiredstring
ledgerAccountIdrequiredstring (uuid)
ledgerAccountCoderequiredstring
ledgerAccountNamerequiredstring
connectionrequiredobject (BooksBankConnection)nullable

Null for an account kept up to date with statement files.

connection.​idrequiredstring (uuid)
connection.​providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

connection.​statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

connection.​bankNamerequiredstringnullable
connection.​consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

connection.​consentExpiresAtrequiredstring (date-time)nullable
connection.​daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

connection.​lastSyncedAtrequiredstring (date-time)nullable
connection.​lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

connection.​createdAtrequiredstring (date-time)
lastSyncedAtrequiredstring (date-time)nullable
bankBalancePencerequiredintegernullable

Integer pence (GBP).

The bank’s own balance at the last sync.

bankBalanceAtrequiredstring (date-time)nullable
statementBalancePencerequiredintegernullable

Integer pence (GBP).

statementBalanceDaterequiredstring (date)nullable

example "2026-03-31"

ledgerBalancePencerequiredinteger

Integer pence (GBP).

The balance in the books (money in the account positive).

toExplainrequiredinteger

Lines still to explain.

pendingrequiredarray of BooksBankPendingLine
pending[].​daterequiredstring (date)

example "2026-03-31"

pending[].​descriptionrequiredstring
pending[].​amountPencerequiredinteger

Integer pence (GBP).

Money in positive, money out negative.

createdAtrequiredstring (date-time)

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

Get a bank account

GET/api/v1/books/bank/accounts/{id}

Scopes
books:read

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

Parameters

Parameters for GET /api/v1/books/bank/accounts/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankAccount).

A business bank, savings or card account, tied to one account in the books.

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

Rename a bank account or record its statement balance

PATCH/api/v1/books/bank/accounts/{id}

Scopes
books:write

The statement balance and its date are what reconciliation checks the books against. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for PATCH /api/v1/books/bank/accounts/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankUpdateAccount).

Request body for PATCH /api/v1/books/bank/accounts/{id}
FieldTypeDescription
namestring
statementBalancePenceintegernullable

Integer pence (GBP).

statementBalanceDatestring (date)nullable

example "2026-03-31"

Responses

200 OK, application/json

Body: object (BooksBankAccount).

A business bank, savings or card account, tied to one account in the books.

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

Reconcile a bank account

GET/api/v1/books/bank/accounts/{id}/reconciliation

Scopes
books:read

The statement (or bank) balance against the balance in the books, and what makes up the difference: lines not yet explained, entries in the books no bank line explains, and anything still to find. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/bank/accounts/{id}/reconciliation
NameInTypeDescription
idrequiredpathstring (uuid)
asAtquerystring (date)

Default: the latest statement balance’s date, else today with the bank’s balance.

Responses

200 OK, application/json

Body: object (BooksBankReconciliation).

The statement (or bank) balance against the balance in the books, with the difference explained.

200 OK response for GET /api/v1/books/bank/accounts/{id}/reconciliation
FieldTypeDescription
bankAccountIdrequiredstring (uuid)
asAtrequiredstring (date)

example "2026-03-31"

statementBalancePencerequiredintegernullable

Integer pence (GBP).

statementSourcerequiredstring (BooksBankBalanceSource)nullable

One of: statement, bank_feed, running_balance

ledgerBalancePencerequiredinteger

Integer pence (GBP).

differencePencerequiredintegernullable

Integer pence (GBP).

itemsrequiredarray of BooksBankReconciliationItem
items[].​kindrequiredstring (BooksBankReconciliationKind)

One of: to_explain, not_on_statement, unexplained

items[].​labelrequiredstring
items[].​countrequiredinteger
items[].​amountPencerequiredinteger

Integer pence (GBP).

reconciledrequiredboolean

The difference is fully explained.

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

Preview a statement file

POST/api/v1/books/bank/accounts/{id}/imports/preview

Scopes
books:write

Reads the file without storing anything: its format, lines, what is new and the rows left out; or, for a CSV Tolvi doesn’t recognise, its headings to choose the columns from. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/accounts/{id}/imports/preview
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankStatementFile).

Request body for POST /api/v1/books/bank/accounts/{id}/imports/preview
FieldTypeDescription
fileNamerequiredstring
contentBase64requiredstring

The file, base64 encoded (CSV, OFX, QFX, QIF or Santander’s text download; up to 8 MB).

columnsobject

For an unrecognised CSV: { date, amount | paidIn + paidOut, description: [..], headerRow?, amountSign? } (0-based columns).

Responses

200 OK, application/json

Body: object (BooksBankStatementPreview).

200 OK response for POST /api/v1/books/bank/accounts/{id}/imports/preview
FieldTypeDescription
needsColumnsrequiredboolean

True when Tolvi needs the columns chosen (see csv).

csvrequiredobject (BooksBankCsvColumns)nullable

For a CSV Tolvi doesn’t recognise: the headings and first rows, for choosing the columns.

csv.​headersrequiredarray of string
csv.​samplerequiredarray of array of string

The first rows, each an array of cells.

csv.​suggestedrequiredobject

Tolvi’s best guess at the columns (0-based indexes).

csv.​headerRowrequiredintegernullable
formatrequiredstringnullable

example "csv"

layoutrequiredstringnullable

example "barclays"

linesFoundrequiredinteger
linesNewrequiredinteger
linesAlreadyInrequiredinteger
periodFromrequiredstring (date)nullable

example "2026-03-31"

periodTorequiredstring (date)nullable

example "2026-03-31"

closingBalancePencerequiredintegernullable

Integer pence (GBP).

issuesrequiredarray of BooksBankStatementIssue

Rows left out.

issues[].​rowrequiredintegernullable

The 1-based row or record number.

issues[].​messagerequiredstring
samplerequiredarray of BooksBankStatementLine
sample[].​bookedAtrequiredstring (date)

example "2026-03-31"

sample[].​descriptionrequiredstring
sample[].​amountPencerequiredinteger

Integer pence (GBP).

sample[].​alreadyInrequiredboolean

Already in the books from an earlier file or the bank feed.

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

Import a statement file

POST/api/v1/books/bank/accounts/{id}/imports

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

CSV, OFX/QFX, QIF or Santander’s text download. Lines already in the books (same id, or same date, amount, description and balance) are skipped, so overlapping files are safe. Tolvi then suggests what each new line is. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/accounts/{id}/imports
NameInTypeDescription
idrequiredpathstring (uuid)
Idempotency-Keyheaderstring

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

1 to 255 characters

Request body

Required. application/json: object (BooksBankStatementFile).

Request body for POST /api/v1/books/bank/accounts/{id}/imports
FieldTypeDescription
fileNamerequiredstring
contentBase64requiredstring

The file, base64 encoded (CSV, OFX, QFX, QIF or Santander’s text download; up to 8 MB).

columnsobject

For an unrecognised CSV: { date, amount | paidIn + paidOut, description: [..], headerRow?, amountSign? } (0-based columns).

Responses

201 Created, application/json

Body: object (BooksBankImport).

201 Created response for POST /api/v1/books/bank/accounts/{id}/imports
FieldTypeDescription
idrequiredstring (uuid)
bankAccountIdrequiredstring (uuid)
fileNamerequiredstring
formatrequiredstring
linesFoundrequiredinteger
linesAddedrequiredinteger
linesAlreadyInrequiredinteger
issuesrequiredarray of BooksBankStatementIssue
issues[].​rowrequiredintegernullable

The 1-based row or record number.

issues[].​messagerequiredstring
periodFromrequiredstring (date)nullable

example "2026-03-31"

periodTorequiredstring (date)nullable

example "2026-03-31"

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

Connect a bank

POST/api/v1/books/bank/connections

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

Returns the provider’s link: the person signs in at their bank there and is sent back to Tolvi Books (see callback). When providers.chooseBank is true (Yapily) bankId is required (422 without it). Read-only access, renewed every 90 days. Owners and admins, signed in. 503 when bank connections aren’t switched on. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksBankStartConnection).

Request body for POST /api/v1/books/bank/connections
FieldTypeDescription
bankIdstring

The provider’s id for the bank the person chose (from providers.banks). Required when providers.chooseBank is true; otherwise it skips the provider’s own picker.

Responses

201 Created, application/json

Body: object (BooksBankConnectStart).

201 Created response for POST /api/v1/books/bank/connections
FieldTypeDescription
connectionIdrequiredstring (uuid)
urlrequiredstring

Send the person’s browser here. The provider handles the bank’s sign-in, then returns to Tolvi with a code.

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

Finish connecting a bank

POST/api/v1/books/bank/connections/callback

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

Send what the provider put on the redirect (state, and code or error). Returns the accounts the bank shared, to choose which to add. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksBankConnectionCallback).

What the provider sent back on the redirect.

Request body for POST /api/v1/books/bank/connections/callback
FieldTypeDescription
staterequiredstring
codestring
errorstring
errorDescriptionstring
paramsobject

Every query parameter the provider sent back, as is. The provider reads its own (Yapily sends a one-time token, not a code). Up to 30.

Responses

200 OK, application/json

Body: object (BooksBankConnectionAccounts).

200 OK response for POST /api/v1/books/bank/connections/callback
FieldTypeDescription
connectionrequiredobject (BooksBankConnection)

One consent at one bank, through the open-banking provider. Access lasts 90 days at a time; the person reconfirms it in Tolvi (FCA SCA-RTS Article 10A).

connection.​idrequiredstring (uuid)
connection.​providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

connection.​statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

connection.​bankNamerequiredstringnullable
connection.​consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

connection.​consentExpiresAtrequiredstring (date-time)nullable
connection.​daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

connection.​lastSyncedAtrequiredstring (date-time)nullable
connection.​lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

connection.​createdAtrequiredstring (date-time)
accountsrequiredarray of BooksBankProviderAccount
accounts[].​providerAccountIdrequiredstring
accounts[].​namerequiredstring
accounts[].​kindrequiredstring (BooksBankAccountKind)

One of: current, savings, credit_card, other

accounts[].​sortCoderequiredstringnullable
accounts[].​accountNumberEndingrequiredstringnullable

The last four digits only.

accounts[].​currencyrequiredstring
accounts[].​bankAccountIdrequiredstring (uuid)nullable

Already in Tolvi as this bank account.

accounts[].​suggestedLedgerAccountIdrequiredstring (uuid)nullable

The ledger account Tolvi suggests; null means Tolvi adds one.

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

The accounts a bank shared

GET/api/v1/books/bank/connections/{id}/accounts

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

Each with whether it is already added and the account in the books Tolvi would use. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/bank/connections/{id}/accounts
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankConnectionAccounts).

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 accounts from a connected bank

POST/api/v1/books/bank/connections/{id}/accounts

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

Each is tied to an account in the books (the one given, a free bank account, or a new one) and read straight away. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/connections/{id}/accounts
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankAddAccounts).

Request body for POST /api/v1/books/bank/connections/{id}/accounts
FieldTypeDescription
accountsrequiredarray of BooksBankAddAccount
accounts[].​providerAccountIdrequiredstring
accounts[].​ledgerAccountIdstring (uuid)
accounts[].​namestring

Responses

200 OK, application/json

Body: object (BooksBankAccountList).

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

Keep sharing for another 90 days

POST/api/v1/books/bank/connections/{id}/reconfirm

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

The person’s explicit reconfirmation (FCA SCA-RTS Article 10A). When the bank wants them to sign in again, url says where to send them. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/connections/{id}/reconfirm
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankReconfirm).

Request body for POST /api/v1/books/bank/connections/{id}/reconfirm
FieldTypeDescription
keepSharingrequiredboolean

Must be true: the person ticked “Keep sharing”.

Responses

200 OK, application/json

Body: object (BooksBankReconfirmResult).

200 OK response for POST /api/v1/books/bank/connections/{id}/reconfirm
FieldTypeDescription
connectionrequiredobject (BooksBankConnection)

One consent at one bank, through the open-banking provider. Access lasts 90 days at a time; the person reconfirms it in Tolvi (FCA SCA-RTS Article 10A).

connection.​idrequiredstring (uuid)
connection.​providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

connection.​statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

connection.​bankNamerequiredstringnullable
connection.​consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

connection.​consentExpiresAtrequiredstring (date-time)nullable
connection.​daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

connection.​lastSyncedAtrequiredstring (date-time)nullable
connection.​lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

connection.​createdAtrequiredstring (date-time)
urlrequiredstringnullable

When the bank wants the person to sign in again: send them here.

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

Disconnect a bank

POST/api/v1/books/bank/connections/{id}/disconnect

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

Ends Tolvi’s access at the provider and forgets the tokens. The accounts and their lines stay; statements can still be uploaded. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/connections/{id}/disconnect
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankConnection).

One consent at one bank, through the open-banking provider. Access lasts 90 days at a time; the person reconfirms it in Tolvi (FCA SCA-RTS Article 10A).

200 OK response for POST /api/v1/books/bank/connections/{id}/disconnect
FieldTypeDescription
idrequiredstring (uuid)
providerrequiredstring (BooksBankProvider)

One of: truelayer, yapily, fake

statusrequiredstring (BooksBankConnectionStatus)

One of: pending, active, expired, revoked, error

bankNamerequiredstringnullable
consentStaterequiredstring (BooksBankConsentState)nullable

Where the connection stands against the 90 days. reconfirm_soon: in the last 14 days.

One of: active, reconfirm_soon, reconfirm_required, revoked

consentExpiresAtrequiredstring (date-time)nullable
daysLeftrequiredintegernullable

Whole days until access stops; negative once it has.

lastSyncedAtrequiredstring (date-time)nullable
lastErrorrequiredstringnullable

Why the last sync didn’t work, in plain English.

createdAtrequiredstring (date-time)

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

Read the bank now

POST/api/v1/books/bank/connections/{id}/sync

Scopes
books:write

Tolvi also reads each bank a few times a day. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/connections/{id}/sync
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankConnection).

One consent at one bank, through the open-banking provider. Access lasts 90 days at a time; the person reconfirms it in Tolvi (FCA SCA-RTS Article 10A).

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

List bank lines

GET/api/v1/books/bank/lines

Scopes
books:read

Newest first, with Tolvi’s suggestion and its “Why?” for each line still to explain. Money in positive, money out negative. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/bank/lines
NameInTypeDescription
qquerystring

Search: words in the description, payee or reference, or an amount (12.50).

up to 100 characters

offsetqueryinteger

at least 0; default 0

limitqueryinteger

1 to 500; default 200

toquerystring (date)
fromquerystring (date)
statusquerystring

One of: to_explain, explained, excluded, all

bankAccountIdquerystring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankLineList).

200 OK response for GET /api/v1/books/bank/lines
FieldTypeDescription
itemsrequiredarray of BooksBankLine
items[].​idrequiredstring (uuid)
items[].​bankAccountIdrequiredstring (uuid)
items[].​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

items[].​bookedAtrequiredstring (date)

example "2026-03-31"

items[].​descriptionrequiredstring
items[].​counterpartyrequiredstringnullable
items[].​referencerequiredstringnullable
items[].​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

items[].​amountPencerequiredinteger

Integer pence (GBP).

items[].​currencyrequiredstring
items[].​runningBalancePencerequiredintegernullable

Integer pence (GBP).

items[].​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

items[].​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

items[].​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

items[].​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

items[].​suggestion.​summaryrequiredstring
items[].​suggestion.​reasonsrequiredarray of string

The “Why?”.

items[].​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

items[].​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

items[].​suggestion.​categorisation.​accountCoderequiredstring
items[].​suggestion.​categorisation.​accountNamerequiredstringnullable
items[].​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

items[].​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

items[].​suggestion.​categorisation.​split[].​accountCoderequiredstring
items[].​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
items[].​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

items[].​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
items[].​suggestion.​otherLineIdrequiredstring (uuid)nullable
items[].​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

items[].​suggestion.​documentIdsrequiredarray of string
items[].​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
items[].​suggestion.​ruleIdrequiredstring (uuid)nullable
items[].​suggestion.​ruleNamerequiredstringnullable
items[].​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

items[].​suggestion.​candidates[].​summaryrequiredstring
items[].​suggestion.​candidates[].​scorerequiredinteger

0 to 100

items[].​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

items[].​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

items[].​suggestion.​candidates[].​documentIdsrequiredarray of string
items[].​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
items[].​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
items[].​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

items[].​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

items[].​explanation.​entryIdrequiredstring (uuid)
items[].​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

items[].​explanation.​categorisation.​accountCoderequiredstring
items[].​explanation.​categorisation.​accountNamerequiredstringnullable
items[].​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

items[].​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

items[].​explanation.​categorisation.​split[].​accountCoderequiredstring
items[].​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
items[].​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

items[].​explanation.​transferLineIdrequiredstring (uuid)nullable
items[].​explanation.​receiptIdrequiredstring (uuid)nullable
items[].​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

items[].​explanation.​ruleVersionrequiredintegernullable
items[].​explanation.​explainedByrequiredstring (uuid)nullable
items[].​explanation.​explainedAtrequiredstring (date-time)
items[].​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

items[].​createdAtrequiredstring (date-time)
countsrequiredobject (BooksBankLineCounts)
counts.​toExplainrequiredinteger
counts.​explainedrequiredinteger
counts.​excludedrequiredinteger
totalrequiredinteger

Lines matching the filter (for paging with offset).

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

Confirm a group of lines

POST/api/v1/books/bank/lines/confirm

Scopes
books:write

Each line as suggested, or every line as one category. Each line posts on its own, so one that can’t be posted (a locked period, say) doesn’t stop the rest. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksBankConfirmLines).

Request body for POST /api/v1/books/bank/lines/confirm
FieldTypeDescription
lineIdsrequiredarray of string
categorisationobject (BooksBankCategorisationInput)

The same category for every line; left out, each is confirmed as suggested.

categorisation.​accountCoderequiredstring
categorisation.​vatCodestringnullable
categorisation.​splitarray of BooksBankSplitPartInput
categorisation.​split[].​accountCoderequiredstring
categorisation.​split[].​vatCodestringnullable
categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

Responses

200 OK, application/json

Body: object (BooksBankConfirmResults).

200 OK response for POST /api/v1/books/bank/lines/confirm
FieldTypeDescription
resultsrequiredarray of BooksBankConfirmResult
results[].​lineIdrequiredstring (uuid)
results[].​okrequiredboolean
results[].​problemrequiredstringnullable

Why this line wasn’t confirmed.

confirmedrequiredinteger

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

Get a bank line

GET/api/v1/books/bank/lines/{id}

Scopes
books:read

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

Parameters

Parameters for GET /api/v1/books/bank/lines/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankLine).

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

200 OK response for GET /api/v1/books/bank/lines/{id}
FieldTypeDescription
idrequiredstring (uuid)
bankAccountIdrequiredstring (uuid)
sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

bookedAtrequiredstring (date)

example "2026-03-31"

descriptionrequiredstring
counterpartyrequiredstringnullable
referencerequiredstringnullable
payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

amountPencerequiredinteger

Integer pence (GBP).

currencyrequiredstring
runningBalancePencerequiredintegernullable

Integer pence (GBP).

statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

suggestion.​summaryrequiredstring
suggestion.​reasonsrequiredarray of string

The “Why?”.

suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

suggestion.​categorisation.​accountCoderequiredstring
suggestion.​categorisation.​accountNamerequiredstringnullable
suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

suggestion.​categorisation.​split[].​accountCoderequiredstring
suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
suggestion.​otherLineIdrequiredstring (uuid)nullable
suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

suggestion.​documentIdsrequiredarray of string
suggestion.​duplicateOfIdrequiredstring (uuid)nullable
suggestion.​ruleIdrequiredstring (uuid)nullable
suggestion.​ruleNamerequiredstringnullable
suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

suggestion.​candidates[].​summaryrequiredstring
suggestion.​candidates[].​scorerequiredinteger

0 to 100

suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

suggestion.​candidates[].​documentIdsrequiredarray of string
suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

explanation.​entryIdrequiredstring (uuid)
explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

explanation.​categorisation.​accountCoderequiredstring
explanation.​categorisation.​accountNamerequiredstringnullable
explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

explanation.​categorisation.​split[].​accountCoderequiredstring
explanation.​categorisation.​split[].​vatCoderequiredstringnullable
explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

explanation.​transferLineIdrequiredstring (uuid)nullable
explanation.​receiptIdrequiredstring (uuid)nullable
explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

explanation.​ruleVersionrequiredintegernullable
explanation.​explainedByrequiredstring (uuid)nullable
explanation.​explainedAtrequiredstring (date-time)
bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

createdAtrequiredstring (date-time)

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

Explain a bank line

POST/api/v1/books/bank/lines/{id}/explain

Scopes
books:write

As suggested; as a category (with VAT, or split); as a transfer to or from another of the business’s accounts; or as the payment for a confirmed receipt. Posts one entry in the books. 422 when it can’t be posted (a locked period, an unknown category), 409 when the line is already explained. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/lines/{id}/explain
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankExplainLine).

kind: suggested (confirm the suggestion), category ({ accountCode, vatCode?, split? }), transfer ({ toBankAccountId, otherLineId? }), match ({ receiptId, accountCode? }), bill ({ billId }: money out paying a bill, in full or in part) or vat_return ({ submissionId }: a payment to or from HMRC for a filed return).

Request body for POST /api/v1/books/bank/lines/{id}/explain
FieldTypeDescription
kindrequiredstring (BooksBankExplainKind)

One of: suggested, category, transfer, match, bill, vat_return

billIdstring (uuid)
accountCodestring
vatCodestringnullable
splitarray of BooksBankSplitPartInput
split[].​accountCoderequiredstring
split[].​vatCodestringnullable
split[].​shareBpsrequiredinteger

1 to 9999

toBankAccountIdstring (uuid)
otherLineIdstring (uuid)nullable
receiptIdstring (uuid)
submissionIdstring (uuid)

The filed VAT return this payment settles.

Responses

200 OK, application/json

Body: object (BooksBankLine).

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

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

Undo a line’s explanation

POST/api/v1/books/bank/lines/{id}/undo

Scopes
books:write

Posts the reversal of its entry (dated in the first open period if the books are locked) and puts the line back to explain. A matched receipt goes back to waiting for its payment. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/lines/{id}/undo
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankLine).

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

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

Set a line aside

POST/api/v1/books/bank/lines/{id}/exclude

Scopes
books:write

A copy of another line, or nothing to do with the business: it stays in the list but never in the books. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/lines/{id}/exclude
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankLine).

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

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

Bring back a line set aside

POST/api/v1/books/bank/lines/{id}/include

Scopes
books:write

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

Parameters

Parameters for POST /api/v1/books/bank/lines/{id}/include
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBankLine).

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

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

List rules

GET/api/v1/books/bank/rules

Scopes
books:read

Each rule’s current version, as a sentence, with how many lines it has explained. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: array of BooksBankRule.

An owner’s (or accountant’s) rule, current version. It suggests, or posts without a tap only when the owner chose that.

200 OK response for GET /api/v1/books/bank/rules
FieldTypeDescription
[].​idrequiredstring (uuid)
[].​versionrequiredinteger
[].​namerequiredstringnullable
[].​descriptionrequiredstring

The rule as a sentence.

[].​enabledrequiredboolean
[].​priorityrequiredinteger
[].​matchrequiredstring (BooksBankRuleMatch)

One of: all, any

[].​conditionsrequiredarray of BooksBankRuleCondition
[].​conditions[].​fieldrequiredstring (BooksBankRuleField)

One of: description, merchant, counterparty, reference, amount, direction, payment_type, bank_account

[].​conditions[].​oprequiredstring

example "contains"

[].​conditions[].​valuestring
[].​conditions[].​penceinteger

at least 0

[].​conditions[].​toPenceinteger

Integer pence (GBP).

at least 0

[].​categoriserequiredobject (BooksBankCategorisation)

A category (account code) and VAT code; a split gives each part’s share in basis points.

[].​categorise.​accountCoderequiredstring
[].​categorise.​accountNamerequiredstringnullable
[].​categorise.​vatCoderequiredstringnullable

Null or NONE: no VAT.

[].​categorise.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

[].​categorise.​split[].​accountCoderequiredstring
[].​categorise.​split[].​vatCoderequiredstringnullable
[].​categorise.​split[].​shareBpsrequiredinteger

1 to 9999

[].​postWithoutAskingrequiredboolean
[].​autoPostLimitPencerequiredintegernullable

Integer pence (GBP).

[].​createdByrequiredstring (BooksBankRuleAuthor)

One of: owner, accountant

[].​appliedrequiredinteger

Lines this rule explained (all versions).

[].​updatedAtrequiredstring (date-time)

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

Add a rule

POST/api/v1/books/bank/rules

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

A rule needs a condition on the description, payee, reference or amount. postWithoutAsking: only the business’s owners and admins, signed in; even then a possible copy, a locked period, an unusual amount or a VAT-sensitive code is left for a person. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/rules
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 (BooksBankRuleInput).

Request body for POST /api/v1/books/bank/rules
FieldTypeDescription
namestring
priorityinteger
enabledboolean
matchstring (BooksBankRuleMatch)

One of: all, any

conditionsrequiredarray of BooksBankRuleCondition
conditions[].​fieldrequiredstring (BooksBankRuleField)

One of: description, merchant, counterparty, reference, amount, direction, payment_type, bank_account

conditions[].​oprequiredstring

example "contains"

conditions[].​valuestring
conditions[].​penceinteger

at least 0

conditions[].​toPenceinteger

Integer pence (GBP).

at least 0

categoriserequiredobject (BooksBankCategorisationInput)

An account code and VAT code (null: no VAT), or a split.

categorise.​accountCoderequiredstring
categorise.​vatCodestringnullable
categorise.​splitarray of BooksBankSplitPartInput
categorise.​split[].​accountCoderequiredstring
categorise.​split[].​vatCodestringnullable
categorise.​split[].​shareBpsrequiredinteger

1 to 9999

postWithoutAskingboolean

Post matching lines without a tap. The business’s owners and admins only, signed in.

autoPostLimitPenceintegernullable

Integer pence (GBP).

Responses

201 Created, application/json

Body: object (BooksBankRule).

An owner’s (or accountant’s) rule, current version. It suggests, or posts without a tap only when the owner chose that.

201 Created response for POST /api/v1/books/bank/rules
FieldTypeDescription
idrequiredstring (uuid)
versionrequiredinteger
namerequiredstringnullable
descriptionrequiredstring

The rule as a sentence.

enabledrequiredboolean
priorityrequiredinteger
matchrequiredstring (BooksBankRuleMatch)

One of: all, any

conditionsrequiredarray of BooksBankRuleCondition
conditions[].​fieldrequiredstring (BooksBankRuleField)

One of: description, merchant, counterparty, reference, amount, direction, payment_type, bank_account

conditions[].​oprequiredstring

example "contains"

conditions[].​valuestring
conditions[].​penceinteger

at least 0

conditions[].​toPenceinteger

Integer pence (GBP).

at least 0

categoriserequiredobject (BooksBankCategorisation)

A category (account code) and VAT code; a split gives each part’s share in basis points.

categorise.​accountCoderequiredstring
categorise.​accountNamerequiredstringnullable
categorise.​vatCoderequiredstringnullable

Null or NONE: no VAT.

categorise.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

categorise.​split[].​accountCoderequiredstring
categorise.​split[].​vatCoderequiredstringnullable
categorise.​split[].​shareBpsrequiredinteger

1 to 9999

postWithoutAskingrequiredboolean
autoPostLimitPencerequiredintegernullable

Integer pence (GBP).

createdByrequiredstring (BooksBankRuleAuthor)

One of: owner, accountant

appliedrequiredinteger

Lines this rule explained (all versions).

updatedAtrequiredstring (date-time)

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

Preview a rule

POST/api/v1/books/bank/rules/preview

Scopes
books:read

What it would catch among the lines already in the books, before saving it: “This rule would apply to 14 past lines (£512.40).” Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksBankRuleInput).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (BooksBankRulePreview).

200 OK response for POST /api/v1/books/bank/rules/preview
FieldTypeDescription
countrequiredinteger
totalPencerequiredinteger

Integer pence (GBP).

wouldAutoPostrequiredinteger
differentNowrequiredinteger
sampleLineIdsrequiredarray of string
sampleLinesarray of BooksBankRulePreviewLine

The sample lines themselves (up to 10, newest first), so a preview can show them.

sampleLines[].​idrequiredstring (uuid)
sampleLines[].​bookedAtrequiredstring (date)

example "2026-03-31"

sampleLines[].​descriptionrequiredstring
sampleLines[].​payeerequiredstringnullable
sampleLines[].​amountPencerequiredinteger

Integer pence (GBP).

Money in positive, money out negative.

sampleLines[].​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

summaryrequiredstring

example "This rule would apply to 14 past lines (£512.40)."

problemsrequiredarray of string

Problems with the rule, if any.

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

Change a rule

PUT/api/v1/books/bank/rules/{id}

Scopes
books:write

Saves a new version; earlier versions are kept, so each entry still names the version that posted it. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for PUT /api/v1/books/bank/rules/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksBankRuleInput).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (BooksBankRule).

An owner’s (or accountant’s) rule, current version. It suggests, or posts without a tap only when the owner chose that.

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 rule

POST/api/v1/books/bank/rules/{id}/remove

Scopes
books:write

It stops applying; lines it explained stay as they are (undo them one by one if needed). Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bank/rules/{id}/remove
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

204 No content

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

Get the inbox

GET/api/v1/books/inbox

Scopes
books:read

Bank lines still to explain, laid out as questions (Tolvi isn’t sure: two or three answers), suggested groups (one payee, one category: one tap confirms them all) and matches; “Do this every time?” rule offers; receipts to check, reminders to approve and invoices to chase; VAT returns due; and bank or HMRC connections running out. Says whether Tolvi AI is waiting for next month’s allowance (nothing is charged) and whether the viewer can act. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (BooksInbox).

Everything that needs the owner, most of it already sorted, each with a “Why?”. Nothing in it posts until a person confirms (or the owner’s own rule does).

200 OK response for GET /api/v1/books/inbox
FieldTypeDescription
viewerrequiredobject (BooksInboxViewer)

Who is looking, and whether they can act on the inbox.

viewer.​canActrequiredboolean

False for an accountant whose link only lets them see the books.

viewer.​accountantrequiredboolean

An accountant working through the practice link.

viewer.​canAutoPostrequiredboolean

May let a rule post without asking (the business’s owners and admins, signed in).

viewer.​readOnlyReasonrequiredstringnullable

Why the viewer can’t act, in plain English.

countsrequiredobject (BooksInboxCounts)
counts.​totalrequiredinteger
counts.​questionsrequiredinteger
counts.​suggestedrequiredinteger
counts.​matchedrequiredinteger
counts.​tasksrequiredinteger
counts.​ruleOffersrequiredinteger
airequiredobject (BooksInboxAi)

Tolvi AI in the inbox this month (fair use, D-83): past the allowance it waits, and nothing is charged.

ai.​staterequiredstring (BooksInboxAiState)

One of: on, waiting

ai.​allowancerequiredinteger

AI suggestions included this month.

ai.​usedrequiredinteger
ai.​resetsOnrequiredstring (date)

When the allowance starts again.

example "2026-03-31"

ai.​waitingrequiredinteger

Lines waiting for Tolvi AI.

ai.​messagerequiredstringnullable
questionsrequiredarray of BooksInboxLine

Tolvi isn’t sure: answer in a tap.

questions[].​linerequiredobject (BooksBankLine)

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

questions[].​line.​idrequiredstring (uuid)
questions[].​line.​bankAccountIdrequiredstring (uuid)
questions[].​line.​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

questions[].​line.​bookedAtrequiredstring (date)

example "2026-03-31"

questions[].​line.​descriptionrequiredstring
questions[].​line.​counterpartyrequiredstringnullable
questions[].​line.​referencerequiredstringnullable
questions[].​line.​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

questions[].​line.​amountPencerequiredinteger

Integer pence (GBP).

questions[].​line.​currencyrequiredstring
questions[].​line.​runningBalancePencerequiredintegernullable

Integer pence (GBP).

questions[].​line.​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

questions[].​line.​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

questions[].​line.​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

questions[].​line.​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

questions[].​line.​suggestion.​summaryrequiredstring
questions[].​line.​suggestion.​reasonsrequiredarray of string

The “Why?”.

questions[].​line.​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

questions[].​line.​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

questions[].​line.​suggestion.​categorisation.​accountCoderequiredstring
questions[].​line.​suggestion.​categorisation.​accountNamerequiredstringnullable
questions[].​line.​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

questions[].​line.​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

questions[].​line.​suggestion.​categorisation.​split[].​accountCoderequiredstring
questions[].​line.​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
questions[].​line.​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

questions[].​line.​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
questions[].​line.​suggestion.​otherLineIdrequiredstring (uuid)nullable
questions[].​line.​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

questions[].​line.​suggestion.​documentIdsrequiredarray of string
questions[].​line.​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
questions[].​line.​suggestion.​ruleIdrequiredstring (uuid)nullable
questions[].​line.​suggestion.​ruleNamerequiredstringnullable
questions[].​line.​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

questions[].​line.​suggestion.​candidates[].​summaryrequiredstring
questions[].​line.​suggestion.​candidates[].​scorerequiredinteger

0 to 100

questions[].​line.​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

questions[].​line.​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

questions[].​line.​suggestion.​candidates[].​documentIdsrequiredarray of string
questions[].​line.​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
questions[].​line.​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
questions[].​line.​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

questions[].​line.​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

questions[].​line.​explanation.​entryIdrequiredstring (uuid)
questions[].​line.​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

questions[].​line.​explanation.​categorisation.​accountCoderequiredstring
questions[].​line.​explanation.​categorisation.​accountNamerequiredstringnullable
questions[].​line.​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

questions[].​line.​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

questions[].​line.​explanation.​categorisation.​split[].​accountCoderequiredstring
questions[].​line.​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
questions[].​line.​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

questions[].​line.​explanation.​transferLineIdrequiredstring (uuid)nullable
questions[].​line.​explanation.​receiptIdrequiredstring (uuid)nullable
questions[].​line.​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

questions[].​line.​explanation.​ruleVersionrequiredintegernullable
questions[].​line.​explanation.​explainedByrequiredstring (uuid)nullable
questions[].​line.​explanation.​explainedAtrequiredstring (date-time)
questions[].​line.​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

questions[].​line.​createdAtrequiredstring (date-time)
questions[].​bankAccountNamerequiredstringnullable
questions[].​sourceLabelrequiredstring

“From your rule”, “You usually choose this”, “Tolvi AI suggests”, “Matched”…

questions[].​questionrequiredstringnullable

For a question: what Tolvi asks, in plain English.

questions[].​choicesrequiredarray of BooksInboxChoice

For a question: two or three likely answers.

questions[].​choices[].​labelrequiredstring
questions[].​choices[].​asSuggestedrequiredboolean

Confirm as Tolvi suggested (a copy set aside, a match).

questions[].​choices[].​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

questions[].​choices[].​categorisation.​accountCoderequiredstring
questions[].​choices[].​categorisation.​accountNamerequiredstringnullable
questions[].​choices[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

questions[].​choices[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

questions[].​choices[].​categorisation.​split[].​accountCoderequiredstring
questions[].​choices[].​categorisation.​split[].​vatCoderequiredstringnullable
questions[].​choices[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

groupsrequiredarray of BooksInboxGroup
groups[].​keyrequiredstring
groups[].​labelrequiredstring
groups[].​payeerequiredstring
groups[].​directionrequiredstring (BooksInboxDirection)

One of: in, out

groups[].​categorisationrequiredobject (BooksBankCategorisation)

A category (account code) and VAT code; a split gives each part’s share in basis points.

groups[].​categorisation.​accountCoderequiredstring
groups[].​categorisation.​accountNamerequiredstringnullable
groups[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

groups[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

groups[].​categorisation.​split[].​accountCoderequiredstring
groups[].​categorisation.​split[].​vatCoderequiredstringnullable
groups[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

groups[].​sourceLabelrequiredstring
groups[].​reasonsrequiredarray of string

The “Why?” of the newest line.

groups[].​totalPencerequiredinteger

Integer pence (GBP).

groups[].​lineIdsrequiredarray of string
groups[].​linesrequiredarray of BooksInboxLine
groups[].​lines[].​linerequiredobject (BooksBankLine)

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

groups[].​lines[].​line.​idrequiredstring (uuid)
groups[].​lines[].​line.​bankAccountIdrequiredstring (uuid)
groups[].​lines[].​line.​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

groups[].​lines[].​line.​bookedAtrequiredstring (date)

example "2026-03-31"

groups[].​lines[].​line.​descriptionrequiredstring
groups[].​lines[].​line.​counterpartyrequiredstringnullable
groups[].​lines[].​line.​referencerequiredstringnullable
groups[].​lines[].​line.​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

groups[].​lines[].​line.​amountPencerequiredinteger

Integer pence (GBP).

groups[].​lines[].​line.​currencyrequiredstring
groups[].​lines[].​line.​runningBalancePencerequiredintegernullable

Integer pence (GBP).

groups[].​lines[].​line.​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

groups[].​lines[].​line.​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

groups[].​lines[].​line.​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

groups[].​lines[].​line.​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

groups[].​lines[].​line.​suggestion.​summaryrequiredstring
groups[].​lines[].​line.​suggestion.​reasonsrequiredarray of string

The “Why?”.

groups[].​lines[].​line.​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

groups[].​lines[].​line.​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

groups[].​lines[].​line.​suggestion.​categorisation.​accountCoderequiredstring
groups[].​lines[].​line.​suggestion.​categorisation.​accountNamerequiredstringnullable
groups[].​lines[].​line.​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

groups[].​lines[].​line.​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

groups[].​lines[].​line.​suggestion.​categorisation.​split[].​accountCoderequiredstring
groups[].​lines[].​line.​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
groups[].​lines[].​line.​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

groups[].​lines[].​line.​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​suggestion.​otherLineIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

groups[].​lines[].​line.​suggestion.​documentIdsrequiredarray of string
groups[].​lines[].​line.​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​suggestion.​ruleIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​suggestion.​ruleNamerequiredstringnullable
groups[].​lines[].​line.​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

groups[].​lines[].​line.​suggestion.​candidates[].​summaryrequiredstring
groups[].​lines[].​line.​suggestion.​candidates[].​scorerequiredinteger

0 to 100

groups[].​lines[].​line.​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

groups[].​lines[].​line.​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

groups[].​lines[].​line.​suggestion.​candidates[].​documentIdsrequiredarray of string
groups[].​lines[].​line.​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

groups[].​lines[].​line.​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

groups[].​lines[].​line.​explanation.​entryIdrequiredstring (uuid)
groups[].​lines[].​line.​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

groups[].​lines[].​line.​explanation.​categorisation.​accountCoderequiredstring
groups[].​lines[].​line.​explanation.​categorisation.​accountNamerequiredstringnullable
groups[].​lines[].​line.​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

groups[].​lines[].​line.​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

groups[].​lines[].​line.​explanation.​categorisation.​split[].​accountCoderequiredstring
groups[].​lines[].​line.​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
groups[].​lines[].​line.​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

groups[].​lines[].​line.​explanation.​transferLineIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​explanation.​receiptIdrequiredstring (uuid)nullable
groups[].​lines[].​line.​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

groups[].​lines[].​line.​explanation.​ruleVersionrequiredintegernullable
groups[].​lines[].​line.​explanation.​explainedByrequiredstring (uuid)nullable
groups[].​lines[].​line.​explanation.​explainedAtrequiredstring (date-time)
groups[].​lines[].​line.​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

groups[].​lines[].​line.​createdAtrequiredstring (date-time)
groups[].​lines[].​bankAccountNamerequiredstringnullable
groups[].​lines[].​sourceLabelrequiredstring

“From your rule”, “You usually choose this”, “Tolvi AI suggests”, “Matched”…

groups[].​lines[].​questionrequiredstringnullable

For a question: what Tolvi asks, in plain English.

groups[].​lines[].​choicesrequiredarray of BooksInboxChoice

For a question: two or three likely answers.

groups[].​lines[].​choices[].​labelrequiredstring
groups[].​lines[].​choices[].​asSuggestedrequiredboolean

Confirm as Tolvi suggested (a copy set aside, a match).

groups[].​lines[].​choices[].​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

groups[].​lines[].​choices[].​categorisation.​accountCoderequiredstring
groups[].​lines[].​choices[].​categorisation.​accountNamerequiredstringnullable
groups[].​lines[].​choices[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

groups[].​lines[].​choices[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

groups[].​lines[].​choices[].​categorisation.​split[].​accountCoderequiredstring
groups[].​lines[].​choices[].​categorisation.​split[].​vatCoderequiredstringnullable
groups[].​lines[].​choices[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

suggestedrequiredarray of BooksInboxLine

Suggested lines not in a group.

suggested[].​linerequiredobject (BooksBankLine)

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

suggested[].​line.​idrequiredstring (uuid)
suggested[].​line.​bankAccountIdrequiredstring (uuid)
suggested[].​line.​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

suggested[].​line.​bookedAtrequiredstring (date)

example "2026-03-31"

suggested[].​line.​descriptionrequiredstring
suggested[].​line.​counterpartyrequiredstringnullable
suggested[].​line.​referencerequiredstringnullable
suggested[].​line.​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

suggested[].​line.​amountPencerequiredinteger

Integer pence (GBP).

suggested[].​line.​currencyrequiredstring
suggested[].​line.​runningBalancePencerequiredintegernullable

Integer pence (GBP).

suggested[].​line.​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

suggested[].​line.​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

suggested[].​line.​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

suggested[].​line.​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

suggested[].​line.​suggestion.​summaryrequiredstring
suggested[].​line.​suggestion.​reasonsrequiredarray of string

The “Why?”.

suggested[].​line.​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

suggested[].​line.​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

suggested[].​line.​suggestion.​categorisation.​accountCoderequiredstring
suggested[].​line.​suggestion.​categorisation.​accountNamerequiredstringnullable
suggested[].​line.​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

suggested[].​line.​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

suggested[].​line.​suggestion.​categorisation.​split[].​accountCoderequiredstring
suggested[].​line.​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
suggested[].​line.​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

suggested[].​line.​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
suggested[].​line.​suggestion.​otherLineIdrequiredstring (uuid)nullable
suggested[].​line.​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

suggested[].​line.​suggestion.​documentIdsrequiredarray of string
suggested[].​line.​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
suggested[].​line.​suggestion.​ruleIdrequiredstring (uuid)nullable
suggested[].​line.​suggestion.​ruleNamerequiredstringnullable
suggested[].​line.​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

suggested[].​line.​suggestion.​candidates[].​summaryrequiredstring
suggested[].​line.​suggestion.​candidates[].​scorerequiredinteger

0 to 100

suggested[].​line.​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

suggested[].​line.​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

suggested[].​line.​suggestion.​candidates[].​documentIdsrequiredarray of string
suggested[].​line.​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
suggested[].​line.​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
suggested[].​line.​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

suggested[].​line.​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

suggested[].​line.​explanation.​entryIdrequiredstring (uuid)
suggested[].​line.​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

suggested[].​line.​explanation.​categorisation.​accountCoderequiredstring
suggested[].​line.​explanation.​categorisation.​accountNamerequiredstringnullable
suggested[].​line.​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

suggested[].​line.​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

suggested[].​line.​explanation.​categorisation.​split[].​accountCoderequiredstring
suggested[].​line.​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
suggested[].​line.​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

suggested[].​line.​explanation.​transferLineIdrequiredstring (uuid)nullable
suggested[].​line.​explanation.​receiptIdrequiredstring (uuid)nullable
suggested[].​line.​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

suggested[].​line.​explanation.​ruleVersionrequiredintegernullable
suggested[].​line.​explanation.​explainedByrequiredstring (uuid)nullable
suggested[].​line.​explanation.​explainedAtrequiredstring (date-time)
suggested[].​line.​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

suggested[].​line.​createdAtrequiredstring (date-time)
suggested[].​bankAccountNamerequiredstringnullable
suggested[].​sourceLabelrequiredstring

“From your rule”, “You usually choose this”, “Tolvi AI suggests”, “Matched”…

suggested[].​questionrequiredstringnullable

For a question: what Tolvi asks, in plain English.

suggested[].​choicesrequiredarray of BooksInboxChoice

For a question: two or three likely answers.

suggested[].​choices[].​labelrequiredstring
suggested[].​choices[].​asSuggestedrequiredboolean

Confirm as Tolvi suggested (a copy set aside, a match).

suggested[].​choices[].​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

suggested[].​choices[].​categorisation.​accountCoderequiredstring
suggested[].​choices[].​categorisation.​accountNamerequiredstringnullable
suggested[].​choices[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

suggested[].​choices[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

suggested[].​choices[].​categorisation.​split[].​accountCoderequiredstring
suggested[].​choices[].​categorisation.​split[].​vatCoderequiredstringnullable
suggested[].​choices[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

matchedrequiredarray of BooksInboxLine

Paid invoices, receipts found and transfers between your accounts.

matched[].​linerequiredobject (BooksBankLine)

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

matched[].​line.​idrequiredstring (uuid)
matched[].​line.​bankAccountIdrequiredstring (uuid)
matched[].​line.​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

matched[].​line.​bookedAtrequiredstring (date)

example "2026-03-31"

matched[].​line.​descriptionrequiredstring
matched[].​line.​counterpartyrequiredstringnullable
matched[].​line.​referencerequiredstringnullable
matched[].​line.​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

matched[].​line.​amountPencerequiredinteger

Integer pence (GBP).

matched[].​line.​currencyrequiredstring
matched[].​line.​runningBalancePencerequiredintegernullable

Integer pence (GBP).

matched[].​line.​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

matched[].​line.​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

matched[].​line.​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

matched[].​line.​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

matched[].​line.​suggestion.​summaryrequiredstring
matched[].​line.​suggestion.​reasonsrequiredarray of string

The “Why?”.

matched[].​line.​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

matched[].​line.​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

matched[].​line.​suggestion.​categorisation.​accountCoderequiredstring
matched[].​line.​suggestion.​categorisation.​accountNamerequiredstringnullable
matched[].​line.​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

matched[].​line.​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

matched[].​line.​suggestion.​categorisation.​split[].​accountCoderequiredstring
matched[].​line.​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
matched[].​line.​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

matched[].​line.​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
matched[].​line.​suggestion.​otherLineIdrequiredstring (uuid)nullable
matched[].​line.​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

matched[].​line.​suggestion.​documentIdsrequiredarray of string
matched[].​line.​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
matched[].​line.​suggestion.​ruleIdrequiredstring (uuid)nullable
matched[].​line.​suggestion.​ruleNamerequiredstringnullable
matched[].​line.​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

matched[].​line.​suggestion.​candidates[].​summaryrequiredstring
matched[].​line.​suggestion.​candidates[].​scorerequiredinteger

0 to 100

matched[].​line.​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

matched[].​line.​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

matched[].​line.​suggestion.​candidates[].​documentIdsrequiredarray of string
matched[].​line.​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
matched[].​line.​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
matched[].​line.​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

matched[].​line.​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

matched[].​line.​explanation.​entryIdrequiredstring (uuid)
matched[].​line.​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

matched[].​line.​explanation.​categorisation.​accountCoderequiredstring
matched[].​line.​explanation.​categorisation.​accountNamerequiredstringnullable
matched[].​line.​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

matched[].​line.​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

matched[].​line.​explanation.​categorisation.​split[].​accountCoderequiredstring
matched[].​line.​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
matched[].​line.​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

matched[].​line.​explanation.​transferLineIdrequiredstring (uuid)nullable
matched[].​line.​explanation.​receiptIdrequiredstring (uuid)nullable
matched[].​line.​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

matched[].​line.​explanation.​ruleVersionrequiredintegernullable
matched[].​line.​explanation.​explainedByrequiredstring (uuid)nullable
matched[].​line.​explanation.​explainedAtrequiredstring (date-time)
matched[].​line.​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

matched[].​line.​createdAtrequiredstring (date-time)
matched[].​bankAccountNamerequiredstringnullable
matched[].​sourceLabelrequiredstring

“From your rule”, “You usually choose this”, “Tolvi AI suggests”, “Matched”…

matched[].​questionrequiredstringnullable

For a question: what Tolvi asks, in plain English.

matched[].​choicesrequiredarray of BooksInboxChoice

For a question: two or three likely answers.

matched[].​choices[].​labelrequiredstring
matched[].​choices[].​asSuggestedrequiredboolean

Confirm as Tolvi suggested (a copy set aside, a match).

matched[].​choices[].​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

matched[].​choices[].​categorisation.​accountCoderequiredstring
matched[].​choices[].​categorisation.​accountNamerequiredstringnullable
matched[].​choices[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

matched[].​choices[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

matched[].​choices[].​categorisation.​split[].​accountCoderequiredstring
matched[].​choices[].​categorisation.​split[].​vatCoderequiredstringnullable
matched[].​choices[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

ruleOffersrequiredarray of BooksInboxRuleOffer
ruleOffers[].​merchantKeyrequiredstring
ruleOffers[].​merchantrequiredstring
ruleOffers[].​directionrequiredstring (BooksInboxDirection)

One of: in, out

ruleOffers[].​questionrequiredstring
ruleOffers[].​reasonrequiredstring
ruleOffers[].​ruleTextrequiredstring

The rule in plain words.

ruleOffers[].​categorisationrequiredobject (BooksBankCategorisation)

A category (account code) and VAT code; a split gives each part’s share in basis points.

ruleOffers[].​categorisation.​accountCoderequiredstring
ruleOffers[].​categorisation.​accountNamerequiredstringnullable
ruleOffers[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

ruleOffers[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

ruleOffers[].​categorisation.​split[].​accountCoderequiredstring
ruleOffers[].​categorisation.​split[].​vatCoderequiredstringnullable
ruleOffers[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

ruleOffers[].​byrequiredstring (BooksInboxDecider)

One of: owner, accountant

tasksrequiredarray of BooksInboxTask
tasks[].​kindrequiredstring (BooksInboxTaskKind)

One of: receipt, reminder, invoice, vat, bank_consent, hmrc_consent

tasks[].​idrequiredstring
tasks[].​titlerequiredstring
tasks[].​detailrequiredstringnullable
tasks[].​amountPencerequiredintegernullable

Integer pence (GBP).

tasks[].​daterequiredstring (date)nullable

example "2026-03-31"

tasks[].​pathrequiredarray of string

Where to go, relative to the Books area (e.g. ["sales", "invoices", "<id>"]).

tasks[].​queryrequiredobjectnullable

Query parameters for the link.

tasks[].​ownerOnlyrequiredboolean

Only the business’s own people can do this (an accountant sees it but can’t).

tasks[].​tonerequiredstring (BooksInboxTaskTone)

One of: info, warning, danger

sortedByRulesrequiredobject (BooksInboxSorted)

Lines your rules posted without a tap in the last 7 days (in the activity, each with Undo).

sortedByRules.​countrequiredinteger
sortedByRules.​sincerequiredstring (date)

example "2026-03-31"

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

Confirm lines from the inbox

POST/api/v1/books/inbox/confirm

Scopes
books:write

One line, a group or a selection: each as suggested, or all as one category (an answer to a question). Each line posts on its own, so one that can’t be posted doesn’t stop the rest. The business’s own people, or an accountant whose practice link lets them change the books (year_end or full_bookkeeping), as in Bank. A read-only link sees the inbox but gets 403 here. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksBankConfirmLines).

The fields are as shown above.

Responses

200 OK, application/json

Body: object (BooksBankConfirmResults).

200 OK response for POST /api/v1/books/inbox/confirm
FieldTypeDescription
resultsrequiredarray of BooksBankConfirmResult
results[].​lineIdrequiredstring (uuid)
results[].​okrequiredboolean
results[].​problemrequiredstringnullable

Why this line wasn’t confirmed.

confirmedrequiredinteger

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

Undo lines confirmed from the inbox

POST/api/v1/books/inbox/undo

Scopes
books:write

Posts the reversal of each line’s entry and puts it back in the inbox. The business’s own people, or an accountant whose practice link lets them change the books (year_end or full_bookkeeping), as in Bank. A read-only link sees the inbox but gets 403 here. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksInboxUndoLines).

Request body for POST /api/v1/books/inbox/undo
FieldTypeDescription
lineIdsrequiredarray of string

Responses

200 OK, application/json

Body: object (BooksBankConfirmResults).

200 OK response for POST /api/v1/books/inbox/undo
FieldTypeDescription
resultsrequiredarray of BooksBankConfirmResult
results[].​lineIdrequiredstring (uuid)
results[].​okrequiredboolean
results[].​problemrequiredstringnullable

Why this line wasn’t confirmed.

confirmedrequiredinteger

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

Why Tolvi suggested this

GET/api/v1/books/inbox/lines/{id}/why

Scopes
books:read

Where the suggestion came from (your rule, your past choices, a match or Tolvi AI, with the model and prompt version), what this business chose before for the payee, and every decision on the line with who made it. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/inbox/lines/{id}/why
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksInboxWhy).

The “Why?” sheet: where a suggestion came from, what it rests on, and who has decided what on this line.

200 OK response for GET /api/v1/books/inbox/lines/{id}/why
FieldTypeDescription
itemrequiredobject (BooksInboxLine)

A bank line in the inbox, with where its suggestion came from.

item.​linerequiredobject (BooksBankLine)

A line from the bank or a statement: what happened, what Tolvi suggests and how it is in the books. Money in positive, money out negative.

item.​line.​idrequiredstring (uuid)
item.​line.​bankAccountIdrequiredstring (uuid)
item.​line.​sourcerequiredstring (BooksBankLineSource)

One of: feed, csv, ofx, qif, manual

item.​line.​bookedAtrequiredstring (date)

example "2026-03-31"

item.​line.​descriptionrequiredstring
item.​line.​counterpartyrequiredstringnullable
item.​line.​referencerequiredstringnullable
item.​line.​payeerequiredstringnullable

Who it was paid to or received from, cleaned up.

item.​line.​amountPencerequiredinteger

Integer pence (GBP).

item.​line.​currencyrequiredstring
item.​line.​runningBalancePencerequiredintegernullable

Integer pence (GBP).

item.​line.​statusrequiredstring (BooksBankLineStatus)

to_explain, explained (in the books), or excluded (set aside).

One of: to_explain, explained, excluded

item.​line.​suggestionrequiredobject (BooksBankSuggestion)nullable

What Tolvi suggests for a line and why. Only an owner’s rule set to post automatically ever posts without a tap.

item.​line.​suggestion.​levelrequiredstring (BooksBankSuggestionLevel)

One of: sorted, suggested, question

item.​line.​suggestion.​stagerequiredstring (BooksBankSuggestionStage)

Which step decided: a possible copy, a match, your rule, what you did before, Tolvi AI, or nothing yet (for_ai).

One of: duplicate, matched, ruled, remembered, ai, for_ai

item.​line.​suggestion.​summaryrequiredstring
item.​line.​suggestion.​reasonsrequiredarray of string

The “Why?”.

item.​line.​suggestion.​kindrequiredstring (BooksBankSuggestionKind)

One of: category, transfer, match, duplicate, none

item.​line.​suggestion.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

item.​line.​suggestion.​categorisation.​accountCoderequiredstring
item.​line.​suggestion.​categorisation.​accountNamerequiredstringnullable
item.​line.​suggestion.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

item.​line.​suggestion.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

item.​line.​suggestion.​categorisation.​split[].​accountCoderequiredstring
item.​line.​suggestion.​categorisation.​split[].​vatCoderequiredstringnullable
item.​line.​suggestion.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

item.​line.​suggestion.​transferBankAccountIdrequiredstring (uuid)nullable
item.​line.​suggestion.​otherLineIdrequiredstring (uuid)nullable
item.​line.​suggestion.​documentKindrequiredstring (BooksBankDocumentKind)nullable

One of: receipt, sales_invoice, sales_credit_note, bill, supplier_credit, vat_return, loan_repayment

item.​line.​suggestion.​documentIdsrequiredarray of string
item.​line.​suggestion.​duplicateOfIdrequiredstring (uuid)nullable
item.​line.​suggestion.​ruleIdrequiredstring (uuid)nullable
item.​line.​suggestion.​ruleNamerequiredstringnullable
item.​line.​suggestion.​candidatesrequiredarray of BooksBankCandidate

Other possible matches, best first.

item.​line.​suggestion.​candidates[].​summaryrequiredstring
item.​line.​suggestion.​candidates[].​scorerequiredinteger

0 to 100

item.​line.​suggestion.​candidates[].​bandrequiredstring (BooksBankMatchBand)

One of: high, medium, low

item.​line.​suggestion.​candidates[].​kindrequiredstring

transfer, or the kind of document.

item.​line.​suggestion.​candidates[].​documentIdsrequiredarray of string
item.​line.​suggestion.​candidates[].​bankAccountIdrequiredstring (uuid)nullable
item.​line.​suggestion.​candidates[].​otherLineIdrequiredstring (uuid)nullable
item.​line.​explanationrequiredobject (BooksBankExplanation)nullable

How the line is in the books.

item.​line.​explanation.​kindrequiredstring (BooksBankExplanationKind)

One of: category, transfer, match

item.​line.​explanation.​entryIdrequiredstring (uuid)
item.​line.​explanation.​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

item.​line.​explanation.​categorisation.​accountCoderequiredstring
item.​line.​explanation.​categorisation.​accountNamerequiredstringnullable
item.​line.​explanation.​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

item.​line.​explanation.​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

item.​line.​explanation.​categorisation.​split[].​accountCoderequiredstring
item.​line.​explanation.​categorisation.​split[].​vatCoderequiredstringnullable
item.​line.​explanation.​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

item.​line.​explanation.​transferLineIdrequiredstring (uuid)nullable
item.​line.​explanation.​receiptIdrequiredstring (uuid)nullable
item.​line.​explanation.​ruleIdrequiredstring (uuid)nullable

The rule that posted it without a tap.

item.​line.​explanation.​ruleVersionrequiredintegernullable
item.​line.​explanation.​explainedByrequiredstring (uuid)nullable
item.​line.​explanation.​explainedAtrequiredstring (date-time)
item.​line.​bankChangerequiredobjectnullable

The bank changed or withdrew this line after Tolvi read it: { kind: corrected | missing, changed, amountPence, description, bookedAt }.

item.​line.​createdAtrequiredstring (date-time)
item.​bankAccountNamerequiredstringnullable
item.​sourceLabelrequiredstring

“From your rule”, “You usually choose this”, “Tolvi AI suggests”, “Matched”…

item.​questionrequiredstringnullable

For a question: what Tolvi asks, in plain English.

item.​choicesrequiredarray of BooksInboxChoice

For a question: two or three likely answers.

item.​choices[].​labelrequiredstring
item.​choices[].​asSuggestedrequiredboolean

Confirm as Tolvi suggested (a copy set aside, a match).

item.​choices[].​categorisationrequiredobject (BooksBankCategorisation)nullable

A category (account code) and VAT code; a split gives each part’s share in basis points.

item.​choices[].​categorisation.​accountCoderequiredstring
item.​choices[].​categorisation.​accountNamerequiredstringnullable
item.​choices[].​categorisation.​vatCoderequiredstringnullable

Null or NONE: no VAT.

item.​choices[].​categorisation.​splitrequiredarray of BooksBankSplitPart

Empty when not split.

item.​choices[].​categorisation.​split[].​accountCoderequiredstring
item.​choices[].​categorisation.​split[].​vatCoderequiredstringnullable
item.​choices[].​categorisation.​split[].​shareBpsrequiredinteger

1 to 9999

airequiredobject (BooksInboxAiDetail)nullable

Tolvi AI’s part in a suggestion.

ai.​suggestionIdrequiredstring (uuid)
ai.​modelrequiredstring
ai.​promptVersionrequiredstring
ai.​confidencerequiredstring (BooksInboxConfidence)

One of: high, medium, low

ai.​statusrequiredstring (BooksInboxAiStatus)

One of: proposed, accepted, discarded

ai.​atrequiredstring (date-time)
memoryrequiredarray of BooksInboxMemory

Most chosen first.

memory[].​labelrequiredstring
memory[].​timesrequiredinteger
historyrequiredarray of BooksInboxActivityItem

Every decision on this line, newest first.

history[].​idrequiredstring (uuid)
history[].​lineIdrequiredstring (uuid)
history[].​atrequiredstring (date-time)
history[].​actionrequiredstring (BooksInboxActivityAction)

One of: confirmed, changed, answered, set_aside, posted_by_rule, undone

history[].​byrequiredobject (BooksInboxPerson)

Who decided: a person at the business, an accountant (with their firm) or a rule.

history[].​by.​kindrequiredstring (BooksInboxDeciderKind)

One of: owner, accountant, rule

history[].​by.​namerequiredstring
history[].​by.​firmNamerequiredstringnullable
history[].​payeerequiredstringnullable
history[].​amountPencerequiredinteger

Integer pence (GBP).

history[].​whatrequiredstringnullable

What it went in as.

history[].​undoablerequiredboolean

Still stands and can be undone.

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

Who confirmed what

GET/api/v1/books/inbox/activity

Scopes
books:read

The latest decisions on bank lines, newest first: confirmed, changed, answered, set aside, posted by a rule or undone, by whom (an accountant with their firm), and whether each can still be undone. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/inbox/activity
NameInTypeDescription
limitqueryinteger

1 to 200; default 50

Responses

200 OK, application/json

Body: object (BooksInboxActivity).

200 OK response for GET /api/v1/books/inbox/activity
FieldTypeDescription
itemsrequiredarray of BooksInboxActivityItem
items[].​idrequiredstring (uuid)
items[].​lineIdrequiredstring (uuid)
items[].​atrequiredstring (date-time)
items[].​actionrequiredstring (BooksInboxActivityAction)

One of: confirmed, changed, answered, set_aside, posted_by_rule, undone

items[].​byrequiredobject (BooksInboxPerson)

Who decided: a person at the business, an accountant (with their firm) or a rule.

items[].​by.​kindrequiredstring (BooksInboxDeciderKind)

One of: owner, accountant, rule

items[].​by.​namerequiredstring
items[].​by.​firmNamerequiredstringnullable
items[].​payeerequiredstringnullable
items[].​amountPencerequiredinteger

Integer pence (GBP).

items[].​whatrequiredstringnullable

What it went in as.

items[].​undoablerequiredboolean

Still stands and can be undone.

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

Accept a rule offer (“Yes, always”)

POST/api/v1/books/inbox/rule-offers/accept

Scopes
books:write

Saves the offered rule for the payee, so its lines are suggested that way from now on. It only suggests unless postWithoutAsking is set, which the business’s owners and admins can do signed in (403 otherwise). 404 when the offer no longer applies. The business’s own people, or an accountant whose practice link lets them change the books (year_end or full_bookkeeping), as in Bank. A read-only link sees the inbox but gets 403 here. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksInboxAcceptRuleOffer).

Request body for POST /api/v1/books/inbox/rule-offers/accept
FieldTypeDescription
merchantKeyrequiredstring
directionrequiredstring (BooksInboxDirection)

One of: in, out

postWithoutAskingboolean

Post matching lines without a tap. The business’s owners and admins only, signed in.

Responses

201 Created, application/json

Body: object (BooksInboxRuleCreated).

201 Created response for POST /api/v1/books/inbox/rule-offers/accept
FieldTypeDescription
ruleIdrequiredstring (uuid)
descriptionrequiredstring
postWithoutAskingrequiredboolean

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

Decline a rule offer

POST/api/v1/books/inbox/rule-offers/decline

Scopes
books:write

“Not now” asks again after the next correction; “Ask me each time” stops offering for that payee. The business’s own people, or an accountant whose practice link lets them change the books (year_end or full_bookkeeping), as in Bank. A read-only link sees the inbox but gets 403 here. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (BooksInboxDeclineRuleOffer).

Request body for POST /api/v1/books/inbox/rule-offers/decline
FieldTypeDescription
merchantKeyrequiredstring
directionrequiredstring (BooksInboxDirection)

One of: in, out

answerrequiredstring (BooksInboxDeclineAnswer)

One of: not_now, ask_each_time

Responses

204 No content

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