Query & edit transactions

Find the exact ledger activity you need, inspect every transfer, and make safe, auditable edits.

List and filter transactions

getClientTransactions is the main ledger query. Pagination is zero-based and limit is capped at 500. Start with a narrow date range, then add account, asset, label, review, or missing-basis filters.

graphql
query Transactions($clientId: ID!) {
getClientTransactions(
clientId: $clientId
startDate: "2025-01-01"
endDate: "2025-12-31"
reviewed: false
limit: 25
page: 0
sortBy: "date"
ascending: false
) {
total
transactions { id title createdAt provider capGainsSum incomeSum }
}
}

Inspect one transaction

Read the transaction and its transfer legs before editing. Transfer value is the token quantity; fiatAmountCents and basis are monetary fields.

graphql
query Transaction($clientId: ID!, $transactionId: ID!) {
getTransaction(clientId: $clientId, transactionId: $transactionId) {
id title createdAt provider txnHash labelUsed notes
capGainsSum incomeSum isMissingBasis
transfers {
id value fiatAmountCents basis isMissingBasis
transferCategory fromAccountId toAccountId
fullAsset { symbol name }
}
}
}

Label transactions in bulk

Fetch valid labels with getLabels first. Mutations require a ReadWrite API key.

graphql
mutation LabelTransactions($clientId: ID!, $transactionIds: [ID!]!) {
labelTransactions(
clientId: $clientId
transactionIds: $transactionIds
label: "v1:swap"
) { id labelUsed }
}

Edit a transaction

Use updateTransaction for titles, notes, labels, visibility, dates, and supported overrides. Set createDefaultRule only when the same correction should apply to similar future activity.

Recalculate after ledger edits

Labels, transfer changes, merges, and splits can change downstream tax results. Trigger one recalculation after your batch of edits, then verify the affected transactions.

graphql
mutation UpdateTransaction($clientId: ID!, $transactionId: ID!) {
updateTransaction(
clientId: $clientId
transactionId: $transactionId
createDefaultRule: false
updates: { notes: "Reviewed via API", overrideLabel: false }
) { transaction { id notes } }
}

Split one transaction into many

Use splitTransactionIntoMany for all new splits, including one-to-two splits. The base keeps transfers omitted from splits, each input entry creates one child, and array order is the economic settlement order. The legacy splitTransaction mutation is deprecated and retained for compatibility.

Ordering and recalculation

Children are created atomically in the order supplied. Wait for recalculation before validating gains or missing basis.

graphql
mutation SplitIntoMany($clientId: ID!, $transactionId: ID!) {
splitTransactionIntoMany(
clientId: $clientId
baseTransactionId: $transactionId
splits: [
{ transferIds: ["transfer-acquisition"] }
{ transferIds: ["transfer-swap"] }
{ transferIds: ["transfer-bridge"] }
]
) { id createdAt isSplitTxn }
}

More edit operations

TaskOperation
Change a transfer value or basisupdateTransfer
Merge related activitymergeTransactions
Split a transactionsplitTransactionIntoMany
Link owned-wallet movementmarkInternalTransfer
Hide or unhide activityhideTransaction / hideMultipleTransactions
Review edit historygetClientAuditLogs