
# Transfer between accounts

- **POST** ```/api/v3/wallet/transfer/self```

Weight(IP): 20

Transfers assets between the authenticated user's Funding, Spot, and Futures accounts. Requires `TRANSFER` permission. The user is identified through API key authentication and cannot be specified by UID in the request.

<div class='api-content-wrap'>
<div>

<strong>Request Body</strong>

| Parameter | Type | Required? | Description |
|:----------|:-----|:----------|:------------|
| amount | String | Yes | Transfer amount. Must be greater than 0 and respect the configured coin precision; excess precision returns -1160. |
| fromAccountType | String | Yes | Source account type: `UNIMARGIN` (futures account), `SPOT` (spot account), or `FUNDING` (funding account). |
| toAccountType | String | Yes | Destination account type. Uses the same values as `fromAccountType` and must be different from the source account. |
| coin | String | Yes | Asset code. |
| bizId | String | No | Business ID. If specified, the business ID must contain 16-32 ASCII letters or numbers and may include the `openapi_` prefix. The server adds the prefix if absent, stores and returns the final ID, or generates openapi_ plus 32 random characters when omitted. |
| params | String | No | Business remark or additional information. |

</div>
<div class='api-align'>
  <div class='code-wrap'>

<strong>Request example</strong>

```json
{
  "amount": "20",
  "fromAccountType": "SPOT",
  "toAccountType": "FUNDING",
  "coin": "USDT",
  "params": "test",
  "bizId": "openapi_NzqVr0AGj1uDYUp20260903102825"
}
```

</div>
  </div>
</div>

<div class='api-content-wrap'>
  <div>

<strong>Response parameters</strong>

| Field name | Type | Description |
|:-----------|:-----|:------------|
| code | Integer | Business code. 0 indicates success. |
| msg | String | Response message. |
| data.bizId | String | Business ID used for the transfer. |
| data.result | Boolean | `true` indicates a successful transfer. |
| data.transferId | String | Transfer ID. May be Null. |

  </div>
  <div class='api-align'>
  <div class='code-wrap'>

<strong>Response example</strong>

```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "bizId": "openapi_NzqVr0AGj1uDYUp20260903102825",
    "result": true,
    "transferId": null
  }
}
```

</div>
    </div>
</div>

## Error codes

| Code | Message |
|:---|:---|
| -2413 | Insufficient balance. |
| -2442 | Asset transfer failed. |
| -2443 | Asset transfer is processing. Retry with the same bizId. |
| -2444 | fromAccountType and toAccountType cannot be the same. |
| -2445 | bizId already exists. Reuse it only with the original request parameters. |
| -2446 | Legacy spot account is not supported. Use SPOT instead. |
| -2447 | bizId must contain 16 to 32 ASCII letters or digits, optionally prefixed with 'openapi_'. |
| -2452 | Exceeds the maximum amount available for transfer. |
| -1160 | Decimal precision error. |

See [Wallet Error Codes](/products/wallet/WalletErrorCodes) for other wallet and validation errors.
