Skip to main content
Finrock gives you a single POST /dac/v1/transaction endpoint to move funds across all supported blockchains — whether you are sending to an external wallet, shifting balances between sub-accounts, or pushing assets to a connected exchange. This guide covers every parameter you need, explains destination and source types, shows you how to estimate fees before committing, and explains how to use idempotency keys so retried requests never result in a double-spend.

Overview

Submitting a transaction requires four core fields: the asset ticker, the amount, a source_type, and a destination_type. Additional fields control fee behaviour, AML tracking, bulk payouts, and idempotency. Endpoint: POST https://api.finrock.io/dac/v1/transaction

Destination Types

The destination_type field tells Finrock where the funds are going. Choose the value that matches your recipient:

EXTERNAL

Send to any address outside your Finrock workspace — for example, a customer’s self-custody wallet or a third-party exchange deposit address.

INTERNAL

Move funds into your own sub-account within the workspace — for example, pulling balance from a connected exchange into your custody wallet.

SUBACCOUNT

Transfer to a different sub-account within the same workspace — for example, moving funds from a trading desk sub-account to a treasury sub-account.

EXCHANGE

Send funds to a connected exchange — for example, depositing collateral to Binance or Kraken from your Finrock wallet.

Source Types

The source_type field tells Finrock where the funds originate: Use source_id to specify a particular address or address label within your workspace when you want to spend from a specific balance rather than the aggregate wallet balance. For XRP and XLM, use source_tag to identify the originating address tag.

Creating a Transaction

The example below sends 100 USDT on the Tron network to an external wallet address:

All Request Parameters

Sending the Maximum Balance

Set max_amount: true to instruct Finrock to calculate the maximum sendable amount after network fees and deduct accordingly. Omit amount when using this flag:

Bulk UTXO Payouts

For UTXO-based chains (Bitcoin, Litecoin, Dogecoin, Dash, Bitcoin Cash), you can send to multiple recipients in a single transaction using the destinations array instead of a single destination_id. This significantly reduces total network fees compared to sending individual transactions.
The destinations array is supported only on UTXO chains (BTC, LTC, DOGE, DASH, BCH). For EVM, Tron, Solana, and other account-based chains, use a single destination_id.

AML Tracking with aml_cid

If you have AML screening enabled, pass your internal customer identifier in the aml_cid field. Finrock forwards this value to the AML provider (Chainalysis) so every transaction is linked to the correct subject in your compliance records:

Fee Estimation

Before submitting a high-value transaction, call POST /dac/v1/estimate-fee to preview the expected network fee without committing the transaction:
The fee_rate unit depends on the blockchain. Use this reference table:
For UTXO chains, amount is required in the fee estimation request because transaction size — and therefore fee — depends on the number of inputs needed to cover the output value.

Idempotency with sequence_id

Network timeouts and application retries can cause your code to call the transaction endpoint more than once for the same intended transfer. Pass a unique sequence_id string with every transaction request. If Finrock receives a second request with the same sequence_id for the same sub-account, it returns the result of the original transaction instead of creating a new one.
Always use a sequence_id for withdrawal flows in production. Without it, a retry caused by a network error will create a duplicate transaction and move funds twice.

Transaction Statuses

After submission, poll the transactions endpoint or listen to webhooks for status updates. See Transaction Statuses in the Platform Reference for the full list of status values and their meanings. For a deep dive on preventing duplicate transactions, see Idempotency.