Create a transfer request
Permissions required: Transfer funds
Identify the sending resource and asset
To initiate a transfer between resources, you must identify which resource you’d like to transfer funds from and the asset type to transfer. Provide a source and assetType.
Identify the receiving resource
Choose a resource to receive the funds as the destination. This resource may belong to your organization or another organization that also custodies with Anchorage Digital, or it may also be an approved blockchain address not custodied by Anchorage Digital (see Permission Groups for more details). Please note: If you would like to use the Anchorage Digital API to transfer to approved blockchain addresses, please contact api@anchorage.com.
Permissions
The provided API key must be associated with a permission group that has Transfer permissions for the vault from which the assets are being sent. The receiving resource does not need Transfer permissions to receive a transfer of funds.
Additional Metadata
You may provide a transfer memo with each transfer. If the transfer API request is successful, a transfer transaction will be created that will include this transfer memo in the description. The resulting deposit will also include this memo.
Successful Transfers
If the transfer request is valid, the request will initiate a transfer transaction from the source. This is a special withdrawal that will not require a quorum of approvals and will undergo automated Anchorage Digital Risk Review. When the transaction is broadcasted and confirmed on the blockchain, a subsequent deposit will be detected for the destination. All of these transactions will be visible on the Anchorage Digital iOS Application, the Web Dashboard, and in the list transactions API endpoint.
Unsuccessful Transfers
A transfer request may fail for any of the following reasons:
- The specified sending resource does not exist or does not support the specified asset type
- The specified amount exceeds the available funds for this asset (insufficient funds)
- The destination does not exist or does not support the specified asset type
- The provided API key does not have permissions to initiate transfers from this wallet
If the transfer request is successful, the actual transfer transaction may fail for any of the following reasons:
- There are insufficient funds to pay the blockchain network fee at the time of this transaction
- The transfer was successfully queued but there were insufficient funds by the time it was processed
- There is a failure on the blockchain
Idempotent Requests
This endpoint supports idempotent requests so that a transfer does not occur twice if an API call was interrupted and must be retried. To send an idempotent request, include the idempotentId field in the body of the POST request.
Queueing
Transfer requests are queued and processed in the order they were received. When transferring between wallets, multiple transfer requests may be queued for the same asset in a given wallet, but only one will be processed at a time. The other requests will remain in the QUEUED state until the prior transfer is completed or fails.
Transferring Full Balance
For assets with network fees paid in a separate asset type, transferring the full balance of an asset is no different than transferring any other amount for that asset.
For assets with network fees paid in the same asset type, transferring the full balance is not possible without specifying to the server that the fee should be deducted from the transfer amount. See the deductFeeFromAmountIfSameType flag of the TransfersRequest model for more detail.
idempotentId into the body before sending.
Authorizations
An API key associated with a security role
Headers
A hex-encoded Ed25519 signature of timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body.
Construction example:
toHex(
ed25519Sign(
signing_key,
'{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)
)
)^[0-9A-Fa-f]{128,160}$Current timestamp, represented as unix epoch seconds
Body
An amount of a crypto-asset to transfer, without units. The unit is derived from the asset type.
"1000.00000000"
A string representing a type of crypto-asset, which usually corresponds to the crypto asset's ticker symbol.
Use /asset-types to list all of the supported asset types for your organization.
"BTC"
Additional parameters to be provided exclusively when assetType is "ATOM". This field is deprecated, please migrate to using assetParametersCosmos instead
Additional parameters to be provided exclusively when assetType is for a Cosmos blockchain
Extra parameters, to be provided for assets
Additional parameters to be provided exclusively when the destination is a Trusted Destination and assetType is fiat.
Additional parameters to be provided exclusively when assetType is "XLM"
Additional parameters to be provided exclusively when assetType is "XRP"
If false, any network fees will always be added to amount requested. For example, a request to transfer 5 BTC with deductFeeFromAmountIfSameType=false would result in 5 exactly BTC received to the destination wallet and just over 5 BTC spent by the source wallet.
If true and the amount transferred is the same asset type as the network fee for the transfer, the network fee is deducted from the amount instead. For example, a request to transfer 5 BTC with deductFeeFromAmountIfSameType=true would result in just under 5 BTC received to the destination wallet.
For assets where the exact fee taken by the network is not known until the transaction is mined, it is likely that the amount spent will fall just short of the amount requested. For example, a request to transfer 5 ETH with deductFeeFromAmountIfSameType=true may result in the sending wallet spending 4.97 ETH and the recipient receiving 4.9 ETH. In this example, Anchorage Digital specifies to the network a maximum allowable fee of 0.1 ETH, but the network takes only 0.07 ETH
For UTXO-based assets, if deductFeeFromAmountIfSameType=true and the amount requested for transfer is just short of the total balance of the asset, the network will refuse to accept this transaction because the remainder would be unspendable. This is an unlikely edge case. See "Bitcoin Dust" for more context.
This flag is ignored for transfers where the amount and the fee asset types are separate.
An object representing a resource capable of receiving, or holding funds.
Construction example:
{
"id":"1c920f4241b78a1d483a29f3c24b6c4c",
"type":"WALLET"
}A client-provided unique ID for idempotent requests (mandatory)
128"12838927347"
An object representing a resource capable of sending funds.
Construction example:
{
"id":"1c920f4241b78a1d483a29f3c24b6c4c",
"type":"WALLET"
}Anti-money laundering questionnaire submission
{
"originatorType": "MY_CLIENT",
"originatorName": "Satoshi Nakamoto",
"originatorCountry": "US",
"originatorStreetAddress": "1234 NW Bobcat Lane, St. Robert, MO",
"originatorPostalCode": "65584-5678",
"originatorCity": "San Francisco",
"originatorStateProvince": "Wyoming",
"purpose": "TRADING_SETTLEMENT"
}A user-supplied description that will become the description of the subsequent transfer transaction (optional)
"Internal ID: #12838927347"
If true, the Anchorage Digital gas station will pay gas fees, for supported asset types and organizations.
Response
Successfully initiate a transfer

