Transfers
9 min
use a transfer when you already know the source, destination, blockchain, asset, and amount estimate the network fee if required, not a mandatory step, then create the transfer and use the returned transaction status as the lifecycle source of truth estimate a transfer fee post /api/external/transactions/estimate fee/ rest request body { "source" { "type" "vault", "id" "vault 123" }, "destination" { "type" "contact", "id" "contact 456" }, "amount" "0 50", "asset" "eth", "blockchain" "ethereum", "category" "transfer" } the sdk accepts chain and serializes it as blockchain it injects category "transfer" response interface feedata { expectedfeeinasset string; asset string; expectedfeeinusd string; basefee? string; priorityfee? string; } interface estimatedfeeresponse { high feedata; medium feedata; low feedata; } json example { "high" { "expectedfeeinasset" "0 0018", "asset" "eth", "expectedfeeinusd" "5 40", "basefee" "0 0012", "priorityfee" "0 0006" }, "medium" { "expectedfeeinasset" "0 0014", "asset" "eth", "expectedfeeinusd" "4 20", "basefee" "0 0011", "priorityfee" "0 0003" }, "low" { "expectedfeeinasset" "0 0011", "asset" "eth", "expectedfeeinusd" "3 30", "basefee" "0 0010", "priorityfee" "0 0001" } } javascript sdk interface estimatefeerequest { source transferpartydata; destination transferpartydata; amount string; asset string; chain string; } estimatefee(request estimatefeerequest) promise\<estimatedfeeresponse> create a transfer post /api/external/transactions/ rest request body { "source" { "type" "vault", "id" "vault 123" }, "destination" { "type" "contact", "id" "contact 456" }, "amount" "0 50", "asset" "eth", "blockchain" "ethereum", "category" "transfer", "gasparams" { "feetier" "medium" }, "externalid" "invoice 1001", "memo" "vendor payout #1001", "feepayer" { "id" "vault 234" } } sdk field rest field type required description source source transferpartydata yes sending party destination destination transferpartydata yes receiving party amount amount string yes decimal transfer amount asset asset string yes asset symbol chain blockchain string yes blockchain identifier gasparams feetier gasparams feetier high | medium | low no requested fee tier externalid externalid string no client reference memo memo string no human readable note feepayer id feepayer id string no vault that pays the network fee when the chain supports sponsored fee payment response { "id" "transaction 123", "orgid" "org 456", "vaultid" "vault 123", "status" "pending", "transactiontype" "outgoing", "category" "transfer", "subcategory" "external transfer", "createdat" "2026 08 04t10 40 00z", "updatedat" "2026 08 04t10 40 00z", "isdeleted" false, "externalid" "invoice 1001", "memo" "vendor payout #1001", "source" { "type" "vault", "id" "vault 123", "suborgid" "sub org 123", "name" "treasury vault" }, "destination" { "type" "contact", "id" "contact 456", "name" "operations wallet", "address" "0xabc1234567890abcdef1234567890abcdef1234", "chain" "ethereum" }, "blockchain" "ethereum", "asset" "eth", "amount" "0 50" } javascript sdk interface createtransfertransactionrequest { source transferpartydata; destination transferpartydata; amount string; asset string; chain string; gasparams? { feetier? "high" | "medium" | "low" }; externalid? string; memo? string; feepayer? { id string }; } createtransfertransaction( request createtransfertransactionrequest, ) promise\<transaction> the sdk serializes only the fields above and injects category "transfer"