Receipts
21 operations. All areas
- GET /v1/receipts/inbox
- POST /v1/receipts/inbox
- POST /v1/receipts/inbox/rotate
- GET /v1/receipts/inbox/slug
- POST /v1/receipts/inbox/slug
- POST /v1/receipts/inbox/slug/clear
- GET /v1/receipts/inbox/messages
- POST /v1/receipts/inbox/messages/{id}/release
- POST /v1/receipts/inbox/messages/{id}/discard
- GET /v1/receipts
- POST /v1/receipts
- GET /v1/receipts/{id}
- POST /v1/receipts/{id}
- GET /v1/receipts/{id}/file
- POST /v1/receipts/{id}/extract
- POST /v1/receipts/{id}/match
- POST /v1/receipts/{id}/unmatch
- POST /v1/receipts/{id}/attach
- POST /v1/receipts/{id}/expense
- POST /v1/receipts/{id}/discard
- POST /v1/receipts/{id}/restore
GET/v1/receipts/inbox
The company's private receipt address (forward receipts to it), its sender allow-list and limits
- Operation
getReceiptInbox - Scope: read
- Read
- Responses
200Inbox (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/receipts/inbox
Create or change the receipt inbox: on/off and the senders allowed to forward receipts (addresses or @domains). Mail from anyone else waits for review.
- Operation
updateReceiptInbox - Scope: admin
- Write: sets a value, no Idempotency-Key needed
- Request body
enabledbooleanallowed_sendersarray of string
- Responses
200Inbox (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
POST/v1/receipts/inbox/rotate
Give the inbox a new private address; the old one stops working at once (mail to it is refused and listed)
- Operation
rotateReceiptInbox - Scope: admin
- Write: needs Idempotency-Key (or dry_run)
- Request body
reasonstring
- Responses
200Inbox with its new address (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
GET/v1/receipts/inbox/slug
Is a custom receipt name available? receipts+<slug>@... (first come, first served; reserved names and lookalikes refused). Rate-limited.
- Operation
checkReceiptSlug - Scope: read
- Read
- Parameters
slugquery, string, required
- Responses
200Availability (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/receipts/inbox/slug
Set the inbox's custom name receipts+<slug>@... (admin; a firm admin may set it for a client). The previous name forwards for 30 days, then is released. The private token address keeps working.
- Operation
setReceiptSlug - Scope: admin
- Write: sets a value, no Idempotency-Key needed
- Request body
slugstring, required 3-30 lower-case letters, digits and single hyphens, starting and ending with a letter or digit; reserved names and lookalikes are refused
- Responses
200Inbox (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
POST/v1/receipts/inbox/slug/clear
Remove the custom name; it forwards for 30 days, then is released (admin)
- Operation
clearReceiptSlug - Scope: admin
- Write: sets a value, no Idempotency-Key needed
- Request body
reasonstring
- Responses
200Inbox (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
GET/v1/receipts/inbox/messages
Messages the receipt inbox received: processed, waiting for review (unknown sender, failed authentication), quarantined, refused
- Operation
listInboxMessages - Scope: read
- Read
- Parameters
statusquery, "processed" | "review" | "quarantined" | "rejected" | "duplicate" | "released" | "discarded" | "expired"limitquery, integer
- Responses
200Messages (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/receipts/inbox/messages/{id}/release
Process a message that waits for review (a person only): its receipts are stored; optionally allow its sender from now on
- Operation
releaseInboxMessage - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
allow_senderboolean
- Responses
200Released (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/inbox/messages/{id}/discard
Discard a message that waits for review (nothing is processed)
- Operation
discardInboxMessage - Scope: approve
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
reasonstring
- Responses
200Discarded (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/receipts
Receipts, newest first, with what was read from them and their status
- Operation
listReceipts - Scope: read
- Read
- Parameters
statusquery, "new" | "extracted" | "matched" | "posted" | "discarded"sourcequery, "email" | "upload" | "camera"limitquery, integer
- Responses
200Receipts (object)- Errors
400,401,403,429,500(Error:error.type,message)
POST/v1/receipts
Upload a receipt (PDF, JPEG, PNG or HEIC, at most 20 MB, base64). Stored encrypted; the same file twice is the same receipt. A PDF's text is read at once.
- Operation
uploadReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Request body
file_namestring, requiredcontent_base64string, requiredsource"upload" | "camera"notestring
- Responses
201Stored (created: false when this file was already a receipt) (object)- Errors
400,401,403,409,422,429,500(Error:error.type,message)
GET/v1/receipts/{id}
One receipt with the bank lines it could match (amount, date window, vendor; with reasons)
- Operation
getReceipt - Scope: read
- Read
- Parameters
idpath, string, required
- Responses
200Receipt (object)- Errors
400,401,403,404,429,500(Error:error.type,message)
POST/v1/receipts/{id}
Correct what was read from a receipt (vendor, date, total, tax, subtotal, payment method) or its note; the corrected facts drive matching
- Operation
updateReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
vendorstring | nulldatestring | null Calendar date, YYYY-MM-DD.total_centsinteger | nulltax_centsinteger | nullsubtotal_centsinteger | nullpayment_method"cash" | "card" | "other" | nullnotestring
- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
GET/v1/receipts/{id}/file
The stored file (decrypted), or an HTML receipt's PDF snapshot (variant=snapshot); format=base64 returns JSON (MCP)
- Operation
getReceiptFile - Scope: read
- Read
- Parameters
idpath, string, requiredvariantquery, "original" | "snapshot"formatquery, "base64"
- Responses
200The file (its own media type), or JSON with content_base64 when format=base64- Errors
400,401,403,404,429,500(Error:error.type,message)
POST/v1/receipts/{id}/extract
Read the receipt again with this deployment's extractors (PDF text layer, HTML text; OCR when configured)
- Operation
extractReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/match
Attach the receipt to a bank line (it is posted when the line is)
- Operation
matchReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
bank_line_idstring, required
- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/unmatch
Detach the receipt from its bank line
- Operation
unmatchReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/attach
Attach the receipt to a posted document (an expense, check or bill): the document's receipt metadata links to the stored file
- Operation
attachReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
document_idstring, required
- Responses
200Attached (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/expense
Record the receipt as an expense with the receipt attached, through the governed path (dry_run previews; an agent's always waits for approval: receipt_review)
- Operation
createExpenseFromReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
payment_accountstring, requiredaccountstring, requiredamount_centsintegerdoc_datestring Calendar date, YYYY-MM-DD.payee_idstringmemostringclassstringconfidencenumbersoft_lock_override_reasonstringdry_runboolean
- Responses
200Dry run (object)201Posted (object)202Waiting for approval (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/discard
Set a receipt aside (not a receipt, a duplicate); restore brings it back
- Operation
discardReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
reasonstring, required
- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)
POST/v1/receipts/{id}/restore
Bring a discarded receipt back
- Operation
restoreReceipt - Scope: propose
- Write: needs Idempotency-Key (or dry_run)
- Parameters
idpath, string, required
- Request body
Empty object
{}.- Responses
200The receipt (object)- Errors
400,401,403,404,409,422,429,500(Error:error.type,message)