> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anchorage.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Crypto transfer

> Move digital assets between wallets or to an external on-chain address without per-transaction quorum.

A crypto transfer moves digital assets to an internal wallet or an external on-chain address without quorum approval on each request. For shared concepts, external setup, limits, and status monitoring, see [Transfer](/knowledge-base/platform/developers/move-money/transfer). This page covers the crypto-specific payloads and behavior.

`POST /v2/transfers` requires the `Transfer funds` permission and an Ed25519 request signature.

## Internal transfer

Move assets to any wallet you own at Anchorage Digital. No allowlisting or AML information is required. Set both `source.type` and `destination.type` to `WALLET`.

```json theme={null}
{
  "source": {
    "id": "{source wallet ID}",
    "type": "WALLET"
  },
  "destination": {
    "id": "{destination wallet ID}",
    "type": "WALLET"
  },
  "assetType": "{asset}",
  "amount": "{quantity}",
  "transferMemo": "{memo}",
  "idempotentId": "{unique ID}"
}
```

## External transfer

Move assets to an external destination that has been allowlisted as a trusted destination. External transfers always include a transfer AML questionnaire. You can identify the destination two ways:

* **`ADDRESS`** — Pass the allowlisted address as `destination.id`. If the asset requires a memo or destination tag, include the matching `assetParameters`.
* **`TRUSTED_DESTINATION`** — Pass the trusted destination ID as `destination.id`. Any memo or destination tag stored on the trusted destination is applied automatically, so you don't submit `assetParameters` yourself. This is the simpler path for assets that need a memo or tag, and it avoids mismatched-memo errors.

<CodeGroup>
  ```json By address theme={null}
  {
    "source": {
      "id": "{source wallet ID}",
      "type": "WALLET"
    },
    "destination": {
      "id": "{trusted destination address}",
      "type": "ADDRESS"
    },
    "assetType": "{asset}",
    "amount": "{quantity}",
    "transferMemo": "{memo}",
    "idempotentId": "{unique ID}",
    "transferAmlQuestionnaire": {
      "purpose": "{purpose}",
      "originatorType": "{originatorType}"
    },
    "assetParameters": "{memo or destination tag, if required}"
  }
  ```

  ```json By trusted destination theme={null}
  {
    "source": {
      "id": "{source wallet ID}",
      "type": "WALLET"
    },
    "destination": {
      "id": "{trusted destination ID}",
      "type": "TRUSTED_DESTINATION"
    },
    "assetType": "{asset}",
    "amount": "{quantity}",
    "transferMemo": "{memo}",
    "idempotentId": "{unique ID}",
    "transferAmlQuestionnaire": {
      "purpose": "{purpose}",
      "originatorType": "{originatorType}"
    }
  }
  ```
</CodeGroup>

### Fields

| Field                       | Description                                                                                                                                                             |
| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `source.id` / `source.type` | The wallet to send from. Retrieve wallet IDs via `GET /v2/wallets`.                                                                                                     |
| `destination.type`          | `WALLET` for internal. For external, `ADDRESS` (the allowlisted address as `destination.id`) or `TRUSTED_DESTINATION` (the trusted destination ID as `destination.id`). |
| `assetType`                 | The asset to move. List supported values via `GET /v2/asset-types`.                                                                                                     |
| `amount`                    | Quantity as a string, without units.                                                                                                                                    |
| `idempotentId`              | A client-provided unique ID (for example, a v4 UUID). Use a distinct value per transfer so an interrupted call can be safely retried.                                   |
| `transferMemo`              | Optional free-text description carried into the resulting transaction and deposit.                                                                                      |
| `transferAmlQuestionnaire`  | Required on external transfers. See [AML questionnaire](/knowledge-base/platform/developers/move-money/setup/aml-questionnaire) for the full field set.                 |

### Response

A successful request returns `201` with a `transferId` and `status`:

```json theme={null}
{
  "data": {
    "transferId": "008d3ec72558ce907571886df63ef51594b5bd8cf106a0b7fa8f12a30dfc867f",
    "status": "QUEUED"
  }
}
```

<Warning>
  With `destination.type: ADDRESS`, include the matching `assetParameters` if the asset requires a memo or destination tag. With `destination.type: TRUSTED_DESTINATION`, omit `assetParameters`—the memo or tag stored on the trusted destination is applied automatically.
</Warning>

## Crypto-specific behavior

**Queuing** — Up to 50 transfer requests from the same source wallet can be queued at once. Transfers for the same asset on the same blockchain process one at a time; others stay `QUEUED` until the prior transfer completes or fails. Transfers on different wallets or different blockchains can process in parallel. Transfers expire 24 hours after initiation.

**`assetParameters`** — Required when transferring to institutional wallets that need a memo or destination tag. Supported assets: ATOM, Cosmos, DYDX, HBAR, STX, TIA, XLM, XRP, ZETA.

**`useGasStation`** — If `true`, Anchorage Digital's gas station pays network fees for supported assets and organizations. Processing is slightly slower, since Anchorage Digital prefunds the originating wallet before executing the transfer.

**`deductFeeFromAmountIfSameType`**

| Value             | Behavior                                                                                            |
| :---------------- | :-------------------------------------------------------------------------------------------------- |
| `false` (default) | Network fee is charged in addition to the transfer amount.                                          |
| `true`            | Network fee is deducted from the transfer amount, only when the fee and transfer asset types match. |

To transfer a full balance of an asset whose fee is paid in the same asset (for example, BTC), set `deductFeeFromAmountIfSameType: true`. When the source is a `walletId`, fees are deducted from that wallet; when the source is a `vaultId`, fees come from the vault's default wallet (`isDefault: true`).

## Troubleshooting

If an external transfer returns `401`/`403`, check that:

* You're using the correct base URL.
* The destination is an allowlisted trusted destination.
* The permission group has external transfers enabled.
* If your permission is scoped to specific destinations, the destination has been connected to the permission group and endorsed.

Common request-level failures: the source wallet doesn't exist or doesn't support the asset, the amount exceeds available funds, the destination doesn't support the asset, or the key lacks permissions for the source vault.

After a request succeeds, the transfer can still fail at execution if there are insufficient funds to cover the network fee at broadcast time or there's a blockchain-level failure.
