---
title: "Create a crypto withdrawal"
method: POST
path: "/v3/withdrawals/crypto"
tags: ["Crypto Withdrawal"]
---

# Create a crypto withdrawal

`POST /v3/withdrawals/crypto`

## Request

- Base URL: `https://confirmo.net/api`
- URL: `https://confirmo.net/api/v3/withdrawals/crypto`
- Auth: HTTP bearer

Creates a crypto withdrawal to one of the authenticated merchant's crypto address book entries, with status `prepared`. The network fee is calculated and the balance blocked; the merchant must confirm within the confirmation window or the withdrawal auto-expires and the balance is released.

> Supports the optional `Idempotency-Key` header so a retry won't perform the operation twice - a fresh UUID per request is recommended. See <a href="#idempotent-requests">Idempotent requests</a> for more information.

## Request body

- CreateCryptoWithdrawalRequest
  - `balanceAssetId` string, required
  - `balanceQuantity` number, required
  - `cryptoAddressId` string, required: The entry must be ACTIVE and designated for WITHDRAWAL.
  - `feePaymentMode` 'net' | 'gross', required
  - `notifyEmail` string, email
  - `notifyUrl` string, url
  - `reference` string

## Response `201`

Crypto withdrawal successfully created

- CryptoWithdrawal
  - `address` string
  - `balanceAssetId` string
  - `createdAt` integer
  - `debitedBalanceQuantity` number: In `net` mode this is the entered amount plus the total fee; in `gross` mode it equals the entered amount. The amount delivered on-chain is this value minus `totalFeeQuantity`. In the balance asset.
  - `enteredBalanceQuantity` number
  - `expiresAt` integer
  - `feePaymentMode` 'net' | 'gross'
  - `id` string
  - `networkFeeQuantity` number: The on-chain gas is paid in the network's native token (e.g. SOL on Solana); this is that fee recalculated into the balance asset at the current rate — i.e. what the merchant is charged for it.
  - `networkId` string
  - `notifyUrl` string, url
  - `reference` string
  - `status` 'prepared' | 'confirmed' | 'sending' | 'done' | 'canceled' | 'expired'
  - `substatus` string: Set on a `canceled` withdrawal: `rejected` — it could not be processed and will not be retried, and the blocked funds have been released — or `manually_canceled` when a person ended it. Not every cancellation has a reason to report, so its absence is not itself information — please ask us rather than reading one into it. Treat this as an open set: new values are added as they are announced, and your integration must tolerate ones it does not recognise.
  - `totalFeeQuantity` number: The sum of the processing fee and the network fee (the latter recalculated from the native gas token into the balance asset). Currently equal to the network fee (processing fee is 0 at launch). The amount delivered on-chain equals `debitedBalanceQuantity` minus this value.
  - `transaction` CryptoWithdrawalTransaction
    - `hash` string: Absent until the transaction reaches the network, so a transaction that is still being prepared or screened has none. Together with the withdrawal's `networkId` it locates the transaction on a block explorer.

## Other responses

- `400`: Invalid request, a balance asset that cannot be withdrawn on the network of the address book entry, or the Crypto Withdrawals feature is disabled
- `403`: Not authenticated by an API key, no authenticated merchant, or missing withdrawal permission
- `404`: No crypto address book entry has the given cryptoAddressId
- `409`: Conflict
- `422`: Address not usable, the merchant's daily withdrawal limit would be exceeded, amount below the fee, or insufficient balance

---

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