Skip to main content

Books: sales

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

Who owes the business money

GET/api/v1/books/sales/summary

Scopes
books:read

What is owed and overdue as at today, by customer (most overdue first), with drafts and reminders waiting for the owner. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (SalesSummary).

Who owes the business money, as at today.

200 OK response for GET /api/v1/books/sales/summary
FieldTypeDescription
asAtrequiredstring (date)

example "2026-03-31"

owedPencerequiredinteger

Integer pence (GBP).

overduePencerequiredinteger

Integer pence (GBP).

unpaidInvoicesrequiredinteger
overdueInvoicesrequiredinteger
draftsrequiredinteger
remindersToApproverequiredinteger

Reminders waiting for the owner to approve.

debtorsrequiredarray of SalesDebtor

Most overdue first.

debtors[].​customerIdrequiredstring (uuid)
debtors[].​customerNamerequiredstring
debtors[].​owedPencerequiredinteger

Integer pence (GBP).

debtors[].​overduePencerequiredinteger

Integer pence (GBP).

debtors[].​invoicesrequiredinteger
debtors[].​oldestDaysOverduerequiredinteger

Days the oldest unpaid invoice is past due (0 if none is).

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

Get the invoice settings

GET/api/v1/books/sales/settings

Scopes
books:read

Address, contact and bank details printed on invoices, the brand colour and logo, VAT rounding, terms, numbering and reminders. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (SalesSettings).

What the business’s invoices say about it and how they look.

200 OK response for GET /api/v1/books/sales/settings
FieldTypeDescription
addressLinesrequiredarray of string
postcoderequiredstringnullable
emailrequiredstringnullable

Shown on invoices; customers’ replies go here.

phonerequiredstringnullable
ownerNamesrequiredstringnullable

Sole traders and partnerships trading under a business name: the owner’s or partners’ names (Companies Act 2006 s1202).

bankAccountNamerequiredstringnullable
bankSortCoderequiredstringnullable

example "123456"

bankAccountNumberrequiredstringnullable

example "12345678"

brandColourrequiredstringnullable

The accent colour on the business’s invoices; null for Tolvi’s.

example "#1F4E79"

logoStatusrequiredstring (SalesLogoStatus)

available: the logo is on invoices. pending_scan: a new logo is being checked for viruses.

One of: none, pending_scan, available, rejected

vatRoundingrequiredstring (VatRounding)

VAT Notice 700 section 17: invoice (total VAT rounded down, para 17.5) or line (each line to the nearest penny, para 17.6).

One of: invoice, line

defaultTermsDaysrequiredinteger

0 to 365

footerNoterequiredstringnullable
remindersOnrequiredboolean

Draft reminders for overdue invoices. The owner still approves each one.

invoicePrefixrequiredstring

example "INV-"

creditNotePrefixrequiredstring

example "CN-"

numberingChangeablerequiredboolean

Whether the numbering can still change (nothing issued yet).

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

Change the invoice settings

PATCH/api/v1/books/sales/settings

Scopes
books:write

The business’s owners and admins, or a practice whose link can post. The numbering prefixes can change only until something has been issued (409 after), so numbers always run in one sequence. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (SalesSettingsPatch).

Request body for PATCH /api/v1/books/sales/settings
FieldTypeDescription
addressLinesarray of string
postcodestringnullable
emailstringnullable
phonestringnullable
ownerNamesstringnullable
bankAccountNamestringnullable
bankSortCodestringnullable
bankAccountNumberstringnullable
brandColourstringnullable
vatRoundingstring (VatRounding)

VAT Notice 700 section 17: invoice (total VAT rounded down, para 17.5) or line (each line to the nearest penny, para 17.6).

One of: invoice, line

defaultTermsDaysinteger

0 to 365

footerNotestringnullable
remindersOnboolean
invoicePrefixstring
creditNotePrefixstring

Responses

200 OK, application/json

Body: object (SalesSettings).

What the business’s invoices say about it and how they look.

The fields are as shown above.

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

Get a customer’s statement

GET/api/v1/books/customers/{id}/statement

Scopes
books:read

Every issued invoice still owed at the date, with ageing that adds up to the total, and the email as it would go. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/customers/{id}/statement
NameInTypeDescription
idrequiredpathstring (uuid)
asAtquerystring (date)

Defaults to today.

Responses

200 OK, application/json

Body: object (SalesStatement).

What a customer owes at a date, invoice by invoice, with ageing.

200 OK response for GET /api/v1/books/customers/{id}/statement
FieldTypeDescription
customerIdrequiredstring (uuid)
customerNamerequiredstring
asAtrequiredstring (date)

example "2026-03-31"

itemsrequiredarray of SalesStatementItem
items[].​documentIdrequiredstring (uuid)
items[].​referencerequiredstring
items[].​daterequiredstring (date)

example "2026-03-31"

items[].​dueDaterequiredstring (date)nullable

example "2026-03-31"

items[].​daysOverduerequiredinteger
items[].​bucketrequiredstring

example "days_1_30"

items[].​amountPencerequiredinteger

Integer pence (GBP).

items[].​openPencerequiredinteger

Integer pence (GBP).

ageingrequiredobject (SalesStatementAgeing)
ageing.​currentrequiredinteger
ageing.​days_1_30requiredinteger
ageing.​days_31_60requiredinteger
ageing.​days_61_90requiredinteger
ageing.​over_90requiredinteger
totalPencerequiredinteger

Integer pence (GBP).

emailDraftrequiredobject (SalesStatementEmailDraft)

The email as it would go, for the owner to read and change first.

emailDraft.​torequiredstringnullable
emailDraft.​subjectrequiredstring
emailDraft.​linesrequiredarray of string

The paragraphs of the email. A message of the owner’s own goes after the first.

emailDraft.​fileNamerequiredstring
lastSentrequiredobject (SalesStatementSend)nullable

The last time a statement was emailed to them.

lastSent.​sentTorequiredstring
lastSent.​asAtrequiredstring (date)

example "2026-03-31"

lastSent.​totalPencerequiredinteger

Integer pence (GBP).

lastSent.​sentAtrequiredstring (date-time)

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

Get a customer’s statement as a PDF

GET/api/v1/books/customers/{id}/statement/pdf

Scopes
books:read

As the customer receives it, with the business’s logo and colour. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/customers/{id}/statement/pdf
NameInTypeDescription
idrequiredpathstring (uuid)
asAtquerystring (date)

Defaults to today.

Responses

200 OK, application/pdf

The PDF

Body: string (binary).

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

Email a customer their statement

POST/api/v1/books/customers/{id}/statement/send

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

To the customer (or the address given), with the PDF attached, from Tolvi in the business’s name; replies go to the business. Only a person at the business, signed in: never an accountant in the books, an API client or an assistant. 409 if they owe nothing. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/customers/{id}/statement/send
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Optional. application/json: object (SalesStatementSendInput).

Request body for POST /api/v1/books/customers/{id}/statement/send
FieldTypeDescription
tostring

Defaults to the customer’s email.

subjectstring

up to 200 characters

messagestringnullable

A short note added to the standard wording.

up to 2000 characters

asAtstring (date)

Defaults to today.

example "2026-03-31"

Responses

200 OK, application/json

Body: object (SalesStatement).

What a customer owes at a date, invoice by invoice, with ageing.

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 customers

GET/api/v1/books/customers

Scopes
books:read

By name, with what each owes. archived=true lists archived customers instead. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/customers
NameInTypeDescription
archivedquerystring

One of: true, false

searchqueryany

Responses

200 OK, application/json

Body: object (CustomerList).

200 OK response for GET /api/v1/books/customers
FieldTypeDescription
itemsrequiredarray of Customer
items[].​idrequiredstring (uuid)
items[].​namerequiredstring
items[].​emailrequiredstringnullable
items[].​addressLinesrequiredarray of string
items[].​postcoderequiredstringnullable
items[].​countryrequiredstring

example "GB"

items[].​vatNumberrequiredstringnullable

Checked for format and check digits; only HMRC can confirm it is registered.

example "GB123456789"

items[].​isBusinessrequiredboolean
items[].​paymentTermsDaysrequiredintegernullable

Days to pay; null means the business’s usual terms.

items[].​cisRegisteredrequiredboolean
items[].​endUserOrIntermediaryrequiredboolean
items[].​remindersPausedrequiredboolean
items[].​archivedrequiredboolean
items[].​owedPencerequiredinteger

Still owed on issued invoices, in pence.

items[].​overduePencerequiredinteger

Integer pence (GBP).

Of that, past its due date.

items[].​createdAtrequiredstring (date-time)

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

Add a customer

POST/api/v1/books/customers

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

A UK VAT number must pass HMRC’s check digits (422 if not). Only HMRC can confirm a number is registered. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/customers
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 (CustomerInput).

Request body for POST /api/v1/books/customers
FieldTypeDescription
namerequiredstring

up to 200 characters

emailstringnullable
addressLinesarray of string
postcodestringnullable
countrystring

example "GB"

vatNumberstringnullable
isBusinessboolean
paymentTermsDaysintegernullable
cisRegisteredboolean
endUserOrIntermediaryboolean
remindersPausedboolean

Responses

201 Created, application/json

Body: object (Customer).

Someone the business invoices.

201 Created response for POST /api/v1/books/customers
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
emailrequiredstringnullable
addressLinesrequiredarray of string
postcoderequiredstringnullable
countryrequiredstring

example "GB"

vatNumberrequiredstringnullable

Checked for format and check digits; only HMRC can confirm it is registered.

example "GB123456789"

isBusinessrequiredboolean
paymentTermsDaysrequiredintegernullable

Days to pay; null means the business’s usual terms.

cisRegisteredrequiredboolean
endUserOrIntermediaryrequiredboolean
remindersPausedrequiredboolean
archivedrequiredboolean
owedPencerequiredinteger

Still owed on issued invoices, in pence.

overduePencerequiredinteger

Integer pence (GBP).

Of that, past its due date.

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 customer

GET/api/v1/books/customers/{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/customers/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Customer).

Someone the business invoices.

The fields are as shown above.

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

Change a customer

PATCH/api/v1/books/customers/{id}

Scopes
books:write

Invoices already issued keep the details they were issued with. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Request body

Required. application/json: object (CustomerPatch).

Request body for PATCH /api/v1/books/customers/{id}
FieldTypeDescription
namestring

up to 200 characters

emailstringnullable
addressLinesarray of string
postcodestringnullable
countrystring
vatNumberstringnullable
isBusinessboolean
paymentTermsDaysintegernullable
cisRegisteredboolean
endUserOrIntermediaryboolean
remindersPausedboolean

Responses

200 OK, application/json

Body: object (Customer).

Someone the business invoices.

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

Archive a customer

POST/api/v1/books/customers/{id}/archive

Scopes
books:write

Hidden from lists and new invoices. 409 while they still owe money. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/customers/{id}/archive
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Customer).

Someone the business invoices.

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

Restore an archived customer

POST/api/v1/books/customers/{id}/restore

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/customers/{id}/restore
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Customer).

Someone the business invoices.

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 invoices or credit notes

GET/api/v1/books/invoices

Scopes
books:read

Newest first. Status is worked out from payments and credit notes as at today. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/invoices
NameInTypeDescription
limitqueryinteger

1 to 500; default 200

customerIdquerystring (uuid)
statusquerystring

One of: all, draft, unpaid, overdue, paid, void

kindquerystring

One of: invoice, credit_note, all

Responses

200 OK, application/json

Body: object (SalesDocumentList).

200 OK response for GET /api/v1/books/invoices
FieldTypeDescription
itemsrequiredarray of SalesDocument
items[].​idrequiredstring (uuid)
items[].​kindrequiredstring (SalesDocumentKind)

One of: invoice, credit_note

items[].​staterequiredstring (SalesDocumentState)

draft: can be changed or deleted. issued: numbered, in the books and never changed.

One of: draft, issued

items[].​statusrequiredstring (InvoiceStatus)

draft, sent (issued, nothing paid yet), part_paid, paid, overdue, or void (credited in full).

One of: draft, sent, part_paid, paid, overdue, void

items[].​numberrequiredstringnullable

example "INV-0001"

items[].​openingrequiredboolean

Issued before the books started and brought forward in the opening balances: it has its old number and no Tolvi copy to print or send.

items[].​customerIdrequiredstring (uuid)
items[].​customerNamerequiredstring
items[].​customerEmailrequiredstringnullable
items[].​issueDaterequiredstring (date)nullable

example "2026-03-31"

items[].​supplyDaterequiredstring (date)nullable

example "2026-03-31"

items[].​taxPointrequiredstring (date)nullable

The VAT tax point (VATA 1994 s6).

example "2026-03-31"

items[].​dueDaterequiredstring (date)nullable

example "2026-03-31"

items[].​termsDaysrequiredintegernullable
items[].​roundingrequiredstring (VatRounding)

VAT Notice 700 section 17: invoice (total VAT rounded down, para 17.5) or line (each line to the nearest penny, para 17.6).

One of: invoice, line

items[].​referencerequiredstringnullable
items[].​purchaseOrderrequiredstringnullable
items[].​notesrequiredstringnullable
items[].​creditsIdrequiredstring (uuid)nullable

Credit notes: the invoice credited.

items[].​creditsNumberrequiredstringnullable
items[].​reasonrequiredstringnullable

Credit notes: why.

items[].​linesrequiredarray of SalesLine
items[].​lines[].​descriptionrequiredstring

up to 300 characters

items[].​lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

items[].​lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

items[].​lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

items[].​lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

items[].​lines[].​discountobject (SalesLineDiscount)nullable
items[].​lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

items[].​lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

items[].​lines[].​discount.​penceinteger

amount: pence off the line.

items[].​lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

items[].​lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

items[].​lines[].​netPencerequiredinteger

Integer pence (GBP).

After any discount, before VAT.

items[].​lines[].​vatPencerequiredinteger

Integer pence (GBP).

VAT charged on the line (its share of the rounded total under invoice rounding).

items[].​lines[].​rateBpsrequiredinteger

Basis points (2000 = 20%).

items[].​totalsrequiredobject (SalesTotals)
items[].​totals.​netPencerequiredinteger

Integer pence (GBP).

items[].​totals.​vatPencerequiredinteger

Integer pence (GBP).

items[].​totals.​grossPencerequiredinteger

Integer pence (GBP).

items[].​totals.​amountDuePencerequiredinteger

Integer pence (GBP).

What the customer pays: the gross less any CIS deduction.

items[].​totals.​notionalVatPencerequiredinteger

Integer pence (GBP).

items[].​totals.​cisDeductionPencerequiredinteger

Integer pence (GBP).

items[].​totals.​byVatCoderequiredarray of SalesVatTotal
items[].​totals.​byVatCode[].​coderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

items[].​totals.​byVatCode[].​rateBpsrequiredinteger
items[].​totals.​byVatCode[].​netPencerequiredinteger

Integer pence (GBP).

items[].​totals.​byVatCode[].​vatPencerequiredinteger

Integer pence (GBP).

items[].​totals.​byVatCode[].​notionalVatPencerequiredinteger

Integer pence (GBP).

Reverse charge: the VAT the customer accounts for, shown but not charged.

items[].​paidPencerequiredinteger

Integer pence (GBP).

items[].​creditedPencerequiredinteger

Integer pence (GBP).

items[].​outstandingPencerequiredinteger

Integer pence (GBP).

Still owed (invoices); nil for drafts and credit notes.

items[].​daysOverduerequiredinteger
items[].​sentAtrequiredstring (date-time)nullable
items[].​sentTorequiredstringnullable
items[].​ledgerEntryIdrequiredstring (uuid)nullable

The ledger entry it posted.

items[].​aiSuggestionIdrequiredstring (uuid)nullable

Drafted from a sentence by Tolvi AI.

items[].​issuedAtrequiredstring (date-time)nullable
items[].​createdAtrequiredstring (date-time)
items[].​updatedAtrequiredstring (date-time)

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

Start a draft invoice

POST/api/v1/books/invoices

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

A draft posts nothing and can be changed or deleted. Pass the Tolvi AI suggestion’s id as aiSuggestionId when the draft came from a sentence; saving it records that the person accepted the suggestion. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices
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 (CreateSalesDocument).

Request body for POST /api/v1/books/invoices
FieldTypeDescription
customerIdrequiredstring (uuid)
issueDatestring (date)nullable

example "2026-03-31"

supplyDatestring (date)nullable

example "2026-03-31"

dueDatestring (date)nullable

example "2026-03-31"

termsDaysintegernullable
linesarray of SalesLineInput
lines[].​descriptionrequiredstring

up to 300 characters

lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

lines[].​discountobject (SalesLineDiscount)nullable
lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

lines[].​discount.​penceinteger

amount: pence off the line.

lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

referencestringnullable
purchaseOrderstringnullable
notesstringnullable
aiSuggestionIdstring (uuid)nullable

The Tolvi AI suggestion it was drafted from.

Responses

201 Created, application/json

Body: object (SalesDocumentDetail).

201 Created response for POST /api/v1/books/invoices
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring (SalesDocumentKind)

One of: invoice, credit_note

staterequiredstring (SalesDocumentState)

draft: can be changed or deleted. issued: numbered, in the books and never changed.

One of: draft, issued

statusrequiredstring (InvoiceStatus)

draft, sent (issued, nothing paid yet), part_paid, paid, overdue, or void (credited in full).

One of: draft, sent, part_paid, paid, overdue, void

numberrequiredstringnullable

example "INV-0001"

openingrequiredboolean

Issued before the books started and brought forward in the opening balances: it has its old number and no Tolvi copy to print or send.

customerIdrequiredstring (uuid)
customerNamerequiredstring
customerEmailrequiredstringnullable
issueDaterequiredstring (date)nullable

example "2026-03-31"

supplyDaterequiredstring (date)nullable

example "2026-03-31"

taxPointrequiredstring (date)nullable

The VAT tax point (VATA 1994 s6).

example "2026-03-31"

dueDaterequiredstring (date)nullable

example "2026-03-31"

termsDaysrequiredintegernullable
roundingrequiredstring (VatRounding)

VAT Notice 700 section 17: invoice (total VAT rounded down, para 17.5) or line (each line to the nearest penny, para 17.6).

One of: invoice, line

referencerequiredstringnullable
purchaseOrderrequiredstringnullable
notesrequiredstringnullable
creditsIdrequiredstring (uuid)nullable

Credit notes: the invoice credited.

creditsNumberrequiredstringnullable
reasonrequiredstringnullable

Credit notes: why.

linesrequiredarray of SalesLine
lines[].​descriptionrequiredstring

up to 300 characters

lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

lines[].​discountobject (SalesLineDiscount)nullable
lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

lines[].​discount.​penceinteger

amount: pence off the line.

lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

lines[].​netPencerequiredinteger

Integer pence (GBP).

After any discount, before VAT.

lines[].​vatPencerequiredinteger

Integer pence (GBP).

VAT charged on the line (its share of the rounded total under invoice rounding).

lines[].​rateBpsrequiredinteger

Basis points (2000 = 20%).

totalsrequiredobject (SalesTotals)
totals.​netPencerequiredinteger

Integer pence (GBP).

totals.​vatPencerequiredinteger

Integer pence (GBP).

totals.​grossPencerequiredinteger

Integer pence (GBP).

totals.​amountDuePencerequiredinteger

Integer pence (GBP).

What the customer pays: the gross less any CIS deduction.

totals.​notionalVatPencerequiredinteger

Integer pence (GBP).

totals.​cisDeductionPencerequiredinteger

Integer pence (GBP).

totals.​byVatCoderequiredarray of SalesVatTotal
totals.​byVatCode[].​coderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

totals.​byVatCode[].​rateBpsrequiredinteger
totals.​byVatCode[].​netPencerequiredinteger

Integer pence (GBP).

totals.​byVatCode[].​vatPencerequiredinteger

Integer pence (GBP).

totals.​byVatCode[].​notionalVatPencerequiredinteger

Integer pence (GBP).

Reverse charge: the VAT the customer accounts for, shown but not charged.

paidPencerequiredinteger

Integer pence (GBP).

creditedPencerequiredinteger

Integer pence (GBP).

outstandingPencerequiredinteger

Integer pence (GBP).

Still owed (invoices); nil for drafts and credit notes.

daysOverduerequiredinteger
sentAtrequiredstring (date-time)nullable
sentTorequiredstringnullable
ledgerEntryIdrequiredstring (uuid)nullable

The ledger entry it posted.

aiSuggestionIdrequiredstring (uuid)nullable

Drafted from a sentence by Tolvi AI.

issuedAtrequiredstring (date-time)nullable
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)
supplierrequiredobject (SalesParty)

A business or customer as the document shows it (frozen at issue).

supplier.​namerequiredstring
supplier.​addressLinesrequiredarray of string
supplier.​postcoderequiredstringnullable
supplier.​vatNumberrequiredstringnullable
supplier.​emailrequiredstringnullable
supplier.​registeredNamerequiredstringnullable

Companies and LLPs: the registered name.

supplier.​companyNumberrequiredstringnullable
supplier.​payTorequiredstringnullable

How to pay, as printed (the business only).

customerrequiredobject (SalesParty)

A business or customer as the document shows it (frozen at issue).

customer.​namerequiredstring
customer.​addressLinesrequiredarray of string
customer.​postcoderequiredstringnullable
customer.​vatNumberrequiredstringnullable
customer.​emailrequiredstringnullable
customer.​registeredNamerequiredstringnullable

Companies and LLPs: the registered name.

customer.​companyNumberrequiredstringnullable
customer.​payTorequiredstringnullable

How to pay, as printed (the business only).

problemsrequiredarray of SalesProblem

Drafts: what stops it being issued (errors) and what to check (warnings).

problems[].​coderequiredstring

example "customer_address_missing"

problems[].​severityrequiredstring (SalesProblemSeverity)

One of: error, warning

problems[].​fieldrequiredstringnullable

example "customer.address"

problems[].​messagerequiredstring
problems[].​citationrequiredstringnullable

The legislation or HMRC guidance.

paymentsrequiredarray of SalesPayment
payments[].​idrequiredstring (uuid)
payments[].​paidOnrequiredstring (date)

example "2026-03-31"

payments[].​amountPencerequiredinteger

Integer pence (GBP).

payments[].​methodrequiredstring (SalesPaymentMethod)

One of: bank_transfer, card, cash, cheque, other

payments[].​accountIdrequiredstring (uuid)
payments[].​referencerequiredstringnullable
payments[].​bankLineIdrequiredstring (uuid)nullable

Set when it came from a matched bank line.

payments[].​ledgerEntryIdrequiredstring (uuid)
payments[].​createdAtrequiredstring (date-time)
creditNotesrequiredarray of SalesCreditApplied
creditNotes[].​idrequiredstring (uuid)
creditNotes[].​numberrequiredstringnullable
creditNotes[].​staterequiredstring (SalesDocumentState)

draft: can be changed or deleted. issued: numbered, in the books and never changed.

One of: draft, issued

creditNotes[].​issueDaterequiredstring (date)nullable

example "2026-03-31"

creditNotes[].​amountPencerequiredinteger

Integer pence (GBP).

What it takes off the invoice.

creditNotes[].​reasonrequiredstringnullable
sendsrequiredarray of SalesSend
sends[].​kindrequiredstring (SalesSendKind)

One of: invoice, credit_note, reminder

sends[].​sentTorequiredstring
sends[].​subjectrequiredstring
sends[].​sentAtrequiredstring (date-time)
remindersrequiredarray of SalesReminder
reminders[].​idrequiredstring (uuid)
reminders[].​invoiceIdrequiredstring (uuid)
reminders[].​invoiceNumberrequiredstring
reminders[].​customerNamerequiredstring
reminders[].​customerEmailrequiredstringnullable
reminders[].​tonerequiredstring (ReminderTone)

One of: friendly, firm, final

reminders[].​daysOverduerequiredinteger

Negative before the due date.

reminders[].​outstandingPencerequiredinteger

Integer pence (GBP).

reminders[].​compensationPencerequiredinteger

Integer pence (GBP).

Fixed late payment compensation the owner may add (Late Payment of Commercial Debts (Interest) Act 1998 s5A); not added unless they choose to.

reminders[].​subjectrequiredstring
reminders[].​bodyrequiredstring
reminders[].​statusrequiredstring (ReminderStatus)

One of: to_approve, sent, dismissed

reminders[].​draftedOnrequiredstring (date)

example "2026-03-31"

reminders[].​sentAtrequiredstring (date-time)nullable
reminders[].​sentTorequiredstringnullable

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

Draft an invoice from a sentence (Tolvi AI)

POST/api/v1/books/invoices/draft-from-sentence

Scopes
books:write

Tolvi AI reads a sentence such as "Invoice Acme for 3 days’ consulting at £450 plus VAT" and Tolvi builds a draft from your customers, VAT status and terms, with the questions to answer. A suggestion only: nothing is saved, issued or sent. Included in the Tolvi Books price. Needs a person; not available through MCP. Part of the books product: the firm must have it and you must have access to it.

Request body

Required. application/json: object (DraftInvoiceFromSentence).

Request body for POST /api/v1/books/invoices/draft-from-sentence
FieldTypeDescription
sentencerequiredstring

up to 1000 characters; example "Invoice Acme for 3 days' consulting at £450 plus VAT"

Responses

200 OK, application/json

Body: object (SalesDraftSuggestion).

What Tolvi AI made of the sentence: a suggestion to check and save as a draft. Nothing is saved, issued or sent.

200 OK response for POST /api/v1/books/invoices/draft-from-sentence
FieldTypeDescription
suggestionIdrequiredstring (uuid)

The Tolvi AI suggestion; pass it as aiSuggestionId when saving the draft.

customerMatchrequiredstring (SalesCustomerMatch)

One of: existing, new, ambiguous, missing

customerIdrequiredstring (uuid)nullable
customerNamerequiredstringnullable
customerEmailrequiredstringnullable
linesrequiredarray of SalesLine
lines[].​descriptionrequiredstring

up to 300 characters

lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

lines[].​discountobject (SalesLineDiscount)nullable
lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

lines[].​discount.​penceinteger

amount: pence off the line.

lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

lines[].​netPencerequiredinteger

Integer pence (GBP).

After any discount, before VAT.

lines[].​vatPencerequiredinteger

Integer pence (GBP).

VAT charged on the line (its share of the rounded total under invoice rounding).

lines[].​rateBpsrequiredinteger

Basis points (2000 = 20%).

issueDaterequiredstring (date)

example "2026-03-31"

supplyDaterequiredstring (date)nullable

example "2026-03-31"

dueDaterequiredstring (date)nullable

example "2026-03-31"

termsDaysrequiredintegernullable
purchaseOrderrequiredstringnullable
totalsrequiredobject (SalesTotals)
totals.​netPencerequiredinteger

Integer pence (GBP).

totals.​vatPencerequiredinteger

Integer pence (GBP).

totals.​grossPencerequiredinteger

Integer pence (GBP).

totals.​amountDuePencerequiredinteger

Integer pence (GBP).

What the customer pays: the gross less any CIS deduction.

totals.​notionalVatPencerequiredinteger

Integer pence (GBP).

totals.​cisDeductionPencerequiredinteger

Integer pence (GBP).

totals.​byVatCoderequiredarray of SalesVatTotal
totals.​byVatCode[].​coderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

totals.​byVatCode[].​rateBpsrequiredinteger
totals.​byVatCode[].​netPencerequiredinteger

Integer pence (GBP).

totals.​byVatCode[].​vatPencerequiredinteger

Integer pence (GBP).

totals.​byVatCode[].​notionalVatPencerequiredinteger

Integer pence (GBP).

Reverse charge: the VAT the customer accounts for, shown but not charged.

questionsrequiredarray of SalesDraftQuestion
questions[].​coderequiredstring

example "customer_ambiguous"

questions[].​fieldrequiredstring
questions[].​messagerequiredstring
questions[].​blockingrequiredboolean

Must be answered before the invoice can be issued.

questions[].​optionsrequiredarray of object
questions[].​options[].​idrequiredstring
questions[].​options[].​labelrequiredstring
assumptionsrequiredarray of SalesDraftAssumption
assumptions[].​fieldrequiredstring
assumptions[].​messagerequiredstring
noterequiredstring

Tolvi AI’s note on anything unclear, or "".

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

Get an invoice or credit note

GET/api/v1/books/invoices/{id}

Scopes
books:read

With its lines, totals, what is owed, payments, credit notes, emails sent and reminders. A draft lists what would stop it being issued. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Change a draft

PATCH/api/v1/books/invoices/{id}

Scopes
books:write

409 once issued: an issued invoice is corrected with a credit note. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Request body

Required. application/json: object (UpdateSalesDocument).

Change a draft. Fields left out keep their value.

Request body for PATCH /api/v1/books/invoices/{id}
FieldTypeDescription
customerIdstring (uuid)
issueDatestring (date)nullable

example "2026-03-31"

supplyDatestring (date)nullable

example "2026-03-31"

dueDatestring (date)nullable

example "2026-03-31"

termsDaysintegernullable
linesarray of SalesLineInput
lines[].​descriptionrequiredstring

up to 300 characters

lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

lines[].​discountobject (SalesLineDiscount)nullable
lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

lines[].​discount.​penceinteger

amount: pence off the line.

lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

referencestringnullable
purchaseOrderstringnullable
notesstringnullable
reasonstringnullable

Credit notes: why.

Responses

200 OK, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Delete a draft

DELETE/api/v1/books/invoices/{id}

Scopes
books:write

409 once issued: an issued invoice is never deleted, only cancelled with a credit note. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for DELETE /api/v1/books/invoices/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

204 No content

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

Copy an invoice as a new draft

POST/api/v1/books/invoices/{id}/duplicate

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

A new draft for the same customer with the same lines and note, undated (it takes the date it is issued) and on the customer’s usual terms. The order number isn’t copied. Credit notes can’t be copied. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/duplicate
NameInTypeDescription
idrequiredpathstring (uuid)
Idempotency-Keyheaderstring

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

1 to 255 characters

Responses

201 Created, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Issue an invoice or credit note

POST/api/v1/books/invoices/{id}/issue

Scopes
books:write

Takes the next number in the series (no gaps: VAT Regulations 1995 reg 14(1)(a)) and posts it to the books, in one step. 422 with every reason when it can’t be issued (for example a missing customer address on a VAT invoice, or a locked period); nothing is numbered or posted then. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/issue
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Optional. application/json: object (IssueSalesDocument).

Request body for POST /api/v1/books/invoices/{id}/issue
FieldTypeDescription
issueDatestring (date)

Defaults to the draft’s date, or today.

example "2026-03-31"

Responses

200 OK, application/json

Body: object (SalesDocumentDetail).

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

Draft a credit note for an issued invoice

POST/api/v1/books/invoices/{id}/credit-notes

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

The whole invoice unless lines are given, at the VAT rates of the original supply (VAT Notice 700 section 19). Issue the credit note to post it. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/credit-notes
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 (CreditNoteRequest).

Request body for POST /api/v1/books/invoices/{id}/credit-notes
FieldTypeDescription
reasonrequiredstring

up to 300 characters

linesarray of SalesLineInput

Leave out to credit the whole invoice.

lines[].​descriptionrequiredstring

up to 300 characters

lines[].​quantitystring

Up to 3 decimal places. Default 1.

example "3"

lines[].​unitPricePencerequiredinteger

Price per unit before VAT, in pence.

at least 0

lines[].​vatCoderequiredstring (VatCode)

One of: S20, R5, Z0, EX, OS, RC_SERV, DRC_SALE, DRC_SALE_R5, DRC_PURCH, RC_GOODS_SALE, RC_GOODS_PURCH, PIVA, IMPORT_C79, BLOCKED

lines[].​accountIdstring (uuid)nullable

The income account; the business’s sales account when left out.

lines[].​discountobject (SalesLineDiscount)nullable
lines[].​discount.​kindrequiredstring (SalesDiscountKind)

One of: percent, amount

lines[].​discount.​bpsinteger

percent: basis points (1000 = 10%).

lines[].​discount.​penceinteger

amount: pence off the line.

lines[].​unitCodestringnullable

UN/ECE Recommendation 20 unit code.

example "DAY"

lines[].​cisLabourboolean

CIS: labour (the deduction is worked on labour only).

issueDatestring (date)

example "2026-03-31"

Responses

201 Created, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Cancel an issued invoice

POST/api/v1/books/invoices/{id}/void

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

Issues a credit note for the whole invoice, so its number stays used and the books balance. 409 if anything has been paid or credited already (use a credit note instead). Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/void
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 (VoidInvoiceRequest).

Request body for POST /api/v1/books/invoices/{id}/void
FieldTypeDescription
reasonrequiredstring

up to 300 characters

issueDatestring (date)

example "2026-03-31"

Responses

200 OK, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Record a payment received

POST/api/v1/books/invoices/{id}/payments

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

Posts it to the books (into the bank or cash account given, out of money owed to you). No more than is still owed; not dated in the future. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/payments
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 (RecordSalesPayment).

Request body for POST /api/v1/books/invoices/{id}/payments
FieldTypeDescription
paidOnrequiredstring (date)

example "2026-03-31"

amountPencerequiredinteger

Integer pence (GBP).

at least 1

methodstring (SalesPaymentMethod)

One of: bank_transfer, card, cash, cheque, other

accountIdrequiredstring (uuid)

The bank or cash account the money went into.

referencestringnullable

Responses

201 Created, application/json

Body: object (SalesDocumentDetail).

The fields are as shown above.

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

Get the PDF

GET/api/v1/books/invoices/{id}/pdf

Scopes
books:read

As the customer receives it, with the business’s logo and colour. A draft is marked DRAFT. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/invoices/{id}/pdf
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/pdf

The PDF

Body: string (binary).

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

Email an issued invoice or credit note

POST/api/v1/books/invoices/{id}/send

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

To the customer (or the address given), with the PDF attached, from Tolvi in the business’s name; replies go to the business. Only a person at the business, signed in: never an accountant in the books, an API client or an assistant. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/invoices/{id}/send
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Optional. application/json: object (SendSalesDocument).

Request body for POST /api/v1/books/invoices/{id}/send
FieldTypeDescription
tostring

Defaults to the customer’s email.

subjectstring

The email’s subject. Defaults to "Invoice INV-0001 from <business>" (or "Credit note …").

up to 200 characters

messagestringnullable

up to 2000 characters

Responses

200 OK, application/json

Body: object (SalesDocumentDetail).

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 payment reminders

GET/api/v1/books/reminders

Scopes
books:read

Drafted by Tolvi for overdue (or nearly due) invoices; nothing is sent until a person at the business approves 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/reminders
NameInTypeDescription
invoiceIdquerystring (uuid)
statusquerystring

One of: to_approve, sent, dismissed, all

Responses

200 OK, application/json

Body: object (SalesReminderList).

200 OK response for GET /api/v1/books/reminders
FieldTypeDescription
itemsrequiredarray of SalesReminder
items[].​idrequiredstring (uuid)
items[].​invoiceIdrequiredstring (uuid)
items[].​invoiceNumberrequiredstring
items[].​customerNamerequiredstring
items[].​customerEmailrequiredstringnullable
items[].​tonerequiredstring (ReminderTone)

One of: friendly, firm, final

items[].​daysOverduerequiredinteger

Negative before the due date.

items[].​outstandingPencerequiredinteger

Integer pence (GBP).

items[].​compensationPencerequiredinteger

Integer pence (GBP).

Fixed late payment compensation the owner may add (Late Payment of Commercial Debts (Interest) Act 1998 s5A); not added unless they choose to.

items[].​subjectrequiredstring
items[].​bodyrequiredstring
items[].​statusrequiredstring (ReminderStatus)

One of: to_approve, sent, dismissed

items[].​draftedOnrequiredstring (date)

example "2026-03-31"

items[].​sentAtrequiredstring (date-time)nullable
items[].​sentTorequiredstringnullable

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

Edit a reminder before sending it

PATCH/api/v1/books/reminders/{id}

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

A person at the business, signed in. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Request body

Required. application/json: object (UpdateSalesReminder).

Request body for PATCH /api/v1/books/reminders/{id}
FieldTypeDescription
subjectrequiredstring

up to 200 characters

bodyrequiredstring

up to 5000 characters

Responses

200 OK, application/json

Body: object (SalesReminder).

A reminder drafted for an overdue (or nearly due) invoice. It goes only when a person at the business presses Send.

200 OK response for PATCH /api/v1/books/reminders/{id}
FieldTypeDescription
idrequiredstring (uuid)
invoiceIdrequiredstring (uuid)
invoiceNumberrequiredstring
customerNamerequiredstring
customerEmailrequiredstringnullable
tonerequiredstring (ReminderTone)

One of: friendly, firm, final

daysOverduerequiredinteger

Negative before the due date.

outstandingPencerequiredinteger

Integer pence (GBP).

compensationPencerequiredinteger

Integer pence (GBP).

Fixed late payment compensation the owner may add (Late Payment of Commercial Debts (Interest) Act 1998 s5A); not added unless they choose to.

subjectrequiredstring
bodyrequiredstring
statusrequiredstring (ReminderStatus)

One of: to_approve, sent, dismissed

draftedOnrequiredstring (date)

example "2026-03-31"

sentAtrequiredstring (date-time)nullable
sentTorequiredstringnullable

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

Approve and send a reminder

POST/api/v1/books/reminders/{id}/send

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

Emails it to the customer as it stands. Only a person at the business, signed in; 409 if the invoice has been paid. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/reminders/{id}/send
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesReminder).

A reminder drafted for an overdue (or nearly due) invoice. It goes only when a person at the business presses Send.

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

Dismiss a reminder

POST/api/v1/books/reminders/{id}/dismiss

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

Not sent. The schedule moves on to the next step. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/reminders/{id}/dismiss
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesReminder).

A reminder drafted for an overdue (or nearly due) invoice. It goes only when a person at the business presses Send.

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 repeating invoices

GET/api/v1/books/recurring-invoices

Scopes
books:read

By default those still running or paused. invoiceId finds the one an invoice was set up from, or made by. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/recurring-invoices
NameInTypeDescription
customerIdquerystring (uuid)
invoiceIdquerystring (uuid)
statusquerystring

One of: current, active, paused, stopped, all

Responses

200 OK, application/json

Body: object (SalesRecurringInvoiceList).

200 OK response for GET /api/v1/books/recurring-invoices
FieldTypeDescription
itemsrequiredarray of SalesRecurringInvoice
items[].​idrequiredstring (uuid)
items[].​customerIdrequiredstring (uuid)
items[].​customerNamerequiredstring
items[].​customerEmailrequiredstringnullable
items[].​sourceDocumentIdrequiredstring (uuid)nullable

The invoice it was set up from.

items[].​frequencyrequiredstring (SalesRepeatFrequency)

One of: weekly, monthly, quarterly, yearly

items[].​frequencyTextrequiredstring

example "every month"

items[].​statusrequiredstring (SalesRepeatStatus)

active: makes one on nextOn. paused: makes none until resumed. stopped: for good.

One of: active, paused, stopped

items[].​nextOnrequiredstring (date)nullable

The next date one is made. Null when paused or stopped.

example "2026-03-31"

items[].​firstOnrequiredstring (date)

example "2026-03-31"

items[].​autoSendrequiredboolean

false (the default): each one is a draft for the owner to check. true: issued and emailed on the day, in the name of the person who turned it on.

items[].​autoSendAtrequiredstring (date-time)nullable
items[].​amountPencerequiredinteger

What each one bills, with VAT, in pence.

items[].​summaryrequiredstring

The first line’s description, to recognise it by.

items[].​lineCountrequiredinteger
items[].​runCountrequiredinteger
items[].​lastRunOnrequiredstring (date)nullable

example "2026-03-31"

items[].​lastDocumentIdrequiredstring (uuid)nullable

The last invoice made.

items[].​lastProblemrequiredstringnullable

What went wrong on the last run, in plain words.

items[].​createdAtrequiredstring (date-time)

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

Repeat an invoice

POST/api/v1/books/recurring-invoices

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

Copies the invoice’s customer, lines, note and terms. On each date Tolvi makes a new draft for the owner to check: nothing is numbered, posted or sent. 409 if the invoice already repeats. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/recurring-invoices
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 (SalesRecurringInvoiceInput).

Request body for POST /api/v1/books/recurring-invoices
FieldTypeDescription
invoiceIdrequiredstring (uuid)

The invoice to repeat: its customer, lines, note and terms are copied.

frequencyrequiredstring (SalesRepeatFrequency)

One of: weekly, monthly, quarterly, yearly

firstOnrequiredstring (date)

The first date to make one. Today or later.

example "2026-03-31"

Responses

201 Created, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

201 Created response for POST /api/v1/books/recurring-invoices
FieldTypeDescription
idrequiredstring (uuid)
customerIdrequiredstring (uuid)
customerNamerequiredstring
customerEmailrequiredstringnullable
sourceDocumentIdrequiredstring (uuid)nullable

The invoice it was set up from.

frequencyrequiredstring (SalesRepeatFrequency)

One of: weekly, monthly, quarterly, yearly

frequencyTextrequiredstring

example "every month"

statusrequiredstring (SalesRepeatStatus)

active: makes one on nextOn. paused: makes none until resumed. stopped: for good.

One of: active, paused, stopped

nextOnrequiredstring (date)nullable

The next date one is made. Null when paused or stopped.

example "2026-03-31"

firstOnrequiredstring (date)

example "2026-03-31"

autoSendrequiredboolean

false (the default): each one is a draft for the owner to check. true: issued and emailed on the day, in the name of the person who turned it on.

autoSendAtrequiredstring (date-time)nullable
amountPencerequiredinteger

What each one bills, with VAT, in pence.

summaryrequiredstring

The first line’s description, to recognise it by.

lineCountrequiredinteger
runCountrequiredinteger
lastRunOnrequiredstring (date)nullable

example "2026-03-31"

lastDocumentIdrequiredstring (uuid)nullable

The last invoice made.

lastProblemrequiredstringnullable

What went wrong on the last run, in plain words.

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 repeating invoice

GET/api/v1/books/recurring-invoices/{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/recurring-invoices/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

The fields are as shown above.

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

Change a repeating invoice

PATCH/api/v1/books/recurring-invoices/{id}

Scopes
books:write

How often, the next date (later dates follow from it), or what it bills, copied from another invoice for the same customer. Invoices already made don’t change. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for PATCH /api/v1/books/recurring-invoices/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (SalesRecurringInvoicePatch).

Request body for PATCH /api/v1/books/recurring-invoices/{id}
FieldTypeDescription
frequencystring (SalesRepeatFrequency)

One of: weekly, monthly, quarterly, yearly

nextOnstring (date)

The next date to make one. Today or later; later dates follow from it.

example "2026-03-31"

fromInvoiceIdstring (uuid)

Bill what this invoice bills from now on: its lines, note and terms (same customer).

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

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

Turn automatic sending on or off

POST/api/v1/books/recurring-invoices/{id}/auto-send

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

On: each invoice is issued and emailed on its date, without anyone checking it, in the name of the person who turned this on. Only a person at the business, signed in: never an accountant in the books, an API client or an assistant. If anything is in the way the invoice stays a draft, and the schedule says why. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/recurring-invoices/{id}/auto-send
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (SalesRecurringAutoSend).

Request body for POST /api/v1/books/recurring-invoices/{id}/auto-send
FieldTypeDescription
onrequiredboolean

true: issue and email each one on the day. false: each one is a draft to check.

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

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

Pause a repeating invoice

POST/api/v1/books/recurring-invoices/{id}/pause

Scopes
books:write

No more are made until it is resumed. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/recurring-invoices/{id}/pause
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

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

Resume a paused repeating invoice

POST/api/v1/books/recurring-invoices/{id}/resume

Scopes
books:write

From its next date on or after today. Dates missed while it was paused aren’t billed. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/recurring-invoices/{id}/resume
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

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

Stop a repeating invoice

POST/api/v1/books/recurring-invoices/{id}/stop

Scopes
books:write

For good. Invoices already made stay as they are. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/recurring-invoices/{id}/stop
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (SalesRecurringInvoice).

A repeating invoice: what it bills, how often, and when the next one is made.

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