Skip to main content
POST
/
vaults
/
{vaultId}
/
transfers
Create Vault Transfer
curl --request POST \
  --url https://api.dfns.io/vaults/{vaultId}/transfers \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'X-DFNS-USERACTION: <api-key>' \
  --data '
{
  "tid": "<string>",
  "to": "<string>",
  "amount": "<string>",
  "externalId": "<string>"
}
'
import requests

url = "https://api.dfns.io/vaults/{vaultId}/transfers"

payload = {
"tid": "<string>",
"to": "<string>",
"amount": "<string>",
"externalId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"X-DFNS-USERACTION": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'X-DFNS-USERACTION': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({tid: '<string>', to: '<string>', amount: '<string>', externalId: '<string>'})
};

fetch('https://api.dfns.io/vaults/{vaultId}/transfers', 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.dfns.io/vaults/{vaultId}/transfers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tid' => '<string>',
'to' => '<string>',
'amount' => '<string>',
'externalId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-DFNS-USERACTION: <api-key>"
],
]);

$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.dfns.io/vaults/{vaultId}/transfers"

payload := strings.NewReader("{\n \"tid\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"externalId\": \"<string>\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-DFNS-USERACTION", "<api-key>")
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.post("https://api.dfns.io/vaults/{vaultId}/transfers")
.header("Authorization", "Bearer <token>")
.header("X-DFNS-USERACTION", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tid\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"externalId\": \"<string>\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.dfns.io/vaults/{vaultId}/transfers")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-DFNS-USERACTION"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tid\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"externalId\": \"<string>\"\n}"

response = http.request(request)
puts response.read_body
{
  "id": "xfr-20g4k-nsdpo-mg6arrifgvid4orn",
  "walletId": "wa-5pfuu-9euek-h0odgb6snva8ph3k",
  "requester": {
    "userId": "us-6b58p-r53sr-rlrd3l5cj3uc4ome",
    "tokenId": "to-202a0-cdo33-o65mbt6q758lvvnt"
  },
  "requestBody": {
    "kind": "Native",
    "to": "<string>",
    "amount": "<string>",
    "memo": "<string>",
    "createDestinationAccount": true,
    "offer": true,
    "expiresAt": "2023-11-07T05:31:56Z",
    "useDurableNonce": true,
    "externalId": "<string>",
    "travelRule": {
      "kind": "Notabene",
      "originator": {},
      "beneficiary": {},
      "beneficiaryVASPdid": "<string>",
      "beneficiaryProof": {}
    },
    "feeSponsorId": "fs-5vqdl-gliqk-b4rfukqauov1sp7j",
    "gasLimit": "<string>",
    "gasPrice": "<string>",
    "maxFeePerGas": "<string>",
    "maxPriorityFeePerGas": "<string>"
  },
  "metadata": {
    "asset": {
      "symbol": "<string>",
      "decimals": 123,
      "verified": true,
      "quotes": {
        "EUR": 123,
        "USD": 123
      }
    }
  },
  "dateRequested": "2023-04-14T20:41:28.715Z",
  "reason": "<string>",
  "txHash": "<string>",
  "fee": "<string>",
  "datePolicyResolved": "2023-04-14T20:41:28.715Z",
  "dateBroadcasted": "2023-04-14T20:41:28.715Z",
  "dateConfirmed": "2023-04-14T20:41:28.715Z",
  "approvalId": "ap-2a9in-tt2a1-983lho480p35ejd0",
  "externalId": "<string>",
  "feeSponsorId": "fs-5vqdl-gliqk-b4rfukqauov1sp7j",
  "replacementId": "<string>",
  "details": {}
}

Authentication

✅ Organization User (CustomerEmployee)
❌ Delegated User (EndUser)
✅ Service Account

Required Permissions

Vaults:Transfers:Create: Always required.

Authorizations

Authorization
string
header
required

Bearer Token: Used to authenticate API requests. More details how to generate the token: Authentication flows

X-DFNS-USERACTION
string
header
required

User Action Signature: Used to sign the change-inducing API requests. More details how to generate the token: User Action Signing flows

Path Parameters

vaultId
string
required

Vault id.

Required string length: 1 - 64
Pattern: ^vlt-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{14,16}$

Body

application/json
network
enum<string>
required

The EVM network the transfer is on.

Available options:
ArbitrumOne,
ArbitrumSepolia,
ArcTestnet,
AvalancheC,
AvalancheCFuji,
Base,
BaseSepolia,
Bob,
BobSepolia,
Bsc,
BscTestnet,
Berachain,
BerachainBepolia,
Celo,
CeloAlfajores,
Codex,
CodexSepolia,
Ethereum,
EthereumClassic,
EthereumClassicMordor,
EthereumSepolia,
EthereumHoodi,
FlareC,
FlareCCoston2,
FlowEvm,
FlowEvmTestnet,
Ink,
InkSepolia,
Optimism,
OptimismSepolia,
Plasma,
PlasmaTestnet,
Plume,
PlumeSepolia,
Polygon,
PolygonAmoy,
Race,
RaceSepolia,
Rayls,
RaylsTestnet,
Robinhood,
RobinhoodSepolia,
SeiPacific1,
SeiAtlantic2,
Sonic,
SonicTestnet,
Tempo,
TempoModerato,
Tsc,
TscTestnet1,
Xdc,
XdcApothem,
XLayer,
XLayerSepolia
tid
string
required

The token identifier of the asset to transfer (e.g. native:eth or erc20:0x...).

to
string
required

The destination address.

amount
string
required

The amount to transfer, in minimum denomination.

Pattern: ^\d+$
externalId
string

A unique id from your system.

Required string length: 1 - 50

Response

200 - application/json

Success

id
string
required

Transfer id.

Required string length: 1 - 64
Pattern: ^xfr-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{14,16}$
Example:

"xfr-20g4k-nsdpo-mg6arrifgvid4orn"

walletId
string
required

The source wallet for this tranfer.

Required string length: 1 - 64
Pattern: ^wa-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{14,16}$
Example:

"wa-5pfuu-9euek-h0odgb6snva8ph3k"

network
enum<string>
required

The blockchain network this transfer is on.

Available options:
Algorand,
AlgorandTestnet,
Aptos,
AptosTestnet,
ArbitrumOne,
ArbitrumSepolia,
ArcTestnet,
AvalancheC,
AvalancheCFuji,
BabylonGenesis,
BabylonTestnet5,
Base,
BaseSepolia,
Berachain,
BerachainBepolia,
Bitcoin,
BitcoinSignet,
BitcoinTestnet4,
BitcoinCash,
Bob,
BobSepolia,
Bsc,
BscTestnet,
Canton,
CantonTestnet,
Cardano,
CardanoPreprod,
Concordium,
ConcordiumTestnet,
Celo,
CeloAlfajores,
Codex,
CodexSepolia,
CosmosHub4,
CosmosIcsTestnet,
Dogecoin,
DogecoinTestnet,
Ethereum,
EthereumClassic,
EthereumClassicMordor,
EthereumSepolia,
EthereumHoodi,
FlareC,
FlareCCoston2,
FlowEvm,
FlowEvmTestnet,
Hedera,
HederaTestnet,
Ink,
InkSepolia,
InternetComputer,
Ion,
IonTestnet,
Iota,
IotaTestnet,
Kusama,
KusamaAssetHub,
Litecoin,
LitecoinTestnet,
Movement,
MovementTestnet,
Near,
NearTestnet,
Optimism,
OptimismSepolia,
Origyn,
Plasma,
PlasmaTestnet,
Plume,
PlumeSepolia,
Paseo,
PaseoAssetHub,
Polkadot,
PolkadotAssetHub,
Polygon,
PolygonAmoy,
Polymesh,
PolymeshTestnet,
Race,
RaceSepolia,
Rayls,
RaylsTestnet,
Robinhood,
RobinhoodSepolia,
SeiAtlantic2,
SeiPacific1,
Solana,
SolanaDevnet,
Sonic,
SonicTestnet,
Starknet,
StarknetSepolia,
Stellar,
StellarTestnet,
Sui,
SuiTestnet,
Tezos,
TezosGhostnet,
TezosShadownet,
Tempo,
TempoModerato,
Tsc,
TscTestnet1,
Ton,
TonTestnet,
Tron,
TronNile,
Westend,
WestendAssetHub,
Xdc,
XdcApothem,
XLayer,
XLayerSepolia,
XrpLedger,
XrpLedgerTestnet
requester
object
required

The user who initiated the request.

requestBody
Native Asset · object
required
metadata
object
required

Additional metadata about the transfered asset.

status
enum<string>
required

Transfer status.

StatusDefinition
PendingThe request is pending approval due to a policy applied to the wallet.
ExecutingThe request is approved and is in the process of being executed. note this status is only set for a short time between pending and broadcasted.
BroadcastedThe transaction has been successfully written to the mempool.
ConfirmedThe transaction has been confirmed on-chain by our indexing pipeline.
FailedIndicates either system failure to complete the request or the transaction failed on chain.
RejectedThe request has been rejected by a policy approval action.
Available options:
Pending,
Executing,
Broadcasted,
Confirmed,
Failed,
Rejected
dateRequested
string<date-time>
required

ISO 8601 date (must be UTC). When the transfer was requested.

Example:

"2023-04-14T20:41:28.715Z"

reason
string

The reason for a failed transfer.

txHash
string

The blockchain transaction hash for this transfer.

fee
string

The fee paid for this transfer in minimum denomination.

datePolicyResolved
string<date-time>

ISO 8601 date (must be UTC). When the transfer was approved by policy reviewers.

Example:

"2023-04-14T20:41:28.715Z"

dateBroadcasted
string<date-time>

ISO 8601 date (must be UTC). When the transfer was broadcasted to the blockchain.

Example:

"2023-04-14T20:41:28.715Z"

dateConfirmed
string<date-time>

ISO 8601 date (must be UTC). When the transfer was confirmed on chain.

Example:

"2023-04-14T20:41:28.715Z"

approvalId
string

The id of the approval request if this transfer triggered a policy.

Required string length: 1 - 64
Pattern: ^ap-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{14,16}$
Example:

"ap-2a9in-tt2a1-983lho480p35ejd0"

externalId
string

The external id provided at transfer creation time.

feeSponsorId
string

The fee sponsor id used to pay for the transfer fees.

Required string length: 1 - 64
Pattern: ^fs-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{14,16}$
Example:

"fs-5vqdl-gliqk-b4rfukqauov1sp7j"

replacementId
string

The id of the replacement transaction (cancel or speed-up) issued for this transfer.

details
object

Structured representation of the data used to construct the signature (e.g. nonce, gas parameters). Shape is blockchain specific.

Last modified on July 9, 2026