Update expense

Updates an expense by its ID (EXP-...). You can set its description, invoice_number, status, vat_amount, category, and accounting fields (tax rate, vendor, payment account, expense account). Send only the fields you want to change.

status is one of incomplete, pending_review, ready, or synced. If you don't send status, an incomplete expense moves to pending_review automatically once it's ready for review, for example when all required fields are filled.

The response is the updated expense. Unknown category or accounting identifiers return 422 with VALIDATION_ERROR, and an unknown expense ID returns 404. For the full expense fields, see the Expense object.

📘

Prefer Update Expense Transaction

Update expense transaction accepts either the transaction ID or the expense ID, returns the full transaction with its receipts, and validates more strictly. This endpoint has its own rules:

  • The category field is expense_category_identifier, not category_identifier.
  • Identifiers must exist, but disabled accounting records are accepted.
  • A vendor's currency isn't checked against the transaction's.
  • vat_amount is read as an absolute value (a negative number becomes positive), with no upper limit.
  • A null identifier is rejected, so you can't clear a field here. Use Update Expense Transaction for that.
Path Params
string
required
Defaults to EXP-5E6F7A8B9C

Expense ID

Body Params
string

Invoice number for the expense

string

Description of the expense

string
enum

Status of the expense

Allowed:
string

Identifier of the expense category to assign.

string

Identifier of the tax rate to assign.

string

Identifier of the vendor to assign.

string

Identifier of the payment account to assign.

string

Identifier of the expense account to assign.

number

VAT amount for the expense.

Headers
string

A unique key, such as a UUID, that makes it safe to retry this request. Reuse the same key when you retry. See Idempotency.

Responses

429

Too many requests. You sent more than 100 requests in 30 seconds from one IP address. This response has no JSON body. See Rate limits.

Language
Credentials
Header
URL
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json