Skip to main content

Books: purchases and receipts

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

List receipts

GET/api/v1/books/receipts

Scopes
books:read

Newest first. Filter by the person’s decision: to_review, confirmed, discarded or all. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

1 to 200; default 100

reviewquerystring

One of: to_review, confirmed, discarded, all

Responses

200 OK, application/json

Body: object (ReceiptList).

200 OK response for GET /api/v1/books/receipts
FieldTypeDescription
itemsrequiredarray of Receipt
items[].​idrequiredstring (uuid)
items[].​sourcerequiredstring (ReceiptSource)

One of: camera, upload, email

items[].​fileNamerequiredstring
items[].​contentTyperequiredstring
items[].​sizeBytesrequiredinteger
items[].​statusrequiredstring (ReceiptFileStatus)

pending_upload, pending_scan (being checked for viruses), available, or rejected (with the reason).

One of: pending_upload, pending_scan, available, rejected

items[].​rejectedReasonrequiredstringnullable
items[].​readingStatusrequiredstring (ReceiptReadingStatus)

waiting (until the virus check passes), queued, reading, done or failed.

One of: waiting, queued, reading, done, failed

items[].​readingErrorrequiredstringnullable

Why reading failed, in plain English.

items[].​readingrequiredobject (ReceiptReading)nullable

What Tolvi AI read from the receipt: a suggestion for the person to confirm or correct. Money in integer pence.

items[].​reading.​documentTyperequiredstring (ReceiptDocumentType)

One of: till_receipt, simplified_vat_invoice, vat_invoice, order_confirmation, statement, not_a_receipt, other

items[].​reading.​supplierNamerequiredstringnullable
items[].​reading.​supplierVatNumberrequiredstringnullable

As printed on the receipt.

items[].​reading.​documentNumberrequiredstringnullable
items[].​reading.​daterequiredstring (date)nullable

example "2026-03-31"

items[].​reading.​currencyrequiredstringnullable

example "GBP"

items[].​reading.​totalPencerequiredintegernullable

Integer pence (GBP).

items[].​reading.​netPencerequiredintegernullable

Integer pence (GBP).

items[].​reading.​vatPencerequiredintegernullable

Integer pence (GBP).

items[].​reading.​vatBreakdownrequiredarray of ReceiptVatRow
items[].​reading.​vatBreakdown[].​rateBpsrequiredinteger

VAT rate in basis points (2000 = 20%).

items[].​reading.​vatBreakdown[].​netPencerequiredintegernullable

Integer pence (GBP).

items[].​reading.​vatBreakdown[].​vatPencerequiredinteger

Integer pence (GBP).

items[].​reading.​lineItemsrequiredarray of ReceiptLineItem
items[].​reading.​lineItems[].​descriptionrequiredstring
items[].​reading.​lineItems[].​quantityrequiredstringnullable
items[].​reading.​lineItems[].​amountPencerequiredinteger

Integer pence (GBP).

items[].​reading.​lineItems[].​vatRateBpsrequiredintegernullable
items[].​reading.​lineItems[].​vatPenceintegernullable

Integer pence (GBP).

The VAT shown on this line. Absent on a reading from before lines were captured.

items[].​reading.​lineItems[].​accountCodestringnullable

The category Tolvi AI suggests, from the chart of accounts.

items[].​reading.​lineItems[].​confidenceinteger

How sure Tolvi AI is of this line, from 0 to 100.

0 to 100

items[].​reading.​lineItems[].​reasonstringnullable

Why it is unsure, when it is; otherwise empty.

items[].​reading.​moreLinesboolean

The document has more lines than Tolvi AI kept.

items[].​reading.​paymentMethodrequiredstring (ReceiptPaymentMethod)

One of: card, cash, bank_transfer, direct_debit, other, unknown

items[].​reading.​cardLast4requiredstringnullable

The last four digits of the card only.

items[].​reading.​fieldsrequiredobject (ReceiptFieldNotes)
items[].​reading.​fields.​supplierNamerequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

items[].​reading.​fields.​supplierName.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

items[].​reading.​fields.​supplierName.​reasonrequiredstring
items[].​reading.​fields.​supplierName.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

items[].​reading.​fields.​daterequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

items[].​reading.​fields.​date.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

items[].​reading.​fields.​date.​reasonrequiredstring
items[].​reading.​fields.​date.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

items[].​reading.​fields.​totalrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

items[].​reading.​fields.​total.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

items[].​reading.​fields.​total.​reasonrequiredstring
items[].​reading.​fields.​total.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

items[].​reading.​fields.​vatrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

items[].​reading.​fields.​vat.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

items[].​reading.​fields.​vat.​reasonrequiredstring
items[].​reading.​fields.​vat.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

items[].​reading.​fields.​vatNumberrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

items[].​reading.​fields.​vatNumber.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

items[].​reading.​fields.​vatNumber.​reasonrequiredstring
items[].​reading.​fields.​vatNumber.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

items[].​reading.​notesrequiredstring
items[].​reading.​modelrequiredstring

The model that read it.

items[].​reading.​promptVersionrequiredstring

example "extract_receipt@1"

items[].​reading.​readAtrequiredstring (date-time)
items[].​suggestedLinesrequiredarray of ReceiptSuggestedLine
items[].​suggestedLines[].​descriptionrequiredstring
items[].​suggestedLines[].​accountCoderequiredstringnullable

The suggested category, from the chart of accounts.

items[].​suggestedLines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

items[].​suggestedLines[].​vatPencerequiredinteger

Integer pence (GBP).

The VAT in that cost.

items[].​suggestedLines[].​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[].​suggestedLines[].​checkThisrequiredboolean

Tolvi AI was barely sure of this line: highlight it for the person to check. It never stops them.

items[].​suggestedLines[].​checkReasonrequiredstringnullable
items[].​checksrequiredobject (ReceiptChecks)nullable
items[].​checks.​ofrequiredstring (ReceiptChecksOf)

Whether these checks are on what Tolvi AI read or on what the person confirmed.

One of: reading, confirmed

items[].​checks.​problemsrequiredarray of ReceiptProblem
items[].​checks.​problems[].​coderequiredstring

example "no_vat_number"

items[].​checks.​problems[].​severityrequiredstring (ReceiptProblemSeverity)

One of: warning, info

items[].​checks.​problems[].​fieldrequiredstringnullable

example "vatNumber"

items[].​checks.​problems[].​messagerequiredstring
items[].​checks.​problems[].​sourcerequiredstringnullable

The rule behind it.

items[].​checks.​vatClaimablerequiredboolean

Whether the VAT on it can be reclaimed: the business is VAT registered and the receipt shows VAT and a valid UK VAT number.

items[].​checks.​suggestedVatCoderequiredstring (VatCode)nullable

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[].​checks.​vatNumberrequiredstringnullable

The VAT number without GB, when it passes the check digits.

items[].​duplicateOfIdrequiredstring (uuid)nullable

An earlier receipt this looks like a copy of.

items[].​matchesrequiredarray of ReceiptMatch
items[].​matches[].​bankLineIdrequiredstring (uuid)
items[].​matches[].​bankAccountIdrequiredstring (uuid)
items[].​matches[].​bookedAtrequiredstring (date)

example "2026-03-31"

items[].​matches[].​amountPencerequiredinteger

Integer pence (GBP).

As on the bank line: money out is negative.

items[].​matches[].​descriptionrequiredstring
items[].​matches[].​scorerequiredinteger

0 to 100

items[].​matches[].​bandrequiredstring (ReceiptMatchBand)

One of: high, medium, low

items[].​matches[].​summaryrequiredstring
items[].​matches[].​reasonsrequiredarray of string
items[].​reviewStatusrequiredstring (ReceiptReviewStatus)

One of: to_review, confirmed, discarded

items[].​confirmedrequiredobject (ReceiptConfirmed)nullable

What the person confirmed. Money in integer pence.

items[].​confirmed.​supplierNamerequiredstring
items[].​confirmed.​supplierVatNumberrequiredstringnullable
items[].​confirmed.​daterequiredstring (date)

example "2026-03-31"

items[].​confirmed.​currencyrequiredstring

example "GBP"

items[].​confirmed.​totalPencerequiredinteger

Integer pence (GBP).

items[].​confirmed.​netPencerequiredintegernullable

Integer pence (GBP).

items[].​confirmed.​vatPencerequiredintegernullable

Integer pence (GBP).

items[].​confirmed.​vatCoderequiredstring (VatCode)nullable

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[].​confirmed.​accountCoderequiredstringnullable
items[].​confirmed.​paymentMethodrequiredstring (ReceiptPaymentMethod)nullable

One of: card, cash, bank_transfer, direct_debit, other, unknown

items[].​confirmed.​cardLast4requiredstringnullable
items[].​confirmed.​paidPersonallyrequiredboolean
items[].​confirmed.​bankLineIdrequiredstring (uuid)nullable
items[].​confirmed.​noterequiredstringnullable
items[].​confirmed.​correctedFieldsrequiredarray of string

Fields the person changed from what Tolvi AI read; line1.category is the first line’s category.

items[].​confirmed.​linesrequiredarray of ReceiptConfirmedLine

The lines it went into the books as. Empty when it was confirmed as one amount.

items[].​confirmed.​lines[].​descriptionrequiredstring
items[].​confirmed.​lines[].​accountCoderequiredstringnullable
items[].​confirmed.​lines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

items[].​confirmed.​lines[].​vatPencerequiredinteger

Integer pence (GBP).

items[].​confirmed.​confirmedByrequiredstring (uuid)nullable
items[].​confirmed.​confirmedAtrequiredstring (date-time)
items[].​postingStatusrequiredstring (ReceiptPostingStatus)

none, proposed (confirmed; waiting for the books), or posted.

One of: none, proposed, posted

items[].​postingProposalrequiredobjectnullable

What confirming proposes for the books (version 1, or version 2 with lines).

items[].​ledgerEntryIdrequiredstring (uuid)nullable
items[].​emailFromrequiredstringnullable

For an emailed receipt: who sent it.

items[].​emailSubjectrequiredstringnullable
items[].​previewablerequiredboolean

Whether a browser can show the image (a HEIC photo has a JPEG preview once read).

items[].​uploadedByrequiredstring (uuid)nullable
items[].​capturedAtrequiredstring (date-time)nullable
items[].​createdAtrequiredstring (date-time)
items[].​updatedAtrequiredstring (date-time)
toReviewrequiredinteger

Receipts waiting for the person to check.

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

Add a receipt

POST/api/v1/books/receipts

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

Records a photo or file of a receipt (JPEG, PNG, WebP, HEIC or PDF, up to 20 MB) and returns a short-lived presigned URL to PUT it to storage with exactly the headers given; then call upload-complete. Send the app’s own clientReference for a capture so sending it again (an offline retry) returns the same receipt. Needs a person, not an API client. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Register a photo or file of a receipt before uploading it.

Request body for POST /api/v1/books/receipts
FieldTypeDescription
fileNamerequiredstring

up to 200 characters; example "IMG_2041.HEIC"

contentTypestring

The type the browser reports; the file name’s extension decides.

example "image/heic"

sizeBytesrequiredinteger

1 to 20971520

sourcestring (ReceiptCaptureSource)

One of: camera, upload

clientReferencestring (uuid)

The app’s own id for this capture: sending it again returns the same receipt (offline retries).

capturedAtstring (date-time)

Responses

201 Created, application/json

Body: object (ReceiptUpload).

201 Created response for POST /api/v1/books/receipts
FieldTypeDescription
receiptrequiredobject (Receipt)

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

receipt.​idrequiredstring (uuid)
receipt.​sourcerequiredstring (ReceiptSource)

One of: camera, upload, email

receipt.​fileNamerequiredstring
receipt.​contentTyperequiredstring
receipt.​sizeBytesrequiredinteger
receipt.​statusrequiredstring (ReceiptFileStatus)

pending_upload, pending_scan (being checked for viruses), available, or rejected (with the reason).

One of: pending_upload, pending_scan, available, rejected

receipt.​rejectedReasonrequiredstringnullable
receipt.​readingStatusrequiredstring (ReceiptReadingStatus)

waiting (until the virus check passes), queued, reading, done or failed.

One of: waiting, queued, reading, done, failed

receipt.​readingErrorrequiredstringnullable

Why reading failed, in plain English.

receipt.​readingrequiredobject (ReceiptReading)nullable

What Tolvi AI read from the receipt: a suggestion for the person to confirm or correct. Money in integer pence.

receipt.​reading.​documentTyperequiredstring (ReceiptDocumentType)

One of: till_receipt, simplified_vat_invoice, vat_invoice, order_confirmation, statement, not_a_receipt, other

receipt.​reading.​supplierNamerequiredstringnullable
receipt.​reading.​supplierVatNumberrequiredstringnullable

As printed on the receipt.

receipt.​reading.​documentNumberrequiredstringnullable
receipt.​reading.​daterequiredstring (date)nullable

example "2026-03-31"

receipt.​reading.​currencyrequiredstringnullable

example "GBP"

receipt.​reading.​totalPencerequiredintegernullable

Integer pence (GBP).

receipt.​reading.​netPencerequiredintegernullable

Integer pence (GBP).

receipt.​reading.​vatPencerequiredintegernullable

Integer pence (GBP).

receipt.​reading.​vatBreakdownrequiredarray of ReceiptVatRow
receipt.​reading.​vatBreakdown[].​rateBpsrequiredinteger

VAT rate in basis points (2000 = 20%).

receipt.​reading.​vatBreakdown[].​netPencerequiredintegernullable

Integer pence (GBP).

receipt.​reading.​vatBreakdown[].​vatPencerequiredinteger

Integer pence (GBP).

receipt.​reading.​lineItemsrequiredarray of ReceiptLineItem
receipt.​reading.​lineItems[].​descriptionrequiredstring
receipt.​reading.​lineItems[].​quantityrequiredstringnullable
receipt.​reading.​lineItems[].​amountPencerequiredinteger

Integer pence (GBP).

receipt.​reading.​lineItems[].​vatRateBpsrequiredintegernullable
receipt.​reading.​lineItems[].​vatPenceintegernullable

Integer pence (GBP).

The VAT shown on this line. Absent on a reading from before lines were captured.

receipt.​reading.​lineItems[].​accountCodestringnullable

The category Tolvi AI suggests, from the chart of accounts.

receipt.​reading.​lineItems[].​confidenceinteger

How sure Tolvi AI is of this line, from 0 to 100.

0 to 100

receipt.​reading.​lineItems[].​reasonstringnullable

Why it is unsure, when it is; otherwise empty.

receipt.​reading.​moreLinesboolean

The document has more lines than Tolvi AI kept.

receipt.​reading.​paymentMethodrequiredstring (ReceiptPaymentMethod)

One of: card, cash, bank_transfer, direct_debit, other, unknown

receipt.​reading.​cardLast4requiredstringnullable

The last four digits of the card only.

receipt.​reading.​fieldsrequiredobject (ReceiptFieldNotes)
receipt.​reading.​fields.​supplierNamerequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

receipt.​reading.​fields.​supplierName.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

receipt.​reading.​fields.​supplierName.​reasonrequiredstring
receipt.​reading.​fields.​supplierName.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

receipt.​reading.​fields.​daterequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

receipt.​reading.​fields.​date.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

receipt.​reading.​fields.​date.​reasonrequiredstring
receipt.​reading.​fields.​date.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

receipt.​reading.​fields.​totalrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

receipt.​reading.​fields.​total.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

receipt.​reading.​fields.​total.​reasonrequiredstring
receipt.​reading.​fields.​total.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

receipt.​reading.​fields.​vatrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

receipt.​reading.​fields.​vat.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

receipt.​reading.​fields.​vat.​reasonrequiredstring
receipt.​reading.​fields.​vat.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

receipt.​reading.​fields.​vatNumberrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

receipt.​reading.​fields.​vatNumber.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

receipt.​reading.​fields.​vatNumber.​reasonrequiredstring
receipt.​reading.​fields.​vatNumber.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

receipt.​reading.​notesrequiredstring
receipt.​reading.​modelrequiredstring

The model that read it.

receipt.​reading.​promptVersionrequiredstring

example "extract_receipt@1"

receipt.​reading.​readAtrequiredstring (date-time)
receipt.​suggestedLinesrequiredarray of ReceiptSuggestedLine
receipt.​suggestedLines[].​descriptionrequiredstring
receipt.​suggestedLines[].​accountCoderequiredstringnullable

The suggested category, from the chart of accounts.

receipt.​suggestedLines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

receipt.​suggestedLines[].​vatPencerequiredinteger

Integer pence (GBP).

The VAT in that cost.

receipt.​suggestedLines[].​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

receipt.​suggestedLines[].​checkThisrequiredboolean

Tolvi AI was barely sure of this line: highlight it for the person to check. It never stops them.

receipt.​suggestedLines[].​checkReasonrequiredstringnullable
receipt.​checksrequiredobject (ReceiptChecks)nullable
receipt.​checks.​ofrequiredstring (ReceiptChecksOf)

Whether these checks are on what Tolvi AI read or on what the person confirmed.

One of: reading, confirmed

receipt.​checks.​problemsrequiredarray of ReceiptProblem
receipt.​checks.​problems[].​coderequiredstring

example "no_vat_number"

receipt.​checks.​problems[].​severityrequiredstring (ReceiptProblemSeverity)

One of: warning, info

receipt.​checks.​problems[].​fieldrequiredstringnullable

example "vatNumber"

receipt.​checks.​problems[].​messagerequiredstring
receipt.​checks.​problems[].​sourcerequiredstringnullable

The rule behind it.

receipt.​checks.​vatClaimablerequiredboolean

Whether the VAT on it can be reclaimed: the business is VAT registered and the receipt shows VAT and a valid UK VAT number.

receipt.​checks.​suggestedVatCoderequiredstring (VatCode)nullable

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

receipt.​checks.​vatNumberrequiredstringnullable

The VAT number without GB, when it passes the check digits.

receipt.​duplicateOfIdrequiredstring (uuid)nullable

An earlier receipt this looks like a copy of.

receipt.​matchesrequiredarray of ReceiptMatch
receipt.​matches[].​bankLineIdrequiredstring (uuid)
receipt.​matches[].​bankAccountIdrequiredstring (uuid)
receipt.​matches[].​bookedAtrequiredstring (date)

example "2026-03-31"

receipt.​matches[].​amountPencerequiredinteger

Integer pence (GBP).

As on the bank line: money out is negative.

receipt.​matches[].​descriptionrequiredstring
receipt.​matches[].​scorerequiredinteger

0 to 100

receipt.​matches[].​bandrequiredstring (ReceiptMatchBand)

One of: high, medium, low

receipt.​matches[].​summaryrequiredstring
receipt.​matches[].​reasonsrequiredarray of string
receipt.​reviewStatusrequiredstring (ReceiptReviewStatus)

One of: to_review, confirmed, discarded

receipt.​confirmedrequiredobject (ReceiptConfirmed)nullable

What the person confirmed. Money in integer pence.

receipt.​confirmed.​supplierNamerequiredstring
receipt.​confirmed.​supplierVatNumberrequiredstringnullable
receipt.​confirmed.​daterequiredstring (date)

example "2026-03-31"

receipt.​confirmed.​currencyrequiredstring

example "GBP"

receipt.​confirmed.​totalPencerequiredinteger

Integer pence (GBP).

receipt.​confirmed.​netPencerequiredintegernullable

Integer pence (GBP).

receipt.​confirmed.​vatPencerequiredintegernullable

Integer pence (GBP).

receipt.​confirmed.​vatCoderequiredstring (VatCode)nullable

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

receipt.​confirmed.​accountCoderequiredstringnullable
receipt.​confirmed.​paymentMethodrequiredstring (ReceiptPaymentMethod)nullable

One of: card, cash, bank_transfer, direct_debit, other, unknown

receipt.​confirmed.​cardLast4requiredstringnullable
receipt.​confirmed.​paidPersonallyrequiredboolean
receipt.​confirmed.​bankLineIdrequiredstring (uuid)nullable
receipt.​confirmed.​noterequiredstringnullable
receipt.​confirmed.​correctedFieldsrequiredarray of string

Fields the person changed from what Tolvi AI read; line1.category is the first line’s category.

receipt.​confirmed.​linesrequiredarray of ReceiptConfirmedLine

The lines it went into the books as. Empty when it was confirmed as one amount.

receipt.​confirmed.​lines[].​descriptionrequiredstring
receipt.​confirmed.​lines[].​accountCoderequiredstringnullable
receipt.​confirmed.​lines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

receipt.​confirmed.​lines[].​vatPencerequiredinteger

Integer pence (GBP).

receipt.​confirmed.​confirmedByrequiredstring (uuid)nullable
receipt.​confirmed.​confirmedAtrequiredstring (date-time)
receipt.​postingStatusrequiredstring (ReceiptPostingStatus)

none, proposed (confirmed; waiting for the books), or posted.

One of: none, proposed, posted

receipt.​postingProposalrequiredobjectnullable

What confirming proposes for the books (version 1, or version 2 with lines).

receipt.​ledgerEntryIdrequiredstring (uuid)nullable
receipt.​emailFromrequiredstringnullable

For an emailed receipt: who sent it.

receipt.​emailSubjectrequiredstringnullable
receipt.​previewablerequiredboolean

Whether a browser can show the image (a HEIC photo has a JPEG preview once read).

receipt.​uploadedByrequiredstring (uuid)nullable
receipt.​capturedAtrequiredstring (date-time)nullable
receipt.​createdAtrequiredstring (date-time)
receipt.​updatedAtrequiredstring (date-time)
uploadrequiredobject (PresignedUpload)nullable

PUT the file here with exactly these headers, then call upload-complete. Null when the file has already been uploaded.

upload.​urlrequiredstring (uri)
upload.​methodrequiredstring (PresignedMethod)

One of: PUT, GET

upload.​headersrequiredobject

Headers to send with the request.

upload.​expiresAtrequiredstring (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 the address for emailing receipts in

GET/api/v1/books/receipts/email-address

Scopes
books:read

Null until one is created. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (ReceiptEmailAddress).

Where to email receipts in. Anything sent here is read as a receipt for this business.

200 OK response for GET /api/v1/books/receipts/email-address
FieldTypeDescription
addressrequiredstring (email)nullable

example "k3v9x2m8q4p7w1z6@receipts.tolvi.co.uk"

createdAtrequiredstring (date-time)nullable

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

Create or replace the address for emailing receipts in

POST/api/v1/books/receipts/email-address

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

Anything emailed to it is read as a receipt for this business. Replacing it stops the old address working at once. The business’s owners and admins, signed in. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (ReceiptEmailAddress).

Where to email receipts in. Anything sent here is read as a receipt for this business.

200 OK response for POST /api/v1/books/receipts/email-address
FieldTypeDescription
addressrequiredstring (email)nullable

example "k3v9x2m8q4p7w1z6@receipts.tolvi.co.uk"

createdAtrequiredstring (date-time)nullable

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

Get a receipt

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

Scopes
books:read

The file’s state, what Tolvi AI read (with how sure it is), the checks, possible bank payments and what was confirmed. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (Receipt).

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

200 OK response for GET /api/v1/books/receipts/{id}
FieldTypeDescription
idrequiredstring (uuid)
sourcerequiredstring (ReceiptSource)

One of: camera, upload, email

fileNamerequiredstring
contentTyperequiredstring
sizeBytesrequiredinteger
statusrequiredstring (ReceiptFileStatus)

pending_upload, pending_scan (being checked for viruses), available, or rejected (with the reason).

One of: pending_upload, pending_scan, available, rejected

rejectedReasonrequiredstringnullable
readingStatusrequiredstring (ReceiptReadingStatus)

waiting (until the virus check passes), queued, reading, done or failed.

One of: waiting, queued, reading, done, failed

readingErrorrequiredstringnullable

Why reading failed, in plain English.

readingrequiredobject (ReceiptReading)nullable

What Tolvi AI read from the receipt: a suggestion for the person to confirm or correct. Money in integer pence.

reading.​documentTyperequiredstring (ReceiptDocumentType)

One of: till_receipt, simplified_vat_invoice, vat_invoice, order_confirmation, statement, not_a_receipt, other

reading.​supplierNamerequiredstringnullable
reading.​supplierVatNumberrequiredstringnullable

As printed on the receipt.

reading.​documentNumberrequiredstringnullable
reading.​daterequiredstring (date)nullable

example "2026-03-31"

reading.​currencyrequiredstringnullable

example "GBP"

reading.​totalPencerequiredintegernullable

Integer pence (GBP).

reading.​netPencerequiredintegernullable

Integer pence (GBP).

reading.​vatPencerequiredintegernullable

Integer pence (GBP).

reading.​vatBreakdownrequiredarray of ReceiptVatRow
reading.​vatBreakdown[].​rateBpsrequiredinteger

VAT rate in basis points (2000 = 20%).

reading.​vatBreakdown[].​netPencerequiredintegernullable

Integer pence (GBP).

reading.​vatBreakdown[].​vatPencerequiredinteger

Integer pence (GBP).

reading.​lineItemsrequiredarray of ReceiptLineItem
reading.​lineItems[].​descriptionrequiredstring
reading.​lineItems[].​quantityrequiredstringnullable
reading.​lineItems[].​amountPencerequiredinteger

Integer pence (GBP).

reading.​lineItems[].​vatRateBpsrequiredintegernullable
reading.​lineItems[].​vatPenceintegernullable

Integer pence (GBP).

The VAT shown on this line. Absent on a reading from before lines were captured.

reading.​lineItems[].​accountCodestringnullable

The category Tolvi AI suggests, from the chart of accounts.

reading.​lineItems[].​confidenceinteger

How sure Tolvi AI is of this line, from 0 to 100.

0 to 100

reading.​lineItems[].​reasonstringnullable

Why it is unsure, when it is; otherwise empty.

reading.​moreLinesboolean

The document has more lines than Tolvi AI kept.

reading.​paymentMethodrequiredstring (ReceiptPaymentMethod)

One of: card, cash, bank_transfer, direct_debit, other, unknown

reading.​cardLast4requiredstringnullable

The last four digits of the card only.

reading.​fieldsrequiredobject (ReceiptFieldNotes)
reading.​fields.​supplierNamerequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

reading.​fields.​supplierName.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

reading.​fields.​supplierName.​reasonrequiredstring
reading.​fields.​supplierName.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

reading.​fields.​daterequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

reading.​fields.​date.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

reading.​fields.​date.​reasonrequiredstring
reading.​fields.​date.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

reading.​fields.​totalrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

reading.​fields.​total.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

reading.​fields.​total.​reasonrequiredstring
reading.​fields.​total.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

reading.​fields.​vatrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

reading.​fields.​vat.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

reading.​fields.​vat.​reasonrequiredstring
reading.​fields.​vat.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

reading.​fields.​vatNumberrequiredobject (ReceiptFieldNote)

How sure Tolvi AI is of one field, and why.

reading.​fields.​vatNumber.​confidencerequiredstring (ReceiptConfidence)

One of: high, medium, low

reading.​fields.​vatNumber.​reasonrequiredstring
reading.​fields.​vatNumber.​alternativerequiredstringnullable

Another reading worth checking, e.g. "£36.20".

reading.​notesrequiredstring
reading.​modelrequiredstring

The model that read it.

reading.​promptVersionrequiredstring

example "extract_receipt@1"

reading.​readAtrequiredstring (date-time)
suggestedLinesrequiredarray of ReceiptSuggestedLine
suggestedLines[].​descriptionrequiredstring
suggestedLines[].​accountCoderequiredstringnullable

The suggested category, from the chart of accounts.

suggestedLines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

suggestedLines[].​vatPencerequiredinteger

Integer pence (GBP).

The VAT in that cost.

suggestedLines[].​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

suggestedLines[].​checkThisrequiredboolean

Tolvi AI was barely sure of this line: highlight it for the person to check. It never stops them.

suggestedLines[].​checkReasonrequiredstringnullable
checksrequiredobject (ReceiptChecks)nullable
checks.​ofrequiredstring (ReceiptChecksOf)

Whether these checks are on what Tolvi AI read or on what the person confirmed.

One of: reading, confirmed

checks.​problemsrequiredarray of ReceiptProblem
checks.​problems[].​coderequiredstring

example "no_vat_number"

checks.​problems[].​severityrequiredstring (ReceiptProblemSeverity)

One of: warning, info

checks.​problems[].​fieldrequiredstringnullable

example "vatNumber"

checks.​problems[].​messagerequiredstring
checks.​problems[].​sourcerequiredstringnullable

The rule behind it.

checks.​vatClaimablerequiredboolean

Whether the VAT on it can be reclaimed: the business is VAT registered and the receipt shows VAT and a valid UK VAT number.

checks.​suggestedVatCoderequiredstring (VatCode)nullable

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

checks.​vatNumberrequiredstringnullable

The VAT number without GB, when it passes the check digits.

duplicateOfIdrequiredstring (uuid)nullable

An earlier receipt this looks like a copy of.

matchesrequiredarray of ReceiptMatch
matches[].​bankLineIdrequiredstring (uuid)
matches[].​bankAccountIdrequiredstring (uuid)
matches[].​bookedAtrequiredstring (date)

example "2026-03-31"

matches[].​amountPencerequiredinteger

Integer pence (GBP).

As on the bank line: money out is negative.

matches[].​descriptionrequiredstring
matches[].​scorerequiredinteger

0 to 100

matches[].​bandrequiredstring (ReceiptMatchBand)

One of: high, medium, low

matches[].​summaryrequiredstring
matches[].​reasonsrequiredarray of string
reviewStatusrequiredstring (ReceiptReviewStatus)

One of: to_review, confirmed, discarded

confirmedrequiredobject (ReceiptConfirmed)nullable

What the person confirmed. Money in integer pence.

confirmed.​supplierNamerequiredstring
confirmed.​supplierVatNumberrequiredstringnullable
confirmed.​daterequiredstring (date)

example "2026-03-31"

confirmed.​currencyrequiredstring

example "GBP"

confirmed.​totalPencerequiredinteger

Integer pence (GBP).

confirmed.​netPencerequiredintegernullable

Integer pence (GBP).

confirmed.​vatPencerequiredintegernullable

Integer pence (GBP).

confirmed.​vatCoderequiredstring (VatCode)nullable

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

confirmed.​accountCoderequiredstringnullable
confirmed.​paymentMethodrequiredstring (ReceiptPaymentMethod)nullable

One of: card, cash, bank_transfer, direct_debit, other, unknown

confirmed.​cardLast4requiredstringnullable
confirmed.​paidPersonallyrequiredboolean
confirmed.​bankLineIdrequiredstring (uuid)nullable
confirmed.​noterequiredstringnullable
confirmed.​correctedFieldsrequiredarray of string

Fields the person changed from what Tolvi AI read; line1.category is the first line’s category.

confirmed.​linesrequiredarray of ReceiptConfirmedLine

The lines it went into the books as. Empty when it was confirmed as one amount.

confirmed.​lines[].​descriptionrequiredstring
confirmed.​lines[].​accountCoderequiredstringnullable
confirmed.​lines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT.

confirmed.​lines[].​vatPencerequiredinteger

Integer pence (GBP).

confirmed.​confirmedByrequiredstring (uuid)nullable
confirmed.​confirmedAtrequiredstring (date-time)
postingStatusrequiredstring (ReceiptPostingStatus)

none, proposed (confirmed; waiting for the books), or posted.

One of: none, proposed, posted

postingProposalrequiredobjectnullable

What confirming proposes for the books (version 1, or version 2 with lines).

ledgerEntryIdrequiredstring (uuid)nullable
emailFromrequiredstringnullable

For an emailed receipt: who sent it.

emailSubjectrequiredstringnullable
previewablerequiredboolean

Whether a browser can show the image (a HEIC photo has a JPEG preview once read).

uploadedByrequiredstring (uuid)nullable
capturedAtrequiredstring (date-time)nullable
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

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

Delete a receipt for good

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

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

Removes a receipt that isn’t in the books, with its files. It can’t be undone. 409, saying why, when it has been confirmed, is in the books, is matched to a bank payment or is attached to a bill: those are accounting records. Signed in people only; recorded in the audit log. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Responses

204 No content

Deleted.

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

Get a short-lived link to a receipt’s image

GET/api/v1/books/receipts/{id}/image

Scopes
books:read

Only once the file has passed the virus check. Recorded in the audit log. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/receipts/{id}/image
NameInTypeDescription
idrequiredpathstring (uuid)
variantquerystring

preview (default): the JPEG made from a HEIC photo when there is one; original: the file as received.

One of: preview, original

Responses

200 OK, application/json

Body: object (ReceiptImage).

A short-lived link to the receipt’s image (or its JPEG preview for a HEIC photo).

200 OK response for GET /api/v1/books/receipts/{id}/image
FieldTypeDescription
urlrequiredstring (uri)
contentTyperequiredstring
expiresAtrequiredstring (date-time)

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

Presign a receipt upload again

POST/api/v1/books/receipts/{id}/upload

Scopes
books:write

A fresh PUT for a receipt still waiting for its file (the first PUT failed or expired). Only the person who added it; 409 once 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/receipts/{id}/upload
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (ReceiptUpload).

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

Finish a receipt upload

POST/api/v1/books/receipts/{id}/upload-complete

Scopes
books:write

Call after the PUT. Checks the stored file’s size, type and contents, records its checksum and starts the virus check. Once it passes, Tolvi AI reads it (readingStatus). 422 if the file is refused or malware is found. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/receipts/{id}/upload-complete
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Receipt).

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

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

Read a receipt again

POST/api/v1/books/receipts/{id}/read-again

Scopes
books:write

After a reading failed. Only for receipts still to review. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/receipts/{id}/read-again
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Receipt).

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

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

Confirm a receipt

POST/api/v1/books/receipts/{id}/confirm

Scopes
books:write

The person’s figures (what Tolvi AI read, checked or corrected), optionally the bank payment it matches or that it was paid personally. Checks run again on these figures. Confirming records what it means for the books (postingProposal); the ledger posts it. Needs a person, not an API client. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/receipts/{id}/confirm
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (ConfirmReceipt).

The person’s figures. Money in integer pence. Net plus VAT must equal the total.

Request body for POST /api/v1/books/receipts/{id}/confirm
FieldTypeDescription
supplierNamerequiredstring

up to 200 characters

supplierVatNumberstringnullable

up to 20 characters

daterequiredstring (date)

example "2026-03-31"

currencystring

example "GBP"

totalPencerequiredinteger

Integer pence (GBP).

at least 1

poundsPenceintegernullable

Integer pence (GBP).

What a foreign receipt paid with the person’s own money cost in pounds. Required then; ignored otherwise.

at least 1

netPenceintegernullable

Integer pence (GBP).

at least 0

vatPenceintegernullable

Integer pence (GBP).

at least 0

vatCodestring (VatCode)nullable

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

accountCodestringnullable

The account it goes to, from the chart of accounts (or chosen later, when the bank payment is confirmed).

paymentMethodstring (ReceiptPaymentMethod)nullable

One of: card, cash, bank_transfer, direct_debit, other, unknown

cardLast4stringnullable

pattern ^\d{4}$

paidPersonallyboolean

Paid with the owner’s own money: the business owes it back.

bankLineIdstring (uuid)nullable

The bank payment it matches, from matches.

notestringnullable

up to 1000 characters

linesarray of ConfirmReceiptLine

The lines, each with its own category. They must add up to the total. Ignored for a receipt in another currency, where the amount in pounds comes from the bank payment. Left out, the whole amount is one line.

lines[].​descriptionrequiredstring

up to 500 characters

lines[].​accountCodestringnullable

The account this line goes to. Left out, it is chosen when the bank payment is confirmed, or goes to general costs.

lines[].​grossPencerequiredinteger

Integer pence (GBP).

What the line cost, including any VAT. A discount is negative.

lines[].​vatPenceintegernullable

Integer pence (GBP).

The VAT in that cost. Used only when the VAT can be reclaimed.

lines[].​vatCodestring (VatCode)nullable

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

Responses

200 OK, application/json

Body: object (Receipt).

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

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

Discard a receipt

POST/api/v1/books/receipts/{id}/discard

Scopes
books:write

Not a receipt, or a copy of one already added. The file is kept until the receipt is deleted. A confirmed receipt can’t be discarded. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/receipts/{id}/discard
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (Receipt).

A receipt or bill: the file (kept as the record), what Tolvi AI read from it, and what the person confirmed.

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

What the business owes

GET/api/v1/books/purchases/summary

Scopes
books:read

What is owed, overdue and due in the next 7 days as at today, by supplier (most overdue first), with drafts. Part of the books product: the firm must have it and you must have access to it.

Responses

200 OK, application/json

Body: object (BooksPurchasesSummary).

What the business owes as at today.

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

example "2026-03-31"

owedPencerequiredinteger

Integer pence (GBP).

overduePencerequiredinteger

Integer pence (GBP).

dueSoonPencerequiredinteger

Integer pence (GBP).

What falls due in the next 7 days.

unpaidBillsrequiredinteger
overdueBillsrequiredinteger
draftsrequiredinteger
creditorsrequiredarray of BooksPurchasesCreditor
creditors[].​supplierIdrequiredstring (uuid)
creditors[].​supplierNamerequiredstring
creditors[].​owedPencerequiredinteger

Integer pence (GBP).

creditors[].​overduePencerequiredinteger

Integer pence (GBP).

creditors[].​billsrequiredinteger

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

List suppliers

GET/api/v1/books/suppliers

Scopes
books:read

By name, with what is still owed to each. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/suppliers
NameInTypeDescription
qquerystring
archivedquerystring

One of: live, archived, all

Responses

200 OK, application/json

Body: object (BooksSupplierList).

200 OK response for GET /api/v1/books/suppliers
FieldTypeDescription
itemsrequiredarray of BooksSupplier
items[].​idrequiredstring (uuid)
items[].​namerequiredstring
items[].​emailrequiredstringnullable
items[].​addressLinesrequiredarray of string
items[].​postcoderequiredstringnullable
items[].​vatNumberrequiredstringnullable
items[].​paymentTermsDaysrequiredintegernullable

Days to pay; null means 30 days unless a bill gives a due date.

items[].​defaultAccountIdrequiredstring (uuid)nullable

The account used on the last bill, to fill in the next one.

items[].​defaultVatCoderequiredstringnullable
items[].​owedPencerequiredinteger

What is still owed, in pence.

items[].​openBillsrequiredinteger
items[].​archivedrequiredboolean

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

Add a supplier

POST/api/v1/books/suppliers

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

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

Parameters

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

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

up to 200 characters

emailstringnullable
addressLinesarray of string
postcodestringnullable
vatNumberstringnullable
paymentTermsDaysintegernullable

0 to 365

Responses

201 Created, application/json

Body: object (BooksSupplier).

A business this business buys from.

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

Days to pay; null means 30 days unless a bill gives a due date.

defaultAccountIdrequiredstring (uuid)nullable

The account used on the last bill, to fill in the next one.

defaultVatCoderequiredstringnullable
owedPencerequiredinteger

What is still owed, in pence.

openBillsrequiredinteger
archivedrequiredboolean

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 supplier

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

Responses

200 OK, application/json

Body: object (BooksSupplier).

A business this business buys from.

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 or archive a supplier

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

Scopes
books:write

A supplier who is still owed money can’t be archived. Posted bills keep the name they were posted 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/suppliers/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Request body

Required. application/json: object (BooksSupplierPatch).

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

up to 200 characters

emailstringnullable
addressLinesarray of string
postcodestringnullable
vatNumberstringnullable
paymentTermsDaysintegernullable

0 to 365

archivedboolean

Responses

200 OK, application/json

Body: object (BooksSupplier).

A business this business buys from.

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 bills

GET/api/v1/books/bills

Scopes
books:read

Newest first. Status is worked out as at today: to_pay includes part-paid bills; overdue is past its due date with something still to pay. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/bills
NameInTypeDescription
limitquerynumber
supplierIdquerystring (uuid)
kindquerystring

One of: bill, supplier_credit, all

statusquerystring

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

Responses

200 OK, application/json

Body: object (BooksBillList).

200 OK response for GET /api/v1/books/bills
FieldTypeDescription
itemsrequiredarray of BooksBill
items[].​idrequiredstring (uuid)
items[].​kindrequiredstring (BooksBillKind)

One of: bill, supplier_credit

items[].​staterequiredstring (BooksBillState)

One of: draft, posted

items[].​statusrequiredstring (BooksBillStatus)

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

items[].​supplierIdrequiredstring (uuid)
items[].​supplierNamerequiredstring
items[].​referencerequiredstringnullable

The supplier’s own invoice or credit note number.

items[].​billDaterequiredstring (date)nullable

example "2026-03-31"

items[].​dueDaterequiredstring (date)nullable

example "2026-03-31"

items[].​notesrequiredstringnullable
items[].​reasonrequiredstringnullable
items[].​creditsIdrequiredstring (uuid)nullable
items[].​openingrequiredboolean

Brought forward with the starting balances: dated before the books start, with no VAT breakdown.

items[].​receiptIdrequiredstring (uuid)nullable

The photo or PDF this came from (GET /books/receipts/{id}/image).

items[].​netPencerequiredinteger

Integer pence (GBP).

items[].​vatPencerequiredinteger

Integer pence (GBP).

items[].​grossPencerequiredinteger

Integer pence (GBP).

items[].​paidPencerequiredinteger

Integer pence (GBP).

items[].​creditedPencerequiredinteger

Integer pence (GBP).

items[].​outstandingPencerequiredinteger

Integer pence (GBP).

items[].​overpaidPencerequiredinteger

Integer pence (GBP).

items[].​daysOverduerequiredinteger
items[].​ledgerEntryIdrequiredstring (uuid)nullable
items[].​createdAtrequiredstring (date-time)
items[].​postedAtrequiredstring (date-time)nullable

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

Start or add a bill

POST/api/v1/books/bills

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

Give a supplierId, or a supplierName to find or add one. With post: true it goes into the books straight away (Dr costs and VAT, Cr creditors); otherwise it stays a draft. With a receiptId the photo or PDF stays with the bill; posting confirms the receipt with these figures, which is the person’s decision on what Tolvi AI read. 409 if the same supplier reference has already been added. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

A supplierId, or a supplierName to find or add one.

Request body for POST /api/v1/books/bills
FieldTypeDescription
supplierIdstring (uuid)
supplierNamestring

up to 200 characters

referencestringnullable

The supplier’s own invoice number.

billDatestring (date)nullable

example "2026-03-31"

dueDatestring (date)nullable

Left out: the supplier’s terms, or 30 days.

example "2026-03-31"

notesstringnullable
linesarray of BooksBillLineInput
lines[].​descriptionrequiredstring

up to 500 characters

lines[].​accountIdrequiredstring (uuid)

A cost or asset account.

lines[].​netPencerequiredinteger

Integer pence (GBP).

lines[].​vatCoderequiredstring

example "S20"

lines[].​vatPenceinteger

Integer pence (GBP).

The VAT on the bill; worked from the rate at the bill’s date when left out.

receiptIdstring (uuid)

The receipt or bill photo this came from.

postboolean

Add it to the books straight away.

Responses

201 Created, application/json

Body: object (BooksBillDetail).

201 Created response for POST /api/v1/books/bills
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring (BooksBillKind)

One of: bill, supplier_credit

staterequiredstring (BooksBillState)

One of: draft, posted

statusrequiredstring (BooksBillStatus)

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

supplierIdrequiredstring (uuid)
supplierNamerequiredstring
referencerequiredstringnullable

The supplier’s own invoice or credit note number.

billDaterequiredstring (date)nullable

example "2026-03-31"

dueDaterequiredstring (date)nullable

example "2026-03-31"

notesrequiredstringnullable
reasonrequiredstringnullable
creditsIdrequiredstring (uuid)nullable
openingrequiredboolean

Brought forward with the starting balances: dated before the books start, with no VAT breakdown.

receiptIdrequiredstring (uuid)nullable

The photo or PDF this came from (GET /books/receipts/{id}/image).

netPencerequiredinteger

Integer pence (GBP).

vatPencerequiredinteger

Integer pence (GBP).

grossPencerequiredinteger

Integer pence (GBP).

paidPencerequiredinteger

Integer pence (GBP).

creditedPencerequiredinteger

Integer pence (GBP).

outstandingPencerequiredinteger

Integer pence (GBP).

overpaidPencerequiredinteger

Integer pence (GBP).

daysOverduerequiredinteger
ledgerEntryIdrequiredstring (uuid)nullable
createdAtrequiredstring (date-time)
postedAtrequiredstring (date-time)nullable
linesrequiredarray of BooksBillLine
lines[].​idrequiredstring (uuid)
lines[].​descriptionrequiredstring
lines[].​accountIdrequiredstring (uuid)
lines[].​accountNamerequiredstring
lines[].​netPencerequiredinteger

Integer pence (GBP).

lines[].​vatCoderequiredstring

example "S20"

lines[].​vatPencerequiredinteger

Integer pence (GBP).

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

example "2026-03-31"

payments[].​amountPencerequiredinteger

Integer pence (GBP).

payments[].​methodrequiredstring (BooksBillPaymentMethod)

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

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

Set when it was matched from a bank line: undo it in Bank.

payments[].​undonerequiredboolean
creditsrequiredarray of BooksBillCredit
credits[].​idrequiredstring (uuid)
credits[].​referencerequiredstringnullable
credits[].​daterequiredstring (date)nullable

example "2026-03-31"

credits[].​amountPencerequiredinteger

Integer pence (GBP).

credits[].​reasonrequiredstringnullable

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

A bill as Tolvi AI read it

GET/api/v1/books/bills/from-receipt/{receiptId}

Scopes
books:read

A suggestion to check, from a receipt or bill that has been read. Nothing is saved or posted. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for GET /api/v1/books/bills/from-receipt/{receiptId}
NameInTypeDescription
receiptIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBillProposal).

A bill as Tolvi AI read it from a receipt or bill: a suggestion. Nothing is saved until the person checks it and creates the bill.

200 OK response for GET /api/v1/books/bills/from-receipt/{receiptId}
FieldTypeDescription
receiptIdrequiredstring (uuid)
existingBillIdrequiredstring (uuid)nullable

A draft already started from this file: open that instead.

supplierIdrequiredstring (uuid)nullable

The supplier if the name read matches one.

supplierNamerequiredstringnullable
referencerequiredstringnullable
billDaterequiredstring (date)nullable

example "2026-03-31"

dueDaterequiredstring (date)nullable

example "2026-03-31"

linesrequiredarray of BooksBillProposalLine
lines[].​descriptionrequiredstring
lines[].​accountIdrequiredstring (uuid)nullable
lines[].​netPencerequiredinteger

Integer pence (GBP).

lines[].​vatCoderequiredstring
lines[].​vatPencerequiredinteger

Integer pence (GBP).

lines[].​checkThisrequiredboolean

Tolvi AI was barely sure of this line: highlight it for the person to check. It never stops them.

lines[].​checkReasonrequiredstringnullable
warningsrequiredarray of string

What to check, in plain English.

documentTotalPencerequiredintegernullable

Integer pence (GBP).

The total printed on the document, to compare the lines with. Null when it couldn’t be read or isn’t in pounds.

linesWarningrequiredstringnullable

Which of the warnings says the lines don’t add up, so it can go once they do.

readingStatusrequiredstring (BooksBillProposalReading)

One of: waiting, queued, reading, done, failed

foreignCurrencyrequiredstringnullable

The currency, when the document isn’t in pounds. Bills are in pounds, so no amount is suggested.

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

Get a bill

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

Scopes
books:read

With its lines, what is owed, payments and credits. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Responses

200 OK, application/json

Body: object (BooksBillDetail).

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 bill

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

Scopes
books:write

409 once it is in the books: a posted bill is corrected with a credit. Part of the books product: the firm must have it and you must have access to it.

Parameters

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

Request body

Required. application/json: object (BooksUpdateBill).

Request body for PATCH /api/v1/books/bills/{id}
FieldTypeDescription
supplierIdstring (uuid)
supplierNamestring

up to 200 characters

referencestringnullable
billDatestring (date)nullable

example "2026-03-31"

dueDatestring (date)nullable

example "2026-03-31"

notesstringnullable
linesarray of BooksBillLineInput
lines[].​descriptionrequiredstring

up to 500 characters

lines[].​accountIdrequiredstring (uuid)

A cost or asset account.

lines[].​netPencerequiredinteger

Integer pence (GBP).

lines[].​vatCoderequiredstring

example "S20"

lines[].​vatPenceinteger

Integer pence (GBP).

The VAT on the bill; worked from the rate at the bill’s date when left out.

Responses

200 OK, application/json

Body: object (BooksBillDetail).

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 bill

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

Scopes
books:write

409 once it is in the books. The file it came from is kept. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for DELETE /api/v1/books/bills/{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).

Add a draft bill to the books

POST/api/v1/books/bills/{id}/post

Scopes
books:write

Posts it through the ledger with VAT on every line, in one step. 422 with the reasons when it can’t post (for example a locked period). Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bills/{id}/post
NameInTypeDescription
idrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBillDetail).

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

Record a supplier credit note

POST/api/v1/books/bills/{id}/credit

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

All of what hasn’t been credited, or amountPence gross shared across the bill’s lines, at the VAT rates of the original supply (VAT Notice 700 section 19). Posts 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/bills/{id}/credit
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 (BooksCreditBill).

Request body for POST /api/v1/books/bills/{id}/credit
FieldTypeDescription
reasonrequiredstring

up to 200 characters

referencestringnullable

The supplier’s credit note number.

datestring (date)

example "2026-03-31"

amountPenceinteger

Integer pence (GBP).

Gross. Left out, everything not credited yet.

at least 1

Responses

201 Created, application/json

Body: object (BooksBillDetail).

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 a bill

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

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

Posts a credit for the whole bill, so the record stays and the books balance. 409 if anything has been paid or credited. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bills/{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 (BooksVoidBill).

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

up to 200 characters

datestring (date)

example "2026-03-31"

Responses

200 OK, application/json

Body: object (BooksBillDetail).

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 made

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

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

For money paid outside the bank feed. Part payments are fine; no more than is owed. Dr creditors, Cr the account it came from, and the share of the bill’s VAT settled for cash accounting. Tolvi doesn’t send the money. A bank line is matched in Bank 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/bills/{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 (BooksPayBill).

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

example "2026-03-31"

amountPencerequiredinteger

Integer pence (GBP).

at least 1

accountIdrequiredstring (uuid)

The bank, cash or card account it came from, or the owner’s own account (director’s loan, capital introduced, partner’s current account).

methodstring (BooksBillPayMethod)

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

referencestringnullable

Responses

201 Created, application/json

Body: object (BooksBillDetail).

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

Undo a payment recorded by hand

POST/api/v1/books/bills/{id}/payments/{paymentId}/undo

Scopes
books:write

Posts the reversal and reverses its VAT settlement. 409 for one matched from a bank line: undo that in Bank. Part of the books product: the firm must have it and you must have access to it.

Parameters

Parameters for POST /api/v1/books/bills/{id}/payments/{paymentId}/undo
NameInTypeDescription
idrequiredpathstring (uuid)
paymentIdrequiredpathstring (uuid)

Responses

200 OK, application/json

Body: object (BooksBillDetail).

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