Skip to main content
PATCH
Update a single transaction

Path Parameters

id
string
required

Transaction ID

Example:

"12345"

Query Parameters

orgId
string
required

Organization ID. Use GET /v1/companies to discover available org/company pairs.

Example:

"1"

companyId
string
required

Company ID. Use GET /v1/companies to discover available companies and their access levels.

Example:

"1"

Body

application/json
account
string | null

Account code (numeric string). The contra (income/expense) account: what was this transaction for? (e.g. Sales, Legal Expense, Consulting Revenue). IMPORTANT: Always call company_get first to retrieve the chart of accounts, find the account by name, and use its "code" field. Never pass a free-text name like "sales".

assetAccount
string | null

Asset account code (numeric string). The balance-sheet account for the token in this transaction. Required in ALL balance sheet modes. If the current value is "(auto)", Breezing resolves it at sync time from token-level or rule-based mappings. You can leave it or override with a specific code. IMPORTANT: Always call company_get first to retrieve the chart of accounts and use the numeric code.

feeAssetAccount
string | null

Fee asset account code (numeric string). The balance-sheet account for the fee portion. Same rules as assetAccount: required in ALL balance sheet modes. If "(auto)", Breezing resolves it at sync time. IMPORTANT: Always call company_get first to retrieve the chart of accounts and use the numeric code.

status
enum<string>

Transaction status lifecycle: notStarted (new/uncategorized) → reviewRequired (flagged for client review; client sees these in the Client Review workflow) → reconciled (categorized and verified) → manuallyReconciled (manually confirmed) → paid (synced to accounting software). Set to reviewRequired when the accountant needs the client to clarify a transaction.

Available options:
notStarted,
reviewRequired,
reconciled,
manuallyReconciled,
paid,
synced
type
string | null

Transaction type as a freeform label, safe to overwrite. System may set values like "transaction" or "internal" during import, but these are just labels, not business logic. The isInternal boolean controls actual internal transfer logic. Set to any descriptive value: "Opening Balance", "Staking Reward", "Payment", etc.

note
string | null

User note. Internal only, not synced to accounting software. Use accountingDescription for text that should appear in journal entries.

accountingDescription
string | null

Description that syncs as the journal entry description in Xero/QuickBooks/Bexio. Use for invoice references, vendor names, or transaction context that should appear in the accounting software. Placeholders {{externalWalletName}}, {{externalWallet}} (the counterparty: walletTo on an out row, walletFrom otherwise), {{walletFromName}}, {{walletToName}}, {{walletFrom}}, {{walletTo}}, {{token}}, {{amount}}, {{transactionId}} and {{date}} are filled when the journal is generated. Distinct from "note" which is internal only.

vat
string | null

VAT or sales tax code as a freeform string that syncs to journal entries. Must match a tax rate name configured in the user's Xero/QuickBooks/Bexio account (e.g. "Output 8.1% VAT", "Tax Exempt"). Default is "no-vat". No validation, so invalid codes may cause sync errors.

isSpam
boolean

Spam flag. Set true to hide airdrop/scam tokens from the main view and prevent syncing to accounting software. Breezing auto-detects many spam tokens; use this for any it missed.

extraLabel
string | null

Extra label: freeform text for custom tagging or grouping, visible in Breezing reports.

skipNgl
boolean

Skip net gain/loss. When true, realized gain/loss is zeroed for this transaction (excluded from NGL and tax calculations). Use for non-taxable movements like wrapping, staking, or bridging. Requires skipNglReason when set to true. Cannot be set on internal transfers (isInternal=true). Setting this does NOT recalculate NGL automatically; run POST /ngl/calculate afterward to recompute net.

skipNglReason
string | null

Reason net gain/loss is skipped (e.g. "Wrapping", "Staking", "Bridge transfer"). Required when skipNgl is set to true.

qboClass
string | null

QuickBooks Online class ID. Syncs as the class on the journal entry in QuickBooks. Use the "id" returned by the QuickBooks classes refresh endpoint (call it first to retrieve valid class IDs). Only relevant when QuickBooks is linked.

xeroTrackingCategory
string | null

Xero tracking category option ID. Syncs as the tracking category on the journal entry in Xero. Use the "id" returned by the Xero categories refresh endpoint (call it first to retrieve valid option IDs). Only relevant when Xero is linked.

date
integer

New transaction timestamp in unix SECONDS (not milliseconds). CAUTION: dates drive cost-basis lot ordering (FIFO/LIFO/HIFO consume lots in date order) and an internal transfer IN leg must stay dated after its OUT leg. Net gain/loss is NOT recomputed automatically; run POST /ngl/calculate afterwards.

Required range: x > 0
Example:

1700000000

direction
enum<string>

New direction. "in" = the wallet received the asset; "out" = the wallet sent it. The server re-signs amount/fee/amountFiat/feeFiat to match the new direction: values you pass explicitly are taken as positive decimals and signed server-side, values you omit are re-signed from their stored magnitudes (fee and feeFiat are forced "0" when the new direction is "in"). Returns 409 when the change would flip an exchange trade leg (exchangeId set) or an internal transfer leg (isInternal=true); ungroup a trade first via POST /transactions/ungroup-trades. In the batch endpoint, changing direction additionally requires explicit amount and amountFiat (plus fee and feeFiat when direction="out").

Available options:
in,
out
amount

New token amount as a POSITIVE decimal (string preferred for precision). The server signs it from the effective direction: positive for "in", negative for "out". Changing amount does NOT recompute amountFiat or net gain/loss; pass amountFiat too (or run POST /transactions/update-price-auto) and run POST /ngl/calculate afterwards.

Example:

"1.5"

fee

New fee in fee-token units as a POSITIVE decimal. Fees never sit on inbound rows: when the effective direction is "in" the server forces "0", for "out" it is stored negative.

Example:

"0.001"

token
string

New token symbol (e.g. "ETH"). Renames the symbol on this row only; feeToken and tokenAddress are unchanged.

Minimum string length: 1
Example:

"ETH"

amountFiat

New fiat value of the amount as a POSITIVE decimal. Signed server-side from the effective direction, like amount.

Example:

"3000.00"

feeFiat

New fiat value of the fee as a POSITIVE decimal. Forced "0" when the effective direction is "in", stored negative for "out", like fee.

Example:

"2.00"

chain

Blockchain identifier. Prefer one of the supported chain values (e.g. "eth", "matic", "solana"; the ChainValue schema lists them): they drive explorer links, chain filters and per-chain balances. Any other string is accepted and stored as given, for chains Breezing does not index. Pass "" to clear it.

Available options:
eth,
bsc,
lyx,
matic,
avax,
abstract,
arb,
op,
base,
xdai,
celo,
katana,
linea,
btt,
ape,
taiko,
solana,
btc,
bch,
zec,
dash,
doge,
ltc,
ada,
strk,
trx,
sui,
apt,
blast,
sei,
sonic,
scroll,
nova,
era,
bera,
stable,
arc,
hyperevm,
mantle,
fraxtal,
monad,
hbar,
xrp,
xlm,
icp,
xtz,
ton,
near,
plasma,
unichain,
world,
opbnb,
megaeth,
xdc,
immutable,
mode,
robinhood,
lightlink,
soneium,
somnia,
dot,
tao
Example:

"eth"

feeToken
string

Fee token symbol (e.g. "ETH"). Balances debit fees under this symbol; it must stay non-empty.

Minimum string length: 1
Example:

"ETH"

tokenAddress
string

Token contract address, case preserved (Solana and TRON addresses are case sensitive). Address-keyed pricing and trade grouping resolve through it. Pass "" to clear it.

Maximum string length: 256
Example:

"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"

feeTokenAddress
string

Fee token contract address, same rules as tokenAddress.

Maximum string length: 256
walletFrom
string

Counterparty address the asset came from. The contact link (walletFromId, walletFromName) is re-resolved the way imports do: the company contact with the same address (case-insensitive), else a contact is created for it (named after the company wallet when the address is one of the company's own wallets, otherwise unnamed; name it via PATCH /contacts/{id}). Internal transfer detection is NOT re-run; use POST /transactions/group-internals. Pass "" to clear the address and its link.

Maximum string length: 255
walletTo
string

Counterparty address the asset went to. Same contact resolution rules as walletFrom.

Maximum string length: 255
transactionId
string

External reference (blockchain hash, exchange order id, invoice number). NOT deduped. In the batch endpoint the same value lands on every row.

Minimum string length: 1
Example:

"0xabc123"

currency
string

3-letter fiat currency of amountFiat/feeFiat (e.g. "USD"). A value that differs from the company currency surfaces as a currency mismatch active issue.

Required string length: 3
Example:

"USD"

Response

Transaction updated successfully

success
enum<boolean>
required
Available options:
true
data
object
required
Last modified on April 11, 2026