---
title: "Create Withdrawal"
method: POST
path: "/v1/wallets/withdrawal"
tags: ["custody"]
---

# Create Withdrawal

`POST /v1/wallets/withdrawal`

## Request

- Base URL: `https://api.exchange.bullish.com/trading-api`
- URL: `https://api.exchange.bullish.com/trading-api/v1/wallets/withdrawal`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/bullish/apis/bullish-trading-api/docs/v1/wallets/withdrawal/post.ts> (a function with typed inputs; its response is checked against the schema)

Trigger a withdrawal, requires [bearer token](/rest/authentication#add-authenticated-request-header) in authorization header

The `BX-SIGNATURE` header should be created by signing the request with an ECDSA API Key as follows:

1. Construct a string that concatenates the following fields:
    - `timestamp` - current epoch milliseconds e.g. 1697008474031
    - `nonce` - a UUID identifier to protect against replay attacks e.g. 255241a1-2cde-4954-87b1-13beef547960
    - `request method` - e.g. POST
    - `request path` - e.g. /trading-api/v1/wallets/withdrawal
    - `request body JSON string`, removing any spaces and newline characters
2. Hash the string using a SHA-256 hash function and sign the resulting hexdigest with your `<PRIVATE_KEY>`.
3. DER encode the signature, and base64 encode the DER encoded signature.

> **Bullish requires you to whitelist a withdrawal destination address before submitting a withdrawal request. You may view, approve, and manage your list of destination addresses in Account Settings on the Bullish website. If you attempt a withdrawal without first whitelisting an address in Account Settings, then the withdrawal attempt will fail.**

For a full example of using the withdrawal endpoint please see the [Custody Withdrawal Example](https://github.com/bullish-exchange/api-examples/blob/master/custody/custody_withdrawal_ecdsa.py)

Please note that Custody endpoints utilize a non-multiplied asset format for long decimal assets like SHIB and PEPE, ensuring consistency with real-world asset representation. This differs from Trading endpoints, which use a multiplied asset format, such as SHIB1M and PEPE1M. For more information, please see [help center](https://bullishexchange.atlassian.net/wiki/spaces/BHC/pages/20807684/Understanding+Multiplied+Assets+PEPE1M+and+SHIB1M)

The currently supported precisions for withdrawal quantities are as follows. Please note that fees are always specified in units of the symbol itself, not in smaller denominations (e.g. BTC not Satoshi, ETH not Wei) :

| Symbol | Precision | Remarks |
| ---------- |---------------- | --- |
| USD | 2dp | |
| BTC | 8dp | |
| DOGE | 8dp | |
| ETH | 8dp | |
| LTC | 8dp | |
| XRP | 6dp | |
| AAVE | 8dp | |
| CRV | 8dp | |
| LINK | 8dp | |
| MANA | 8dp | |
| MATIC | 8dp | |
| SUSHI | 8dp | |
| UNI | 8dp | |
| USDC | 6dp | |
| USDT | 6dp | |
| SHIB | 2dp | Please ensure to use the non-multiplied asset format (e.g., SHIB, PEPE, BONK) when creating withdrawals, as Custody endpoints align with real-world asset representation |
| PEPE | 2dp | Please ensure to use the non-multiplied asset format (e.g., SHIB, PEPE, BONK) when creating withdrawals, as Custody endpoints align with real-world asset representation |
| BONK | Round to the nearest ten (e.g., 120 or 130, not 125). | Please ensure to use the non-multiplied asset format (e.g., SHIB, PEPE, BONK) when creating withdrawals, as Custody endpoints align with real-world asset representation |

**Ratelimited:** `True` - see [custody limits](/rest/general/rate-limits)

## Headers

- `BX-SIGNATURE` string, required

## Request body

- CustodyApiEcdsaWithdrawalRequest
  - `timestamp` string, string, required: unsigned 64 bit integer value which is the number of milliseconds since EPOCH expressed as string
  - `nonce` string, required: a UUID withdrawal nonce to protect against replay attacks
  - `authorizer` string, string, required: JWT authorizer you obtain along with the [JWT token](/rest/authentication#generate-a-jwt-token)
  - `command` CustodyApiEcdsaWithdrawalCommand, required
    - `commandType` string, required: the command type, it must be 'V1Withdrawal'
    - `destinationId` string, required: destination id provided by bullish that uniquely identifies a whitelisted address or account
    - `symbol` string, required: symbol representing coin or token, e.g. USDC, BTC, ETH, SHIB
    - `network` string, required: the network of the native coin or token, e.g. BTC, ETH, SOL
    - `quantity` string, required: total quantity of symbol to withdraw including fee in units of symbol, not in smaller denominations (e.g. BTC not Satoshi, ETH not Wei) - quantity received will have fee subtracted.

## Response `200`

OK

- CustodyApiWithdrawalResponse
  - `statusReason` string: status reason, describes why withdrawal challenge is in a specific state
  - `statusReasonCode` integer: status reason code, see [details](/rest/general/error-rejection-codes)
  - `custodyTransactionId` string: unique identifier for tracking a withdrawal during signing and in history

## Other responses

- `429`: Too Many Requests
- `500`: Internal Server Error

---

[API](https://skmtc.dev/bullish/apis/bullish-trading-api.md) - [All operations](https://skmtc.dev/bullish/apis/bullish-trading-api/llms.txt) - [OpenAPI document](https://skmtc.dev/bullish/apis/bullish-trading-api/revisions/df5d69ccedcf?raw)
