PaperTotal API

The PaperTotal API. Send a key as Authorization: Bearer ptk_live_.... A key reaches one workspace and only the scopes it was given. An OAuth access token (pta_...) goes on the same header and reaches the same routes, within the scopes the person granted.

Requests are limited per workspace, across all of its keys and tokens: 600 a minute on Business, 120 on Pro, 60 on Starter and 30 with no plan. Past that the API answers 429 with code RATE_LIMITED and a Retry-After header.

Money is an integer in minor units with a currency code, dates are YYYY-MM-DD, and every error has the same body with a stable code and a message written for a person.

Sending a file. Ask POST /v1/uploads for a ticket, saying what the file is for (purpose), its type and its size in bytes. PUT exactly that many bytes to the ticket's url, with its headers and no others: the file goes straight to storage and never through this API. Then call the route the file is for with JSON naming uploadId where it would otherwise take a multipart file: POST /v1/documents or any other route that reads a document, such as POST /v1/documents/classify, POST /v1/parse or POST /v1/split, for document, POST /v1/expenses/{id}/receipts for expense_receipt, POST /v1/mileage/{id}/odometer-photos for odometer_photo, POST /v1/approvals/policy for policy_document, the statement imports under /v1/payment-accounts for statement, and POST /v1/attachments for attachment. Nothing counts until that route has checked the stored file: its bytes decide its type, and a file that is not acceptable is refused there and deleted. The ticket stops working at expiresAt, and a failed PUT is treated as an expired one: ask for a new ticket and try once more. A multipart file on the same routes still works, and is the simple way for a script.

A key can require signed requests. Send X-PaperTotal-Request-Timestamp with the Unix time and X-PaperTotal-Request-Signature with the hex HMAC-SHA256 of "<timestamp>.<METHOD>.<path and query>.<raw body>", using the key's client secret. A signature is good for 30 minutes either way, and one that is sent is always checked. It covers a JSON body or none, so send a file as file_data when signing.

Base URL: https://api.papertotal.com

Need help with the API? Write to [email protected] with the X-Request-Id of the call. A person answers by email.

Try a call from the web app, with your own session or a key you paste.

analytics

GET /v1/analytics/by-category Spending by category

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/by-department Spending by department

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/by-member Spending by member

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/by-merchant Spending by merchant

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/by-project Spending by project

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/by-tag Spending by tag

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Breakdown

GET /v1/analytics/summary Spending totals for a period, with the period before it

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json AnalyticsSummary

GET /v1/analytics/trend Spending over time

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
limitqueryinteger
intervalqueryday week month quarter year running
groupCurrencyquerystring

Response

200 Success.

application/json Trend

api keys

GET /v1/api-keys/verify See what the calling key grants

Any key may call this about itself, whatever its scopes. It says what the key can reach, in which workspace, and until when. Every other route under /v1/api-keys takes a person, so a key cannot mint a stronger key.

Any API key can call this, whatever its scopes. Try it

Response

200 Success.

application/json ApiKeyVerification

attachments

POST /v1/attachments Make a file a comment or a message can carry

From a finished upload with the purpose attachment. Name its id in attachmentIds on a comment or a message. A file nothing names is deleted after a week.

Needs the expenses:write scope. Needs a live plan. Try it

Request body

application/json CreateAttachmentInput

Response

201 Success.

application/json Attachment

automation rules

GET /v1/automation-rules List automation rules

The workspace's rules, top to bottom. The first rule to set a field wins it.

Needs the rules:read scope. Try it

Response

200 Success.

application/json AutomationRuleList

POST /v1/automation-rules Add an automation rule

Conditions match on the expense, its line items, its tags and flags, the words on its document, or a question for Claude.

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Request body

application/json AutomationRuleInput

Response

201 Success.

application/json AutomationRule

DELETE /v1/automation-rules/{id} Delete an automation rule

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

PATCH /v1/automation-rules/{id} Change an automation rule

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateAutomationRuleInput

Response

200 Success.

application/json AutomationRule

POST /v1/automation-rules/{id}/apply Run a rule over expenses not yet submitted

A field a person set keeps their value. Running it twice changes nothing more.

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json AutomationApply

POST /v1/automation-rules/{id}/test Count what a saved rule would match

Changes nothing.

Needs the rules:write scope. Needs the policies.manage permission. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json AutomationPreview

GET /v1/automation-rules/export Export automation rules as a file

Every workspace rule, in order, with names in place of ids, so another workspace can import it. Needs policies.manage.

Needs the rules:read scope. Needs the policies.manage permission. Try it

Response

200 Success.

application/json RulesDocument

POST /v1/automation-rules/import Import automation rules from CSV

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Request body

application/json CatalogImportInput

Response

200 Success.

application/json CatalogImportResult

POST /v1/automation-rules/import-file Import automation rules from a file

Takes what the export route gives. Each name is looked up in this workspace, and a rule that names something it does not have comes back in errors, with the reason. A rule already here is skipped.

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Request body

application/json RulesDocument

Response

200 Success.

application/json CatalogImportResult

POST /v1/automation-rules/preview Count what some conditions would match

Changes nothing. The sample shows expenses, so it needs rules:write and policies.manage.

Needs the rules:write scope. Needs the policies.manage permission. Try it

Request body

application/json AutomationPreviewInput

Response

200 Success.

application/json AutomationPreview

POST /v1/automation-rules/reorder Put the rules in a new order

Needs the rules:write scope. Needs the policies.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Request body

application/json ReorderAutomationRulesInput

Response

200 Success.

application/json AutomationRuleOrder

bank statements

POST /v1/bank-statements Read a bank statement

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

POST /v1/bank-statements/async Read a bank statement in the background

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

bank statements set

GET /v1/bank-statements-set List bank statement sets

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DocumentSetPage

POST /v1/bank-statements-set Split a PDF of bank statements and read each one

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Up to 250 pages and 50 MB. Answers at once. bank_statement_set.created says when every statement is read, and bank_statement_set.failed why not. Account numbers are masked in every view.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

GET /v1/bank-statements-set/{id} Get a bank statement set

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentSet

billing

GET /v1/billing Get the plan, seats and this month's usage

Needs the billing:read scope. Try it

Response

200 Success.

application/json Billing

POST /v1/billing/cancel Cancel the subscription

It ends when the period already paid for does, as cancelling in the billing portal does. Asking twice changes nothing. Needs billing.manage.

Needs the billing:write scope. Needs the billing.manage permission. Try it

Response

200 Success.

application/json Billing

GET /v1/billing/invoices List invoices

Newest first, from Stripe, with Stripe's own links to each invoice's page and PDF. A plan bought in a store has its invoices there.

Needs the billing:read scope. Needs the billing.manage permission. Try it

Response

200 Success.

application/json BillingInvoicePage

blueprints

GET /v1/blueprints List blueprints

This workspace's own, then the built-in catalogue.

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

documentTypequeryRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT

Response

200 Success.

application/json BlueprintList

POST /v1/blueprints Create a blueprint

A strict subset of JSON schema: object, array, string, number, integer and boolean, nested up to four levels and up to 150 fields. A keyword outside it, such as $ref, pattern or anyOf, is refused by name. Needs settings.manage.

Needs the documents:write scope. Needs the settings.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Request body

application/json CreateBlueprintInput

Response

201 Success.

application/json Blueprint

DELETE /v1/blueprints/{name} Delete a blueprint

Results it made stay, and its name can be used again.

Needs the documents:write scope. Needs the settings.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

name requiredpathstring

Response

204 Done, with no content.

GET /v1/blueprints/{name} Get a blueprint

Asks for an older version with version.

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

name requiredpathstring
versionqueryinteger

Response

200 Success.

application/json Blueprint

PATCH /v1/blueprints/{name} Change a blueprint

A new schema or new field guidance adds a version. Results keep the version that made them.

Needs the documents:write scope. Needs the settings.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

name requiredpathstring

Request body

application/json UpdateBlueprintInput

Response

200 Success.

application/json Blueprint

POST /v1/blueprints/draft Propose a blueprint from a sample

Multipart, or JSON naming an uploadId from POST /v1/uploads. Reads one sample and proposes fields. Nothing is saved until it is sent to POST /v1/blueprints. Costs one scan.

Needs the documents:write scope. Needs the settings.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Request body

multipart/form-data

file requiredstring (binary)

application/json

uploadId requiredstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

Response

201 Success.

application/json BlueprintDraft

GET /v1/blueprints/draft/{documentId} Get a proposed blueprint

The document id from proposing one. Answers READING until it has been read.

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

documentId requiredpathstring

Response

200 Success.

application/json BlueprintDraft

budgets

GET /v1/budgets List budgets

Needs the expenses:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json BudgetPage

GET /v1/budgets/{id} Get a budget and how it stands

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Budget

business cards

POST /v1/business-cards Read a business card

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

categories

GET /v1/categories List categories

Needs the expenses:read scope. Try it

Parameters

qquerystring
enabledquerystring
typequeryEXPENSE COGS INCOME REFUND
originquerySYSTEM CUSTOM ACCOUNTING
headersquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json CategoryPage

POST /v1/categories Create a category

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json CategoryInput

Response

201 Success.

application/json Category

DELETE /v1/categories/{id} Delete a category

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/categories/{id} Get a category

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Category

PATCH /v1/categories/{id} Change a category

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateCategoryInput

Response

200 Success.

application/json Category

POST /v1/categories/import Import categories from CSV

Send the CSV as text/plain, or as JSON with a csv field. Rows that match an existing category update it. Columns: Name, Enabled, GL code, Payroll code, Comment required, Comment hint, Max expense. With mode=replace the list becomes what the file says: a category it leaves out is deleted, or turned off if something uses it, and a file with a row it cannot read changes nothing.

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

modequerymerge replace

Request body

application/json CatalogImportInput

Response

201 Success.

application/json CatalogImportResult

check with document

POST /v1/check-with-document Read a check with its remittance

Two documents, read apart: the check, and what came with it.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CheckWithDocumentInput

Response

201 Success.

application/json CheckWithDocument

202 Accepted. One or both are still being read.

application/json CheckWithDocument

checks

POST /v1/checks Read a bank check

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

POST /v1/checks/async Read a bank check in the background

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

clients

GET /v1/clients GET /v1/clients

Needs the expenses:read scope. Try it

Response

POST /v1/clients POST /v1/clients

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Response

DELETE /v1/clients/{id} DELETE /v1/clients/:id

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

GET /v1/clients/{id} GET /v1/clients/:id

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

PATCH /v1/clients/{id} PATCH /v1/clients/:id

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

contacts

GET /v1/contacts List contacts

Needs the contacts:read scope. Try it

Parameters

qquerystring
documentIdquerystring
namequerystring
companyquerystring
emailquerystring
phonequerystring
websitequerystring
cityquerystring
regionquerystring
postalCodequerystring
countryquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ContactPage

GET /v1/contacts/{id} Get a contact

Needs the contacts:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Contact

GET /v1/contacts/{id}/vcard Download a contact as a vCard

Needs the contacts:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

text/vcard string (binary)

POST /v1/contacts/export Export contacts as vCard or CSV

Needs the contacts:read scope. Try it

Request body

application/json ContactExportInput

Response

200 Success.

text/vcard string (binary)

text/csv string (binary)

custom fields

GET /v1/custom-fields List custom fields

Needs the expenses:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json CustomFieldPage

GET /v1/custom-fields/{id} Get a custom field

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json CustomField

documents

GET /v1/documents List documents

Ranges take __gt, __gte, __lt and __lte on created, updated, issued, total and tax: created__gte=2026-01-01, total__lt=5000. Issued, total and tax are what the document's expense holds, with whatever a person corrected, and a document with no expense has none. A day covers all of itself. order_by sorts, and a leading minus sorts down: -total. A document with no value comes last either way. A cursor resumes the created order only, so any other order pages with offset or page. is_empty names fields that must be empty. q searches the title, file name, notes, OCR text and extracted fields in any case; with an asterisk it searches the OCR text and extracted fields, case sensitive, and returns at most the newest 5,000 matches.

Needs the documents:read scope. Try it

Parameters

typequeryRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
statusqueryUPLOADED PROCESSING PROCESSED FAILED
sourcequeryWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
source_idquerystring
external_idquerystring
blueprint_namequerystring
ownerquerystring
device_idquerystring
device_user_uuidquerystring
viewedqueryboolean
trashedqueryboolean
envelopequerystring
created__gtquerystring or string (date-time)
created__gtequerystring or string (date-time)
created__ltquerystring or string (date-time)
created__ltequerystring or string (date-time)
updated__gtquerystring or string (date-time)
updated__gtequerystring or string (date-time)
updated__ltquerystring or string (date-time)
updated__ltequerystring or string (date-time)
issuedquerystring
issued__gtquerystring
issued__gtequerystring
issued__ltquerystring
issued__ltequerystring
totalqueryinteger
total__gtqueryinteger
total__gtequeryinteger
total__ltqueryinteger
total__ltequeryinteger
taxqueryinteger
tax__gtqueryinteger
tax__gtequeryinteger
tax__ltqueryinteger
tax__ltequeryinteger
currencyquerystring
categoryquerystring
vendorquerystring
notesquerystring
payment_typequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
last_four_digitsquerystring
first_namequerystring
last_namequerystring
work_phonequerystring
cell_phonequerystring
companyquerystring
emailquerystring
websitequerystring
countryquerystring
statequerystring
cityquerystring
zipquerystring
namequerystring
is_emptyquerystring
order_byquerycreated updated issued total tax -created -updated -issued -total -tax
folderIdquerystring
mailInBatchIdquerystring
setIdquerystring
externalIdquerystring
tagquerystring
archivedqueryboolean
unviewedqueryboolean
qquerystring
fromquerystring
toquerystring
fraudColorqueryGREEN YELLOW RED
fraudSignalquerydigital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
fraudReviewqueryPENDING FRAUD NOT_FRAUD UNKNOWN
limitqueryinteger
cursorquerystring
offsetqueryinteger
pagequeryinteger
page_sizequeryinteger
track_total_resultsqueryboolean

Response

200 Success.

application/json DocumentList

POST /v1/documents Upload a file

Multipart, or JSON naming an uploadId from POST /v1/uploads. The file's type comes from its bytes. Use a JPEG, PNG, WebP, HEIC, TIFF, PDF, DOCX, XLSX, CSV, TXT, HTML, EML or ZIP file. Up to 25 MB, or 50 MB for a PDF sent to be split into a set of documents. Reads best at 300 DPI for a PDF and 1000 pixels on the shorter side of an image. A ZIP unpacks into one document per file, up to 200 files and 200 MB, and each file counts against the plan. A ZIP inside a ZIP is refused. With a key this waits for the reading and answers with it, unless async is set. Name a type, or leave it out and the classifier says what it is.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

clientqueryios android

The app sending the file. Leave it out in a browser.

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
clientIdstring
externalIdstring
folderIdstring
notesstring
capturedAtstring (date-time)
latitudenumber
longitudenumber
locationAccuracyMnumber
deviceIdstring
merchantNamestring
datestring
totalMinorinteger
taxMinorinteger
categorystring

application/json

uploadId requiredstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
clientIdstring
externalIdstring
folderIdstring
notesstring
capturedAtstring (date-time)
latitudenumber
longitudenumber
locationAccuracyMnumber
deviceIdstring
merchantNamestring
datestring
totalMinorinteger
taxMinorinteger
categorystring

Response

201 Success.

application/json DocumentUpload

DELETE /v1/documents/{id} Delete a document

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id} Get a document and its extraction

Links are signed again on every read, with no new reading. detailed=true adds the reading with each field wrapped as value, score, ocrScore, rotation, boundingBox, boundingRegion and enriched. with_scores=true adds lineItemsWithScores and taxLinesWithScores. recordStatus says processed, reviewed or archived. bounding_boxes=true adds every line read with its box and four corners, and where each field was read from: boundingBox as [page, x1, y1, x2, y2] and boundingRegion as [x1, y1, x2, y2, x3, y3, x4, y4], both as fractions of the page. confidence_details=true adds how sure the read of each field was. Both can be sent on a submission too.

Needs the documents:read scope. Try it

Parameters

id requiredpathstring
bounding_boxesqueryboolean
confidence_detailsqueryboolean
detailedqueryboolean
with_scoresqueryboolean

Response

200 Success.

application/json DocumentDetail

PATCH /v1/documents/{id} Change a document

status REVIEWED marks it checked, approved sets your own flag, fraudReview records a decision, and billable, merchantName and the totals change its expense, under the rules of PATCH /v1/expenses/{id}. What can be refused is checked first, so nothing changes when any of it is.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateDocumentInput

Response

200 Success.

application/json Document

PUT /v1/documents/{id} Change a document, for a client written for PUT

The same as PATCH: it changes what the body names and nothing else.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateDocumentInput

Response

200 Success.

application/json Document

POST /v1/documents/{id}/cancel Stop reading a document

For filling in the details by hand. The file stays, and it can be read again.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Document

POST /v1/documents/{id}/crop Crop a photo

A box as fractions of the page as it shows now. The original stays as it came: a new page is drawn from it and read again, and it stays cropped through every later read. Only images can be cropped.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json CropDocumentInput

Response

200 Success.

application/json Document

POST /v1/documents/{id}/fraud-review Record a person's decision on a document

Fraud, not fraud or unknown, with the signals they agree with. A re-read replaces the evidence and leaves this alone. Nobody decides on their own upload except the workspace owner.

Needs the documents:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body

application/json FraudReviewInput

Response

200 Success.

application/json Document

DELETE /v1/documents/{id}/line-items Delete every line item

The total stays as the receipt printed it.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id}/line-items List a document's line items

Needs the documents:read scope. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ExpenseLinePage

POST /v1/documents/{id}/line-items Add a line item

The lines of the document's expense. When they added up to its total, a change to one moves the total and the converted amount with it. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json ExpenseLineInput

Response

201 Success.

application/json ExpenseLine

DELETE /v1/documents/{id}/line-items/{lineId} Delete a line item

The lines of the document's expense. When they added up to its total, a change to one moves the total and the converted amount with it. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
lineId requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id}/line-items/{lineId} Get a line item

Needs the documents:read scope. Try it

Parameters

id requiredpathstring
lineId requiredpathstring

Response

200 Success.

application/json ExpenseLine

PATCH /v1/documents/{id}/line-items/{lineId} Change a line item

The lines of the document's expense. When they added up to its total, a change to one moves the total and the converted amount with it. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
lineId requiredpathstring

Request body

application/json UpdateExpenseLineInput

Response

200 Success.

application/json ExpenseLine

GET /v1/documents/{id}/ofx Download a bank statement as OFX

OFX 1.0.2, the file accounting software and personal finance programs import, from the latest reading of a bank statement: the rules' reading, Claude's, or the bank_statement blueprint's. Each account on the statement gets its own transactions, with FITIDs that stay the same each time. Account and routing numbers are masked, so match the file to an account when importing it. A document that is not a statement, or one with nothing read from it, answers 409 saying which.

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/x-ofx string (binary)

GET /v1/documents/{id}/original Get a short-lived link to the original file

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentOriginal

GET /v1/documents/{id}/pdf Download a document as a PDF

A file that already is a PDF answers 302 to a short-lived link on storage, so follow the redirect, without your Authorization header. Anything else is built on the spot and comes back here.

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/pdf string (binary)

POST /v1/documents/{id}/reprocess Read a document again

Fields a person changed are left alone.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json Document

POST /v1/documents/{id}/reveal Open the bank and tax numbers read from a document

Needs the documents.reveal permission and, for a key, the documents:reveal scope. Every call writes an audit row. Also returns a link to the original file and, for a check, its TIFF images. Nothing else hands these out.

Needs the documents:reveal scope. Needs the documents.reveal permission. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json RevealDocumentInput

Response

200 Success.

application/json RevealedDocument

POST /v1/documents/{id}/rotate Turn a page

A quarter turn, counter-clockwise by default. The original stays as it came: a new page is drawn from it and read again, and it stays turned through every later read.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json RotateDocumentInput

Response

200 Success.

application/json Document

POST /v1/documents/{id}/split Split a PDF already uploaded

Every page, or the ranges given. Each part is a document and counts as a scan, and the whole goes to the trash once the parts exist.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
clientqueryios android

The app sending the file. Leave it out in a browser.

Request body

application/json SplitDocumentInput

Response

202 Success.

application/json DocumentSet

DELETE /v1/documents/{id}/tags Take every tag off a document

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id}/tags List a document's tags

Any type of document: receipts, checks, bank statements, business cards, contracts, tax forms and the rest.

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentTagList

POST /v1/documents/{id}/tags Add several tags to a document

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json DocumentTagsInput

Response

200 Success.

application/json DocumentTagList

PUT /v1/documents/{id}/tags Add a tag to a document

By name. A name the workspace does not have makes the tag. Adding one it already has changes nothing.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json DocumentTagInput

Response

200 Success.

application/json DocumentTagList

DELETE /v1/documents/{id}/tags/{tagId} Take a tag off a document

The tag stays in the workspace.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
tagId requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id}/tax-lines List a document's tax lines

Needs the documents:read scope. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ExpenseTaxLinePage

POST /v1/documents/{id}/tax-lines Add a tax line

The expense's tax is the sum of its tax lines. When its total was what is under the tax and on top of it, the total moves with the tax. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json ExpenseTaxLineInput

Response

201 Success.

application/json ExpenseTaxLine

DELETE /v1/documents/{id}/tax-lines/{taxLineId} Delete a tax line

The expense's tax is the sum of its tax lines. When its total was what is under the tax and on top of it, the total moves with the tax. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
taxLineId requiredpathstring

Response

204 Done, with no content.

GET /v1/documents/{id}/tax-lines/{taxLineId} Get a tax line

Needs the documents:read scope. Try it

Parameters

id requiredpathstring
taxLineId requiredpathstring

Response

200 Success.

application/json ExpenseTaxLine

PATCH /v1/documents/{id}/tax-lines/{taxLineId} Change a tax line

The expense's tax is the sum of its tax lines. When its total was what is under the tax and on top of it, the total moves with the tax. Refused once the expense is on a submitted report.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
taxLineId requiredpathstring

Request body

application/json UpdateExpenseTaxLineInput

Response

200 Success.

application/json ExpenseTaxLine

GET /v1/documents/{id}/text Get the text read from a document

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentText

POST /v1/documents/any Read a document with a blueprint

Multipart with a field named file, or JSON with uploadId, file_url or file_data. The answer is in blueprint.result. Without a Claude key on the server, blueprint.error says so and the text is still read. 20 pages by default and 50 at most.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
blueprint_name requiredstring
blueprint_versioninteger
max_pages_to_processinteger

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
blueprint_name requiredstring
blueprint_versioninteger
max_pages_to_processinteger

Response

201 Success.

application/json Document

POST /v1/documents/any/async Read a document with a blueprint, in the background

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Answers at once. document.processed says when it is done.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
blueprint_name requiredstring
blueprint_versioninteger
max_pages_to_processinteger

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
blueprint_name requiredstring
blueprint_versioninteger
max_pages_to_processinteger

Response

202 Success.

application/json Document

POST /v1/documents/batch Submit up to 100 addresses at once

Answers at once with a set. Each address becomes a document with its own webhook, and an address that fails is listed under refused without stopping the rest.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json BatchDocumentsInput

Response

202 Success.

application/json DocumentSet

POST /v1/documents/bulk Act on many documents

Send ids, or a filter to act on everything that matches. With a filter, call again with nextCursor until it is null.

Needs the documents:write scope. Needs a live plan. Try it

Request body

application/json BulkDocumentInput

Response

200 Success.

application/json BulkDocumentResult

POST /v1/documents/classify Say what a document is

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Answers with a value and a score, from the built-in list or from document_types. It works with no Claude key for the common types, and Claude only decides what the rules cannot.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

Response

201 Success.

application/json Classification

GET /v1/documents/count Count the documents a filter matches

Needs the documents:read scope. Try it

Parameters

typequeryRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
statusqueryUPLOADED PROCESSING PROCESSED FAILED
sourcequeryWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
source_idquerystring
external_idquerystring
blueprint_namequerystring
ownerquerystring
device_idquerystring
device_user_uuidquerystring
viewedqueryboolean
trashedqueryboolean
envelopequerystring
created__gtquerystring or string (date-time)
created__gtequerystring or string (date-time)
created__ltquerystring or string (date-time)
created__ltequerystring or string (date-time)
updated__gtquerystring or string (date-time)
updated__gtequerystring or string (date-time)
updated__ltquerystring or string (date-time)
updated__ltequerystring or string (date-time)
issuedquerystring
issued__gtquerystring
issued__gtequerystring
issued__ltquerystring
issued__ltequerystring
totalqueryinteger
total__gtqueryinteger
total__gtequeryinteger
total__ltqueryinteger
total__ltequeryinteger
taxqueryinteger
tax__gtqueryinteger
tax__gtequeryinteger
tax__ltqueryinteger
tax__ltequeryinteger
currencyquerystring
categoryquerystring
vendorquerystring
notesquerystring
payment_typequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
last_four_digitsquerystring
first_namequerystring
last_namequerystring
work_phonequerystring
cell_phonequerystring
companyquerystring
emailquerystring
websitequerystring
countryquerystring
statequerystring
cityquerystring
zipquerystring
namequerystring
is_emptyquerystring
order_byquerycreated updated issued total tax -created -updated -issued -total -tax
folderIdquerystring
mailInBatchIdquerystring
setIdquerystring
externalIdquerystring
tagquerystring
archivedqueryboolean
unviewedqueryboolean
qquerystring
fromquerystring
toquerystring
fraudColorqueryGREEN YELLOW RED
fraudSignalquerydigital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
fraudReviewqueryPENDING FRAUD NOT_FRAUD UNKNOWN

Response

200 Success.

application/json DocumentCount

POST /v1/documents/extract Say what a document is and read it, in one call

Multipart with a field named file, or JSON with uploadId, file_url or file_data. document_types may name built-in types and blueprints. Answers with extraction, or extraction_error when it could not be read.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

Response

201 Success.

application/json Extraction

POST /v1/documents/split Split a PDF on storage into documents

The PDF named by uploadId, from POST /v1/uploads with purpose document_set, up to 50 MB. mode says where it is cut, and detect is the default. Each part is a document, counts as a scan and is held to 25 MB: a part past that is listed under refused, and the rest are filed.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

clientqueryios android

The app sending the file. Leave it out in a browser.

Request body

application/json SplitUploadInput

Response

202 Success.

application/json DocumentSet

GET /v1/documents/trash List deleted documents

Each can be restored for 30 days.

Needs the documents:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json TrashedDocumentPage

POST /v1/documents/trash Restore deleted documents, or delete them for good

Needs the documents:write scope. Needs a live plan. Try it

Request body

application/json TrashActionInput

Response

200 Success.

application/json TrashActionResult

POST /v1/documents/url Submit a file by URL or base64

By default the call waits up to 30 seconds and returns the extraction with 201. With async: true, or if reading takes longer, it answers 202 and the document.processed webhook says when it is done. file_url must be public https; redirects are not followed. file_urls reads several images as one document, in order. bucket and package_path read from your own S3 bucket, with keys saved in document settings. Use a JPEG, PNG, WebP, HEIC, TIFF, PDF, DOCX, XLSX, CSV, TXT, HTML, EML or ZIP file. Up to 25 MB, or 50 MB for a PDF sent to be split into a set of documents. Reads best at 300 DPI for a PDF and 1000 pixels on the shorter side of an image. A ZIP unpacks into one document per file, up to 200 files and 200 MB, and each file counts against the plan. A ZIP inside a ZIP is refused.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

documents set

GET /v1/documents-set List sets of documents

Includes ZIPs and batches of addresses.

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DocumentSetPage

POST /v1/documents-set Split a PDF and read each document in it

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Up to 250 pages and 50 MB. Answers at once. Each part fires document.processed and counts as a scan, and document_set.completed says when all are read.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

GET /v1/documents-set/{id} Get a set and the documents it made

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentSet

expenses

GET /v1/expenses List expenses

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
sortquerydate:asc date:desc merchant:asc merchant:desc category:asc category:desc status:asc status:desc amount:asc amount:desc
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ExpensePage

POST /v1/expenses Create an expense

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CreateExpenseInput

Response

201 Success.

application/json ExpenseDetail

DELETE /v1/expenses/{id} Void an expense

A voided expense stays for audit and leaves every total.

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/expenses/{id} Get an expense

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ExpenseDetail

PATCH /v1/expenses/{id} Change an expense

Send If-Match with the updatedAt you last read to make this conditional: if someone changed the expense since, it answers 409 CONFLICT with details.reason STALE_WRITE and changes nothing.

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
If-Matchheaderstring

The expense's updatedAt, as read.

Request body

application/json UpdateExpenseInput

Response

200 Success.

application/json ExpenseDetail

GET /v1/expenses/{id}/comments List comments on an expense

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json CommentPage

POST /v1/expenses/{id}/comments Comment on an expense

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body (optional)

application/json CommentInput

Response

201 Success.

application/json PostedComment

POST /v1/expenses/{id}/comments/{commentId}/reach Reach someone a comment on this expense could not

An expense has no participants of its own, so they join the report it is on, and then they are told. Refused when it is on no report.

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring
commentId requiredpathstring

Request body (optional)

application/json ReachMentionedInput

Response

200 Success.

application/json Reached

GET /v1/expenses/{id}/comments/mentionable List who a comment on this expense can mention

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json MentionablePeople

POST /v1/expenses/{id}/duplicate Copy an expense, dated today, with no receipt

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json CreatedId

GET /v1/expenses/{id}/duplicates List an expense and its possible duplicates

Every copy in the group, not just a pair. hidden counts any the caller cannot read.

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ExpenseDuplicateGroup

POST /v1/expenses/{id}/flags/{code}/dismiss Dismiss a flag on an expense

For whoever has it for approval, or someone who manages expenses. The flag goes from the expense and stays in the audit log. Not for a hold.

Needs the expenses:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring
code requiredpathstring

Request body (optional)

application/json DismissFlagInput

Response

200 Success.

application/json Hold

POST /v1/expenses/{id}/hold Put an expense on hold

Needs the expenses:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json HoldExpenseInput

Response

200 Success.

application/json Hold

POST /v1/expenses/{id}/receipts Attach a receipt to an expense

Multipart, or JSON naming an uploadId from POST /v1/uploads. add files it beside what is there, and a first receipt on a receipt expense is read onto it. replace takes the current ones to the trash and reads the new one. Fields a person changed are left alone.

Needs the documents:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
clientqueryios android

The app sending the file. Leave it out in a browser.

Request body

multipart/form-data

file requiredstring (binary)
modeadd replace
clientIdstring
deviceIdstring

application/json

uploadId requiredstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

modeadd replace
clientIdstring
deviceIdstring

Response

201 Success.

application/json Document

POST /v1/expenses/{id}/settle-duplicates Answer a duplicate question

keep all takes the hold off every one of them. keep selected keeps this one, discards the others and can take values from them, all in one step. The submitter and whoever holds the open approval can do this on an outstanding report.

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json SettleDuplicatesInput

Response

200 Success.

application/json ExpenseDetail

POST /v1/expenses/{id}/unhold Take an expense off hold

Needs the expenses:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Hold

POST /v1/expenses/bulk Change many expenses

Needs the expenses:write scope. Needs a live plan. Try it

Request body

application/json BulkExpenseInput

Response

201 Success.

application/json BulkExpenseResult

GET /v1/expenses/totals Total the expenses that match a filter, or the ones selected, in any currency

Needs the expenses:read scope. Try it

Parameters

statusqueryPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindqueryRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdquerystring
scopequerymine all
categoryIdquerystring
merchantIdquerystring
projectIdquerystring
clientIdquerystring
tagIdquerystring
departmentquerystring
reportIdquerystring
externalIdquerystring
unreportedqueryboolean
needsReviewqueryboolean
billablequeryboolean
reimbursablequeryboolean
moneyFlowqueryIN OUT
dateFieldquerydate createdAt updatedAt submittedAt approvedAt
fromquerystring
toquerystring
minMinorqueryinteger
maxMinorqueryinteger
qquerystring
idsquerystring or array of string
currencyquerystring

Response

200 Success.

application/json ExpenseTotals

export history

GET /v1/export-history List which documents went where

Files from exports, postings to connected services, and what programs recorded, with the id each has there. Needs expenses.read_all.

Needs the documents:read scope. Needs the expenses.read_all permission. Try it

Parameters

documentIdquerystring
targetquerystring
externalIdquerystring
viaqueryEXPORT SYNC API
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ExportRecordPage

POST /v1/export-history Record that documents went somewhere

For an export a program made itself. A record already held is not written again, so a retry is safe.

Needs the documents:write scope. Needs a live plan. Try it

Request body

application/json ExportRecordInput

Response

201 Success.

application/json ExportRecordsAppended

exports

GET /v1/exports List exports

Needs the expenses:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ExportJobPage

POST /v1/exports Start an export

Filters select by expense, or by report with reportState, reportIds, startDate and endDate (one year at most), approvedAfter and exported. policyIds takes workspace ids, and a key can only name its own. template is the file's whole layout as text, with ${expense.merchant}, <#list reports as report> and <#if report.exported>, and takes CSV, TXT, JSON or XML: a mistake in it answers 422 with the line. onFinish can email the file, mark the reports it covers as exported, which needs reports:write, and upload it by SFTP. SFTP needs the host key fingerprint of the server, refuses a private address, and never returns the credentials.

Needs the expenses:read scope. Try it

Request body

application/json CreateExportInput

Response

201 Success.

application/json ExportJob

GET /v1/exports/{id} Get an export and, when ready, its link

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ExportJob

folders

GET /v1/folders List folders

Needs the documents:read scope. Try it

Parameters

qquerystring
parentIdquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json FolderPage

POST /v1/folders Create a folder

Needs the documents:write scope. Needs the expenses.write_all permission. Needs a live plan. Try it

Request body

application/json FolderInput

Response

201 Success.

application/json Folder

DELETE /v1/folders/{id} Delete a folder

Needs the documents:write scope. Needs the expenses.write_all permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/folders/{id} Get a folder

Needs the documents:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Folder

PATCH /v1/folders/{id} Change a folder

Needs the documents:write scope. Needs the expenses.write_all permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateFolderInput

Response

200 Success.

application/json Folder

forwarding

GET /v1/forwarding/emails List email sent to the caller's forwarding addresses

Every message, filed or not, with the sender, subject, received time, whether it carried a file, and any file left out and why.

Needs the documents:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json InboundEmailPage

fraud

GET /v1/fraud/blocklist List blocked devices

Needs the documents:read scope. Needs the expenses.read_all permission. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DeviceBlockPage

POST /v1/fraud/blocklist Block a device

A blocked device still captures. Its documents read red, with the reason stated, for a reviewer.

Needs the documents:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json BlockDeviceInput

Response

201 Success.

application/json DeviceBlock

DELETE /v1/fraud/blocklist/{deviceId} Remove a device from the blocklist

Needs the documents:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

deviceId requiredpathstring

Response

204 Done, with no content.

GET /v1/fraud/blocklist/{deviceId} Check whether a device is blocked

A device nobody blocked answers blocked: false, not 404.

Needs the documents:read scope. Needs the expenses.read_all permission. Try it

Parameters

deviceId requiredpathstring

Response

200 Success.

application/json DeviceBlockStatus

GET /v1/fraud/export Download the evidence on documents that match a filter

The same filter as listing documents. Needs expenses.read_all.

Needs the documents:read scope. Needs the expenses.read_all permission. Try it

Parameters

typequeryRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
statusqueryUPLOADED PROCESSING PROCESSED FAILED
sourcequeryWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
source_idquerystring
external_idquerystring
blueprint_namequerystring
ownerquerystring
device_idquerystring
device_user_uuidquerystring
viewedqueryboolean
trashedqueryboolean
envelopequerystring
created__gtquerystring or string (date-time)
created__gtequerystring or string (date-time)
created__ltquerystring or string (date-time)
created__ltequerystring or string (date-time)
updated__gtquerystring or string (date-time)
updated__gtequerystring or string (date-time)
updated__ltquerystring or string (date-time)
updated__ltequerystring or string (date-time)
issuedquerystring
issued__gtquerystring
issued__gtequerystring
issued__ltquerystring
issued__ltequerystring
totalqueryinteger
total__gtqueryinteger
total__gtequeryinteger
total__ltqueryinteger
total__ltequeryinteger
taxqueryinteger
tax__gtqueryinteger
tax__gtequeryinteger
tax__ltqueryinteger
tax__ltequeryinteger
currencyquerystring
categoryquerystring
vendorquerystring
notesquerystring
payment_typequeryCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
last_four_digitsquerystring
first_namequerystring
last_namequerystring
work_phonequerystring
cell_phonequerystring
companyquerystring
emailquerystring
websitequerystring
countryquerystring
statequerystring
cityquerystring
zipquerystring
namequerystring
is_emptyquerystring
order_byquerycreated updated issued total tax -created -updated -issued -total -tax
folderIdquerystring
mailInBatchIdquerystring
setIdquerystring
externalIdquerystring
tagquerystring
archivedqueryboolean
unviewedqueryboolean
qquerystring
fromquerystring
toquerystring
fraudColorqueryGREEN YELLOW RED
fraudSignalquerydigital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
fraudReviewqueryPENDING FRAUD NOT_FRAUD UNKNOWN

Response

200 Success.

text/csv string (binary)

integrations

GET /v1/integrations List connected services and what can be connected

Needs the integrations:read scope. Try it

Response

200 Success.

application/json IntegrationList

GET /v1/integrations/{provider}/health See how a connection stands

Needs the integrations:read scope. Needs the integrations.manage permission. Try it

Parameters

provider requiredpathstring

The service, by its slug: quickbooks-online, quickbooks-desktop, xero, freshbooks, wave, zoho-books, sage, microsoft-dynamics, myob, oracle, sap, netsuite, gusto, hr, gmail, google-drive, dropbox, box, onedrive, slack, zapier.

Response

200 Success.

application/json IntegrationHealth

GET /v1/integrations/{provider}/records List what was sent to a service

Each record names the expense and the id it has in the other system.

Needs the integrations:read scope. Needs the integrations.manage permission. Try it

Parameters

provider requiredpathstring

The service, by its slug: quickbooks-online, quickbooks-desktop, xero, freshbooks, wave, zoho-books, sage, microsoft-dynamics, myob, oracle, sap, netsuite, gusto, hr, gmail, google-drive, dropbox, box, onedrive, slack, zapier.

statequeryPENDING SYNCED FAILED SKIPPED VOIDED
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json SyncRecordPage

invitations

GET /v1/invitations List invitations

Needs the members:read scope. Needs the members.manage permission. Try it

Parameters

statusqueryPENDING EXPIRED ACCEPTED REVOKED
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json InvitationPage

POST /v1/invitations Invite someone to this workspace

They join when they accept, signed in with this address. An open invitation holds a seat.

Needs the members:write scope. Needs the members.manage permission. Needs a live plan. Try it

Request body

application/json CreateInvitationInput

Response

201 Success.

application/json InvitationSent

DELETE /v1/invitations/{id} Withdraw an invitation

Works on a lapsed plan.

Needs the members:write scope. Needs the members.manage permission. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

POST /v1/invitations/{id}/resend Send an invitation again

A new link. The old one stops working.

Needs the members:write scope. Needs the members.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json InvitationSent

POST /v1/invitations/import Invite many people from CSV

Send the CSV as text/plain, or as JSON with a csv field, with an Email column and an optional Role column.

Needs the members:write scope. Needs the members.manage permission. Needs a live plan. Try it

Request body

application/json CatalogImportInput

Response

201 Success.

application/json CatalogImportResult

mail in

GET /v1/mail-in List mail-in batches

A member sees the batches they asked for.

Needs the mailin:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json MailInBatchPage

POST /v1/mail-in Request envelopes and a mail-in batch

envelopes is how many to send, and the answer says how many can still be requested this week. The estimate holds that many documents of this month's allowance. Both holds commit with the batch, or not at all. Left out, afterScan follows the workspace's shredding setting.

Needs the mailin:write scope. Needs the mail_in plan feature. Needs a live plan. Try it

Request body

application/json CreateMailInInput

Response

201 Success.

application/json MailInRequested

GET /v1/mail-in/{id} Get a mail-in batch

Needs the mailin:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json MailInBatch

PATCH /v1/mail-in/{id} Change the address on a batch

For the person who asked or a manager, until the batch finishes. A batch's code cannot be changed.

Needs the mailin:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json ChangeMailInAddressInput

Response

200 Success.

application/json MailInBatch

GET /v1/mail-in/{id}/barcode Get a batch's barcode

A Code 128 image of the batch reference.

Needs the mailin:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

image/png string (binary)

POST /v1/mail-in/{id}/cancel Cancel a batch nobody has started on

Needs the mailin:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json MailInBatch

GET /v1/mail-in/{id}/cover-sheet Get a batch's cover sheet

Needs the mailin:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/pdf string (binary)

GET /v1/mail-in/{id}/documents List what came out of a batch

Needs the mailin:read scope. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json MailInDocumentPage

GET /v1/mail-in/allowance See this month's paper allowance

Needs the mailin:read scope. Try it

Response

200 Success.

application/json MailInAllowance

GET /v1/mail-in/barcode Get the workspace's barcode

A Code 128 image of the workspace reference.

Needs the mailin:read scope. Try it

Response

200 Success.

image/png string (binary)

GET /v1/mail-in/cover-sheet Get the workspace's cover sheet

One page to put on top of a stack of paper, with the barcode on it.

Needs the mailin:read scope. Try it

Response

200 Success.

application/pdf string (binary)

GET /v1/mail-in/settings See your saved mail-in address

One person's own, in this workspace. Nobody else reads it.

Needs the mailin:read scope. Try it

Response

200 Success.

application/json MailInSettings

PUT /v1/mail-in/settings Save your mail-in address

Envelopes and returned paper go here when a request names no address. Null forgets it. Batches already requested keep theirs: change those one at a time.

Needs the mailin:write scope. Needs a live plan. Try it

Request body

application/json MailInSettingsInput

Response

200 Success.

application/json MailInSettings

me

DELETE /v1/me/forwarding-address Give up the chosen forwarding address

The random address keeps working. Only the chosen one stops.

Needs the documents:write scope. Try it

Response

204 Done, with no content.

POST /v1/me/forwarding-address Choose a forwarding address

Beside the random one, which keeps working. A name someone else holds is refused.

Needs the documents:write scope. Try it

Request body

application/json ForwardingAliasInput

Response

200 Success.

application/json ForwardingAlias

POST /v1/me/forwarding-address/rotate Issue a new forwarding address

The old address stops working the moment this one is issued.

Needs the documents:write scope. Try it

Response

201 Success.

application/json Me

members

GET /v1/members List the members of this workspace

Pay-adjacent fields stay empty unless the caller has members.manage.

Needs the members:read scope. Try it

Parameters

qquerystring
statusqueryACTIVE SUSPENDED
rolequeryOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json MemberPage

DELETE /v1/members/{id} Remove a member

Their expenses stay. Anyone may remove their own membership. Taking access away works on a lapsed plan.

Needs the members:write scope. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/members/{id} Get a member

Needs the members:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Member

PATCH /v1/members/{id} Change a member

Only an owner can change an owner, or make someone an owner.

Needs the members:write scope. Needs the members.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateMemberInput

Response

200 Success.

application/json Member

POST /v1/members/bulk Change many members at once

A member the rules refuse stays as they were, and the rest still change.

Needs the members:write scope. Needs the members.manage permission. Needs a live plan. Try it

Request body

application/json BulkMemberInput

Response

200 Success.

application/json BulkMemberResult

POST /v1/members/provision Provision and remove people from a list

From a request body or an https address, with a dry run. Answers with who was added, updated and removed, and who was skipped and why. A change of address needs a domain this workspace verified. SFTP is not offered.

Needs the members:write scope. Needs the members.manage permission. Try it

Request body

application/json ProvisionInput

Response

200 Success.

application/json ProvisionResult

GET /v1/members/seats See seats in use against the plan

Needs the members:read scope. Try it

Response

200 Success.

application/json SeatUsage

merchants

GET /v1/merchants List merchants

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json MerchantPage

POST /v1/merchants Create a merchant

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json CreateMerchantInput

Response

201 Success.

application/json Merchant

GET /v1/merchants/{id} Get a merchant

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Merchant

PATCH /v1/merchants/{id} Change a merchant

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json MerchantInput

Response

200 Success.

application/json Merchant

DELETE /v1/merchants/{id}/aliases/{aliasId} Remove a spelling from a merchant

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring
aliasId requiredpathstring

Response

200 Success.

application/json Merchant

POST /v1/merchants/{id}/merge Merge another merchant into this one

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json MergeMerchantInput

Response

200 Success.

application/json Merchant

mileage

POST /v1/mileage Record a trip

Needs the expenses:write scope. Needs the mileage plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CreateTripInput

Response

201 Success.

application/json Trip

PUT /v1/mileage/{id} Replace a trip

Needs the expenses:write scope. Needs the mileage plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json CreateTripInput

Response

200 Success.

application/json Trip

POST /v1/mileage/{id}/odometer-photos Attach an odometer photo to a trip

Needs the expenses:write scope. Needs the mileage plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring
clientqueryios android

The app sending the file. Leave it out in a browser.

Request body

multipart/form-data

file requiredstring (binary)
reading requiredSTART END

application/json

uploadId requiredstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

reading requiredSTART END

Response

201 Success.

application/json Trip

GET /v1/mileage/log Read the mileage log

Needs the expenses:read scope. Try it

Parameters

fromquerystring
toquerystring
scopequerymine all
ownerIdquerystring
vehicleIdquerystring
purposequerybusiness medical charity

Response

200 Success.

application/json MileageLog

GET /v1/mileage/log/export Export the mileage log

The file comes back as JSON, with its content as text.

Needs the expenses:read scope. Try it

Parameters

fromquerystring
toquerystring
scopequerymine all
ownerIdquerystring
vehicleIdquerystring
purposequerybusiness medical charity

Response

200 Success.

application/json DownloadableFile

GET /v1/mileage/routes List saved routes

Needs the expenses:read scope. Try it

Parameters

qquerystring

Response

200 Success.

application/json TripRoutes

mileage rates

GET /v1/mileage-rates List mileage rates

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json MileageRatePage

GET /v1/mileage-rates/{id} Get a mileage rate

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json MileageRate

parse

GET /v1/parse List documents turned into Markdown

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

detailsqueryboolean
tagquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ParsedDocumentPage

POST /v1/parse Turn a document into Markdown

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Tables and reading order are kept. details adds a box for each line, and meta holds pages, sharpness and OCR scores. Up to 50 pages.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
detailsboolean

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
detailsboolean

Response

201 Success.

application/json ParsedDocument

DELETE /v1/parse/{id} Delete one

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/parse/{id} Get a document as Markdown

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring
detailsqueryboolean
tagquerystring

Response

200 Success.

application/json ParsedDocument

PATCH /v1/parse/{id} Change the title, notes or tags of one

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json ParseUpdateInput

Response

200 Success.

application/json ParsedDocument

POST /v1/parse/async Turn a document into Markdown, in the background

Answers at once. document.processed says when it is done.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
detailsboolean

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
detailsboolean

Response

202 Success.

application/json ParsedDocument

parse set

GET /v1/parse-set List Markdown sets

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DocumentSetPage

POST /v1/parse-set Split a PDF and turn each document in it into Markdown

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Up to 50 MB. Answers at once.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

GET /v1/parse-set/{id} Get a Markdown set

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentSet

payment accounts

GET /v1/payment-accounts List cards and bank accounts

A member sees their own and those of the people reporting to them. Numbers are last four only.

Needs the cards:read scope. Try it

Parameters

archivedquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json PaymentAccountPage

GET /v1/payment-accounts/{id} Get a card or bank account

Needs the cards:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json PaymentAccount

GET /v1/payment-accounts/{id}/statements List a card's statement periods

Needs the cards:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json CardStatements

GET /v1/payment-accounts/export Export the card table

The file comes back as JSON, with its content as text.

Needs the cards:read scope. Try it

Response

200 Success.

application/json DownloadableFile

per diem

POST /v1/per-diem Record a per diem

Meals and lodging file as separate expenses, so each deducts at its own percentage.

Needs the expenses:write scope. Needs the per_diem plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CreatePerDiemInput

Response

201 Success.

application/json ExpenseDetails

per diem rates

GET /v1/per-diem-rates List per diem rates

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json PerDiemRatePage

GET /v1/per-diem-rates/{id} Get a per diem rate

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json PerDiemRate

personal rules

GET /v1/personal-rules List a person's rules

The caller's own, or with ownerId, an employee's. Naming someone else needs policies.manage.

Needs the rules:read scope. Try it

Parameters

ownerIdquerystring

Response

200 Success.

application/json AutomationRuleList

POST /v1/personal-rules Add a rule for a person

For the caller, or with ownerId, for an employee. It runs on what that person spends, and can set tags and billable.

Needs the rules:write scope. Needs a live plan. Try it

Request body

application/json PersonalRuleInput

Response

201 Success.

application/json AutomationRule

DELETE /v1/personal-rules/{id} Delete a person's rule

Name the person with ownerId when the rule is not the caller's.

Needs the rules:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
ownerIdquerystring

Response

204 Done, with no content.

PATCH /v1/personal-rules/{id} Change a person's rule

Name the person with ownerId when the rule is not the caller's.

Needs the rules:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json PersonalRuleInput

Response

200 Success.

application/json AutomationRule

POST /v1/personal-rules/reorder Put the caller's own rules in a new order

Needs the rules:write scope. Needs a live plan. Try it

Request body

application/json ReorderAutomationRulesInput

Response

200 Success.

application/json AutomationRuleOrder

projects

GET /v1/projects List projects

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
clientIdquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ProjectPage

POST /v1/projects Create a project

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json ProjectInput

Response

201 Success.

application/json Project

DELETE /v1/projects/{id} Delete a project

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/projects/{id} Get a project

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Project

PATCH /v1/projects/{id} Change a project

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateProjectInput

Response

200 Success.

application/json Project

POST /v1/projects/import Import projects from CSV

Send the CSV as text/plain, or as JSON with a csv field. Rows that match an existing project update it.

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json CatalogImportInput

Response

201 Success.

application/json CatalogImportResult

reference

GET /v1/reference/countries List country codes and the currency each prints

Needs the expenses:read scope. Try it

Response

200 Success.

application/json ReferenceCountryPage

GET /v1/reference/currencies List currency codes

Needs the expenses:read scope. Try it

Response

200 Success.

application/json ReferenceCurrencyPage

GET /v1/reference/locales List the locales offered in a picker

A workspace can hold any language tag; these are the usual ones.

Needs the expenses:read scope. Try it

Response

200 Success.

application/json ReferenceLocalePage

GET /v1/reference/system-categories List the categories a new workspace starts with

A workspace's own are at GET /v1/categories.

Needs the expenses:read scope. Try it

Response

200 Success.

application/json ReferenceSystemCategoryPage

release notifications

GET /v1/release-notifications List release notes

Versioned notes on what changed, newest first. Any key or token may read them, whatever its scopes.

Any API key or OAuth token can call this, whatever it holds. Try it

Parameters

productqueryapp_web api mcp model_document_extraction model_bank_statements model_checks model_fraud_detection
environmentqueryproduction sandbox
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ReleaseNotePage

report fields

GET /v1/report-fields List report fields

Needs the workspace:read scope. Try it

Response

200 Success.

application/json ReportFieldList

POST /v1/report-fields Add a report field

TEXT, DATE, LIST for a dropdown, or FORMULA.

Needs the workspace:write scope. Needs the settings.manage permission. Needs the custom_fields plan feature. Needs a live plan. Try it

Request body

application/json ReportFieldInput

Response

201 Success.

application/json ReportField

DELETE /v1/report-fields/{id} Delete a report field

Needs the workspace:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

PATCH /v1/report-fields/{id} Change a report field

Name and type stay as they were created, since reports already hold values by them.

Needs the workspace:write scope. Needs the settings.manage permission. Needs the custom_fields plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateReportFieldInput

Response

200 Success.

application/json ReportField

POST /v1/report-fields/turn-off Turn report fields off

Lists are kept and turned off, and the rest are deleted.

Needs the workspace:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Response

200 Success.

application/json ReportFieldsOff

reports

GET /v1/reports List reports

Needs the reports:read scope. Try it

Parameters

statusqueryDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED or array of DRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
scopequerymine all assigned
ownerIdquerystring
qquerystring
fromquerystring
toquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ReportPage

POST /v1/reports Create a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body (optional)

application/json CreateReportInput

Response

201 Success.

application/json ReportDetail

DELETE /v1/reports/{id} Delete a draft report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/reports/{id} Get a report

Needs the reports:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

PATCH /v1/reports/{id} Change a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateReportInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/accept-findings Accept what the receipt checks found

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/approve Approve a report

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json ApproveReportInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/close Close a report

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

GET /v1/reports/{id}/comments List comments on a report

Needs the reports:read scope. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json CommentPage

POST /v1/reports/{id}/comments Comment on a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body (optional)

application/json CommentInput

Response

201 Success.

application/json PostedComment

POST /v1/reports/{id}/comments/{commentId}/reach Reach someone a comment on this report could not

The author adds them to the report, and then they are told.

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring
commentId requiredpathstring

Request body (optional)

application/json ReachMentionedInput

Response

200 Success.

application/json Reached

GET /v1/reports/{id}/comments/mentionable List who a comment on this report can mention

Needs the reports:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json MentionablePeople

POST /v1/reports/{id}/duplicate Start a new report from this one

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json ReportDetail

POST /v1/reports/{id}/expenses Add expenses to a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json ReportExpensesInput

Response

200 Success.

application/json ReportDetail

DELETE /v1/reports/{id}/expenses/{expenseId} Take an expense off a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring
expenseId requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/expenses/{expenseId}/reject Reject one expense on a report

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring
expenseId requiredpathstring

Request body (optional)

application/json RejectExpenseInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/mark-exported Mark a report as exported

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/mark-reimbursed Mark a report as reimbursed

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/participants Add a person to a report

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json ReportParticipantInput

Response

200 Success.

application/json ReportDetail

DELETE /v1/reports/{id}/participants/{userId} Take a person off a report

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring
userId requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/reassign Hand a report to another approver

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json ReassignReportInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/reject Send a report back

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json RejectReportInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/reopen Reopen a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/retract Take a submitted report back

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json ReportDetail

POST /v1/reports/{id}/submit Submit a report

Needs the reports:write scope. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body (optional)

application/json SubmitReportInput

Response

200 Success.

application/json ReportDetail

POST /v1/reports/bulk-reassign Hand many reports to another approver

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Request body

application/json BulkReassignInput

Response

200 Success.

application/json BulkReportResult

POST /v1/reports/bulk-submit Submit many reports

Needs the reports:write scope. Needs a live plan. Try it

Request body

application/json BulkReportsInput

Response

200 Success.

application/json BulkReportResult

POST /v1/reports/mark-reimbursed Mark many reports as reimbursed

Answers 200 when all of them went through, and 207 when some did not. A report that is not approved yet, already paid or in a batch is skipped. One the caller cannot find or mark has failed.

Needs the reports:write scope. Needs a live plan. Refuses a delegate on limited access. Try it

Request body

application/json BulkReportsInput

Response

200 Success.

application/json BulkReimbursed

207 Some went through. The body says what became of each.

application/json BulkReimbursed

split

GET /v1/split List splits

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DocumentSetPage

POST /v1/split Find the documents in a PDF

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Returns page ranges and extracts nothing. Up to 250 pages and 50 MB. split_by_blank_page cuts on blank pages instead of detected boundaries.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

201 Success.

application/json DocumentSet

GET /v1/split/{id} Get a split

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentSet

POST /v1/split/async Find the documents in a PDF, in the background

Answers at once with the id. split.completed and split.created deliver the ranges, and split.failed says why not.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

split and classify

POST /v1/split-and-classify Find the documents in a PDF and say what each one is

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Each range has a type and a score, optionally from your own document_types.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

201 Success.

application/json DocumentSet

POST /v1/split-and-classify/async Find and classify the documents in a PDF, in the background

Answers at once. split.completed and split_and_classify.created deliver the same result, and split.failed and split_and_classify.failed say why not.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

tags

GET /v1/tags List tags

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json TagPage

POST /v1/tags Create a tag

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json TagInput

Response

201 Success.

application/json Tag

DELETE /v1/tags/{id} Delete a tag

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/tags/{id} Get a tag

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Tag

PATCH /v1/tags/{id} Change a tag

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateTagInput

Response

200 Success.

application/json Tag

POST /v1/tags/import Import tags from CSV

Send the CSV as text/plain, or as JSON with a csv field, with commas or tabs. Rows that match an existing tag update it. With mode=replace, what the file leaves out is deleted, or archived if something uses it. Columns: Name, Group, GL code, Color, Enabled, Depends on. A tag that depends on another goes on an expense only with that one.

Needs the expenses:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json CatalogImportInput

Response

201 Success.

application/json CatalogImportResult

tax

GET /v1/tax/summary Totals by tax line for a year

Needs the expenses:read scope. Try it

Parameters

yearqueryinteger

Response

200 Success.

application/json TaxSummary

time

POST /v1/time Record time

Needs the expenses:write scope. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CreateTimeInput

Response

201 Success.

application/json ExpenseDetail

tls certificates

GET /v1/tls-certificates List the client certificates this workspace trusts

Needs the workspace:read scope. Needs the developer.manage permission. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json ClientCertificatePage

POST /v1/tls-certificates Add a client certificate

PEM, and never a private key. Only its SHA-256 fingerprint decides anything, and adding the same one twice is one row. Mutual TLS ends at the edge, and has to be set up for this server before a workspace can require it.

Needs the workspace:write scope. Needs the developer.manage permission. Needs a live plan. Try it

Request body

application/json CreateClientCertificateInput

Response

201 Success.

application/json ClientCertificate

DELETE /v1/tls-certificates/{id} Stop trusting a client certificate

The last one cannot go while the workspace requires one.

Needs the workspace:write scope. Needs the developer.manage permission. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

transactions

GET /v1/transactions List card transactions

Needs the cards:read scope. Try it

Parameters

statequeryUNMATCHED MATCHED IGNORED EXPENSED PENDING
paymentAccountIdquerystring
paymentAccountIdsquerystring
fromquerystring
toquerystring
qquerystring
minMinorqueryinteger
maxMinorqueryinteger
missingReceiptquerystring
unreportedquerystring
currencyquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json TransactionPage

GET /v1/transactions/{id} Get a card transaction

Needs the cards:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Transaction

GET /v1/transactions/export Export card data

By date range and card, with unreported=true for lines on no report. Leave it out for all of them. The file comes back as JSON, with its content as text.

Needs the cards:read scope. Try it

Parameters

statequeryUNMATCHED MATCHED IGNORED EXPENSED PENDING
paymentAccountIdquerystring
paymentAccountIdsquerystring
fromquerystring
toquerystring
qquerystring
minMinorqueryinteger
maxMinorqueryinteger
missingReceiptquerystring
unreportedquerystring
currencyquerystring

Response

200 Success.

application/json DownloadableFile

GET /v1/transactions/reconciliation Reconcile card data for a date range

Imported, approved and what is stuck, by where it is stuck.

Needs the cards:read scope. Try it

Parameters

from requiredquerystring
to requiredquerystring
paymentAccountIdquerystring
feedquerystring
currencyquerystring

Response

200 Success.

application/json Reconciliation

GET /v1/transactions/summary Total the card transactions that match a filter

Needs the cards:read scope. Try it

Parameters

statequeryUNMATCHED MATCHED IGNORED EXPENSED PENDING
paymentAccountIdquerystring
paymentAccountIdsquerystring
fromquerystring
toquerystring
qquerystring
minMinorqueryinteger
maxMinorqueryinteger
missingReceiptquerystring
unreportedquerystring
currencyquerystring

Response

200 Success.

application/json TransactionSummary

travel

GET /v1/travel/trips List travel trips

Trips filed from itineraries, newest first. Your own, or everyone's with scope=all when your role reads everyone's expenses. Trips driven are in the mileage log.

Needs the expenses:read scope. Try it

Parameters

scopequerymine all
fromquerystring
toquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json TravelTripPage

GET /v1/travel/trips/{id} Get a travel trip

One trip, with its segments and the documents filed against it.

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json TravelTrip

uploads

POST /v1/uploads Sign an upload straight to storage

The way to send a file: its bytes do not pass through this API. Say what it is for and how big it is, PUT the file to the URL in the answer, then name the uploadId on that feature's route in place of a multipart file. The file's own bytes decide what it is. Video goes to an attachment, up to 500 MiB, and is never read.

Needs the documents:write scope. Needs a live plan. Try it

Request body

application/json CreateUploadInput

Response

201 Success.

application/json UploadTicket

vehicles

GET /v1/vehicles List vehicles

Needs the expenses:read scope. Try it

Parameters

qquerystring
archivedquerystring
userIdquerystring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json VehiclePage

GET /v1/vehicles/{id} Get a vehicle

Needs the expenses:read scope. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json Vehicle

w 8ben e

POST /v1/w-8ben-e Read a Form W-8BEN-E

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

w2s

POST /v1/w2s Read a Form W-2

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

w2s set

GET /v1/w2s-set List W-2 sets

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json DocumentSetPage

POST /v1/w2s-set Split a PDF of W-2s and read each one

Multipart with a field named file, or JSON with uploadId, file_url or file_data. Up to 100 pages and 50 MB. Answers at once. w2_set.created says when every form is read, and w2_set.failed why not. Social security and employer numbers are masked in every view.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

multipart/form-data

file requiredstring (binary)
split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
external_idstring

application/json

Name the file with one of uploadId, file_url or file_data.

uploadIdstring

From POST /v1/uploads, once the file has been sent to the URL it answered with.

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring

A public https address to fetch the file from. Redirects are not followed.

file_datastring

The file itself in base64, raw or as a data URI.

file_namestring

What to call a file sent as file_url or file_data.

external_idstring

Response

202 Success.

application/json DocumentSet

GET /v1/w2s-set/{id} Get a W-2 set

Needs the documents:read scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json DocumentSet

w9s

POST /v1/w9s Read a Form W-9

POST /v1/documents/url with the type fixed: the same body, wait and answer. Bank and tax numbers are masked; POST /v1/documents/{id}/reveal opens them.

Needs the documents:write scope. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json SubmitDocumentInput

Response

201 Success.

application/json DocumentUpload

202 Accepted. The document is still being read.

application/json DocumentUpload

webhooks

GET /v1/webhooks List webhook endpoints

Pending and confirmed alike. Endpoints that belong to one API key are left out unless you ask: send apiKeyId for one key, or include=keys for all of them.

Needs the webhooks:manage scope. Needs the developer.manage permission. Try it

Parameters

apiKeyIdquerystring
includequerykeys
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json WebhookEndpointPage

POST /v1/webhooks Add a webhook endpoint

Step one of the handshake. The URL must be public https, and not on papertotal.com. The endpoint starts PENDING, and PaperTotal sends it one signed subscription event holding a one-time token in data.token. Confirm it with POST /v1/webhooks/confirm within a day. Until then it receives nothing else, and after that it is deleted. An address on hooks.zapier.com is confirmed at once, because a catch hook cannot run a handshake. Send apiKeyId to make this one key's own endpoint: documents that key submits report here and not to the workspace's endpoints, it takes document events only, and a key has one. Changing the URL later goes through the handshake again. The signing secret is in this response and the rotate response, and nowhere else.

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Request body

application/json CreateWebhookInput

Response

201 Success.

application/json WebhookEndpointWithSecret

DELETE /v1/webhooks/{id} Delete a webhook endpoint

Needs the webhooks:manage scope. Needs the developer.manage permission. Try it

Parameters

id requiredpathstring

Response

204 Done, with no content.

GET /v1/webhooks/{id} Get a webhook endpoint

Needs the webhooks:manage scope. Needs the developer.manage permission. Try it

Parameters

id requiredpathstring

Response

200 Success.

application/json WebhookEndpoint

PATCH /v1/webhooks/{id} Change a webhook endpoint

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Request body

application/json UpdateWebhookInput

Response

200 Success.

application/json WebhookEndpoint

GET /v1/webhooks/{id}/deliveries List an endpoint's deliveries

Needs the webhooks:manage scope. Needs the developer.manage permission. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json WebhookDeliveryPage

POST /v1/webhooks/{id}/rotate-secret Issue a new signing secret

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json WebhookEndpointWithSecret

POST /v1/webhooks/{id}/test Send a test event

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json WebhookDelivery

POST /v1/webhooks/confirm Confirm a webhook endpoint

Step three of the handshake. Send the token from the subscription event that went to the address. It works once, and expires after a day.

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Request body

application/json ConfirmWebhookInput

Response

200 Success.

application/json WebhookEndpoint

POST /v1/webhooks/deliveries/{id}/retry Send a delivery again

Needs the webhooks:manage scope. Needs the developer.manage permission. Needs the developer_api plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring

Response

201 Success.

application/json WebhookDelivery

workflows

GET /v1/workflows/{id}/runs List a workflow's runs

Needs the documents:read scope. Needs the settings.manage permission. Try it

Parameters

id requiredpathstring
limitqueryinteger
cursorquerystring

Response

200 Success.

application/json WorkflowRunPage

POST /v1/workflows/{id}/runs Start a run

Sends a file named by uploadId from POST /v1/uploads, or documents already in this workspace, to the workflow's API import. nodeId starts it at another input instead: a Document aggregator gathers what has come in, and Business insights runs its query. An upload, or an Idempotency-Key, makes a repeat answer with the first run.

Needs the documents:write scope. Needs the settings.manage permission. Needs the automation_rules plan feature. Needs a live plan. Try it

Parameters

id requiredpathstring
Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body (optional)

application/json StartWorkflowRunInput

Response

201 Success.

application/json WorkflowRunSummary

GET /v1/workflows/{id}/runs/{runId} Get a run and each of its steps

Each step says what happened. A file comes with a signed link that lasts 15 minutes, and an approval says who was asked and who answered.

Needs the documents:read scope. Needs the settings.manage permission. Try it

Parameters

id requiredpathstring
runId requiredpathstring

Response

200 Success.

application/json WorkflowRun

workspace

DELETE /v1/workspace Close this workspace

Needs the workspace:delete scope, which no preset holds, on a key an owner made. Send the name of the workspace to confirm. Its data is purged after the grace period.

Needs the workspace:delete scope. Needs the workspace.delete permission. Try it

Request body

application/json CloseWorkspaceInput

Response

200 Success.

application/json WorkspaceClosed

GET /v1/workspace Get this workspace, its plan and its usage

Needs the workspace:read scope. Try it

Response

200 Success.

application/json Workspace

PATCH /v1/workspace Change this workspace

Needs the workspace:write scope. Needs the settings.manage permission. Needs a live plan. Try it

Request body

application/json UpdateWorkspaceInput

Response

200 Success.

application/json Workspace

GET /v1/workspace/counts Count what is waiting on the caller

Needs the workspace:read scope. Try it

Response

200 Success.

application/json WorkspaceCounts

workspaces

GET /v1/workspaces List the workspaces this credential reaches

A key or an app is bound to one workspace, so it lists that one. A person lists all of theirs.

Needs the workspace:read scope. Try it

Parameters

limitqueryinteger
cursorquerystring

Response

200 Success.

application/json WorkspacePage

POST /v1/workspaces Create a workspace

The caller's person owns it. It starts with what their one trial has left, or with no plan: reading and exporting work, and capture waits on a plan. A plan cannot be bought by an API call, so naming one returns the billing link where a person pays for it. A key stays bound to its own workspace, so the new one needs a key of its own.

Needs the workspace:write scope. Try it

Parameters

Idempotency-Keyheaderstring

Replaying a key returns the first record instead of creating, and charging for, a second. While the first request is still running, a retry answers 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After, and is not charged. The same key on a different request answers 409 IDEMPOTENCY_CONFLICT.

Request body

application/json CreateWorkspaceInput

Response

201 Success.

application/json WorkspaceCreated

Webhook events

Answer with any 2xx within 10 seconds. A 410 turns the endpoint off. Anything else is retried with exponential backoff, 8 attempts over about 24 hours. Redirects are not followed. Delivery is at least once, so use the event id to ignore repeats.

X-PaperTotal-Signature HMAC-SHA256 of "<t>.<body>" with the endpoint's signing secret, in hex, sent as t=<unix seconds>,v1=<hex>. Compute it over the raw bytes, and refuse a timestamp more than five minutes old.

X-PaperTotal-Event The event type.

Each one posts WebhookEventPayload.

Schemas

TravelTripListQuery

scopemine all
fromstring
tostring

CreateClientCertificateInput

name requiredstring
certificate requiredstring

ReleaseNotificationQuery

productapp_web api mcp model_document_extraction model_bank_statements model_checks model_fraud_detection
environmentproduction sandbox

CreateAttachmentInput

uploadId requiredstring

CreateUploadInput

filename requiredstring
contentType requiredstring
sizeBytes requiredinteger
purpose requireddocument document_set expense_receipt odometer_photo policy_document statement attachment catalog_import iif_lists people_list profile_photo
clientIdstring

ExportRecordInput

documentIds requiredarray of string
target requiredstring
externalIdstring

ExportRecordQuery

documentIdstring
targetstring
externalIdstring
viaEXPORT SYNC API

DocumentReadQuery

bounding_boxesboolean
confidence_detailsboolean
detailedboolean
with_scoresboolean

DocumentTagInput

name requiredstring

DocumentTagsInput

tags requiredarray of string

ExpenseLineInput

description requiredstring
skustring or null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
categoryIdstring,null

ExpenseTaxLineInput

namestring or null
codestring or null
ratePctnumber or null
baseMinorinteger or null
amountMinor requiredinteger

UpdateExpenseLineInput

descriptionstring
skustring or null
quantitynumber,null
unitPriceMinorinteger or null
amountMinorinteger
taxMinorinteger or null
categoryIdstring,null

UpdateExpenseTaxLineInput

namestring or null
codestring or null
ratePctnumber or null
baseMinorinteger or null
amountMinorinteger

CategoryImportQuery

modemerge replace

CloseWorkspaceInput

confirmName requiredstring

ProvisionInput

employeesarray of object
Fields
employeeEmail requiredstring (email)
managerEmailstring (email)
employeeIDstring
policyIDstring
approvalLimitinteger
overLimitApproverstring (email)
workerStatusstring
isTerminatedboolean
domainGroupIDstring
approvesTostring (email)
rolestring
additionalPolicyIDsarray of string
defaultTagsarray of string
firstNamestring
lastNamestring
customField1string
customField2string
payrollCodestring
titlestring
departmentstring
costCenterstring
officeLocationstring
legalEntitystring
workerTypestring
urlstring (uri)
dryRunboolean
shouldFixApprovalChainsboolean
removeMissingboolean

AutomationPreviewInput

conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match

AutomationRuleInput

name requiredstring
enabledboolean
conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actions requiredobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
Fields
input requiredstring
output requiredstring
fallback requiredobject or object or object
Fields
action requirednone

BulkMemberInput

ids requiredarray of string
roleOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
statusACTIVE SUSPENDED
managerIdstring,null

CreateInvitationInput

email requiredstring (email)
namestring
roleOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
messagestring

ChangeMailInAddressInput

shippingAddress requiredobject
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring

MailInSettingsInput

address requiredobject or null
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring

CreateMailInInput

envelopesinteger
expectedDocuments requiredinteger
afterScanRETURN SHRED
shippingAddressobject
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring
folderIdstring,null
notesstring or null

CreateWorkspaceInput

name requiredstring
baseCurrencystring
countrystring
timezonestring
copyFromIdstring
copySectionsarray of categories tags customFields reportFields distanceRates perDiem workflows rules merchantRules policies members accountingConnection overview
planSTARTER PRO BUSINESS
intervalMONTH YEAR

InvitationListQuery

statusPENDING EXPIRED ACCEPTED REVOKED

MemberListQuery

qstring
statusACTIVE SUSPENDED
roleOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN

PaymentAccountListQuery

archivedstring

PersonalRuleInput

name requiredstring
enabledboolean
merchantContains requiredstring
actions requiredobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
Fields
input requiredstring
output requiredstring
fallback requiredobject or object or object
Fields
action requirednone
ownerIdstring

PersonalRuleQuery

ownerIdstring

ReconciliationQuery

from requiredstring
to requiredstring
paymentAccountIdstring
feedstring
currencystring

ReorderAutomationRulesInput

ids requiredarray of string

RulesDocument

format requiredpapertotal.rules
version required1
exportedAtstring
rules requiredarray of object
Fields
name requiredstring
enabledboolean
conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actions requiredobject
Fields
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
postToBookstrue
cleararray of categoryId tagIds taxMinor
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
fallback requiredobject or object or object
categorystring
projectstring
clientstring
vendorstring
tagsarray of object
Fields
name requiredstring
groupstring or null

ReportFieldInput

name requiredstring
type requiredTEXT DATE LIST FORMULA
optionsarray of string
formulastring or null
requiredboolean
enabledboolean
positioninteger

SyncRecordQuery

statePENDING SYNCED FAILED SKIPPED VOIDED

TransactionListQuery

stateUNMATCHED MATCHED IGNORED EXPENSED PENDING
paymentAccountIdstring
paymentAccountIdsstring
fromstring
tostring
qstring
minMinorinteger
maxMinorinteger
missingReceiptstring
unreportedstring
currencystring

UpdateAutomationRuleInput

namestring
enabledboolean
conditionsarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actionsobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
Fields
input requiredstring
output requiredstring
fallback requiredobject or object or object
Fields
action requirednone

UpdateMemberInput

roleOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
statusACTIVE SUSPENDED
developerboolean
managerIdstring,null
titlestring or null
departmentstring or null
employeeIdstring or null
approvalLimitMinorinteger or null
overLimitApproverIdstring,null
forwardToIdstring,null
workerStatusstring or null
defaultTagsarray of string
customField1string or null
customField2string or null
payrollCodestring or null
legalEntitystring or null
tierstring or null
officeLocationstring or null
costCenterstring or null
accountingCodestring or null
workerTypestring or null

UpdateReportFieldInput

optionsarray of string
formulastring or null
requiredboolean
enabledboolean
positioninteger
disabledOptionsarray of string

UpdateWorkspaceInput

namestring
baseCurrencystring
countrystring
timezonestring
fiscalYearStartMonthinteger
distanceUnitmi km
retentionDaysinteger or null
callLogRetentionDaysinteger or null
readingModelstandard rules_only always_second_reading
localestring or null
showDefaultCategoriesboolean
shredDocumentsboolean
vatBasisPointsinteger or null
reimbursableTrackingboolean
calculateMissingTaxboolean
dateFormatYYYY-MM-DD MM/DD/YYYY DD/MM/YYYY DD.MM.YYYY MMM D, YYYY

ForwardingAliasInput

alias requiredstring

UploadSourceQuery

clientios android

The app sending the file. Leave it out in a browser.

AnyDocumentInput

file_urlstring
file_datastring
file_namestring
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
blueprint_name requiredstring
blueprint_versioninteger
max_pages_to_processinteger

BatchDocumentsInput

file_urls requiredarray of string
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
external_idstring

BlueprintListQuery

documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT

BlueprintVersionQuery

versioninteger

ClassifyDocumentInput

file_urlstring
file_datastring
file_namestring
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

CreateBlueprintInput

name requiredstring
title requiredstring
descriptionstring
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
schema requiredobject
Fields
type requiredobject
descriptionstring
properties required__schema0
fieldsarray of object
Fields
path requiredstring
labelstring
examplestring
boxobject
Fields
page requiredinteger
x requirednumber
y requirednumber
width requirednumber
height requirednumber

CropDocumentInput

pageinteger
x requirednumber
y requirednumber
width requirednumber
height requirednumber

ExtractDocumentInput

file_urlstring
file_datastring
file_namestring
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
document_typesarray of string

ParseDocumentInput

file_urlstring
file_datastring
file_namestring
external_idstring
asyncboolean
tagsarray of string
auto_deleteboolean
detailsboolean

ParseQuery

detailsboolean
tagstring

ParseUpdateInput

titlestring or null
notesstring or null
tagsarray of string

RotateDocumentInput

pageinteger
degrees90 or 180 or 270 or -90

SettleDuplicatesInput

object or object

keep requiredall
othersarray of string

SplitDocumentInput

mode requiredevery_page custom detect blank_pages
rangesstring

SplitOptions

split_by_blank_pageboolean
every_pageboolean
rangesstring
document_typesarray of string
blueprint_namestring
file_urlstring
file_datastring
file_namestring
external_idstring

SplitUploadInput

uploadId requiredstring
modeevery_page custom detect blank_pages
rangesstring

UpdateBlueprintInput

titlestring
descriptionstring or null
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
schemaobject
Fields
type requiredobject
descriptionstring
properties required__schema0
fieldsarray of object
Fields
path requiredstring
labelstring
examplestring
boxobject
Fields
page requiredinteger
x requirednumber
y requirednumber
width requirednumber
height requirednumber

StartWorkflowRunInput

uploadIdstring
documentIdsarray of string
nodeIdstring

AnalyticsQuery

statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
limitinteger
intervalday week month quarter year running
groupCurrencystring

ApproveReportInput

commentstring
heldmove approve
bypassboolean
expectedTotalMinorinteger

AttachReceiptInput

modeadd replace
clientIdstring
deviceIdstring

BulkDocumentInput

idsarray of string
filterobject
Fields
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
statusUPLOADED PROCESSING PROCESSED FAILED
sourceWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
source_idstring
external_idstring
blueprint_namestring
ownerstring
device_idstring
device_user_uuidstring
viewedboolean
trashedboolean
envelopestring
created__gtstring or string (date-time)
created__gtestring or string (date-time)
created__ltstring or string (date-time)
created__ltestring or string (date-time)
updated__gtstring or string (date-time)
updated__gtestring or string (date-time)
updated__ltstring or string (date-time)
updated__ltestring or string (date-time)
issuedstring
issued__gtstring
issued__gtestring
issued__ltstring
issued__ltestring
totalinteger
total__gtinteger
total__gteinteger
total__ltinteger
total__lteinteger
taxinteger
tax__gtinteger
tax__gteinteger
tax__ltinteger
tax__lteinteger
currencystring
categorystring
vendorstring
notesstring
payment_typeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
last_four_digitsstring
first_namestring
last_namestring
work_phonestring
cell_phonestring
companystring
emailstring
websitestring
countrystring
statestring
citystring
zipstring
namestring
is_emptystring
order_bycreated updated issued total tax -created -updated -issued -total -tax
folderIdstring
mailInBatchIdstring
setIdstring
externalIdstring
tagstring
archivedboolean
unviewedboolean
qstring
fromstring
tostring
fraudColorGREEN YELLOW RED
fraudSignaldigital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
fraudReviewPENDING FRAUD NOT_FRAUD UNKNOWN
cursorstring
action requiredobject or object or object or object
Fields
type requiredmove
folderId requiredstring,null

TrashActionInput

idsarray of string
allboolean
action requiredrestore purge

BulkExpenseInput

ids requiredarray of string
action requiredobject or object or object or object or object or object or object or object or object
Fields
type requiredset_category
categoryId requiredstring,null

BulkReassignInput

reportIds requiredarray of string
approverId requiredstring
modereplace insert

BulkReportsInput

reportIds requiredarray of string

CatalogImportInput

csv requiredstring

CatalogQuery

qstring
archivedstring

CategoryInput

name requiredstring
parentIdstring,null
glCodestring or null
taxLinestring or null
deductiblePctinteger
enabledboolean
positioninteger
typeEXPENSE COGS INCOME REFUND
payrollCodestring or null
descriptionHintstring or null
approverIdstring,null
commentRequiredboolean
maxExpenseMinorinteger or null
headerOnlyboolean

CategoryQuery

qstring
enabledstring
typeEXPENSE COGS INCOME REFUND
originSYSTEM CUSTOM ACCOUNTING
headersstring

CommentInput

bodystring
mentionsarray of string
attachmentIdsarray of string

ContactExportInput

format requiredvcard google outlook csv
idsarray of string

ContactListQuery

qstring
documentIdstring
namestring
companystring
emailstring
phonestring
websitestring
citystring
regionstring
postalCodestring
countrystring

CreateDocumentInput

tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
clientIdstring
externalIdstring
folderIdstring
notesstring
capturedAtstring (date-time)
latitudenumber
longitudenumber
locationAccuracyMnumber
deviceIdstring
merchantNamestring
datestring
totalMinorinteger
taxMinorinteger
categorystring

CreateExpenseInput

merchantNamestring,null
descriptionstring or null
notesstring or null
date requiredstring
currencystring
amountMinor requiredinteger
subtotalMinorinteger or null
taxMinorinteger or null
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
baseAmountMinorinteger or null
fxRatenumber or null
categoryIdstring,null
projectIdstring,null
clientIdstring,null
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
paymentAccountIdstring,null
cardLast4string or null
invoiceNumberstring or null
poNumberstring or null
dueDatestring or null
mccstring or null
taxDeductibleboolean
moneyFlowIN OUT
alsoCategoryIdsarray of string
tagIdsarray of string
attendeesarray of object
Fields
name requiredstring
emailstring (email)
phonestring
customFieldsmap of any
linesarray of object
Fields
description requiredstring
skustring or null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
categoryIdstring,null
kindMANUAL MILEAGE PER_DIEM TIME
quantitynumber
rateMinorinteger
unitstring
tripmap of any
vehicleIdstring
externalIdstring
ownerIdstring
reportIdstring

CreateExportInput

kind requiredexpenses report tax mileage receipts documents
format requiredCSV XLSX PDF ZIP QBO_CSV XERO_CSV SAGE_CSV DYNAMICS_CSV MYOB_TXT ORACLE_CSV SAP_CSV IIF OFX JSON XML TXT XLS
filtersobject
Fields
statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
idsarray of string
yearinteger
reportStateDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED or array of DRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
reportIdsarray of string
startDatestring
endDatestring
approvedAfterstring
exportedboolean
categoryIdsarray of string
documentIdsarray of string
documentTypesarray of RECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
policyIdsarray of string
templateIdstring
fullPageReceiptsboolean
templatestring
onFinishobject
Fields
emailobject
Fields
recipients requiredarray of string (email)
messagestring
markAsExportedboolean
sftpUploadobject
Fields
host requiredstring
portinteger
username requiredstring
passwordstring
privateKeystring
passphrasestring
hostKeySha256 requiredstring
pathstring
delimiter, ; |
bomboolean
recipientsarray of string (email)
columnSetsimple detailed
presetbasic all_data_expense all_data_report canadian_multiple_tax category per_diem tag tax_report
viewobject
Fields
levelexpense report
columns requiredarray of object
Fields
key requiredstring
labelstring
sortdate:asc date:desc merchant:asc merchant:desc category:asc category:desc status:asc status:desc amount:asc amount:desc
groupBycategory merchant member project status month
groupsOnlyboolean

CreateMerchantInput

name requiredstring
defaultCategoryIdstring,null
websitestring or null
phonestring or null
addressstring or null
taxIdstring or null
is1099boolean
merchantTypeairline lodging car_rental ground_transport fuel dining grocery office software utilities supplies other or null

CreatePerDiemInput

perDiemRateIdstring
mieRateIdstring
subRatesarray of object
Fields
rateId requiredstring
quantity requiredinteger
lodgingRateIdstring
startDate requiredstring
endDate requiredstring
startTimestring
endTimestring
partialDaysboolean
destinationstring
descriptionstring or null
mealsCategoryIdstring or null
tagIdsarray of string
categoryIdstring or null
projectIdstring or null
clientIdstring or null
billableboolean
reimbursableboolean
notesstring or null

CreateReportInput

titlestring
purposestring or null
currencystring
expenseIdsarray of string
ownerIdstring

CreateTimeInput

date requiredstring
hours requirednumber
rateMinor requiredinteger
currencystring
description requiredstring
categoryIdstring or null
projectIdstring or null
clientIdstring or null
billableboolean
reimbursableboolean
notesstring or null

CreateTripInput

date requiredstring
distancenumber
odometerStartnumber
odometerEndnumber
routeDistancenumber or null
roundTripboolean
origin requiredstring
destination requiredstring
stopsarray of string
departedstring or null
arrivedstring or null
purpose requiredstring
vehicleIdstring or null
rateIdstring or null
routeTokenstring or null
categoryIdstring or null
projectIdstring or null
clientIdstring or null
billableboolean
reimbursableboolean
notesstring or null

CreateWebhookInput

url requiredstring
descriptionstring
events requiredarray of document.created document.processed document.failed document.enriched document.enrichment_failed document_set.completed document_set.failed split.completed split.created split.failed split_and_classify.created split_and_classify.failed w2_set.created w2_set.failed bank_statement_set.created bank_statement_set.failed expense.created expense.updated expense.deleted report.submitted report.approved report.rejected report.reimbursed integration.posted integration.failed
apiKeyIdstring

ConfirmWebhookInput

token requiredstring

WebhookListQuery

apiKeyIdstring
includekeys

DocumentListQuery

typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
statusUPLOADED PROCESSING PROCESSED FAILED
sourceWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
source_idstring
external_idstring
blueprint_namestring
ownerstring
device_idstring
device_user_uuidstring
viewedboolean
trashedboolean
envelopestring
created__gtstring or string (date-time)
created__gtestring or string (date-time)
created__ltstring or string (date-time)
created__ltestring or string (date-time)
updated__gtstring or string (date-time)
updated__gtestring or string (date-time)
updated__ltstring or string (date-time)
updated__ltestring or string (date-time)
issuedstring
issued__gtstring
issued__gtestring
issued__ltstring
issued__ltestring
totalinteger
total__gtinteger
total__gteinteger
total__ltinteger
total__lteinteger
taxinteger
tax__gtinteger
tax__gteinteger
tax__ltinteger
tax__lteinteger
currencystring
categorystring
vendorstring
notesstring
payment_typeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
last_four_digitsstring
first_namestring
last_namestring
work_phonestring
cell_phonestring
companystring
emailstring
websitestring
countrystring
statestring
citystring
zipstring
namestring
is_emptystring
order_bycreated updated issued total tax -created -updated -issued -total -tax
folderIdstring
mailInBatchIdstring
setIdstring
externalIdstring
tagstring
archivedboolean
unviewedboolean
qstring
fromstring
tostring
fraudColorGREEN YELLOW RED
fraudSignaldigital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
fraudReviewPENDING FRAUD NOT_FRAUD UNKNOWN

ExpenseListPageQuery

statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
sortdate:asc date:desc merchant:asc merchant:desc category:asc category:desc status:asc status:desc amount:asc amount:desc

ExpenseTotalsQuery

statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
idsstring or array of string
currencystring

FolderInput

name requiredstring
parentIdstring,null

FolderQuery

qstring
parentIdstring

DismissFlagInput

reasonstring

HoldExpenseInput

reason requiredstring

ReachMentionedInput

userIds requiredarray of string

MergeMerchantInput

intoId requiredstring

MerchantInput

namestring
defaultCategoryIdstring,null
websitestring or null
phonestring or null
addressstring or null
taxIdstring or null
is1099boolean
merchantTypeairline lodging car_rental ground_transport fuel dining grocery office software utilities supplies other or null

MileageLogQuery

fromstring
tostring
scopemine all
ownerIdstring
vehicleIdstring
purposebusiness medical charity

OdometerPhotoInput

reading requiredSTART END

ProjectInput

name requiredstring
codestring or null
clientIdstring,null
budgetMinorinteger or null
archivedboolean

ProjectQuery

qstring
archivedstring
clientIdstring

ReassignReportInput

approverId requiredstring
modereplace insert

RejectExpenseInput

reason requiredstring

RejectReportInput

reason requiredstring
tostring

ReportExpensesInput

ids requiredarray of string

ReportListQuery

statusDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED or array of DRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
scopemine all assigned
ownerIdstring
qstring
fromstring
tostring

ReportParticipantInput

userId requiredstring

SubmitReportInput

memostring
ccarray of string
tostring
ccEmailsarray of string (email)
attachPdfboolean
approverEmailstring (email)

SubmitDocumentInput

tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
file_urlstring
file_urlsarray of string
file_datastring
file_namestring
external_idstring
device_idstring
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
bucketstring
package_pathstring

TagInput

name requiredstring
groupNamestring or null
glCodestring or null
colorstring or null
archivedboolean
approverIdstring or null
parentIdstring or null

TaxSummaryQuery

yearinteger

TripRouteQuery

qstring

UpdateCategoryInput

namestring
parentIdstring,null
glCodestring or null
taxLinestring or null
deductiblePctinteger
enabledboolean
positioninteger
typeEXPENSE COGS INCOME REFUND
payrollCodestring or null
descriptionHintstring or null
approverIdstring,null
commentRequiredboolean
maxExpenseMinorinteger or null
headerOnlyboolean

UpdateDocumentInput

typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
folderIdstring,null
titlestring or null
notesstring or null
tagsarray of string
statusPROCESSED REVIEWED
approvedboolean
fraudReviewobject
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
typesarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
notestring
billableboolean
merchantNamestring or null
totalMinorinteger
subtotalMinorinteger or null
taxMinorinteger or null
tipMinorinteger or null
customFieldsmap of string or array of string or null
correctionsmap of string or null

UpdateExpenseInput

merchantNamestring,null
descriptionstring or null
notesstring or null
datestring
currencystring
amountMinorinteger
subtotalMinorinteger or null
taxMinorinteger or null
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
baseAmountMinorinteger or null
fxRatenumber or null
categoryIdstring,null
projectIdstring,null
clientIdstring,null
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
paymentAccountIdstring,null
cardLast4string or null
invoiceNumberstring or null
poNumberstring or null
dueDatestring or null
mccstring or null
taxDeductibleboolean
moneyFlowIN OUT
alsoCategoryIdsarray of string
tagIdsarray of string
attendeesarray of object
Fields
name requiredstring
emailstring (email)
phonestring
customFieldsmap of any
linesarray of object
Fields
description requiredstring
skustring or null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
categoryIdstring,null

UpdateFolderInput

namestring
parentIdstring,null

UpdateProjectInput

namestring
codestring or null
clientIdstring,null
budgetMinorinteger or null
archivedboolean

UpdateReportInput

titlestring
purposestring or null
currencystring
fieldsmap of string or null

UpdateTagInput

namestring
groupNamestring or null
glCodestring or null
colorstring or null
archivedboolean
approverIdstring or null
parentIdstring or null

UpdateWebhookInput

urlstring
descriptionstring or null
eventsarray of document.created document.processed document.failed document.enriched document.enrichment_failed document_set.completed document_set.failed split.completed split.created split.failed split_and_classify.created split_and_classify.failed w2_set.created w2_set.failed bank_statement_set.created bank_statement_set.failed expense.created expense.updated expense.deleted report.submitted report.approved report.rejected report.reimbursed integration.posted integration.failed
enabledboolean

VehicleQuery

qstring
archivedstring
userIdstring

BlockDeviceInput

deviceId requiredstring
reasonstring

FraudReviewInput

decision requiredFRAUD NOT_FRAUD UNKNOWN
typesarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
notestring

RevealDocumentInput

kindsarray of ROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
reasonstring

CheckWithDocumentInput

check requiredobject
Fields
tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
file_urlstring
file_urlsarray of string
file_datastring
file_namestring
external_idstring
device_idstring
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
bucketstring
package_pathstring
document requiredobject
Fields
tagsarray of string
categoriesarray of string
taxonomyarray of string
allowed_async_enrichmentsarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
bounding_boxesboolean
confidence_detailsboolean
computeboolean
parse_addressboolean
countrystring
max_pages_to_processinteger
boost_modeboolean
auto_deleteboolean
stitchboolean
crop_documentboolean
blueprint_namestring
blueprint_versioninteger
asyncboolean
line_item_expansionboolean
tiff_dpinumber
file_urlstring
file_urlsarray of string
file_datastring
file_namestring
external_idstring
device_idstring
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
bucketstring
package_pathstring

BillingInvoicePage

data requiredarray of object
Fields
id requiredstring
number requiredstring,null
status requiredstring,null
currency requiredstring
totalMinor requirednumber
amountPaidMinor requirednumber
amountDueMinor requirednumber
createdAt requiredstring
periodStart requiredstring,null
periodEnd requiredstring,null
hostedUrl requiredstring,null

Stripe's page for the invoice.

pdfUrl requiredstring,null

Stripe's PDF of it.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExportRecordPage

data requiredarray of object
Fields
id requiredstring
documentId requiredstring,null
expenseId requiredstring,null
target requiredstring

A service, such as QUICKBOOKS_ONLINE, a file format, such as CSV, or what a program named.

externalId requiredstring,null

The id it has there.

exportJobId requiredstring,null
via requiredEXPORT SYNC API
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExportRecordsAppended

data requiredarray of object
Fields
id requiredstring
documentId requiredstring,null
expenseId requiredstring,null
target requiredstring

A service, such as QUICKBOOKS_ONLINE, a file format, such as CSV, or what a program named.

externalId requiredstring,null

The id it has there.

exportJobId requiredstring,null
via requiredEXPORT SYNC API
createdAt requiredstring
alreadyRecorded requirednumber

Already recorded, so left as they were.

DocumentDetail

id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
Fields
namestring,null
ratePctnumber,null
amountMinor requiredinteger
orderinteger or null
baseMinorinteger or null
codestring,null
totalInclusiveboolean,null
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
Fields
description requiredstring
skustring,null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
idstring,null
orderinteger or null
textstring,null
typeroom tax parking service fee delivery product food alcohol tobacco transportation fuel refund discount payment giftcard donation toll lottery or null
fullDescriptionstring,null
normalizedDescriptionstring,null
sectionstring,null
referencestring,null
upcstring,null
hsnstring,null
lotstring,null
tagsarray of string or null
unitOfMeasurestring,null
discountMinorinteger or null
discountRatePctnumber,null
discountPriceMinorinteger or null
taxRatePctnumber,null
taxCodestring,null
subtotalMinorinteger or null
grossTotalMinorinteger or null
netTotalMinorinteger or null
datestring or null
startDatestring or null
endDatestring or null
categorystring,null
customCategoriesarray of string or null
customFieldsmap of any or null
countryOfOriginstring,null
manufacturerstring,null
weightstring,null
brandstring,null
hsaFsaEligibleboolean,null
productInfoobject or null
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
vendorsarray of object or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
bankBreakdownarray of object or null
Fields
accountNamestring,null
accountNumberstring,null
accountCurrencystring,null
bankNamestring,null
bankNamesarray of string or null
bankAddressstring,null
bankAddressesarray of string or null
bankNumberstring,null
bankNumbersarray of string or null
bankSwiftstring,null
ibanstring,null
billerCodestring,null
billToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
vatNumberstring,null
regNumberstring,null
phoneNumberstring,null
emailstring,null
shipToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
Fields
cardNumberstring,null
displayNamestring,null
termsstring,null
typenone visa master_card cash american_express interac other maestro discover bancontact girocard applepay paypal bancomat giftcard card check bankaxept bank-to-bank_transfer_bacs octopus pix jcb waon mada wechat alipay unionpay googlepay rupay bpay shopeepay mir giropay food_stamp diners_club paypay or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
Fields
data requiredstring
type requiredQR_CODE PDF417 EAN_13 EAN_8 UPC_A UPC_E CODE_128 CODE_39 ITF DATA_MATRIX AZTEC OTHER
page requiredinteger
boundingRegionarray of number or null
paymentLinksarray of object or null
Fields
url requiredstring
source requiredtext hyperlink qr_code barcode
folioobject or null
Fields
arrivalDatestring or null
departureDatestring or null
roomNumberstring,null
guestNamestring,null
nightsinteger or null
confirmationNumberstring,null
enrichedFieldsarray of string or null
checkobject or null
Fields
amountMinorinteger or null
amountTextstring,null
amountsAgreeboolean,null
bankNamestring,null
bankAddressstring,null
checkNumberstring,null
checkTypebank_draft bill_pay_draft business_check cashiers_check government_check money_order personal_check starter_check teller_check or null
currencystring or null
datestring or null
memostring,null
payerNamestring,null
payerAddressstring,null
receiverNamestring,null
receiverAddressstring,null
isSignedboolean,null
endorsementobject or null
microbject or null
fractionalRoutingNumberstring,null
routingFromFractionalstring,null
voidTermsstring,null
statementobject or null
Fields
accountHolderNamestring,null
accountHolderAddressstring,null
accountTypestring,null
accountNumberstring,null
bankNamestring,null
bankAddressstring,null
bankWebsitestring,null
bankVatNumberstring,null
accountVatNumberstring,null
periodStartDatestring or null
periodEndDatestring or null
statementDatestring or null
statementNumberstring,null
currencystring or null
beginningBalanceMinorinteger or null
endingBalanceMinorinteger or null
minimumDueMinorinteger or null
dueDatestring or null
routingNumberstring,null
swiftstring,null
ibanstring,null
accountsarray of object
balancesAgreeboolean,null
taxFormobject or null
Fields
kind requiredW2 W9 W8BEN_E
w2object or null
w9object or null
w8BenEmap of string,boolean,null or null
itineraryobject or null
Fields
travelerNamestring,null
bookingReferencestring,null
originstring,null
destinationstring,null
departsOnstring or null
returnsOnstring or null
segmentsarray of object
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
Fields
page requirednumber
before requiredstring,null
after requiredstring,null
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject
Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null
Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

readingobject or null

Null when nothing has been read yet.

Fields
linesarray of object

With bounding_boxes: every line read, with where it is.

Fields
text requiredstring
confidence requirednumber
boxtuple

[x, y, width, height] in pixels of the page.

quadarray of number

The four corners as x, y pairs, for a line read at an angle.

page requirednumber
fieldDetailmap of any

With confidence_details: where each field was read from and how sure the read was.

detailedany

With detailed: the reading with each field wrapped as value, score, ocrScore, rotation, boundingBox, boundingRegion and enriched.

lineItemsWithScoresarray of map of any

With with_scores: the same lines, with a value and its confidence on every sub-field.

taxLinesWithScoresarray of map of any

With with_scores: the same tax lines, with a value and its confidence on every sub-field.

DocumentTagList

data requiredarray of object
Fields
id requiredstring
name requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExpenseLine

id requiredstring
position requirednumber
description requiredstring
sku requiredstring,null
quantity requirednumber,null
unitPriceMinor requirednumber,null
amountMinor requirednumber
taxMinor requirednumber,null
categoryId requiredstring,null

ExpenseLinePage

data requiredarray of object
Fields
id requiredstring
position requirednumber
description requiredstring
sku requiredstring,null
quantity requirednumber,null
unitPriceMinor requirednumber,null
amountMinor requirednumber
taxMinor requirednumber,null
categoryId requiredstring,null
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExpenseTaxLine

id requiredstring
position requirednumber
name requiredstring,null
code requiredstring,null
ratePct requirednumber,null
baseMinor requirednumber,null
amountMinor requirednumber

ExpenseTaxLinePage

data requiredarray of object
Fields
id requiredstring
position requirednumber
name requiredstring,null
code requiredstring,null
ratePct requirednumber,null
baseMinor requirednumber,null
amountMinor requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

WorkspaceClosed

status requiredclosed
purgeAfter requiredstring

Records are erased after this moment.

storeSubscriptions requiredarray of object

Non-empty when a store goes on billing until someone cancels there.

Fields
workspaceId requiredstring
workspaceName requiredstring
store requiredAPP_STORE PLAY_STORE

ReferenceCurrencyPage

data requiredarray of object
Fields
code requiredstring
name requiredstring
minorDigits requirednumber

Decimal places in the minor unit: 2 for USD, 0 for JPY.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ReferenceCountryPage

data requiredarray of object
Fields
code requiredstring
name requiredstring
currency requiredstring

The currency its receipts print.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ReferenceLocalePage

data requiredarray of object
Fields
code requiredstring
name requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ReferenceSystemCategoryPage

data requiredarray of object
Fields
key requiredstring

Stays when a workspace renames its copy.

name requiredstring
glCode requiredstring,null
taxLine requiredstring,null
deductiblePct requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

BulkReimbursed

reimbursed requiredarray of string
skipped requiredarray of object

Not in a state to mark: not approved yet, already paid, in a batch, or nothing on it is reimbursable. Left as it was.

Fields
id requiredstring
reference requiredstring,null
code requiredstring
message requiredstring
failed requiredarray of object

Not found, or not the caller's to mark.

Fields
id requiredstring
reference requiredstring,null
code requiredstring
message requiredstring

DocumentList

data requiredarray of object
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
vendorsarray of object or null
bankBreakdownarray of object or null
billToobject or null
shipToobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
paymentLinksarray of object or null
folioobject or null
enrichedFieldsarray of string or null
checkobject or null
statementobject or null
taxFormobject or null
itineraryobject or null
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
isLcd requiredobject
screenshot requiredobject or null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

glare requiredobject
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

offsetnumber

Where this page starts, when paging by offset or page.

nextOffsetnumber,null

Send this as offset for the next page. Null on the last one.

pagenumber

When paging by page number.

pageSizenumber
totalCountnumber

With track_total_results: every document the caller can reach.

filteredCountnumber

With track_total_results: what the filters leave of those.

ProvisionResult

dryRun requiredboolean
added requiredarray of object
Fields
email requiredstring
invited requiredboolean
updated requiredarray of object
Fields
email requiredstring
fields requiredarray of string
removed requiredarray of object
Fields
email requiredstring
skipped requiredarray of object
Fields
email requiredstring
reason requiredstring

AutomationApply

matched requirednumber
updated requirednumber

AutomationPreview

matched requirednumber

Expenses the conditions match, voided ones aside.

applicable requirednumber

Of those, the ones still unsubmitted, which is what applying the rule changes.

sample requiredarray of object
Fields
id requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
status requiredstring
aiSkipped requiredboolean

A question for Claude was left out of this count: it is asked when a document is read, not here.

AutomationRule

id requiredstring
name requiredstring
enabled requiredboolean
position requirednumber
conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actions requiredobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
Fields
input requiredstring
output requiredstring
fallback requiredobject or object or object
Fields
action requirednone
matchCount requirednumber
createdAt requiredstring
updatedAt requiredstring

AutomationRuleOrder

data requiredarray of object
Fields
id requiredstring
name requiredstring
enabled requiredboolean
position requirednumber
conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actions requiredobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
fallback requiredobject or object or object
matchCount requirednumber
createdAt requiredstring
updatedAt requiredstring

AutomationRuleList

data requiredarray of object
Fields
id requiredstring
name requiredstring
enabled requiredboolean
position requirednumber
conditions requiredarray of object
Fields
field requiredmerchantName description amountMinor currency cardLast4 paymentType categoryId merchantType date notes invoiceNumber ocrText subtotalMinor taxMinor tipMinor confidence billable reimbursable documentType source tags flags lineItems.description lineItems.sku lineItems.amountMinor lineItems.quantity ai
op requiredequals contains contains_case starts_with gte lte not_equals not_contains gt lt is_empty is_not_empty matches_regex not_matches_regex between within_days_before_today within_days_after_date within_days_before_date ask
valuestring or number or boolean or object or object
Fields
from requiredstring
to requiredstring
fallbackno_match match
actions requiredobject
Fields
categoryIdstring
projectIdstring
clientIdstring
tagIdsarray of string
billableboolean
reimbursableboolean
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
descriptionstring
merchantNamestring
taxBasisPointsinteger
vendorIdstring (uuid)
postToBookstrue
cleararray of categoryId tagIds taxMinor
reportIdstring
autoApprovetrue
rejectobject
Fields
reason requiredstring
flagForReviewobject
Fields
reason requiredstring
setStatusNEEDS_REVIEW READY
groupobject
Fields
report requiredstring
setCustomFieldsmap of string or number or boolean
extractarray of object or object
Fields
kind requiredregex
field requiredstring
pattern requiredstring
llmExtractarray of object
Fields
field requiredstring
prompt requiredstring
examplesarray of object
fallback requiredobject or object or object
matchCount requirednumber
createdAt requiredstring
updatedAt requiredstring
aiAvailable requiredboolean

Whether a question for Claude can be asked right now. When it cannot, each rule that needs one takes its fallback.

Billing

plan requiredSTARTER PRO BUSINESS or null
status requiredTRIALING ACTIVE PAST_DUE EXPIRED NONE
source requiredSTRIPE APP_STORE PLAY_STORE TRIAL COMP or null
active requiredboolean
interval requiredMONTH YEAR or null
seats requirednumber

Seats the workspace holds.

seatsUsed requirednumber

Members now plus open invitations, which hold a seat each. Above seats after a downgrade.

seatsIncluded requirednumber,null
maxSeats requirednumber,null

Null is unlimited, or no plan.

trialEndsAt requiredstring,null
currentPeriodEnd requiredstring,null
cancelAtPeriodEnd requiredboolean
storeManaged requiredboolean

A live App Store or Google Play subscription owns this workspace, so the web cannot sell to it.

store requiredAPP_STORE PLAY_STORE or null
hasStripeSubscription requiredboolean
canOpenPortal requiredboolean
usage requiredarray of object

The plan's counters for this month.

Fields
metric requiredscans api_documents
used requirednumber
limit requirednumber
stripeConfigured requiredboolean
cashsdkConfigured requiredboolean

BulkMemberResult

succeeded requiredarray of string
failed requiredarray of object

Members the rules refused. They stay as they were, and the rest still change.

Fields
id requiredstring
message requiredstring

CardStatements

array of object

from requiredstring
to requiredstring
open requiredboolean

True for the period still open today.

count requirednumber
spentMinor requirednumber
creditedMinor requirednumber
netMinor requirednumber
currency requiredstring

IntegrationHealth

provider requiredQUICKBOOKS_ONLINE XERO FRESHBOOKS WAVE ZOHO_BOOKS SAGE NETSUITE GUSTO GOOGLE_DRIVE DROPBOX BOX ONEDRIVE GMAIL SLACK ZAPIER QUICKBOOKS_DESKTOP INTUIT_ENTERPRISE CAMPFIRE DUALENTRY RILLET ACCELO CERTINIA SAGE_BUSINESS_CLOUD SAASU BAMBOOHR HIBOB WORKDAY GOOGLE_WORKSPACE GREENHOUSE EVERNOTE QUICKBOOKS_TIME RIGHTSIGNATURE HR_SYNC BILL_COM SAP_CONCUR MICROSOFT_DYNAMICS MYOB ORACLE SAP_ERP
slug requiredstring
name requiredstring
status requiredCONNECTED NEEDS_ATTENTION DISCONNECTED
organisationName requiredstring,null
synced requirednumber
pending requirednumber
failed requirednumber
skipped requirednumber
voided requirednumber
waiting requirednumber

Approved expenses with no record yet.

lastSyncedAt requiredstring,null
tokenExpiresAt requiredstring,null
refreshTokenExpiresAt requiredstring,null
endsOnDateboolean
pausedUntil requiredstring,null
pulledAt requiredstring,null
postingPausedobject or null
Fields
since requiredstring
code requiredstring
message requiredstring

IntegrationList

array of object

provider requiredQUICKBOOKS_ONLINE XERO FRESHBOOKS WAVE ZOHO_BOOKS SAGE NETSUITE GUSTO GOOGLE_DRIVE DROPBOX BOX ONEDRIVE GMAIL SLACK ZAPIER QUICKBOOKS_DESKTOP INTUIT_ENTERPRISE CAMPFIRE DUALENTRY RILLET ACCELO CERTINIA SAGE_BUSINESS_CLOUD SAASU BAMBOOHR HIBOB WORKDAY GOOGLE_WORKSPACE GREENHOUSE EVERNOTE QUICKBOOKS_TIME RIGHTSIGNATURE HR_SYNC BILL_COM SAP_CONCUR MICROSOFT_DYNAMICS MYOB ORACLE SAP_ERP
slug requiredstring
name requiredstring
group requiredACCOUNTING PAYROLL HR CAPTURE STORAGE CHAT AUTOMATION
availability requiredNOT_CONFIGURED AVAILABLE CONNECTED NEEDS_ATTENTION EXPORT_AVAILABLE NOT_CONNECTED
label requiredstring

The short status, as printed on the card.

description requiredstring
export requiredobject or null

The file that works today, with this provider or without it.

Fields
format requiredCSV XLSX PDF ZIP QBO_CSV XERO_CSV SAGE_CSV DYNAMICS_CSV MYOB_TXT ORACLE_CSV SAP_CSV IIF OFX JSON XML TXT XLS
label requiredstring
payrollboolean
organisationName requiredstring,null
organisationChoices requiredarray of object
Fields
id requiredstring
name requiredstring
lastSyncedAt requiredstring,null
lastError requiredstring,null
links requiredarray of object
Fields
label requiredstring
href requiredstring
customerAppboolean
blockedBystring

InvitationPage

data requiredarray of object
Fields
id requiredstring
email requiredstring
name requiredstring,null
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
status requiredPENDING EXPIRED ACCEPTED REVOKED
invitedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
expiresAt requiredstring
acceptedAt requiredstring,null
revokedAt requiredstring,null
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

InvitationSent

id requiredstring
email requiredstring
name requiredstring,null
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
status requiredPENDING EXPIRED ACCEPTED REVOKED
invitedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
expiresAt requiredstring
acceptedAt requiredstring,null
revokedAt requiredstring,null
createdAt requiredstring
acceptUrl requiredstring

The link the email carries. It works only for someone signed in with this address.

MailInAllowance

period requiredstring

YYYY-MM.

limit requirednumber

Documents a month on this plan.

used requirednumber

Held by this month's batches. It can pass the limit: paper that has arrived is scanned regardless.

remaining requirednumber
included requiredboolean

False when the plan does not include mail-in at all.

available requiredboolean

False until there is a mailroom to send paper to, whatever the plan says.

mailroomAddress requiredstring,null

Where own-packaging paper goes. Null until a mailroom has one.

envelopes requiredobject
Fields
week requiredstring

2026-W44. A week starts on Monday, UTC.

weekLimit requirednumber

Envelopes a workspace can have sent in a week.

used requirednumber
remaining requirednumber

Envelopes that can still be requested this week.

MailInSettings

address requiredobject or null
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring
updatedAt requiredstring,null

MailInBatch

id requiredstring
reference requiredstring

Printed on the packing slip and on the cover sheet.

workspaceReference requiredstring
status requiredREQUESTED ENVELOPE_SENT IN_TRANSIT RECEIVED SCANNING COMPLETED RETURNED LOST CANCELLED
envelopes requirednumber
expectedDocuments requirednumber
documentCount requirednumber
afterScan requiredRETURN SHRED
shippingAddress requiredobject
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring
folderId requiredstring,null
trackingNumber requiredstring,null
notes requiredstring,null
requestedById requiredstring
requestedByName requiredstring,null

Who this paper belongs to, as printed on the slip and the cover sheet.

requestedByEmail requiredstring,null
envelopeSentAt requiredstring,null
receivedAt requiredstring,null
completedAt requiredstring,null
createdAt requiredstring
updatedAt requiredstring

MailInBatchPage

data requiredarray of object
Fields
id requiredstring
reference requiredstring

Printed on the packing slip and on the cover sheet.

workspaceReference requiredstring
status requiredREQUESTED ENVELOPE_SENT IN_TRANSIT RECEIVED SCANNING COMPLETED RETURNED LOST CANCELLED
envelopes requirednumber
expectedDocuments requirednumber
documentCount requirednumber
afterScan requiredRETURN SHRED
shippingAddress requiredobject
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring
folderId requiredstring,null
trackingNumber requiredstring,null
notes requiredstring,null
requestedById requiredstring
requestedByName requiredstring,null

Who this paper belongs to, as printed on the slip and the cover sheet.

requestedByEmail requiredstring,null
envelopeSentAt requiredstring,null
receivedAt requiredstring,null
completedAt requiredstring,null
createdAt requiredstring
updatedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

MailInRequested

id requiredstring
reference requiredstring

Printed on the packing slip and on the cover sheet.

workspaceReference requiredstring
status requiredREQUESTED ENVELOPE_SENT IN_TRANSIT RECEIVED SCANNING COMPLETED RETURNED LOST CANCELLED
envelopes requirednumber
expectedDocuments requirednumber
documentCount requirednumber
afterScan requiredRETURN SHRED
shippingAddress requiredobject
Fields
name requiredstring
companystring or null
line1 requiredstring
line2string or null
city requiredstring
region requiredstring
postalCode requiredstring
countrystring
folderId requiredstring,null
trackingNumber requiredstring,null
notes requiredstring,null
requestedById requiredstring
requestedByName requiredstring,null

Who this paper belongs to, as printed on the slip and the cover sheet.

requestedByEmail requiredstring,null
envelopeSentAt requiredstring,null
receivedAt requiredstring,null
completedAt requiredstring,null
createdAt requiredstring
updatedAt requiredstring
envelopeAllowance requiredobject
Fields
week requiredstring

2026-W44. A week starts on Monday, UTC.

weekLimit requirednumber

Envelopes a workspace can have sent in a week.

used requirednumber
remaining requirednumber

Envelopes that can still be requested this week.

MailInDocumentPage

data requiredarray of object
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
thumbnailUrl requiredstring,null
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Member

id requiredstring

The membership: the id PATCH and DELETE /v1/members/:id take.

userId requiredstring
email requiredstring
name requiredstring,null
photoUrl requiredstring,null
pronouns requiredstring,null
personStatus requiredobject or null

The note they set beside their name, until it clears. status is their membership.

Fields
text requiredstring
clearsAt requiredstring,null
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
status requiredACTIVE SUSPENDED
developer requiredboolean

Whether this person can reach API keys and webhooks: always for an owner, and for an admin only with the grant. False unless the caller has members.manage.

managerId requiredstring,null

The manager's user id.

managerName requiredstring,null
title requiredstring,null
department requiredstring,null
employeeId requiredstring,null

Null unless the caller has members.manage.

approvalLimitMinor requirednumber,null

Null unless the caller has members.manage.

overLimitApproverId requiredstring,null

Null unless the caller has members.manage.

forwardToId requiredstring,null

Null unless the caller has members.manage.

workerStatus requiredstring,null

Null unless the caller has members.manage.

defaultTags requiredarray of string

Empty unless the caller has members.manage.

customField1 requiredstring,null
customField2 requiredstring,null
payrollCode requiredstring,null

Goes out with payroll files. Null unless the caller manages members.

legalEntity requiredstring,null

The company the person is employed by. Null unless the caller manages members.

tier requiredstring,null

Their travel tier. Null unless the caller manages members.

officeLocation requiredstring,null

The office they work from. Null unless the caller manages members.

costCenter requiredstring,null

Where their costs are charged. Null unless the caller manages members.

accountingCode requiredstring,null

Their code in the books. Null unless the caller manages members.

workerType requiredstring,null

Employee, contractor or the like. Null unless the caller manages members.

createdAt requiredstring

MemberPage

data requiredarray of object
Fields
id requiredstring

The membership: the id PATCH and DELETE /v1/members/:id take.

userId requiredstring
email requiredstring
name requiredstring,null
photoUrl requiredstring,null
pronouns requiredstring,null
personStatus requiredobject or null

The note they set beside their name, until it clears. status is their membership.

Fields
text requiredstring
clearsAt requiredstring,null
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
status requiredACTIVE SUSPENDED
developer requiredboolean

Whether this person can reach API keys and webhooks: always for an owner, and for an admin only with the grant. False unless the caller has members.manage.

managerId requiredstring,null

The manager's user id.

managerName requiredstring,null
title requiredstring,null
department requiredstring,null
employeeId requiredstring,null

Null unless the caller has members.manage.

approvalLimitMinor requirednumber,null

Null unless the caller has members.manage.

overLimitApproverId requiredstring,null

Null unless the caller has members.manage.

forwardToId requiredstring,null

Null unless the caller has members.manage.

workerStatus requiredstring,null

Null unless the caller has members.manage.

defaultTags requiredarray of string

Empty unless the caller has members.manage.

customField1 requiredstring,null
customField2 requiredstring,null
payrollCode requiredstring,null

Goes out with payroll files. Null unless the caller manages members.

legalEntity requiredstring,null

The company the person is employed by. Null unless the caller manages members.

tier requiredstring,null

Their travel tier. Null unless the caller manages members.

officeLocation requiredstring,null

The office they work from. Null unless the caller manages members.

costCenter requiredstring,null

Where their costs are charged. Null unless the caller manages members.

accountingCode requiredstring,null

Their code in the books. Null unless the caller manages members.

workerType requiredstring,null

Employee, contractor or the like. Null unless the caller manages members.

createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

PaymentAccount

id requiredstring
name requiredstring
kind requiredCREDIT_CARD DEBIT_CARD BANK_ACCOUNT CASH
brand requiredstring,null
last4 requiredstring,null
isCompany requiredboolean
feedSource requiredMANUAL FILE_IMPORT PLAID
owner requiredobject or null
Fields
id requiredstring
name requiredstring,null
email requiredstring
institutionName requiredstring,null
archived requiredboolean
transactionCount requirednumber
unmatchedCount requirednumber
lastPostedDate requiredstring,null
lastImportedAt requiredstring,null

When a line last arrived, from a file or the bank.

transactionStartDate requiredstring,null
statementCloseDay requirednumber,null
liability requiredPERSONAL CORPORATE
reimbursable requiredboolean,null
allowDeletingTransactions requiredboolean
glAccount requiredstring,null
createExpenses requiredboolean
assigneeEmail requiredstring,null

Invited and not yet in: the card is theirs when they join.

balance requiredobject or null

What the bank last reported, when it reports these at all.

Fields
currentMinor requirednumber,null
limitMinor requirednumber,null
remainingMinor requirednumber,null
currency requiredstring
asOf requiredstring
createdAt requiredstring

PaymentAccountPage

data requiredarray of object
Fields
id requiredstring
name requiredstring
kind requiredCREDIT_CARD DEBIT_CARD BANK_ACCOUNT CASH
brand requiredstring,null
last4 requiredstring,null
isCompany requiredboolean
feedSource requiredMANUAL FILE_IMPORT PLAID
owner requiredobject or null
Fields
id requiredstring
name requiredstring,null
email requiredstring
institutionName requiredstring,null
archived requiredboolean
transactionCount requirednumber
unmatchedCount requirednumber
lastPostedDate requiredstring,null
lastImportedAt requiredstring,null

When a line last arrived, from a file or the bank.

transactionStartDate requiredstring,null
statementCloseDay requirednumber,null
liability requiredPERSONAL CORPORATE
reimbursable requiredboolean,null
allowDeletingTransactions requiredboolean
glAccount requiredstring,null
createExpenses requiredboolean
assigneeEmail requiredstring,null

Invited and not yet in: the card is theirs when they join.

balance requiredobject or null

What the bank last reported, when it reports these at all.

Fields
currentMinor requirednumber,null
limitMinor requirednumber,null
remainingMinor requirednumber,null
currency requiredstring
asOf requiredstring
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Reconciliation

from requiredstring
to requiredstring
currency requiredstring

What every figure here is in. Ask for another with currency.

currencies requiredarray of object

Every currency posted in these dates, each with its own count and net.

Fields
currency requiredstring
count requirednumber
netMinor requirednumber
importedMinor requirednumber

What to hold against the card statement.

importedCount requirednumber
approvedMinor requirednumber

What to hold against the liability account.

approvedCount requirednumber
unapprovedMinor requirednumber

What is left to accrue at month end, by where it is stuck.

unapprovedCount requirednumber
pendingMinor requirednumber

Charges the bank has not posted, which are on no statement yet.

buckets requiredobject
Fields
unreported requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
draft requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
outstanding requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
deleted requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
noExpense requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
ignored requiredobject
Fields
count requirednumber
amountMinor requirednumber
rows requiredarray of object
Fields
transactionId requiredstring
postedDate requiredstring
description requiredstring
amountMinor requirednumber
currency requiredstring
account requiredobject
expense requiredobject or null
ownerId requiredstring,null
cards requiredarray of object
Fields
account requiredobject
Fields
id requiredstring
name requiredstring
last4 requiredstring,null
count requirednumber
importedMinor requirednumber
unapprovedMinor requirednumber
duplicates requiredarray of object
Fields
postedDate requiredstring
amountMinor requirednumber
description requiredstring
count requirednumber

ReportField

id requiredstring
name requiredstring
type requiredTEXT DATE LIST FORMULA
options requiredarray of string
formula requiredstring,null
required requiredboolean
enabled requiredboolean
position requirednumber
disabledOptionsarray of string

List values turned off: kept on reports that hold them, and not offered for new ones.

importedboolean

Came from the connected books, so it cannot be deleted and its values only turn on and off.

ReportFieldList

data requiredarray of object
Fields
id requiredstring
name requiredstring
type requiredTEXT DATE LIST FORMULA
options requiredarray of string
formula requiredstring,null
required requiredboolean
enabled requiredboolean
position requirednumber
disabledOptionsarray of string

List values turned off: kept on reports that hold them, and not offered for new ones.

importedboolean

Came from the connected books, so it cannot be deleted and its values only turn on and off.

ReportFieldsOff

deleted requirednumber

Fields removed. Lists take work to build, so they are kept.

disabled requirednumber

Lists turned off and kept.

SeatUsage

active requirednumber
invited requirednumber

Open invitations hold a seat until they are accepted, revoked or expire.

included requirednumber,null
paid requirednumber,null

Seats the workspace holds, which is what stops an invitation. Null with no plan.

max requirednumber,null

The most seats this plan can hold. Null is unlimited.

full requiredobject or null

Set once every seat is taken or invited, with what to do about it.

Fields
metric requiredseats
limit requirednumber
used requirednumber
addSeats requiredobject or null
Fields
seats requirednumber
added requirednumber
priceMinor requirednumber
interval requiredMONTH YEAR
askName requiredstring,null
appMessage requiredstring

The refusal with no price and no way to buy in it, which an app in a store can show as written.

message requiredstring

SyncRecordPage

data requiredarray of object
Fields
id requiredstring
expenseId requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
amountMinor requirednumber
currency requiredstring
state requiredPENDING SYNCED FAILED SKIPPED VOIDED
externalType requiredstring,null
externalId requiredstring,null

The record in the other system.

errorCode requiredstring,null
message requiredstring,null
attempts requirednumber
syncedAt requiredstring,null
nextAttemptAt requiredstring,null
paidAtstring,null
paidByPROVIDER PAPERTOTAL or null
paymentErrorstring,null
resendsnumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Transaction

id requiredstring
paymentAccount requiredobject
Fields
id requiredstring
name requiredstring
last4 requiredstring,null
postedDate requiredstring
amountMinor requirednumber

Positive is money spent. Negative is a refund or a payment to the card.

currency requiredstring
description requiredstring
merchantName requiredstring,null
state requiredUNMATCHED MATCHED IGNORED EXPENSED PENDING
matchScore requirednumber,null
missingReceipt requiredboolean

Older than three days with no expense: a receipt is owed.

expense requiredobject or null
Fields
id requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
amountMinor requirednumber
currency requiredstring
status requiredstring
suggestions requiredarray of object
Fields
expense requiredobject
Fields
id requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
amountMinor requirednumber
currency requiredstring
status requiredstring
score requirednumber
amountGapMinor requirednumber
dayGap requirednumber

TransactionPage

data requiredarray of object
Fields
id requiredstring
paymentAccount requiredobject
Fields
id requiredstring
name requiredstring
last4 requiredstring,null
postedDate requiredstring
amountMinor requirednumber

Positive is money spent. Negative is a refund or a payment to the card.

currency requiredstring
description requiredstring
merchantName requiredstring,null
state requiredUNMATCHED MATCHED IGNORED EXPENSED PENDING
matchScore requirednumber,null
missingReceipt requiredboolean

Older than three days with no expense: a receipt is owed.

expense requiredobject or null
Fields
id requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
amountMinor requirednumber
currency requiredstring
status requiredstring
suggestions requiredarray of object
Fields
expense requiredobject
Fields
id requiredstring
reference requiredstring
merchantName requiredstring,null
date requiredstring
amountMinor requirednumber
currency requiredstring
status requiredstring
score requirednumber
amountGapMinor requirednumber
dayGap requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

TransactionSummary

currency requiredstring

What every figure here is in: the one asked for with currency, or the workspace currency when it has lines, or the commonest.

currencies requiredarray of object

Every currency these lines are in, each with its own count and net.

Fields
currency requiredstring
count requirednumber
netMinor requirednumber
count requirednumber
spentMinor requirednumber
creditedMinor requirednumber
missingReceipts requirednumber
byState requiredarray of object
Fields
state requiredUNMATCHED MATCHED IGNORED EXPENSED PENDING
count requirednumber
amountMinor requirednumber

Workspace

id requiredstring
name requiredstring
kind requiredPERSONAL TEAM
baseCurrency requiredstring
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
country requiredstring
timezone requiredstring
fiscalYearStartMonth requirednumber
distanceUnit requiredstring
claimedDomain requiredstring,null
requireMfa requiredboolean
retentionDays requirednumber,null

Documents are deleted this many days after they are read. Null keeps them until someone deletes them.

callLogRetentionDays requirednumber,null

Days the API call log is kept. Null is the default of 365.

preferences requiredobject
Fields
locale requiredstring,null

How this workspace's findings write money. Null is the person's own.

showDefaultCategories requiredboolean

False takes the built-in categories out of everyone's list but a manager's, and out of what reading a document suggests.

shredDocuments requiredboolean

Paper from a mail-in batch is shredded after scanning, unless the batch says otherwise.

reimbursableTracking requiredboolean

False takes reimbursing out of the workspace: nothing new is flagged.

calculateMissingTax requiredboolean

Works out a missing tax on a captured document at vatBasisPoints, and says so on the expense.

dateFormat requiredYYYY-MM-DD MM/DD/YYYY DD/MM/YYYY DD.MM.YYYY MMM D, YYYY

How dates read across the app. The API always sends YYYY-MM-DD.

vatBasisPoints requirednumber,null

VAT within the total on a typed expense that gives no tax, in hundredths of a percent. 2000 is 20%.

permissions requiredarray of expenses.read_all expenses.write_all reports.read_all reports.approve reimbursements.manage members.manage settings.manage policies.manage billing.manage integrations.manage exports.all developer.manage audit.read documents.reveal cards.manage security.manage workspace.delete

What this caller may do here, from the role of the person the key belongs to.

entitlement requiredobject
Fields
plan requiredSTARTER PRO BUSINESS or null
lastPlanSTARTER PRO BUSINESS or null

With no plan in force, the one the workspace held last. What it could read stays readable.

status requiredTRIALING ACTIVE PAST_DUE EXPIRED NONE
source requiredSTRIPE APP_STORE PLAY_STORE TRIAL COMP or null
active requiredboolean

Capture and edits stop when this is false. Reading and exporting never do.

trialEndsAt requiredstring,null
currentPeriodEnd requiredstring,null
cancelAtPeriodEnd requiredboolean
interval requiredMONTH YEAR or null
seats requirednumber
features requiredarray of receipt_capture email_capture mileage expense_reports tax_reports standard_exports multi_currency business_cards mail_in automation_rules card_feeds accounting_sync approvals policies reimbursements custom_fields per_diem human_verification developer_api multi_level_approvals sso audit_log scheduled_reports
limits requiredobject or null
Fields
scansPerMonth requirednumber
seatsIncluded requirednumber
maxSeats requirednumber,null
apiDocumentsPerMonth requirednumber
mailInDocumentsPerMonth requirednumber
services requiredobject
Fields
mailIn requiredboolean
humanVerification requiredboolean
usage requiredmap of number
memberCount requirednumber
sandboxOfId requiredstring,null

The workspace this is the sandbox of. Null for a live workspace.

readingModel requiredstandard rules_only always_second_reading

What reads this workspace's documents.

actingForobject or null
Fields
userId requiredstring
name requiredstring
access requiredFULL LIMITED

WorkspaceCounts

needsReview requirednumber
processing requirednumber
pendingApprovals requirednumber
holdsApprovals requiredboolean
unmatchedTransactions requirednumber
unreadNotifications requirednumber

WorkspaceCreated

id requiredstring
name requiredstring
kind requiredPERSONAL TEAM
baseCurrency requiredstring
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
entitlement requiredobject
Fields
plan requiredSTARTER PRO BUSINESS or null

What the workspace holds now: what the trial of its owner has left, or nothing. Naming a plan does not buy it.

status requiredTRIALING ACTIVE PAST_DUE EXPIRED NONE
active requiredboolean
trialEndsAt requiredstring,null
checkout requiredobject or null

Set when a plan was named.

Fields
plan requiredSTARTER PRO BUSINESS
interval requiredMONTH YEAR
url requiredstring

The billing page, for a person to pay for the plan. A plan cannot be bought by an API call.

WorkspacePage

data requiredarray of object
Fields
id requiredstring
name requiredstring
kind requiredPERSONAL TEAM
baseCurrency requiredstring
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Me

id requiredstring
email requiredstring
emailVerified requiredboolean
displayName requiredstring,null
photoUrl requiredstring,null
phone requiredstring,null
language requireden es fr de el it ja nl pl pt-BR zh-Hans

The language the interface is written in. locale only sets how figures print.

highContrast requiredboolean
pronouns requiredstring,null
personStatus requiredobject or null

A note beside their name, until it clears.

Fields
text requiredstring
clearsAt requiredstring,null
hasPrivateDetails requiredboolean

Whether anything is kept under the emailed code. The details never come back from here.

locale requiredstring
timezone requiredstring
distanceUnit requiredstring
onboarded requiredboolean
onboardingIntent requiredstring,null

What they said they came for on first run.

emailBounced requiredboolean

Their address bounced, so mail to it stopped until they fix it.

phoneVerified requiredboolean

Firebase proved the number with a code.

hasEmail requiredboolean

False for someone who came in with a phone number and has not added an address yet. email then holds an address nothing can be sent to.

locked requiredboolean

Locked after a report of suspicious activity. Only support can undo it.

canChangeEmail requiredboolean

A domain group can keep the sign-in address where the company put it.

canManageWorkspaces requiredboolean

A domain group can stop someone creating or closing workspaces.

defaultWorkspaceId requiredstring,null
forwardingAddress requiredstring
workspaces requiredarray of object
Fields
id requiredstring
name requiredstring
kind requiredPERSONAL TEAM
baseCurrency requiredstring
role requiredOWNER ADMIN APPROVER ACCOUNTANT AUDITOR MEMBER EDITOR CARD_ADMIN PEOPLE_ADMIN PAYMENTS_ADMIN

ForwardingAlias

alias requiredstring
address requiredstring

Blueprint

id requiredstring
name requiredstring

What blueprint_name takes.

title requiredstring
description requiredstring,null
documentType requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
builtIn requiredboolean

Ships with PaperTotal, and can be used and not changed.

version requirednumber

Changing a blueprint adds a version, and results keep the one that made them.

schema requiredobject
Fields
type requiredobject
descriptionstring
properties required__schema0
fields requiredarray of object
Fields
path requiredstring
labelstring
examplestring
boxobject
Fields
page requiredinteger
x requirednumber
y requirednumber
width requirednumber
height requirednumber
createdAt requiredstring,null
updatedAt requiredstring,null

BlueprintList

data requiredarray of object
Fields
id requiredstring
name requiredstring

What blueprint_name takes.

title requiredstring
documentType requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
builtIn requiredboolean

Ships with PaperTotal, and can be used and not changed.

version requirednumber

Changing a blueprint adds a version, and results keep the one that made them.

nextCursor requirednull

BlueprintDraft

documentId requiredstring
status requiredREADING READY FAILED
draft requiredobject or null

A starting point. Nothing is saved until it is sent to POST /v1/blueprints.

Fields
name requiredstring
title requiredstring
documentType requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
schema requiredobject
Fields
type requiredobject
descriptionstring
properties required__schema0
fields requiredarray of object
Fields
path requiredstring
labelstring
examplestring
boxobject
Fields
page requiredinteger
x requirednumber
y requirednumber
width requirednumber
height requirednumber
engine requiredrules claude
error requiredstring,null

Classification

id requiredstring
status requiredUPLOADED PROCESSING PROCESSED FAILED
document_type requiredobject or null

Null until it has been read.

Fields
value requiredstring
score requirednumber
engine requiredrules claude or null
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber

Extraction

id requiredstring
status requiredUPLOADED PROCESSING PROCESSED FAILED
document_type requiredobject or null

Null until it has been read.

Fields
value requiredstring
score requirednumber
engine requiredrules claude or null
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
extraction requiredmap of any or null
extraction_error requiredstring,null
document requiredobject
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
vendorsarray of object or null
bankBreakdownarray of object or null
billToobject or null
shipToobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
paymentLinksarray of object or null
folioobject or null
enrichedFieldsarray of string or null
checkobject or null
statementobject or null
taxFormobject or null
itineraryobject or null
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
isLcd requiredobject
screenshot requiredobject or null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

glare requiredobject
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

DocumentSet

id requiredstring
kind requiredZIP BATCH SPLIT DOCUMENTS W2 BANK_STATEMENT PARSE
status requiredQUEUED PROCESSING COMPLETED FAILED
originalFilename requiredstring,null
pageCount requirednumber
ranges requiredarray of object

Pages found, 1-based and inclusive, with a type and score when classified.

Fields
start requirednumber
end requirednumber
typestring
scorenumber
refused requiredarray of object
Fields
name requiredstring
reason requiredstring
error requiredstring,null
documents requiredarray of object
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
status requiredUPLOADED PROCESSING PROCESSED FAILED
pageStart requirednumber,null
pageEnd requirednumber,null
createdAt requiredstring
completedAt requiredstring,null

DocumentSetPage

data requiredarray of object
Fields
id requiredstring
kind requiredZIP BATCH SPLIT DOCUMENTS W2 BANK_STATEMENT PARSE
status requiredQUEUED PROCESSING COMPLETED FAILED
originalFilename requiredstring,null
pageCount requirednumber
ranges requiredarray of object

Pages found, 1-based and inclusive, with a type and score when classified.

Fields
start requirednumber
end requirednumber
typestring
scorenumber
refused requiredarray of object
Fields
name requiredstring
reason requiredstring
error requiredstring,null
documents requiredarray of object
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
status requiredUPLOADED PROCESSING PROCESSED FAILED
pageStart requirednumber,null
pageEnd requirednumber,null
createdAt requiredstring
completedAt requiredstring,null
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ParsedDocument

id requiredstring
status requiredUPLOADED PROCESSING PROCESSED FAILED
markdown requiredstring,null
meta requiredobject or null
Fields
pages requiredarray of object
Fields
index requirednumber
width requirednumber
height requirednumber
blurScore requirednumber,null

Sharpness of a photographed page. Higher is sharper.

ocrScore requirednumber,null
ocrScore requirednumber,null
engine requiredrules claude
tags requiredarray of string
title requiredstring,null
notes requiredstring,null
externalId requiredstring,null
setId requiredstring,null
createdAt requiredstring
boxesarray of object

With details: every recognized line and where it sits.

Fields
text requiredstring
confidence requirednumber
page requirednumber
box requiredtuple or null

ParsedDocumentPage

data requiredarray of object
Fields
id requiredstring
status requiredUPLOADED PROCESSING PROCESSED FAILED
markdown requiredstring,null
meta requiredobject or null
Fields
pages requiredarray of object
Fields
index requirednumber
width requirednumber
height requirednumber
blurScore requirednumber,null

Sharpness of a photographed page. Higher is sharper.

ocrScore requirednumber,null
ocrScore requirednumber,null
engine requiredrules claude
tags requiredarray of string
title requiredstring,null
notes requiredstring,null
externalId requiredstring,null
setId requiredstring,null
createdAt requiredstring
boxesarray of object

With details: every recognized line and where it sits.

Fields
text requiredstring
confidence requirednumber
page requirednumber
box requiredtuple or null
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

DocumentUpload

id requiredstring
typeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
sourceWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredstring
originalFilenamestring,null
mimeTypestring
sizeBytesnumber
pageCountnumber
externalIdstring,null
folderIdstring,null
expenseIdstring,null
mailInBatchIdstring,null
titlestring,null
notesstring,null
latitudenumber,null

Where the device said it was when the photo was taken.

longitudenumber,null
locationAccuracyMnumber,null
duplicateOfIdstring,null
processingErrorstring,null
processingErrorCodeFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verificationstring
capturedAtstring,null
processedAtstring,null
viewedAtstring,null
archivedAtstring,null
createdAtstring
uploadedByobject or null
Fields
id requiredstring
name requiredstring,null
pagesarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classificationobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprintobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tagsarray of string
tagRefsarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatusprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicatesarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setIdstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFieldsmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichmentobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extractionobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
Fields
namestring,null
ratePctnumber,null
amountMinor requiredinteger
orderinteger or null
baseMinorinteger or null
codestring,null
totalInclusiveboolean,null
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
Fields
description requiredstring
skustring,null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
idstring,null
orderinteger or null
textstring,null
typeroom tax parking service fee delivery product food alcohol tobacco transportation fuel refund discount payment giftcard donation toll lottery or null
fullDescriptionstring,null
normalizedDescriptionstring,null
sectionstring,null
referencestring,null
upcstring,null
hsnstring,null
lotstring,null
tagsarray of string or null
unitOfMeasurestring,null
discountMinorinteger or null
discountRatePctnumber,null
discountPriceMinorinteger or null
taxRatePctnumber,null
taxCodestring,null
subtotalMinorinteger or null
grossTotalMinorinteger or null
netTotalMinorinteger or null
datestring or null
startDatestring or null
endDatestring or null
categorystring,null
customCategoriesarray of string or null
customFieldsmap of any or null
countryOfOriginstring,null
manufacturerstring,null
weightstring,null
brandstring,null
hsaFsaEligibleboolean,null
productInfoobject or null
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
vendorsarray of object or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
bankBreakdownarray of object or null
Fields
accountNamestring,null
accountNumberstring,null
accountCurrencystring,null
bankNamestring,null
bankNamesarray of string or null
bankAddressstring,null
bankAddressesarray of string or null
bankNumberstring,null
bankNumbersarray of string or null
bankSwiftstring,null
ibanstring,null
billerCodestring,null
billToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
vatNumberstring,null
regNumberstring,null
phoneNumberstring,null
emailstring,null
shipToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
Fields
cardNumberstring,null
displayNamestring,null
termsstring,null
typenone visa master_card cash american_express interac other maestro discover bancontact girocard applepay paypal bancomat giftcard card check bankaxept bank-to-bank_transfer_bacs octopus pix jcb waon mada wechat alipay unionpay googlepay rupay bpay shopeepay mir giropay food_stamp diners_club paypay or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
Fields
data requiredstring
type requiredQR_CODE PDF417 EAN_13 EAN_8 UPC_A UPC_E CODE_128 CODE_39 ITF DATA_MATRIX AZTEC OTHER
page requiredinteger
boundingRegionarray of number or null
paymentLinksarray of object or null
Fields
url requiredstring
source requiredtext hyperlink qr_code barcode
folioobject or null
Fields
arrivalDatestring or null
departureDatestring or null
roomNumberstring,null
guestNamestring,null
nightsinteger or null
confirmationNumberstring,null
enrichedFieldsarray of string or null
checkobject or null
Fields
amountMinorinteger or null
amountTextstring,null
amountsAgreeboolean,null
bankNamestring,null
bankAddressstring,null
checkNumberstring,null
checkTypebank_draft bill_pay_draft business_check cashiers_check government_check money_order personal_check starter_check teller_check or null
currencystring or null
datestring or null
memostring,null
payerNamestring,null
payerAddressstring,null
receiverNamestring,null
receiverAddressstring,null
isSignedboolean,null
endorsementobject or null
microbject or null
fractionalRoutingNumberstring,null
routingFromFractionalstring,null
voidTermsstring,null
statementobject or null
Fields
accountHolderNamestring,null
accountHolderAddressstring,null
accountTypestring,null
accountNumberstring,null
bankNamestring,null
bankAddressstring,null
bankWebsitestring,null
bankVatNumberstring,null
accountVatNumberstring,null
periodStartDatestring or null
periodEndDatestring or null
statementDatestring or null
statementNumberstring,null
currencystring or null
beginningBalanceMinorinteger or null
endingBalanceMinorinteger or null
minimumDueMinorinteger or null
dueDatestring or null
routingNumberstring,null
swiftstring,null
ibanstring,null
accountsarray of object
balancesAgreeboolean,null
taxFormobject or null
Fields
kind requiredW2 W9 W8BEN_E
w2object or null
w9object or null
w8BenEmap of string,boolean,null or null
itineraryobject or null
Fields
travelerNamestring,null
bookingReferencestring,null
originstring,null
destinationstring,null
departsOnstring or null
returnsOnstring or null
segmentsarray of object
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraudobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
Fields
page requirednumber
before requiredstring,null
after requiredstring,null
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject
Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null
Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealedarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAtstring
extractorstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrTextstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrlstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

metaobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAtstring,null

A person checked what was read.

approvedAtstring,null

A developer's own approved flag. An expense's approval is a different thing.

objectdocument_set

Set on the answer to a ZIP, which holds kind, documentIds and refused instead of a document.

kindstring
documentIdsarray of string
refusedarray of object
Fields
name requiredstring
reason requiredstring

InboundEmailPage

data requiredarray of object
Fields
id requiredstring
from requiredstring
subject requiredstring,null
status requiredRECEIVED PROCESSED NO_ATTACHMENT UNKNOWN_SENDER OVER_LIMIT REJECTED FAILED
detail requiredstring,null
documentCount requirednumber
hasAttachment requiredboolean
refusedFiles requiredarray of object
Fields
name requiredstring
reason requiredstring
receivedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExpenseDuplicateGroup

data requiredarray of object
Fields
id requiredstring
number requirednumber
reference requiredstring
status requiredPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kind requiredRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
merchantName requiredstring,null
tripTitle requiredstring,null

For a trip, what to call it in a list.

description requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
baseAmountMinor requirednumber
taxMinor requirednumber,null
category requiredobject or null
Fields
id requiredstring
name requiredstring
alsoCategories requiredarray of object

Further categories it can be found under. Its money stays in category.

Fields
id requiredstring
name requiredstring
project requiredobject or null
Fields
id requiredstring
name requiredstring
code requiredstring,null
client requiredobject or null
Fields
id requiredstring
name requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
moneyFlow requiredIN OUT

Which way the money went.

invoiceNumber requiredstring,null
matched requiredboolean

A card charge has been matched to it.

connectedApps requiredarray of string

Connected services it has been posted to.

reportId requiredstring,null
externalId requiredstring,null

A developer's own reference, exactly as sent.

billable requiredboolean
reimbursable requiredboolean
paymentType requiredCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
confidence requirednumber,null
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

reviewFields requiredarray of string
thumbnailUrl requiredstring,null
documentId requiredstring,null
tags requiredarray of object
Fields
id requiredstring
name requiredstring
color requiredstring,null
attendeeCount requirednumber
fxRate requirednumber

What one unit of the expense currency is worth in the base currency. Zero means no rate is available yet, so baseAmountMinor is zero too and the expense is held in review.

held requiredboolean

Held back from its report until someone releases it.

createdAt requiredstring
updatedAt requiredstring
notes requiredstring,null
subtotalMinor requirednumber,null
tipMinor requirednumber,null
discountMinor requirednumber,null
shippingMinor requirednumber,null
paymentAccountId requiredstring,null
cardLast4 requiredstring,null
poNumber requiredstring,null

The buyer's purchase order number, as an invoice prints it.

dueDate requiredstring,null

When an invoice falls due.

mcc requiredstring,null

The merchant category code a card network gave the merchant, four digits.

taxDeductible requiredboolean
quantity requirednumber,null
rateMinor requirednumber,null
unit requiredstring,null
trip requiredmap of any or null
vehicleId requiredstring,null
attendees requiredarray of object
Fields
name requiredstring
emailstring
phonestring
customFields requiredmap of any
editedFields requiredarray of string
duplicateOfId requiredstring,null
duplicateReview requiredobject or null

What the second look at a flagged copy decided, and why.

Fields
outcome requiredDISMISSED KEPT
reason requiredstring
engine requiredrules claude
at requiredstring
canSettleDuplicate requiredboolean

Whether the caller can answer the duplicate question on this expense.

splitParentId requiredstring,null
access requiredobject

What the caller may do with it.

Fields
canEdit requiredboolean
limited requiredboolean

Out for approval: only the amount, description, merchant, date, category, tags and attendees can change.

reason requiredstring,null

Why it cannot be edited, or how far it can, in words for the person looking at it.

amountLocked requiredboolean

The amount is a card's own figure.

canDelete requiredboolean
canRestore requiredboolean
restoreBlocked requiredstring,null

Why it cannot be restored: split, or merged, for good.

canSplit requiredboolean
canMove requiredboolean
splitInto requiredarray of object

This expense was divided: its parts now count in its place.

Fields
id requiredstring
reference requiredstring
amountMinor requirednumber
mergedIntoId requiredstring,null

A merge absorbed this expense. Where it went.

report requiredobject or null

The report this expense is on, named even where the caller could not list it.

Fields
id requiredstring
title requiredstring
status requiredstring
lines requiredarray of object
Fields
id requiredstring
position requirednumber
description requiredstring
sku requiredstring,null
quantity requirednumber,null
unitPriceMinor requirednumber,null
amountMinor requirednumber
taxMinor requirednumber,null
categoryId requiredstring,null
documentIds requiredarray of string
hidden requirednumber

Copies in the group the caller cannot read.

WorkflowRun

id requiredstring
workflowId requiredstring
version requirednumber
status requiredRUNNING PAUSED COMPLETED FAILED CANCELLED
trigger requiredAPI MANUAL SCHEDULE GMAIL GOOGLE_DRIVE DROPBOX EMAIL
startNodeId requiredstring
documents requirednumber
error requiredstring,null
createdAt requiredstring
finishedAt requiredstring,null
steps requiredarray of object
Fields
id requiredstring
nodeId requiredstring
type requiredapi_import document_aggregator google_drive_import gmail_input dropbox_import email_collector ai_agent convert_csv convert_excel decision document_classifier email_approval extract_data extract_data_set pdf_splitter split_collector business_insights email_file google_drive dropbox google_sheets xero_export
label requiredstring
status requiredPENDING RUNNING WAITING DONE SKIPPED FAILED
message requiredstring,null
documents requirednumber
files requiredarray of object
Fields
exportJobId requiredstring
filename requiredstring
rows requirednumber
url requiredstring,null

A signed link, or null once the file has expired.

table requiredobject or null
Fields
title requiredstring
columns requiredarray of string
rows requiredarray of array of string,number,null
totalRows requirednumber
approval requiredobject or null
Fields
recipients requiredarray of string
expiresAt requiredstring
decision requiredapprove reject or null
decidedBy requiredstring,null
decidedAt requiredstring,null
startedAt requiredstring,null
finishedAt requiredstring,null

WorkflowRunSummary

id requiredstring
workflowId requiredstring
version requirednumber
status requiredRUNNING PAUSED COMPLETED FAILED CANCELLED
trigger requiredAPI MANUAL SCHEDULE GMAIL GOOGLE_DRIVE DROPBOX EMAIL
startNodeId requiredstring
documents requirednumber
error requiredstring,null
createdAt requiredstring
finishedAt requiredstring,null

WorkflowRunPage

data requiredarray of object
Fields
id requiredstring
workflowId requiredstring
version requirednumber
status requiredRUNNING PAUSED COMPLETED FAILED CANCELLED
trigger requiredAPI MANUAL SCHEDULE GMAIL GOOGLE_DRIVE DROPBOX EMAIL
startNodeId requiredstring
documents requirednumber
error requiredstring,null
createdAt requiredstring
finishedAt requiredstring,null
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Error

error requiredobject
Fields
code requiredstring

Stable. Safe to branch on.

message requiredstring

Written for a person.

detailsany
requestIdstring

Quote this when you contact support.

Attachment

id requiredstring
filename requiredstring
contentType requiredstring
sizeBytes requiredinteger
url requiredstring

A signed link that lasts 15 minutes.

UploadTicket

uploadId requiredstring
method requiredPUT
url requiredstring

Send exactly sizeBytes bytes here, with these headers. It goes straight to storage.

headers requiredmap of string

The signature covers these, so send them exactly.

expiresAt requiredstring

When the URL stops working. If a PUT fails, ask for a new ticket and try once more.

AnalyticsSummary

totalMinor requirednumber
count requirednumber
averageMinor requirednumber
unconverted requirednumber

Expenses with no exchange rate yet. They are not in these totals.

reimbursableMinor requirednumber
billableMinor requirednumber
previous requiredobject
Fields
totalMinor requirednumber
count requirednumber
averageMinor requirednumber
changePct requirednumber,null
from requiredstring
to requiredstring
previousFrom requiredstring
previousTo requiredstring
currency requiredstring

Every amount here is in this currency: the workspace's base, or the one groupCurrency asked for.

convertedFrom requiredstring,null

Set when groupCurrency converted the amounts: the currency they were in, at the latest rate.

Breakdown

dimension requiredmerchant category project member tag department
totalMinor requirednumber
previousTotalMinor requirednumber
averageMinor requirednumber

What one row spends on average in this period, over every row and not only those within limit.

rows requiredarray of object
Fields
id requiredstring,null

The category, merchant, member, project, tag or department. Null is the row for expenses with none.

label requiredstring
totalMinor requirednumber
count requirednumber
previousMinor requirednumber
changePct requirednumber,null
sharePct requirednumber

Of the period's total, one decimal.

other requiredobject or null

Everything past limit. Null when every row fits.

Fields
totalMinor requirednumber
count requirednumber
previousMinor requirednumber
overlapping requiredboolean

True for tags: one expense can carry several, so rows can add up to more than the total.

from requiredstring
to requiredstring
previousFrom requiredstring
previousTo requiredstring
currency requiredstring

Every amount here is in this currency: the workspace's base, or the one groupCurrency asked for.

convertedFrom requiredstring,null

Set when groupCurrency converted the amounts: the currency they were in, at the latest rate.

Trend

interval requiredday week month quarter year running
points requiredarray of object
Fields
totalMinor requirednumber

Added up from the start of the period when the interval is running, like count and sharePct.

count requirednumber
sharePct requirednumber

Of the period's total, one decimal.

previousLabel requiredstring,null

The point at the same position in the previous period.

previousMinor requirednumber
start requiredstring

The days this point covers, cut to the period at either end.

end requiredstring
label requiredstring
shortLabel requiredstring
totalMinor requirednumber
count requirednumber
averageMinor requirednumber

What one point spends on average. For a running total, what each step adds on average.

from requiredstring
to requiredstring
previousFrom requiredstring
previousTo requiredstring
currency requiredstring

Every amount here is in this currency: the workspace's base, or the one groupCurrency asked for.

convertedFrom requiredstring,null

Set when groupCurrency converted the amounts: the currency they were in, at the latest rate.

Budget

id requiredstring
scope requiredCATEGORY TAG MEMBER
targetId requiredstring
targetName requiredstring
period requiredMONTH YEAR
periodKey requiredstring

2026-03 for a month, 2026 for a fiscal year.

periodStart requiredstring
periodEnd requiredstring
currency requiredstring
totalMinor requirednumber,null
perMemberMinor requirednumber,null
thresholds requiredarray of number
total requiredobject or null

Everyone together. Null when the budget has no shared limit.

Fields
limitMinor requirednumber
spentMinor requirednumber

Approved or paid.

pendingMinor requirednumber

Not void or rejected, and not approved yet: what is on its way.

remainingMinor requirednumber

Below zero once the limit is passed.

percentUsed requirednumber

Of the limit, rounded down.

mine requiredobject or null

The caller's own share. Null when they have no limit of their own here.

Fields
limitMinor requirednumber
spentMinor requirednumber

Approved or paid.

pendingMinor requirednumber

Not void or rejected, and not approved yet: what is on its way.

remainingMinor requirednumber

Below zero once the limit is passed.

percentUsed requirednumber

Of the limit, rounded down.

BudgetPage

data requiredarray of object
Fields
id requiredstring
scope requiredCATEGORY TAG MEMBER
targetId requiredstring
targetName requiredstring
period requiredMONTH YEAR
periodKey requiredstring

2026-03 for a month, 2026 for a fiscal year.

periodStart requiredstring
periodEnd requiredstring
currency requiredstring
totalMinor requirednumber,null
perMemberMinor requirednumber,null
thresholds requiredarray of number
total requiredobject or null

Everyone together. Null when the budget has no shared limit.

Fields
limitMinor requirednumber
spentMinor requirednumber

Approved or paid.

pendingMinor requirednumber

Not void or rejected, and not approved yet: what is on its way.

remainingMinor requirednumber

Below zero once the limit is passed.

percentUsed requirednumber

Of the limit, rounded down.

mine requiredobject or null

The caller's own share. Null when they have no limit of their own here.

Fields
limitMinor requirednumber
spentMinor requirednumber

Approved or paid.

pendingMinor requirednumber

Not void or rejected, and not approved yet: what is on its way.

remainingMinor requirednumber

Below zero once the limit is passed.

percentUsed requirednumber

Of the limit, rounded down.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

BulkDocumentResult

updated requirednumber
skipped requirednumber

Not found, not the caller's to change, or backing an expense on a submitted report.

nextCursorstring,null

With a filter: send this back as cursor until it is null.

DocumentCount

count requirednumber

TrashActionResult

updated requirednumber
skipped requirednumber
more requiredboolean

With all: there is more to do. Call again.

TrashedDocumentPage

data requiredarray of object
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
title requiredstring,null
originalFilename requiredstring,null
sizeBytes requirednumber
thumbnailUrl requiredstring,null
deletedAt requiredstring
purgeOn requiredstring

YYYY-MM-DD. The day this document and its files are deleted for good.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

BulkExpenseResult

updated requirednumber
skipped requirednumber

BulkReportResult

succeeded requiredarray of string
failed requiredarray of object
Fields
id requiredstring
reference requiredstring,null
code requiredstring
message requiredstring

CatalogImportResult

created requirednumber
updated requirednumber
skipped requirednumber

Rows that matched an existing record and changed nothing, or repeated an earlier row.

errors requiredarray of object

Rows that could not be used. line counts from 1 and includes the header.

Fields
line requirednumber
message requiredstring
removednumber

A replace: categories the file left out and nothing used, now deleted.

disablednumber

A replace: categories the file left out that something still uses, now turned off.

Category

id requiredstring
parentId requiredstring,null
name requiredstring
glCode requiredstring,null
taxLine requiredstring,null
origin requiredSYSTEM CUSTOM ACCOUNTING

Where it came from: the workspace template, a person, or an import from the connected books.

deductiblePct requirednumber
headerOnly requiredboolean

A heading over its subcategories. It groups the list and cannot be chosen on an expense.

enabled requiredboolean
system requiredboolean
position requirednumber
expenseCount requirednumber

A category on any expense cannot be deleted, only disabled.

type requiredEXPENSE COGS INCOME REFUND
payrollCode requiredstring,null

Null unless the caller manages settings or exports: payroll codes are not for everyone.

descriptionHint requiredstring,null

Shown under the description while someone fills in an expense.

approverId requiredstring,null

Sees any report carrying this category before the usual approvers.

approverName requiredstring,null
commentRequired requiredboolean

An expense here needs a description, or it carries a finding on its report.

maxExpenseMinor requirednumber,null

An expense here over this, in the workspace's currency, carries a finding on its report.

CategoryPage

data requiredarray of object
Fields
id requiredstring
parentId requiredstring,null
name requiredstring
glCode requiredstring,null
taxLine requiredstring,null
origin requiredSYSTEM CUSTOM ACCOUNTING

Where it came from: the workspace template, a person, or an import from the connected books.

deductiblePct requirednumber
headerOnly requiredboolean

A heading over its subcategories. It groups the list and cannot be chosen on an expense.

enabled requiredboolean
system requiredboolean
position requirednumber
expenseCount requirednumber

A category on any expense cannot be deleted, only disabled.

type requiredEXPENSE COGS INCOME REFUND
payrollCode requiredstring,null

Null unless the caller manages settings or exports: payroll codes are not for everyone.

descriptionHint requiredstring,null

Shown under the description while someone fills in an expense.

approverId requiredstring,null

Sees any report carrying this category before the usual approvers.

approverName requiredstring,null
commentRequired requiredboolean

An expense here needs a description, or it carries a finding on its report.

maxExpenseMinor requirednumber,null

An expense here over this, in the workspace's currency, carries a finding on its report.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

CommentPage

data requiredarray of object
Fields
id requiredstring
body requiredstring
attachments requiredarray of object
Fields
id requiredstring
filename requiredstring
contentType requiredstring
sizeBytes requiredinteger
url requiredstring

A signed link that lasts 15 minutes.

editedAt requiredstring,null
author requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
systemboolean

PaperTotal wrote this, about something that happened to the report.

actedBy requiredobject or null

The delegate who really wrote it, when that was not the author.

Fields
id requiredstring
name requiredstring,null
email requiredstring
mentions requiredarray of object
Fields
id requiredstring
name requiredstring,null
email requiredstring
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

CreatedId

id requiredstring

PostedComment

id requiredstring
body requiredstring
attachments requiredarray of object
Fields
id requiredstring
filename requiredstring
contentType requiredstring
sizeBytes requiredinteger
url requiredstring

A signed link that lasts 15 minutes.

editedAt requiredstring,null
author requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
systemboolean

PaperTotal wrote this, about something that happened to the report.

actedBy requiredobject or null

The delegate who really wrote it, when that was not the author.

Fields
id requiredstring
name requiredstring,null
email requiredstring
mentions requiredarray of object
Fields
id requiredstring
name requiredstring,null
email requiredstring
createdAt requiredstring
unreachable requiredarray of object

Members the comment named who cannot read this, so were not mentioned or told.

Fields
id requiredstring
name requiredstring,null
email requiredstring

MentionablePeople

data requiredarray of object
Fields
id requiredstring
name requiredstring,null
email requiredstring

Contact

id requiredstring
name requiredstring

Always something to show: the name, else the company, else the first address or number.

firstName requiredstring,null
lastName requiredstring,null
company requiredstring,null
title requiredstring,null
emails requiredarray of string
phones requiredarray of string
mobile requiredstring,null
fax requiredstring,null
website requiredstring,null
address requiredstring,null
city requiredstring,null
region requiredstring,null
postalCode requiredstring,null
country requiredstring,null
notes requiredstring,null
editedFields requiredarray of string

Fields a person changed, which reading the card again leaves alone.

documentId requiredstring,null
logoUrl requiredstring,null

The logo cut from the card, signed for 15 minutes. It stays when the card is deleted.

faxes requiredarray of string

Every fax number on the card, the first being fax.

cardImageUrl requiredstring,null
thumbnailUrl requiredstring,null
createdAt requiredstring
updatedAt requiredstring

ContactPage

data requiredarray of object
Fields
id requiredstring
name requiredstring

Always something to show: the name, else the company, else the first address or number.

firstName requiredstring,null
lastName requiredstring,null
company requiredstring,null
title requiredstring,null
emails requiredarray of string
phones requiredarray of string
mobile requiredstring,null
fax requiredstring,null
website requiredstring,null
address requiredstring,null
city requiredstring,null
region requiredstring,null
postalCode requiredstring,null
country requiredstring,null
notes requiredstring,null
editedFields requiredarray of string

Fields a person changed, which reading the card again leaves alone.

documentId requiredstring,null
logoUrl requiredstring,null

The logo cut from the card, signed for 15 minutes. It stays when the card is deleted.

faxes requiredarray of string

Every fax number on the card, the first being fax.

cardImageUrl requiredstring,null
thumbnailUrl requiredstring,null
createdAt requiredstring
updatedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

CustomField

id requiredstring
key requiredstring
label requiredstring
type requiredTEXT NUMBER DATE SELECT BOOLEAN
options requiredarray of string
required requiredboolean
position requirednumber

CustomFieldPage

data requiredarray of object
Fields
id requiredstring
key requiredstring
label requiredstring
type requiredTEXT NUMBER DATE SELECT BOOLEAN
options requiredarray of string
required requiredboolean
position requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

DeviceBlock

id requiredstring
deviceId requiredstring
reason requiredstring,null
createdAt requiredstring

DeviceBlockPage

data requiredarray of object
Fields
id requiredstring
deviceId requiredstring
reason requiredstring,null
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

DeviceBlockStatus

deviceId requiredstring
blocked requiredboolean
block requiredobject or null
Fields
id requiredstring
deviceId requiredstring
reason requiredstring,null
createdAt requiredstring

Document

id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
Fields
namestring,null
ratePctnumber,null
amountMinor requiredinteger
orderinteger or null
baseMinorinteger or null
codestring,null
totalInclusiveboolean,null
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
Fields
description requiredstring
skustring,null
quantitynumber,null
unitPriceMinorinteger or null
amountMinor requiredinteger
taxMinorinteger or null
idstring,null
orderinteger or null
textstring,null
typeroom tax parking service fee delivery product food alcohol tobacco transportation fuel refund discount payment giftcard donation toll lottery or null
fullDescriptionstring,null
normalizedDescriptionstring,null
sectionstring,null
referencestring,null
upcstring,null
hsnstring,null
lotstring,null
tagsarray of string or null
unitOfMeasurestring,null
discountMinorinteger or null
discountRatePctnumber,null
discountPriceMinorinteger or null
taxRatePctnumber,null
taxCodestring,null
subtotalMinorinteger or null
grossTotalMinorinteger or null
netTotalMinorinteger or null
datestring or null
startDatestring or null
endDatestring or null
categorystring,null
customCategoriesarray of string or null
customFieldsmap of any or null
countryOfOriginstring,null
manufacturerstring,null
weightstring,null
brandstring,null
hsaFsaEligibleboolean,null
productInfoobject or null
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
vendorsarray of object or null
Fields
namestring,null
rawNamestring,null
typestring,null
logostring,null
logoNamestring,null
externalIdstring,null
categorystring,null
orderNumberstring,null
countryCodestring,null
addressstring,null
rawAddressstring,null
parsedAddressobject or null
phoneNumberstring,null
faxNumberstring,null
emailstring,null
webstring,null
latnumber,null
lngnumber,null
mapUrlstring,null
vatNumberstring,null
isValidatedVatNumberboolean,null
regNumberstring,null
abnNumberstring,null
isRegisteredForGstboolean,null
bankobject or null
bankBreakdownarray of object or null
Fields
accountNamestring,null
accountNumberstring,null
accountCurrencystring,null
bankNamestring,null
bankNamesarray of string or null
bankAddressstring,null
bankAddressesarray of string or null
bankNumberstring,null
bankNumbersarray of string or null
bankSwiftstring,null
ibanstring,null
billerCodestring,null
billToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
vatNumberstring,null
regNumberstring,null
phoneNumberstring,null
emailstring,null
shipToobject or null
Fields
namestring,null
addressstring,null
parsedAddressobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
Fields
cardNumberstring,null
displayNamestring,null
termsstring,null
typenone visa master_card cash american_express interac other maestro discover bancontact girocard applepay paypal bancomat giftcard card check bankaxept bank-to-bank_transfer_bacs octopus pix jcb waon mada wechat alipay unionpay googlepay rupay bpay shopeepay mir giropay food_stamp diners_club paypay or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
Fields
data requiredstring
type requiredQR_CODE PDF417 EAN_13 EAN_8 UPC_A UPC_E CODE_128 CODE_39 ITF DATA_MATRIX AZTEC OTHER
page requiredinteger
boundingRegionarray of number or null
paymentLinksarray of object or null
Fields
url requiredstring
source requiredtext hyperlink qr_code barcode
folioobject or null
Fields
arrivalDatestring or null
departureDatestring or null
roomNumberstring,null
guestNamestring,null
nightsinteger or null
confirmationNumberstring,null
enrichedFieldsarray of string or null
checkobject or null
Fields
amountMinorinteger or null
amountTextstring,null
amountsAgreeboolean,null
bankNamestring,null
bankAddressstring,null
checkNumberstring,null
checkTypebank_draft bill_pay_draft business_check cashiers_check government_check money_order personal_check starter_check teller_check or null
currencystring or null
datestring or null
memostring,null
payerNamestring,null
payerAddressstring,null
receiverNamestring,null
receiverAddressstring,null
isSignedboolean,null
endorsementobject or null
microbject or null
fractionalRoutingNumberstring,null
routingFromFractionalstring,null
voidTermsstring,null
statementobject or null
Fields
accountHolderNamestring,null
accountHolderAddressstring,null
accountTypestring,null
accountNumberstring,null
bankNamestring,null
bankAddressstring,null
bankWebsitestring,null
bankVatNumberstring,null
accountVatNumberstring,null
periodStartDatestring or null
periodEndDatestring or null
statementDatestring or null
statementNumberstring,null
currencystring or null
beginningBalanceMinorinteger or null
endingBalanceMinorinteger or null
minimumDueMinorinteger or null
dueDatestring or null
routingNumberstring,null
swiftstring,null
ibanstring,null
accountsarray of object
balancesAgreeboolean,null
taxFormobject or null
Fields
kind requiredW2 W9 W8BEN_E
w2object or null
w9object or null
w8BenEmap of string,boolean,null or null
itineraryobject or null
Fields
travelerNamestring,null
bookingReferencestring,null
originstring,null
destinationstring,null
departsOnstring or null
returnsOnstring or null
segmentsarray of object
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
Fields
page requirednumber
before requiredstring,null
after requiredstring,null
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject
Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null
Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

DocumentOriginal

url requiredstring

Signed for 15 minutes. Opening it downloads the file as uploaded.

filename requiredstring
mimeType requiredstring

RevealedDocument

documentId requiredstring
values requiredarray of object
Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
id requiredstring
value requiredstring

The whole number. Never log or store this.

original requiredobject or null
Fields
url requiredstring

Signed for 15 minutes.

filename requiredstring
mimeType requiredstring
pages requiredarray of object
Fields
index requirednumber
tiffUrl requiredstring,null

A check only: 240 DPI bitonal G4. It prints the MICR line, so it is handed out here and nowhere else.

CheckWithDocument

check requiredobject
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
vendorsarray of object or null
bankBreakdownarray of object or null
billToobject or null
shipToobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
paymentLinksarray of object or null
folioobject or null
enrichedFieldsarray of string or null
checkobject or null
statementobject or null
taxFormobject or null
itineraryobject or null
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
isLcd requiredobject
screenshot requiredobject or null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

glare requiredobject
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

document requiredobject
Fields
id requiredstring
type requiredRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
status requiredUPLOADED PROCESSING PROCESSED FAILED
originalFilename requiredstring,null
mimeType requiredstring
sizeBytes requirednumber
pageCount requirednumber
externalId requiredstring,null
folderId requiredstring,null
expenseId requiredstring,null
mailInBatchId requiredstring,null
title requiredstring,null
notes requiredstring,null
latitude requirednumber,null

Where the device said it was when the photo was taken.

longitude requirednumber,null
locationAccuracyM requirednumber,null
duplicateOfId requiredstring,null
processingError requiredstring,null
processingErrorCode requiredFILE_ENCRYPTED or null

Set when the failure is one the file's owner can fix. processingError says what to do.

verification requiredstring
capturedAt requiredstring,null
processedAt requiredstring,null
viewedAt requiredstring,null
archivedAt requiredstring,null
createdAt requiredstring
uploadedBy requiredobject or null
Fields
id requiredstring
name requiredstring,null
pages requiredarray of object
Fields
index requirednumber
url requiredstring,null
thumbnailUrl requiredstring,null
width requirednumber,null
height requirednumber,null
isBlurry requiredobject
Fields
value requiredboolean,null
score requirednumber,null
glare requiredobject
Fields
value requiredboolean,null
score requirednumber,null
isLcd requiredobject

Blank for a caller without expenses.read_all.

Fields
value requiredboolean,null
score requirednumber,null
screenshot requiredobject or null

Null when the page is not one, and for a caller without expenses.read_all.

Fields
type requiredmobile_screenshot other_screenshot ai_generated
score requirednumber,null
aiGenerated requiredobject

Blank for a caller without expenses.read_all. Value null means nothing could say.

Fields
value requiredboolean,null
score requirednumber,null
language requiredstring,null
languages requiredarray of object
Fields
tag requiredstring
score requirednumber
ocrScore requirednumber,null
isFront requiredboolean,null

A check: the front or the back.

tiffRejectScore requirednumber,null

A check: 0 is a clean clearing image and 1 is one a bank would send back.

tiffUpscaled requiredboolean,null

A check: the photo was under 240 DPI, so the clearing image was enlarged.

classification requiredobject or null

What the classifier decided, when it was asked.

Fields
value requiredstring

A document class, or one of the labels the caller named.

score requirednumber

0..1.

engine requiredrules claude
scores requiredarray of object

The runners-up, best first.

Fields
value requiredstring
score requirednumber
blueprint requiredobject or null

The blueprint this was read with, and what came out of it.

Fields
name requiredstring
version requirednumber,null

Null for a built-in, which has no versions.

result requiredmap of any or null

The fields the blueprint defines. Null when the run failed.

offsetsmap of object

Where each value sits in the text, for a blueprint that asks.

unmatchedarray of string

Fields where a value was read and did not fit, such as words where a number belongs or a choice off the list. Each is left empty. An empty field not named here was not on the document.

error requiredstring,null

Why the run gave nothing back.

tags requiredarray of string
tagRefs requiredarray of object

The same tags with their ids, which a tag route takes.

Fields
id requiredstring
name requiredstring
recordStatus requiredprocessed reviewed archived or null

Where a read document stands: reviewedAt and archivedAt in one word. Null until it has been read.

duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

setId requiredstring,null

The upload this came out of: a ZIP, a split PDF or a batch of addresses.

customFields requiredmap of string or array of string or null

Values the workspace custom field rules read out of the text.

enrichment requiredobject or null

Work still running after the first answer.

Fields
status requiredPENDING DONE FAILED
steps requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
failed requiredarray of duplicates similar_documents line_item_expansion line_item_categorization line_item_custom_categorization xero_line_coding address_parsing fraud rules vendor_resolution
extraction requiredobject or null
Fields
fields requiredobject

What was read, as the extraction contract types it. fieldConfidence holds per-field confidence, 0..1.

Fields
documentTypeRECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
merchantNamestring,null
merchantAddressstring,null
merchantPhonestring,null
merchantWebsitestring,null
merchantTaxIdstring,null
datestring or null
timestring,null
dueDatestring or null
currencyAED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XCG XOF XPF YER ZAR ZMW ZWG CUC HRK SLL ZWL XDR XSU or null
currencyGuessedboolean
totalMinorinteger or null
subtotalMinorinteger or null
taxMinorinteger or null
taxLinesarray of object
tipMinorinteger or null
discountMinorinteger or null
shippingMinorinteger or null
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
cardBrandstring,null
cardLast4string,null
receiptNumberstring,null
invoiceNumberstring,null
poNumberstring,null
lineItemsarray of object
suggestedCategorystring,null
documentTitlestring,null
documentReferenceNumberstring,null
isDocumentboolean,null
isTransactionboolean,null
isMoneyInboolean,null
accountingEntryTypedebit credit or null
vendorobject or null
vendorsarray of object or null
bankBreakdownarray of object or null
billToobject or null
shipToobject or null
insuranceMinorinteger or null
cashbackMinorinteger or null
roundingMinorinteger or null
balanceMinorinteger or null
finalBalanceMinorinteger or null
previousBalanceMinorinteger or null
totalQuantitynumber,null
totalWeightstring,null
paymentobject or null
orderDatestring or null
shipDatestring or null
deliveryDatestring or null
serviceStartDatestring or null
serviceEndDatestring or null
exchangeRatenumber,null
countryCodestring,null
deliveryNoteNumberstring,null
trackingNumberstring,null
trackingNumbersarray of string or null
incotermsstring,null
weightsarray of string or null
licensePlateNumberstring,null
vinNumberstring,null
guestCountinteger or null
serverNamestring,null
storeNumberstring,null
vendingPersonstring,null
vendingPersonNumberstring,null
customerAccountNumberstring,null
categorystring,null
defaultCategorystring,null
barcodesarray of object or null
paymentLinksarray of object or null
folioobject or null
enrichedFieldsarray of string or null
checkobject or null
statementobject or null
taxFormobject or null
itineraryobject or null
fieldConfidencemap of number
fieldBoxesmap of object
confidence requirednumber,null
flags requiredarray of string
warnings requiredarray of object

Integrity findings. A caller without expenses.read_all sees the arithmetic and dates only.

Fields
code requiredtax_rate_mismatch item_counts_mismatch totals_mismatch line_item_amount_mismatch line_item_repeats barcode_decoding_issue barcode_code_missing_in_ocr logo_vendor_mismatch malware weekend_transaction time_and_currency_mismatch exif_creation_modified_date_mismatch missing_date suspicious_document_aspect_ratio generic_placeholder_content
message requiredstring
pagenumber,null
fraud requiredobject or null
Fields
version requiredstring
score requirednumber

0 to 1, from the signals that fired. Evidence, never a verdict.

color requiredgreen yellow red

Under the workspace yellow threshold is green. Over its red threshold is red.

types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other

Signals that fired, most important first.

details requiredmap of object

By signal: a description, a confidence and typed reasons.

attribution requiredstring,null

One sentence naming the strongest evidence.

decision requiredclear review fraud not_fraud unknown

clear or review until a person decides. Only a person can say fraud.

review requiredobject or null
Fields
decision requiredFRAUD NOT_FRAUD UNKNOWN
types requiredarray of digital_tampering fraudulent_pdf fraudulent_image generated_document ai_generated lcd_photo screenshot digital_background not_a_document duplicate similar_documents handwritten_characters invalid_qr_data invalid_mrz_data suspicious_content data_inconsistency vendor_layout_mismatch total_in_words_mismatch aspect_ratio_mismatch high_velocity critical_velocity multiple_profiles_or_devices fraud_history blocked_device other
note requiredstring,null
reviewedBy requiredobject or null
reviewedAt requiredstring
deviceId requiredstring,null

The id the client sent for its device, when it sent one.

submissions requiredobject or null

Documents from this uploader in this workspace, by window.

Fields
lastMinutes requirednumber
lastDay requirednumber
lastWeek requirednumber
last2Weeks requirednumber
lastMonth requirednumber
deviceProfiles requiredarray of object

Over 30 days, inside this workspace only.

Fields
deviceId requiredstring
profileId requiredstring
documentCount requirednumber
digitalTamperingFields requiredarray of string
handwriting requiredobject

What Claude saw written by hand, in dot notation, when a key is set and the handwriting signal is on. With no key, the lists are empty and the flags null: skipped says why.

Fields
handwrittenFields requiredarray of string
fullyHandwrittenFields requiredarray of string
handwrittenTamperedFields requiredarray of string
handwritingDetected requiredboolean,null
handwritingTamperingPresent requiredboolean,null
notADocument requiredobject
Fields
value requiredboolean,null
score requirednumber,null
digitalBackground requiredobject
Fields
value requiredboolean,null
score requirednumber,null
fraudulentPdf requiredobject or null
Fields
fraudulentPdfCreator requirednumber,null
textOverlay requirednumber,null
fontMismatch requirednumber,null
hasDigitalSignature requiredboolean,null
pdfModified requirednumber,null
incrementalUpdates requirednumber,null
incrementalChanges requiredarray of string
incrementalEdits requiredarray of object
signatureCreationTools requiredarray of string
dateInversion requirednumber,null
producerContentMismatch requirednumber,null
writerMismatch requirednumber,null
nullMetadata requirednumber,null
xmpInfoMismatch requirednumber,null
futureMetadataDate requirednumber,null
rasterProfileMismatch requirednumber,null
uncompressedRaster requirednumber,null
splicedPage requirednumber,null
splicedPageNumber requirednumber,null
valueFontSplice requirednumber,null
valueFontSplicePage requirednumber,null
headlessDesktopRender requirednumber,null
headlessRenderPlatform requiredstring,null
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
score requirednumber,null
fraudulentImage requiredobject or null
Fields
doubleJpeg requirednumber,null
firstQuantizationQuality requirednumber,null
scrubbedProvenance requirednumber,null
editorSignature requirednumber,null
editorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
editorSignatureValue requiredstring,null
generatorSignature requirednumber,null
generatorSignatureField requiredicc_profile exif:Software exif:ProcessingSoftware xmp:CreatorTool png:Software jpeg:comment or null
generatorSignatureValue requiredstring,null
generatorWriterProfile requirednumber,null
generatorWriterProfileValue requiredstring,null
syntheticRaster requirednumber,null
syntheticRasterFingerprints requiredarray of string
unprofiledPng requirednumber,null
unprofiledWebp requirednumber,null
source requiredoriginal render or null
sourceFormats requiredarray of string
unreadableSource requirednumber,null
score requirednumber,null
pages requiredarray of object
Fields
index requirednumber
isBlurry requiredobject
isLcd requiredobject
screenshot requiredobject or null
aiGenerated requiredobject

Value null means nothing could say: no pixel model runs, only metadata can answer.

glare requiredobject
skipped requiredarray of object

Checks that could not run on this file, so a clean result is not read as more than it is.

Fields
check requiredstring
reason requiredstring
sealed requiredarray of object

Bank and tax numbers read from this document, as masks. POST /v1/documents/{id}/reveal opens them.

Fields
kind requiredROUTING_NUMBER ACCOUNT_NUMBER MICR_LINE SSN EIN IBAN
masked requiredstring

All but the last few characters are stars. Punctuation stays where it was.

field requiredstring,null
page requirednumber
updatedAt requiredstring
extractor requiredstring,null

What read it: rules, claude, a blueprint, business-card, or none.

ocrText requiredstring,null

Everything read off the page. Card, bank and tax numbers are masked.

pdfUrl requiredstring,null

The PDF as uploaded, signed for 15 minutes. Null for an image, and for a PDF that prints a number only a reveal hands out.

meta requiredobject
Fields
totalPages requirednumber
processedPages requirednumber
ocrScore requirednumber,null

The average character confidence of the reading, which doubles as a measure of the image.

originalFileName requiredstring,null
source requiredWEB IOS ANDROID EMAIL API MAIL_IN INTEGRATION
language requiredstring,null

BCP-47.

languages requiredarray of object

Every language found, best first.

Fields
tag requiredstring
score requirednumber
deviceId requiredstring,null
deviceUserUuid requiredstring,null

The signed-in person the device was capturing for. Null when no device was named.

latitude requirednumber,null
longitude requirednumber,null
sourceDocuments requiredarray of map of any

Each file as submitted: name, type, size in KB, width, height and EXIF.

owner requiredobject or null

Who uploaded it.

Fields
id requiredstring
name requiredstring,null
duplicates requiredarray of object

Near copies past the workspace threshold, best first.

Fields
id requiredstring
url requiredstring
score requirednumber

Percent alike.

reviewedAt requiredstring,null

A person checked what was read.

approvedAt requiredstring,null

A developer's own approved flag. An expense's approval is a different thing.

DocumentText

text requiredstring,null

Everything recognized on the document. Card numbers are already masked.

language requiredstring,null

DownloadableFile

filename requiredstring
contentType requiredstring
content requiredstring

ExpenseDetail

id requiredstring
number requirednumber
reference requiredstring
status requiredPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kind requiredRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
merchantName requiredstring,null
tripTitle requiredstring,null

For a trip, what to call it in a list.

description requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
baseAmountMinor requirednumber
taxMinor requirednumber,null
category requiredobject or null
Fields
id requiredstring
name requiredstring
alsoCategories requiredarray of object

Further categories it can be found under. Its money stays in category.

Fields
id requiredstring
name requiredstring
project requiredobject or null
Fields
id requiredstring
name requiredstring
code requiredstring,null
client requiredobject or null
Fields
id requiredstring
name requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
moneyFlow requiredIN OUT

Which way the money went.

invoiceNumber requiredstring,null
matched requiredboolean

A card charge has been matched to it.

connectedApps requiredarray of string

Connected services it has been posted to.

reportId requiredstring,null
externalId requiredstring,null

A developer's own reference, exactly as sent.

billable requiredboolean
reimbursable requiredboolean
paymentType requiredCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
confidence requirednumber,null
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

reviewFields requiredarray of string
thumbnailUrl requiredstring,null
documentId requiredstring,null
tags requiredarray of object
Fields
id requiredstring
name requiredstring
color requiredstring,null
attendeeCount requirednumber
fxRate requirednumber

What one unit of the expense currency is worth in the base currency. Zero means no rate is available yet, so baseAmountMinor is zero too and the expense is held in review.

held requiredboolean

Held back from its report until someone releases it.

createdAt requiredstring
updatedAt requiredstring
notes requiredstring,null
subtotalMinor requirednumber,null
tipMinor requirednumber,null
discountMinor requirednumber,null
shippingMinor requirednumber,null
paymentAccountId requiredstring,null
cardLast4 requiredstring,null
poNumber requiredstring,null

The buyer's purchase order number, as an invoice prints it.

dueDate requiredstring,null

When an invoice falls due.

mcc requiredstring,null

The merchant category code a card network gave the merchant, four digits.

taxDeductible requiredboolean
quantity requirednumber,null
rateMinor requirednumber,null
unit requiredstring,null
trip requiredmap of any or null
vehicleId requiredstring,null
attendees requiredarray of object
Fields
name requiredstring
emailstring
phonestring
customFields requiredmap of any
editedFields requiredarray of string
duplicateOfId requiredstring,null
duplicateReview requiredobject or null

What the second look at a flagged copy decided, and why.

Fields
outcome requiredDISMISSED KEPT
reason requiredstring
engine requiredrules claude
at requiredstring
canSettleDuplicate requiredboolean

Whether the caller can answer the duplicate question on this expense.

splitParentId requiredstring,null
access requiredobject

What the caller may do with it.

Fields
canEdit requiredboolean
limited requiredboolean

Out for approval: only the amount, description, merchant, date, category, tags and attendees can change.

reason requiredstring,null

Why it cannot be edited, or how far it can, in words for the person looking at it.

amountLocked requiredboolean

The amount is a card's own figure.

canDelete requiredboolean
canRestore requiredboolean
restoreBlocked requiredstring,null

Why it cannot be restored: split, or merged, for good.

canSplit requiredboolean
canMove requiredboolean
splitInto requiredarray of object

This expense was divided: its parts now count in its place.

Fields
id requiredstring
reference requiredstring
amountMinor requirednumber
mergedIntoId requiredstring,null

A merge absorbed this expense. Where it went.

report requiredobject or null

The report this expense is on, named even where the caller could not list it.

Fields
id requiredstring
title requiredstring
status requiredstring
lines requiredarray of object
Fields
id requiredstring
position requirednumber
description requiredstring
sku requiredstring,null
quantity requirednumber,null
unitPriceMinor requirednumber,null
amountMinor requirednumber
taxMinor requirednumber,null
categoryId requiredstring,null
documentIds requiredarray of string

ExpensePage

data requiredarray of object
Fields
id requiredstring
number requirednumber
reference requiredstring
status requiredPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kind requiredRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
merchantName requiredstring,null
tripTitle requiredstring,null

For a trip, what to call it in a list.

description requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
baseAmountMinor requirednumber
taxMinor requirednumber,null
category requiredobject or null
Fields
id requiredstring
name requiredstring
alsoCategories requiredarray of object

Further categories it can be found under. Its money stays in category.

Fields
id requiredstring
name requiredstring
project requiredobject or null
Fields
id requiredstring
name requiredstring
code requiredstring,null
client requiredobject or null
Fields
id requiredstring
name requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
moneyFlow requiredIN OUT

Which way the money went.

invoiceNumber requiredstring,null
matched requiredboolean

A card charge has been matched to it.

connectedApps requiredarray of string

Connected services it has been posted to.

reportId requiredstring,null
externalId requiredstring,null

A developer's own reference, exactly as sent.

billable requiredboolean
reimbursable requiredboolean
paymentType requiredCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
confidence requirednumber,null
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

reviewFields requiredarray of string
thumbnailUrl requiredstring,null
documentId requiredstring,null
tags requiredarray of object
Fields
id requiredstring
name requiredstring
color requiredstring,null
attendeeCount requirednumber
fxRate requirednumber

What one unit of the expense currency is worth in the base currency.

held requiredboolean

Held back from its report until someone releases it.

createdAt requiredstring
updatedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ExpenseTotals

count requirednumber
moneyOutMinor requirednumber

Money out, in the base currency.

moneyInMinor requirednumber

Money in, in the base currency: income, refunds and credits, as a positive figure.

baseAmountMinor requirednumber

In the workspace's base currency. A credit or a refund is negative, so it brings this down.

currency requiredstring
unconverted requirednumber

Counted, but with no exchange rate yet, so they add nothing to the amount.

totalMinor requirednumber

baseAmountMinor in the currency asked for.

totalCurrency requiredstring
convertedFrom requiredstring,null

Set when totalCurrency is not the base: the currency it was converted from, at the latest rate.

ExportJob

id requiredstring
kind requiredexpenses report tax mileage receipts documents
format requiredCSV XLSX PDF ZIP QBO_CSV XERO_CSV SAGE_CSV DYNAMICS_CSV MYOB_TXT ORACLE_CSV SAP_CSV IIF OFX JSON XML TXT XLS
status requiredEXPIRED FAILED COMPLETED QUEUED RUNNING
filters requiredobject
Fields
statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
idsarray of string
yearinteger
reportStateDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED or array of DRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
reportIdsarray of string
startDatestring
endDatestring
approvedAfterstring
exportedboolean
categoryIdsarray of string
documentIdsarray of string
documentTypesarray of RECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
policyIdsarray of string
approvalLinkIdstring
columnsarray of object
Fields
key requiredstring
labelstring
formulastring
columnSetsimple detailed
presetbasic all_data_expense all_data_report canadian_multiple_tax category per_diem tag tax_report
viewobject
Fields
levelexpense report
columns requiredarray of object
Fields
key requiredstring
labelstring
sortdate:asc date:desc merchant:asc merchant:desc category:asc category:desc status:asc status:desc amount:asc amount:desc
groupBycategory merchant member project status month
groupsOnlyboolean
notifyRequesterboolean
fullPageReceiptsboolean
templatestring
emailMessagestring
delimiter, ; |
bomboolean
recipientsarray of string (email)
scheduledReportIdstring
scheduledReportNamestring
notesarray of string
filename requiredstring,null
rowCount requirednumber,null
error requiredstring,null

Why it failed, written for a person.

notes requiredarray of string

What a finished file left out, such as credits a bill import cannot take.

requestedBy requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
onFinish requiredobject or null

How the actions the export asked for went. Null when it asked for none.

Fields
markAsExported requiredobject or null
Fields
state requiredPENDING DONE FAILED SKIPPED
marked requiredarray of string

The reports this export marked, by reference.

skipped requiredarray of object

The reports it left as they were, and why.

Fields
reference requiredstring
reason requiredstring
error requiredstring,null
sftpUpload requiredobject or null

Where the file went. The credentials are never returned.

Fields
state requiredPENDING DONE FAILED SKIPPED
host requiredstring
port requirednumber
path requiredstring
attempts requirednumber
file requiredstring,null

Where the file landed on the server.

error requiredstring,null
uploadedAt requiredstring,null
createdAt requiredstring
completedAt requiredstring,null
expiresAt requiredstring,null
downloadUrl requiredstring,null

Signed, valid for 15 minutes. Null until the file is ready and after it expires.

ExportJobPage

data requiredarray of object
Fields
id requiredstring
kind requiredexpenses report tax mileage receipts documents
format requiredCSV XLSX PDF ZIP QBO_CSV XERO_CSV SAGE_CSV DYNAMICS_CSV MYOB_TXT ORACLE_CSV SAP_CSV IIF OFX JSON XML TXT XLS
status requiredEXPIRED FAILED COMPLETED QUEUED RUNNING
filters requiredobject
Fields
statusPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID or array of PROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kindRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
paymentTypeCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER
ownerIdstring
scopemine all
categoryIdstring
merchantIdstring
projectIdstring
clientIdstring
tagIdstring
departmentstring
reportIdstring
externalIdstring
unreportedboolean
needsReviewboolean
billableboolean
reimbursableboolean
moneyFlowIN OUT
dateFielddate createdAt updatedAt submittedAt approvedAt
fromstring
tostring
minMinorinteger
maxMinorinteger
qstring
idsarray of string
yearinteger
reportStateDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED or array of DRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
reportIdsarray of string
startDatestring
endDatestring
approvedAfterstring
exportedboolean
categoryIdsarray of string
documentIdsarray of string
documentTypesarray of RECEIPT INVOICE BILL BANK_STATEMENT CHECK TAX_FORM BUSINESS_CARD OTHER UNKNOWN PURCHASE_ORDER CONTRACT PACKING_SLIP REMITTANCE_ADVICE CREDIT_NOTE STATEMENT
policyIdsarray of string
approvalLinkIdstring
columnsarray of object
Fields
key requiredstring
labelstring
formulastring
columnSetsimple detailed
presetbasic all_data_expense all_data_report canadian_multiple_tax category per_diem tag tax_report
viewobject
Fields
levelexpense report
columns requiredarray of object
sortdate:asc date:desc merchant:asc merchant:desc category:asc category:desc status:asc status:desc amount:asc amount:desc
groupBycategory merchant member project status month
groupsOnlyboolean
notifyRequesterboolean
fullPageReceiptsboolean
templatestring
emailMessagestring
delimiter, ; |
bomboolean
recipientsarray of string (email)
scheduledReportIdstring
scheduledReportNamestring
notesarray of string
filename requiredstring,null
rowCount requirednumber,null
error requiredstring,null

Why it failed, written for a person.

notes requiredarray of string

What a finished file left out, such as credits a bill import cannot take.

requestedBy requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
onFinish requiredobject or null

How the actions the export asked for went. Null when it asked for none.

Fields
markAsExported requiredobject or null
Fields
state requiredPENDING DONE FAILED SKIPPED
marked requiredarray of string

The reports this export marked, by reference.

skipped requiredarray of object

The reports it left as they were, and why.

error requiredstring,null
sftpUpload requiredobject or null

Where the file went. The credentials are never returned.

Fields
state requiredPENDING DONE FAILED SKIPPED
host requiredstring
port requirednumber
path requiredstring
attempts requirednumber
file requiredstring,null

Where the file landed on the server.

error requiredstring,null
uploadedAt requiredstring,null
createdAt requiredstring
completedAt requiredstring,null
expiresAt requiredstring,null
downloadUrl requiredstring,null

Signed, valid for 15 minutes. Null until the file is ready and after it expires.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Folder

id requiredstring
parentId requiredstring,null
name requiredstring
documentCount requirednumber

FolderPage

data requiredarray of object
Fields
id requiredstring
parentId requiredstring,null
name requiredstring
documentCount requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Hold

id requiredstring
held requiredboolean
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

Reached

reached requiredarray of string

Who can read it now and has been told.

Merchant

id requiredstring
name requiredstring
defaultCategoryId requiredstring,null
website requiredstring,null
phone requiredstring,null
address requiredstring,null
taxId requiredstring,null
is1099 requiredboolean
merchantType requiredairline lodging car_rental ground_transport fuel dining grocery office software utilities supplies other or null

What kind of business this is. Null lets a rule work it out from the card code or the name.

expenseCount requirednumber
totalMinor requirednumber

Non-void expenses, in the workspace's base currency.

aliases requiredarray of object

Other spellings that file here: left by a merge or a rename.

Fields
id requiredstring
name requiredstring

MerchantPage

data requiredarray of object
Fields
id requiredstring
name requiredstring
defaultCategoryId requiredstring,null
website requiredstring,null
phone requiredstring,null
address requiredstring,null
taxId requiredstring,null
is1099 requiredboolean
merchantType requiredairline lodging car_rental ground_transport fuel dining grocery office software utilities supplies other or null

What kind of business this is. Null lets a rule work it out from the card code or the name.

expenseCount requirednumber
totalMinor requirednumber

Non-void expenses, in the workspace's base currency.

aliases requiredarray of object

Other spellings that file here: left by a merge or a rename.

Fields
id requiredstring
name requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

MileageLog

from requiredstring
to requiredstring
rows requiredarray of object
Fields
expenseId requiredstring
reference requiredstring
status requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
date requiredstring
purpose requiredstring
origin requiredstring
stops requiredarray of string

Places along the way.

destination requiredstring
originLabel requiredstring,null

The name of a saved place at this address, such as Home.

destinationLabel requiredstring,null
departed requiredstring,null

HH:MM.

arrived requiredstring,null

HH:MM.

distance requirednumber
unit requiredstring
calculation requiredstring

How the amount was reached: 8.1 mi x $0.76/mi = $6.16.

purposeKind requiredbusiness medical charity

What the trip was for, by the rate it took.

roundTrip requiredboolean
odometerStart requirednumber,null
odometerEnd requirednumber,null
odometerPhotos requiredobject

Documents holding a photo of each reading, and the one image they are merged into.

Fields
start requiredstring,null
end requiredstring,null
merged requiredstring,null
receiptDocumentId requiredstring,null

The generated mileage receipt.

vehicle requiredobject or null
Fields
id requiredstring
name requiredstring
plate requiredstring,null
rateMinor requirednumber

A hundredth of a cent per unit.

rateName requiredstring,null
amountMinor requirednumber
currency requiredstring
entry requiredMANUAL ODOMETER MAP GPS

How the distance came to be known. Only MAP and GPS were measured.

driven requirednumber

The whole drive. distance is what is claimed, which is less when a commute came off it.

commuteExcluded requirednumber,null

The commute taken off this trip, or null if none was.

taxMinor requirednumber,null

The tax on this trip, when its workspace tracks tax on distance.

currency requiredstring
totals requiredobject
Fields
trips requirednumber
amountMinor requirednumber
distances requiredarray of object
Fields
unit requiredstring
distance requirednumber
months requiredarray of object
Fields
month requiredstring

YYYY-MM.

trips requirednumber
amountMinor requirednumber
tally requiredobject or null

Where the person stands against a yearly limit, for a rate that drops after it.

Fields
year requirednumber
distance requirednumber
limit requirednumber
unit requiredstring
remaining requirednumber

MileageRate

id requiredstring
name requiredstring
unit requiredmi km
rateMinor requirednumber

A hundredth of a cent per unit, so 72.5 cents is 7250.

currency requiredstring
effectiveFrom requiredstring
effectiveTo requiredstring,null

The last day this rate covers. Null runs until a newer rate of the same name.

isDefault requiredboolean
archived requiredboolean
taxBasisPoints requirednumber,null

Tax on the reclaimable part, in hundredths of a percent. 2000 is 20%. Used while the workspace tracks tax on distance.

taxReclaimableMinor requirednumber,null

The fixed part of this rate tax can be reclaimed on, at the same scale as rateMinor.

autoGenerated requiredboolean

The government-rate job added this row, and no admin has changed its amount, start or end.

MileageRatePage

data requiredarray of object
Fields
id requiredstring
name requiredstring
unit requiredmi km
rateMinor requirednumber

A hundredth of a cent per unit, so 72.5 cents is 7250.

currency requiredstring
effectiveFrom requiredstring
effectiveTo requiredstring,null

The last day this rate covers. Null runs until a newer rate of the same name.

isDefault requiredboolean
archived requiredboolean
taxBasisPoints requirednumber,null

Tax on the reclaimable part, in hundredths of a percent. 2000 is 20%. Used while the workspace tracks tax on distance.

taxReclaimableMinor requirednumber,null

The fixed part of this rate tax can be reclaimed on, at the same scale as rateMinor.

autoGenerated requiredboolean

The government-rate job added this row, and no admin has changed its amount, start or end.

nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

PerDiemRate

id requiredstring
name requiredstring
country requiredstring,null
region requiredstring,null
amountMinor requirednumber
currency requiredstring
archived requiredboolean

PerDiemRatePage

data requiredarray of object
Fields
id requiredstring
name requiredstring
country requiredstring,null
region requiredstring,null
amountMinor requirednumber
currency requiredstring
archived requiredboolean
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Project

id requiredstring
name requiredstring
code requiredstring,null
clientId requiredstring,null
clientName requiredstring,null
budgetMinor requirednumber,null
spentMinor requirednumber

Non-void expenses, in the workspace's base currency.

expenseCount requirednumber
archived requiredboolean

ProjectPage

data requiredarray of object
Fields
id requiredstring
name requiredstring
code requiredstring,null
clientId requiredstring,null
clientName requiredstring,null
budgetMinor requirednumber,null
spentMinor requirednumber

Non-void expenses, in the workspace's base currency.

expenseCount requirednumber
archived requiredboolean
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ReportDetail

purpose requiredstring,null
rejectionReason requiredstring,null
rejectedAt requiredstring,null
reimbursedAt requiredstring,null
exportedAt requiredstring,null
expenses requiredarray of object
Fields
id requiredstring
number requirednumber
reference requiredstring
status requiredPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kind requiredRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
merchantName requiredstring,null
tripTitle requiredstring,null

For a trip, what to call it in a list.

description requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
baseAmountMinor requirednumber
taxMinor requirednumber,null
category requiredobject or null
Fields
id requiredstring
name requiredstring
alsoCategories requiredarray of object

Further categories it can be found under. Its money stays in category.

Fields
id requiredstring
name requiredstring
project requiredobject or null
Fields
id requiredstring
name requiredstring
code requiredstring,null
client requiredobject or null
Fields
id requiredstring
name requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
moneyFlow requiredIN OUT

Which way the money went.

invoiceNumber requiredstring,null
matched requiredboolean

A card charge has been matched to it.

connectedApps requiredarray of string

Connected services it has been posted to.

reportId requiredstring,null
externalId requiredstring,null

A developer's own reference, exactly as sent.

billable requiredboolean
reimbursable requiredboolean
paymentType requiredCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
confidence requirednumber,null
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

reviewFields requiredarray of string
thumbnailUrl requiredstring,null
documentId requiredstring,null
tags requiredarray of object
Fields
id requiredstring
name requiredstring
color requiredstring,null
attendeeCount requirednumber
fxRate requirednumber

What one unit of the expense currency is worth in the base currency.

held requiredboolean

Held back from its report until someone releases it.

createdAt requiredstring
updatedAt requiredstring
findings requiredarray of object
Fields
code requiredPOLICY_VIOLATION
ruleId requiredstring
type requiredMAX_AMOUNT DAILY_LIMIT RECEIPT_REQUIRED MAX_AGE_DAYS CATEGORY_REQUIRED PROJECT_REQUIRED DESCRIPTION_REQUIRED ATTENDEES_REQUIRED PROHIBITED WEEKEND_SPEND ITEMIZED_RECEIPT_REQUIRED TAG_REQUIRED FUTURE_DATE COMPANY_CARD_REQUIRED PROHIBITED_ITEM ATTENDEE_LIMIT RECEIPT_MISMATCH BILLABLE_NOT_ALLOWED CONVERSION_SURCHARGE RATE_OUT_OF_POLICY DISTANCE_INCREASED NO_ROUTE INACTIVE_VENDOR OVER_AUTO_APPROVAL TAG_OUT_OF_POLICY TAX_OUT_OF_POLICY TAX_REQUIRED AI_GENERATED_RECEIPT TRIP_LIMIT FRINGE_BENEFITS
severity requiredWARN BLOCK_SUBMIT WAIVE
expenseId requiredstring
expenseReference requiredstring
message requiredstring
reviewerOnlyboolean

Evidence for a reviewer. It never reaches the person who uploaded the receipt.

approvals requiredarray of object
Fields
id requiredstring
level requirednumber
approver requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
actedBy requiredobject or null

Set when someone else acted for the approver.

Fields
id requiredstring
name requiredstring,null
email requiredstring
state requiredAPPROVED REJECTED PENDING SKIPPED WAITING
comment requiredstring,null
decidedAt requiredstring,null
participants requiredarray of object

People added to the report. They can read it and comment, nothing more.

Fields
id requiredstring
name requiredstring,null
email requiredstring
fields requiredarray of object
Fields
id requiredstring
name requiredstring
type requiredTEXT DATE LIST FORMULA
options requiredarray of string
formula requiredstring,null
required requiredboolean
enabled requiredboolean
position requirednumber
disabledOptionsarray of string

List values turned off: kept on reports that hold them, and not offered for new ones.

importedboolean

Came from the connected books, so it cannot be deleted and its values only turn on and off.

value requiredstring,null
titleLocked requiredboolean

True when a title typed here would be refused: the workspace's formula sets it.

noApprovalStep requiredboolean

Submitting needs nobody's approval, so it finishes the report.

exportable requiredboolean

This person can export this report or share it. Someone added only to read and comment cannot.

ccEmails requiredarray of string

Addresses outside the workspace copied on each submission.

canPickApprover requiredboolean

A draft whose workflow leaves the next approver open, so the person submitting can name one.

canSendOutside requiredboolean

A draft in a workspace with nobody else to approve it, which can go to someone outside instead.

outsideApprover requiredobject or null

Someone with no account has this report, through a link. A null email is a link that went out on a PDF.

Fields
email requiredstring,null
expiresAt requiredstring
expenseColumns requiredmap of object

What the expense table's optional columns read, by expense id.

customFieldLabels requiredobject

The workspace's first two custom fields, which the Custom field 1 and 2 columns show.

Fields
first requiredstring,null
second requiredstring,null
withdrawalId requiredstring,null

The batch that pays this report.

internationalReimbursementId requiredstring,null

The same, where the batch pays in another currency than the workspace's.

final requiredboolean

Nothing more is due: paid, or approved with nothing to pay, or done.

findingsAccepted requiredobject or null

Someone has reviewed and accepted what the receipt checks found.

Fields
by requiredobject or null
Fields
id requiredstring
name requiredstring,null
email requiredstring
at requiredstring
auditNote requiredstring,null

What the receipt audit did on this report, on a plan that has it. There even when it found nothing.

needsAcceptance requiredboolean

Receipt checks found something, and approving this report has to wait for someone to accept it.

timeline requiredarray of object
Fields
id requiredstring
action requiredstring
actor requiredobject or null

Null when PaperTotal did it on a schedule.

Fields
id requiredstring
name requiredstring,null
email requiredstring
onBehalfOf requiredobject or null

The person whose name this was done in, when the actor was covering for them.

Fields
id requiredstring
name requiredstring,null
email requiredstring
detail requiredstring,null

The reason, comment or note that came with the action.

metadata requiredmap of any
at requiredstring
heldExpenseIds requiredarray of string
actions requiredarray of delete approve submit retract reject reopen close mark_exported mark_reimbursed edit reassign duplicate invite accept_findings received_payment
selfApproval requiredboolean

True when the caller's approval would be a self-approval the workspace allows.

deciding requiredboolean

The caller holds a step that is live now, for themselves or as a delegate. Without one, a workspace admin has to bypass.

id requiredstring
number requirednumber
reference requiredstring
title requiredstring
status requiredDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
stage requiredDRAFT SUBMITTED OUTSTANDING APPROVED REJECTED PAID EXPORTED DONE
paymentStage requiredMARKED_AS_PAID WITHDRAWING CONFIRMED or null
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
currency requiredstring
totalMinor requirednumber
reimbursableMinor requirednumber
expenseCount requirednumber
findingCount requirednumber
periodStart requiredstring,null
periodEnd requiredstring,null
autoCreated requiredboolean
waitingOn requiredarray of object

Who the report is with right now.

Fields
id requiredstring
name requiredstring,null
email requiredstring
submittedAt requiredstring,null
approvedAt requiredstring,null
createdAt requiredstring
updatedAt requiredstring

ReportPage

data requiredarray of object
Fields
id requiredstring
number requirednumber
reference requiredstring
title requiredstring
status requiredDRAFT SUBMITTED APPROVED REJECTED REIMBURSED EXPORTED CLOSED
stage requiredDRAFT SUBMITTED OUTSTANDING APPROVED REJECTED PAID EXPORTED DONE

Submitted until someone has acted on it. Outstanding once it is part way: under review, with a hold, or partly approved.

paymentStage requiredMARKED_AS_PAID WITHDRAWING CONFIRMED or null
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
currency requiredstring
totalMinor requirednumber
reimbursableMinor requirednumber
expenseCount requirednumber
findingCount requirednumber
periodStart requiredstring,null
periodEnd requiredstring,null
autoCreated requiredboolean
waitingOn requiredarray of object

Who the report is with right now.

Fields
id requiredstring
name requiredstring,null
email requiredstring
submittedAt requiredstring,null
approvedAt requiredstring,null
createdAt requiredstring
updatedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Tag

id requiredstring
name requiredstring
groupName requiredstring,null
glCode requiredstring,null
color requiredstring,null
archived requiredboolean
expenseCount requirednumber
approverId requiredstring,null

Reviews any report carrying this tag, after any category approvers and ahead of the workflow.

approverName requiredstring,null
parentId requiredstring,null

The tag this one sits under. An expense carrying this one has to carry that one too.

parentName requiredstring,null

TagPage

data requiredarray of object
Fields
id requiredstring
name requiredstring
groupName requiredstring,null
glCode requiredstring,null
color requiredstring,null
archived requiredboolean
expenseCount requirednumber
approverId requiredstring,null

Reviews any report carrying this tag, after any category approvers and ahead of the workflow.

approverName requiredstring,null
parentId requiredstring,null

The tag this one sits under. An expense carrying this one has to carry that one too.

parentName requiredstring,null
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

TaxSummary

year requirednumber
from requiredstring
to requiredstring
fiscalYearStartMonth requirednumber
currency requiredstring
notice requiredstring
mileageNotice requiredstring
lines requiredarray of object
Fields
line requiredstring

The Schedule C line: "9", "24b".

label requiredstring
count requirednumber
spentMinor requirednumber
deductibleMinor requirednumber
categories requiredarray of object
Fields
id requiredstring
name requiredstring
deductiblePct requirednumber
count requirednumber
spentMinor requirednumber
deductibleMinor requirednumber
mileage requiredarray of object
Fields
unit requiredstring
trips requirednumber
distance requirednumber
deductionMinor requirednumber
unassigned requiredobject

Spending on a category with no tax line, or on no category.

Fields
count requirednumber
spentMinor requirednumber
excluded requiredobject

Expenses a person marked as not deductible.

Fields
count requirednumber
spentMinor requirednumber
payees requiredobject

1099s follow the calendar year whatever the fiscal year, so this has its own dates.

Fields
from requiredstring
to requiredstring
rows requiredarray of object
Fields
merchantId requiredstring
name requiredstring
count requirednumber
totalMinor requirednumber
cardMinor requirednumber

Paid by card. Card payments are reported by the processor, so a preparer usually sets these aside.

taxIdOnFile requiredboolean

Whether a tax id is on file. The number itself is never shown or exported.

needsReview requirednumber

Counted above, but a person has not confirmed them yet.

unconverted requirednumber

Expenses with no exchange rate yet. They are not in these figures.

spentMinor requirednumber
deductibleMinor requirednumber

TravelTrip

id requiredstring
ownerId requiredstring
name requiredstring
origin requiredstring,null
destination requiredstring,null
departsOn requiredstring

YYYY-MM-DD.

returnsOn requiredstring,null

YYYY-MM-DD.

merchantName requiredstring,null
bookingReference requiredstring,null
currency requiredstring,null
totalMinor requirednumber,null

In minor units of the currency: 1250 is 12.50.

segments requiredarray of object

Flights, stays, cars and trains, in order.

Fields
kind requiredflight hotel car rail other
carrierstring,null
numberstring,null
fromstring,null
tostring,null
departsAtstring,null
arrivesAtstring,null
confirmationNumberstring,null
seatstring,null
documentIds requiredarray of string

The itinerary and the receipts filed against this trip.

createdAt requiredstring
updatedAt requiredstring

TravelTripPage

data requiredarray of object
Fields
id requiredstring
ownerId requiredstring
name requiredstring
origin requiredstring,null
destination requiredstring,null
departsOn requiredstring

YYYY-MM-DD.

returnsOn requiredstring,null

YYYY-MM-DD.

merchantName requiredstring,null
bookingReference requiredstring,null
currency requiredstring,null
totalMinor requirednumber,null

In minor units of the currency: 1250 is 12.50.

segments requiredarray of object

Flights, stays, cars and trains, in order.

Fields
kind requiredflight hotel car rail other
carrierstring,null
numberstring,null
fromstring,null
tostring,null
departsAtstring,null
arrivesAtstring,null
confirmationNumberstring,null
seatstring,null
documentIds requiredarray of string

The itinerary and the receipts filed against this trip.

createdAt requiredstring
updatedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

Trip

expenseId requiredstring
reference requiredstring
status requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
date requiredstring
purpose requiredstring
origin requiredstring
stops requiredarray of string

Places along the way.

destination requiredstring
originLabel requiredstring,null

The name of a saved place at this address, such as Home.

destinationLabel requiredstring,null
departed requiredstring,null

HH:MM.

arrived requiredstring,null

HH:MM.

distance requirednumber
unit requiredstring
calculation requiredstring

How the amount was reached: 8.1 mi x $0.76/mi = $6.16.

purposeKind requiredbusiness medical charity

What the trip was for, by the rate it took.

roundTrip requiredboolean
odometerStart requirednumber,null
odometerEnd requirednumber,null
odometerPhotos requiredobject

Documents holding a photo of each reading, and the one image they are merged into.

Fields
start requiredstring,null
end requiredstring,null
merged requiredstring,null
receiptDocumentId requiredstring,null

The generated mileage receipt.

vehicle requiredobject or null
Fields
id requiredstring
name requiredstring
plate requiredstring,null
rateMinor requirednumber

A hundredth of a cent per unit.

rateName requiredstring,null
amountMinor requirednumber
currency requiredstring
entry requiredMANUAL ODOMETER MAP GPS

How the distance came to be known. Only MAP and GPS were measured.

driven requirednumber

The whole drive. distance is what is claimed, which is less when a commute came off it.

commuteExcluded requirednumber,null

The commute taken off this trip, or null if none was.

taxMinor requirednumber,null

The tax on this trip, when its workspace tracks tax on distance.

TripRoutes

array of object

origin requiredstring
stops requiredarray of string
destination requiredstring
distance requirednumber

One way, as it would be typed.

unit requiredstring
roundTrip requiredboolean
lastDriven requiredstring
uses requirednumber

ExpenseDetails

array of object

id requiredstring
number requirednumber
reference requiredstring
status requiredPROCESSING NEEDS_REVIEW READY SUBMITTED APPROVED REJECTED REIMBURSED VOID
kind requiredRECEIPT MANUAL MILEAGE PER_DIEM TIME CARD
merchantName requiredstring,null
tripTitle requiredstring,null

For a trip, what to call it in a list.

description requiredstring,null
date requiredstring
currency requiredstring
amountMinor requirednumber
baseAmountMinor requirednumber
taxMinor requirednumber,null
category requiredobject or null
Fields
id requiredstring
name requiredstring
alsoCategories requiredarray of object

Further categories it can be found under. Its money stays in category.

Fields
id requiredstring
name requiredstring
project requiredobject or null
Fields
id requiredstring
name requiredstring
code requiredstring,null
client requiredobject or null
Fields
id requiredstring
name requiredstring
owner requiredobject
Fields
id requiredstring
name requiredstring,null
email requiredstring
moneyFlow requiredIN OUT

Which way the money went.

invoiceNumber requiredstring,null
matched requiredboolean

A card charge has been matched to it.

connectedApps requiredarray of string

Connected services it has been posted to.

reportId requiredstring,null
externalId requiredstring,null

A developer's own reference, exactly as sent.

billable requiredboolean
reimbursable requiredboolean
paymentType requiredCASH PERSONAL_CARD COMPANY_CARD BANK_TRANSFER CHECK PAYPAL OTHER or null
confidence requirednumber,null
flags requiredarray of object
Fields
code requiredstring
message requiredstring
severity requiredinfo warn block
bystring

Who put it there, where that decides who may take it off.

reviewFields requiredarray of string
thumbnailUrl requiredstring,null
documentId requiredstring,null
tags requiredarray of object
Fields
id requiredstring
name requiredstring
color requiredstring,null
attendeeCount requirednumber
fxRate requirednumber

What one unit of the expense currency is worth in the base currency. Zero means no rate is available yet, so baseAmountMinor is zero too and the expense is held in review.

held requiredboolean

Held back from its report until someone releases it.

createdAt requiredstring
updatedAt requiredstring
notes requiredstring,null
subtotalMinor requirednumber,null
tipMinor requirednumber,null
discountMinor requirednumber,null
shippingMinor requirednumber,null
paymentAccountId requiredstring,null
cardLast4 requiredstring,null
poNumber requiredstring,null

The buyer's purchase order number, as an invoice prints it.

dueDate requiredstring,null

When an invoice falls due.

mcc requiredstring,null

The merchant category code a card network gave the merchant, four digits.

taxDeductible requiredboolean
quantity requirednumber,null
rateMinor requirednumber,null
unit requiredstring,null
trip requiredmap of any or null
vehicleId requiredstring,null
attendees requiredarray of object
Fields
name requiredstring
emailstring
phonestring
customFields requiredmap of any
editedFields requiredarray of string
duplicateOfId requiredstring,null
duplicateReview requiredobject or null

What the second look at a flagged copy decided, and why.

Fields
outcome requiredDISMISSED KEPT
reason requiredstring
engine requiredrules claude
at requiredstring
canSettleDuplicate requiredboolean

Whether the caller can answer the duplicate question on this expense.

splitParentId requiredstring,null
access requiredobject

What the caller may do with it.

Fields
canEdit requiredboolean
limited requiredboolean

Out for approval: only the amount, description, merchant, date, category, tags and attendees can change.

reason requiredstring,null

Why it cannot be edited, or how far it can, in words for the person looking at it.

amountLocked requiredboolean

The amount is a card's own figure.

canDelete requiredboolean
canRestore requiredboolean
restoreBlocked requiredstring,null

Why it cannot be restored: split, or merged, for good.

canSplit requiredboolean
canMove requiredboolean
splitInto requiredarray of object

This expense was divided: its parts now count in its place.

Fields
id requiredstring
reference requiredstring
amountMinor requirednumber
mergedIntoId requiredstring,null

A merge absorbed this expense. Where it went.

report requiredobject or null

The report this expense is on, named even where the caller could not list it.

Fields
id requiredstring
title requiredstring
status requiredstring
lines requiredarray of object
Fields
id requiredstring
position requirednumber
description requiredstring
sku requiredstring,null
quantity requirednumber,null
unitPriceMinor requirednumber,null
amountMinor requirednumber
taxMinor requirednumber,null
categoryId requiredstring,null
documentIds requiredarray of string

Vehicle

id requiredstring
userId requiredstring
ownerName requiredstring,null
name requiredstring
plate requiredstring,null
archived requiredboolean
expenseCount requirednumber

VehiclePage

data requiredarray of object
Fields
id requiredstring
userId requiredstring
ownerName requiredstring,null
name requiredstring
plate requiredstring,null
archived requiredboolean
expenseCount requirednumber
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ApiKeyVerification

id requiredstring
name requiredstring
prefix requiredstring

The first characters of the key.

kind requiredPERSONAL WORKSPACE

PERSONAL acts as the person who made it and ends when they leave. WORKSPACE belongs to the workspace and outlives them.

environment requiredLIVE TEST
workspaceId requiredstring
scopes requiredarray of string

Every scope this key holds right now.

fullAccess requiredboolean

Every scope, present and future.

role requiredstring

The role its reach is measured against: a scope opens a route, and the role decides what the route may do.

signingRequired requiredboolean

A request with no valid signature is refused.

expiresAt requiredstring,null

ClientCertificate

id requiredstring
name requiredstring
fingerprint requiredstring

SHA-256 of the certificate, lowercase hex.

subject requiredstring,null
notAfter requiredstring,null
revokedAt requiredstring,null
createdAt requiredstring

ClientCertificatePage

data requiredarray of object
Fields
id requiredstring
name requiredstring
fingerprint requiredstring

SHA-256 of the certificate, lowercase hex.

subject requiredstring,null
notAfter requiredstring,null
revokedAt requiredstring,null
createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

ReleaseNotePage

data requiredarray of object
Fields
id requiredstring
version requiredstring
product requiredapp_web api mcp model_document_extraction model_bank_statements model_checks model_fraud_detection
environments requiredarray of production sandbox
title requiredstring
body requiredstring
publishedAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

WebhookDelivery

id requiredstring
endpointId requiredstring
eventId requiredstring
eventType requiredstring
state requiredFAILED PENDING DELIVERED ABANDONED
attempts requirednumber
responseStatus requirednumber,null
responseBody requiredstring,null
nextAttemptAt requiredstring,null
deliveredAt requiredstring,null
createdAt requiredstring
payload requiredany

WebhookDeliveryPage

data requiredarray of object
Fields
id requiredstring
endpointId requiredstring
eventId requiredstring
eventType requiredstring
state requiredFAILED PENDING DELIVERED ABANDONED
attempts requirednumber
responseStatus requirednumber,null
responseBody requiredstring,null
nextAttemptAt requiredstring,null
deliveredAt requiredstring,null
createdAt requiredstring
payload requiredany
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

WebhookEndpoint

status requiredPENDING CONFIRMED

PENDING receives the subscription event and nothing else, until POST /v1/webhooks/confirm.

pendingUntil requiredstring,null

A pending endpoint not confirmed by then is deleted.

confirmedAt requiredstring,null
apiKeyId requiredstring,null

Set when this endpoint belongs to one API key rather than the workspace.

id requiredstring
url requiredstring
description requiredstring,null
events requiredarray of string
enabled requiredboolean
failureCount requirednumber
disabledAt requiredstring,null

Set while the endpoint is off.

createdAt requiredstring

WebhookEndpointPage

data requiredarray of object
Fields
status requiredPENDING CONFIRMED

PENDING receives the subscription event and nothing else, until POST /v1/webhooks/confirm.

pendingUntil requiredstring,null

A pending endpoint not confirmed by then is deleted.

confirmedAt requiredstring,null
apiKeyId requiredstring,null

Set when this endpoint belongs to one API key rather than the workspace.

id requiredstring
url requiredstring
description requiredstring,null
events requiredarray of string
enabled requiredboolean
failureCount requirednumber
disabledAt requiredstring,null

Set while the endpoint is off.

createdAt requiredstring
nextCursor requiredstring,null

Pass as cursor for the next page. Null on the last one.

WebhookEndpointWithSecret

status requiredPENDING CONFIRMED

PENDING receives the subscription event and nothing else, until POST /v1/webhooks/confirm.

pendingUntil requiredstring,null

A pending endpoint not confirmed by then is deleted.

confirmedAt requiredstring,null
apiKeyId requiredstring,null

Set when this endpoint belongs to one API key rather than the workspace.

secret requiredstring
id requiredstring
url requiredstring
description requiredstring,null
events requiredarray of string
enabled requiredboolean
failureCount requirednumber
disabledAt requiredstring,null

Set while the endpoint is off.

createdAt requiredstring

WebhookEventPayload

id requiredstring

Stable across retries, so a repeat can be ignored.

type requiredstring
createdAt requiredstring
data requiredmap of any