Expenses

Money out that is not a bill: card charges, cash purchases, checks already written. An expense posts to the ledger the moment it is created, debiting each line's expense account and crediting the account it was paid from. The total is always derived from the line items. Requires the money_out scope.

Approval policies

If the company runs an approval policy that matches the expense, create answers 202 instead of 201, with submitted_for_approval: true and posted: false on the object. Nothing is on the ledger until an approver acts in the app. A queued expense cannot be voided; withdraw the approval request instead.

Bank feeds

An expense created through the API is not matched to any bank transaction. If the same money later arrives on a connected bank feed it appears in Review as an unmatched line, and the user matches it to this expense there. Send an Idempotency-Key on every create so a retry never books the same purchase twice.

The Expense Object

FieldTypeDescription
idstringExpense UUID
objectstringAlways 'expense'
statusstringopen, paid, or voided
approval_statusstringnull when the expense posted directly; pending_approval, approved, or rejected when the company's approval policy routed it
postedbooleanWhether the expense is on the ledger. False while it waits for approval
datestringISO 8601 date the money left the account
ref_numberstringReference number (check number, receipt id, etc.)
payment_methodstringcash, check, credit_card, debit_card, eft, or other
currencystringISO currency code (e.g., USD)
total_centsnumberTotal in cents
memostringInternal memo
payment_account_idstringChart account UUID the expense was paid from (bank or credit card)
partyobject
line_itemsstring[]Expense line items
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp
intercompany_account_overridesstring[]Owed-between account choices stored on this expense (multi-entity companies; empty otherwise)

Endpoints

GET/api/v1/expenses

List expenses

Returns a paginated list of expenses for the current organization, newest first.

Path & Query Parameters

ParameterTypeDescription
statusstringFilter by status (open, paid, voided)
vendor_idstringFilter by vendor UUID
date_fromstringOnly expenses dated on or after this date (YYYY-MM-DD)
date_tostringOnly expenses dated on or before this date (YYYY-MM-DD)
searchstringSearch by reference number, vendor name or memo
pagenumberPage number (default 1)
per_pagenumberResults per page (1-200, default 50)
POST/api/v1/expenses

Create an expense

Creates an expense and posts it to the ledger: debits each line's expense account, credits the payment account. The total is derived from the line items. The expense is not matched to any bank transaction; if the same money arrives on a bank feed it appears in Review for matching.

Body Parameters

ParameterTypeDescription
payment_account_idrequiredstringChart account UUID the expense was paid from (bank or credit card)
datestringExpense date (YYYY-MM-DD, defaults to today)
vendor_idstringVendor UUID
entity_idstringEntity UUID the expense belongs to. A company that keeps more than one entity must name it, unless the payment account belongs to an entity (that entity is used); otherwise 422 with an entity_id error
payment_methodstringcash, check, credit_card, debit_card, eft, or other
ref_numberstringReference number
memostringInternal memo
dimension_valuesobjectDimension tagging (dimension_id => value_id)
prior_runstringreplace or keep. Needed when a line uses a saved split and this vendor already has documents from it this month (otherwise 422 saved_split_prior_run, listing them in error_data.documents). replace voids the earlier documents in the same transaction; keep leaves them
intercompany_account_overridesarrayMulti-entity companies: which account each automatic owed-between line uses, when the expense crosses entities. Omit to keep the current choices; an empty array resets them
line_items_attributesrequiredarrayLine items (at least one)
GET/api/v1/expenses/:id

Retrieve an expense

Path & Query Parameters

ParameterTypeDescription
idrequiredstringExpense UUID
PATCH/api/v1/expenses/:id

Update an expense

Updates an expense and reposts it to the ledger. Voided expenses cannot be updated.

Path & Query Parameters

ParameterTypeDescription
idrequiredstringExpense UUID

Body Parameters

ParameterTypeDescription
payment_account_idstringChart account UUID the expense was paid from
datestringExpense date (YYYY-MM-DD)
vendor_idstringVendor UUID
payment_methodstringcash, check, credit_card, debit_card, eft, or other
ref_numberstringReference number
memostringInternal memo
dimension_valuesobjectDimension tagging (dimension_id => value_id)
prior_runstringreplace or keep. Needed when a line uses a saved split and this vendor already has documents from it this month (otherwise 422 saved_split_prior_run, listing them in error_data.documents). replace voids the earlier documents in the same transaction; keep leaves them
intercompany_account_overridesarrayMulti-entity companies: which account each automatic owed-between line uses, when the expense crosses entities. Omit to keep the current choices; an empty array resets them
line_items_attributesarrayLine items. Include each line's id to edit in place (and _destroy to remove one); a set with no ids REPLACES every existing line
POST/api/v1/expenses/:id/void

Void an expense

Voids the expense and reverses its ledger entry.

Path & Query Parameters

ParameterTypeDescription
idrequiredstringExpense UUID