v1

latestOpenAPI 3.0.02026-08-04134348905.1 KB
Transfers

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.

post/transfers

Headers

Api-Signaturestring required

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)
  )
)
Api-Timestampinteger required

Current timestamp, represented as unix epoch seconds

Request body

amountstring required

An amount of a crypto-asset to transfer, without units. The unit is derived from the asset type.

assetTypestring required

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.

deductFeeFromAmountIfSameTypeboolean

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.

idempotentIdstring

A client-provided unique ID for idempotent requests (mandatory)

transferMemostring nullable

A user-supplied description that will become the description of the subsequent transfer transaction (optional)

useGasStationboolean nullable

If true, the Anchorage Digital gas station will pay gas fees, for supported asset types and organizations.

Example request

{
  "amount": "1000.00000000",
  "assetParametersATOM": {
    "memo": "w3mp19cqp2"
  },
  "assetParametersCosmos": {
    "memo": "w3mp19cqp2"
  },
  "assetParametersExtra": {
    "value": "w3mp19cqp2"
  },
  "assetParametersFiatTrustedDestination": {
    "memo": "Invoice 123",
    "purpose": "TRADING_SETTLEMENT"
  },
  "assetParametersXLM": {
    "memo": "w3mp19cqp2"
  },
  "assetParametersXRP": {
    "destinationTag": 23874
  },
  "assetType": "BTC",
  "destination": {
    "id": "1c920f4241b78a1d483a29f3c24b6c4c"
  },
  "idempotentId": "12838927347",
  "source": {
    "id": "1c920f4241b78a1d483a29f3c24b6c4c"
  },
  "transferAmlQuestionnaire": {
    "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"
  },
  "transferMemo": "Internal ID: #12838927347"
}

Response

Successfully initiate a transfer

Example response

{
  "data": {
    "transferId": "008d3ec72558ce907571886df63ef51594b5bd8cf106a0b7fa8f12a30dfc867f"
  }
}