The transaction object
amountis the transaction total. Negative = money out, positive = money in.- Single-category transactions have
category_id/category_nameset andsplits: null. Split transactions havesplitsand anulltop-level category. ready_to_assign: truemarks income that flows straight to Ready to Assign instead of a category.statusispending,cleared, orreconciled.review_statusisreviewedorneeds_review.- Transfers come in pairs: each side is a
type: "transfer"transaction whosetransfer_account_idpoints at the other account.
List transactions
| Query parameter | Type | Description |
|---|---|---|
since_date | date | Only transactions on or after this date (YYYY-MM-DD) |
until_date | date | Only transactions on or before this date |
account_id | string | Only transactions in this account |
category_id | string | Only transactions with a split in this category |
status | string | pending, cleared, or reconciled |
review_status | string | reviewed or needs_review |
limit | int | Page size, 1–500 (default 100) |
cursor | string | Opaque pagination cursor from a previous response |
next_cursor; pass it back as cursor to fetch the next page, and stop when it is null.
Pages can contain fewer than
limit items even when more results remain — always follow next_cursor rather than
counting rows.Get a transaction
"deleted": true.
Create transactions
transaction, or up to 100 under transactions. The batch is atomic — if any row is invalid, nothing is created.
| Field | Type | Description |
|---|---|---|
account_id | string | Required. Account to book the transaction in |
date | date | Required. YYYY-MM-DD |
amount | string | Required (unless splits). Signed decimal total |
category_id | string | Category for the whole amount. Optional — see auto-categorization below |
ready_to_assign | boolean | true books the amount as income to Ready to Assign (instead of a category) |
splits | array | Split lines { amount, category_id?, ready_to_assign?, notes? } — replaces amount/category_id |
merchant_id | string | Existing merchant id |
merchant_name | string | Merchant by name — matched case-insensitively or created if new |
notes | string | Free-text memo |
status | string | pending or cleared (default cleared) |
review_status | string | reviewed or needs_review (default needs_review) |
Auto-categorization. If you omit
category_id (and don’t set ready_to_assign or splits) on a transaction that
has a merchant, Kualia categorizes it automatically — the same way imported and AI-chat transactions are handled: your
active rules, then your past categorizations for that merchant, learned merchant→category mappings, reviewed history,
and finally an AI prediction for merchants it hasn’t seen before. Anything it can’t confidently categorize is left
uncategorized. Auto-categorized rows still default to needs_review so you can confirm them in the app. Pass an
explicit category_id to skip this entirely.Transfers
Set"type": "transfer" to move money between two accounts. Both sides of the pair are created and returned.
amount must be positive for transfers. An optional category_id categorizes the outflow side (useful for credit-card payments).
Update a transaction
date, amount, category_id, ready_to_assign, splits, merchant_id (or merchant_name), notes (string or null), account_id, status, review_status.
- Changing
amounton a single-category transaction keeps its current category; changingcategory_idkeeps the amount. - To edit a split transaction’s amounts or categories, send the full
splitsarray. review_statusnever changes unless you send it explicitly.