curl --request PATCH \
--url https://api.breezing.io/v1/transactions/{id} \
--header 'Content-Type: application/json' \
--data '
{
"account": "<string>",
"assetAccount": "<string>",
"feeAssetAccount": "<string>",
"type": "<string>",
"note": "<string>",
"accountingDescription": "<string>",
"vat": "<string>",
"isSpam": true,
"extraLabel": "<string>",
"skipNgl": true,
"skipNglReason": "<string>",
"qboClass": "<string>",
"xeroTrackingCategory": "<string>",
"date": 1700000000,
"amount": "1.5",
"fee": "0.001",
"token": "ETH",
"amountFiat": "3000.00",
"feeFiat": "2.00",
"chain": "eth",
"feeToken": "ETH",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"feeTokenAddress": "<string>",
"walletFrom": "<string>",
"walletTo": "<string>",
"transactionId": "0xabc123",
"currency": "USD"
}
'import requests
url = "https://api.breezing.io/v1/transactions/{id}"
payload = {
"account": "<string>",
"assetAccount": "<string>",
"feeAssetAccount": "<string>",
"type": "<string>",
"note": "<string>",
"accountingDescription": "<string>",
"vat": "<string>",
"isSpam": True,
"extraLabel": "<string>",
"skipNgl": True,
"skipNglReason": "<string>",
"qboClass": "<string>",
"xeroTrackingCategory": "<string>",
"date": 1700000000,
"amount": "1.5",
"fee": "0.001",
"token": "ETH",
"amountFiat": "3000.00",
"feeFiat": "2.00",
"chain": "eth",
"feeToken": "ETH",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"feeTokenAddress": "<string>",
"walletFrom": "<string>",
"walletTo": "<string>",
"transactionId": "0xabc123",
"currency": "USD"
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account: '<string>',
assetAccount: '<string>',
feeAssetAccount: '<string>',
type: '<string>',
note: '<string>',
accountingDescription: '<string>',
vat: '<string>',
isSpam: true,
extraLabel: '<string>',
skipNgl: true,
skipNglReason: '<string>',
qboClass: '<string>',
xeroTrackingCategory: '<string>',
date: 1700000000,
amount: '1.5',
fee: '0.001',
token: 'ETH',
amountFiat: '3000.00',
feeFiat: '2.00',
chain: 'eth',
feeToken: 'ETH',
tokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
feeTokenAddress: '<string>',
walletFrom: '<string>',
walletTo: '<string>',
transactionId: '0xabc123',
currency: 'USD'
})
};
fetch('https://api.breezing.io/v1/transactions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.breezing.io/v1/transactions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'account' => '<string>',
'assetAccount' => '<string>',
'feeAssetAccount' => '<string>',
'type' => '<string>',
'note' => '<string>',
'accountingDescription' => '<string>',
'vat' => '<string>',
'isSpam' => true,
'extraLabel' => '<string>',
'skipNgl' => true,
'skipNglReason' => '<string>',
'qboClass' => '<string>',
'xeroTrackingCategory' => '<string>',
'date' => 1700000000,
'amount' => '1.5',
'fee' => '0.001',
'token' => 'ETH',
'amountFiat' => '3000.00',
'feeFiat' => '2.00',
'chain' => 'eth',
'feeToken' => 'ETH',
'tokenAddress' => '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
'feeTokenAddress' => '<string>',
'walletFrom' => '<string>',
'walletTo' => '<string>',
'transactionId' => '0xabc123',
'currency' => 'USD'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.breezing.io/v1/transactions/{id}"
payload := strings.NewReader("{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.breezing.io/v1/transactions/{id}")
.header("Content-Type", "application/json")
.body("{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.breezing.io/v1/transactions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"updated": 123
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}Update Transaction API
Update a single unlocked Breezing transaction by ID to patch crypto accounting fields without changing other transaction values.
curl --request PATCH \
--url https://api.breezing.io/v1/transactions/{id} \
--header 'Content-Type: application/json' \
--data '
{
"account": "<string>",
"assetAccount": "<string>",
"feeAssetAccount": "<string>",
"type": "<string>",
"note": "<string>",
"accountingDescription": "<string>",
"vat": "<string>",
"isSpam": true,
"extraLabel": "<string>",
"skipNgl": true,
"skipNglReason": "<string>",
"qboClass": "<string>",
"xeroTrackingCategory": "<string>",
"date": 1700000000,
"amount": "1.5",
"fee": "0.001",
"token": "ETH",
"amountFiat": "3000.00",
"feeFiat": "2.00",
"chain": "eth",
"feeToken": "ETH",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"feeTokenAddress": "<string>",
"walletFrom": "<string>",
"walletTo": "<string>",
"transactionId": "0xabc123",
"currency": "USD"
}
'import requests
url = "https://api.breezing.io/v1/transactions/{id}"
payload = {
"account": "<string>",
"assetAccount": "<string>",
"feeAssetAccount": "<string>",
"type": "<string>",
"note": "<string>",
"accountingDescription": "<string>",
"vat": "<string>",
"isSpam": True,
"extraLabel": "<string>",
"skipNgl": True,
"skipNglReason": "<string>",
"qboClass": "<string>",
"xeroTrackingCategory": "<string>",
"date": 1700000000,
"amount": "1.5",
"fee": "0.001",
"token": "ETH",
"amountFiat": "3000.00",
"feeFiat": "2.00",
"chain": "eth",
"feeToken": "ETH",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"feeTokenAddress": "<string>",
"walletFrom": "<string>",
"walletTo": "<string>",
"transactionId": "0xabc123",
"currency": "USD"
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account: '<string>',
assetAccount: '<string>',
feeAssetAccount: '<string>',
type: '<string>',
note: '<string>',
accountingDescription: '<string>',
vat: '<string>',
isSpam: true,
extraLabel: '<string>',
skipNgl: true,
skipNglReason: '<string>',
qboClass: '<string>',
xeroTrackingCategory: '<string>',
date: 1700000000,
amount: '1.5',
fee: '0.001',
token: 'ETH',
amountFiat: '3000.00',
feeFiat: '2.00',
chain: 'eth',
feeToken: 'ETH',
tokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
feeTokenAddress: '<string>',
walletFrom: '<string>',
walletTo: '<string>',
transactionId: '0xabc123',
currency: 'USD'
})
};
fetch('https://api.breezing.io/v1/transactions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.breezing.io/v1/transactions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'account' => '<string>',
'assetAccount' => '<string>',
'feeAssetAccount' => '<string>',
'type' => '<string>',
'note' => '<string>',
'accountingDescription' => '<string>',
'vat' => '<string>',
'isSpam' => true,
'extraLabel' => '<string>',
'skipNgl' => true,
'skipNglReason' => '<string>',
'qboClass' => '<string>',
'xeroTrackingCategory' => '<string>',
'date' => 1700000000,
'amount' => '1.5',
'fee' => '0.001',
'token' => 'ETH',
'amountFiat' => '3000.00',
'feeFiat' => '2.00',
'chain' => 'eth',
'feeToken' => 'ETH',
'tokenAddress' => '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
'feeTokenAddress' => '<string>',
'walletFrom' => '<string>',
'walletTo' => '<string>',
'transactionId' => '0xabc123',
'currency' => 'USD'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.breezing.io/v1/transactions/{id}"
payload := strings.NewReader("{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.breezing.io/v1/transactions/{id}")
.header("Content-Type", "application/json")
.body("{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.breezing.io/v1/transactions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account\": \"<string>\",\n \"assetAccount\": \"<string>\",\n \"feeAssetAccount\": \"<string>\",\n \"type\": \"<string>\",\n \"note\": \"<string>\",\n \"accountingDescription\": \"<string>\",\n \"vat\": \"<string>\",\n \"isSpam\": true,\n \"extraLabel\": \"<string>\",\n \"skipNgl\": true,\n \"skipNglReason\": \"<string>\",\n \"qboClass\": \"<string>\",\n \"xeroTrackingCategory\": \"<string>\",\n \"date\": 1700000000,\n \"amount\": \"1.5\",\n \"fee\": \"0.001\",\n \"token\": \"ETH\",\n \"amountFiat\": \"3000.00\",\n \"feeFiat\": \"2.00\",\n \"chain\": \"eth\",\n \"feeToken\": \"ETH\",\n \"tokenAddress\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n \"feeTokenAddress\": \"<string>\",\n \"walletFrom\": \"<string>\",\n \"walletTo\": \"<string>\",\n \"transactionId\": \"0xabc123\",\n \"currency\": \"USD\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"updated": 123
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}Path Parameters
Transaction ID
"12345"
Query Parameters
Organization ID. Use GET /v1/companies to discover available org/company pairs.
"1"
Company ID. Use GET /v1/companies to discover available companies and their access levels.
"1"
Body
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".
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.
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.
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.
notStarted, reviewRequired, reconciled, manuallyReconciled, paid, synced 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.
User note. Internal only, not synced to accounting software. Use accountingDescription for text that should appear in journal entries.
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 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.
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.
Extra label: freeform text for custom tagging or grouping, visible in Breezing reports.
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.
Reason net gain/loss is skipped (e.g. "Wrapping", "Staking", "Bridge transfer"). Required when skipNgl is set to true.
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.
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.
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.
x > 01700000000
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").
in, out 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.
"1.5"
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.
"0.001"
New token symbol (e.g. "ETH"). Renames the symbol on this row only; feeToken and tokenAddress are unchanged.
1"ETH"
New fiat value of the amount as a POSITIVE decimal. Signed server-side from the effective direction, like amount.
"3000.00"
New fiat value of the fee as a POSITIVE decimal. Forced "0" when the effective direction is "in", stored negative for "out", like fee.
"2.00"
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.
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 "eth"
Fee token symbol (e.g. "ETH"). Balances debit fees under this symbol; it must stay non-empty.
1"ETH"
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.
256"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
Fee token contract address, same rules as tokenAddress.
256Counterparty 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.
255Counterparty address the asset went to. Same contact resolution rules as walletFrom.
255External reference (blockchain hash, exchange order id, invoice number). NOT deduped. In the batch endpoint the same value lands on every row.
1"0xabc123"
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.
3"USD"