Crypto Withdrawals
Move crypto from your Confirmo balance to your own wallet or exchange account, on demand.
A crypto withdrawal sends crypto from your Confirmo balance to one of your own accounts in the Crypto Address Book. You can withdraw whenever you want, with no settlement schedule to wait for.
How a withdrawal works
A withdrawal has two steps:
- Create. You choose the destination and the amount. Confirmo locks the network fee and reserves the funds on your balance. The withdrawal is
prepared. - Confirm. You accept the locked fee before it expires. The withdrawal is
confirmed, and Confirmo sends it.
1. Create the withdrawal
curl -X POST https://confirmo.net/api/v3/withdrawals/crypto \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2a1e-1f7b-4d55-9a8e-2b9a3f0c7d11" \
-d '{
"cryptoAddressId": "cab7Ym1kPq3",
"balanceAssetId": "USDC",
"balanceQuantity": 25000,
"feePaymentMode": "net",
"reference": "treasury-sweep-2026-10",
"notifyUrl": "https://merchant.example/hooks/withdrawals",
"notifyEmail": "[email protected]"
}'| Field | Required | Notes |
|---|---|---|
cryptoAddressId | Yes | The id of an ACTIVE address-book entry with the WITHDRAWAL designation. It sets the network. |
balanceAssetId | Yes | The asset to withdraw from your balance, e.g. USDC. It must be available on the entry's network. |
balanceQuantity | Yes | The amount to withdraw, in that asset. |
feePaymentMode | Yes | Who pays the network fee: net adds the fee on top, gross deducts it from the amount. See Network fees. |
reference | No | Your own reference, up to 512 characters. |
notifyUrl | No | Webhook URL for status changes. See Webhooks and emails. |
notifyEmail | No | Email for webhook-failure warnings and, if you don't use a webhook, cancellation notices. |
Withdrawal endpoints accept an optional Idempotency-Key header (see Idempotent requests in the API reference). Use it so that a retried request doesn't create a second withdrawal.
Response 201 Created
{
"id": "cwdQ8nB2xL5",
"status": "prepared",
"substatus": null,
"address": "0x1111111111111111111111111111111111111111",
"networkId": "ETHEREUM-BLOCKCHAIN-MAINNET",
"balanceAssetId": "USDC",
"enteredBalanceQuantity": 25000,
"networkFeeQuantity": 1.84,
"totalFeeQuantity": 1.84,
"debitedBalanceQuantity": 25001.84,
"feePaymentMode": "net",
"expiresAt": 1772539320,
"reference": "treasury-sweep-2026-10",
"notifyUrl": "https://merchant.example/hooks/withdrawals",
"createdAt": 1772539200
}All amounts and fees are in the withdrawn asset. Confirmo pays the gas in the network's native token and charges you the equivalent in the asset you withdraw.
2. Confirm before expiresAt
expiresAtThe fee quote is valid for a short time, about 2 minutes. Use expiresAt to check. Confirm within the window:
curl -X PATCH https://confirmo.net/api/v3/withdrawals/crypto/cwdQ8nB2xL5 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "action": "CONFIRM" }'If you don't confirm in time, the withdrawal moves to expired and the reserved funds return to your balance. Create a new withdrawal to get a fresh quote.
Network fees
You choose who pays the fee with feePaymentMode:
| Mode | Debited from your balance | Arrives at your wallet |
|---|---|---|
net | balanceQuantity + network fee | balanceQuantity |
gross | balanceQuantity | balanceQuantity − network fee |
In gross mode, a withdrawal that is too small to cover the fee is refused with crypto_withdrawal_amount_below_fee.
Lifecycle
Withdrawals use the payout lifecycle without the draft and pending_verification steps:
| Status | Meaning | Funds |
|---|---|---|
prepared | Created, with the network fee locked. Waiting for you to confirm before expiresAt. | Reserved |
confirmed | You confirmed it, and it is queued and being processed. | Reserved |
sending | The transaction has been submitted to the network. transaction.hash appears as soon as it is broadcast. | Reserved |
done | Completed on-chain. Final, and the only success state. | Deducted |
expired | It wasn't confirmed within the window. Final. | Released |
canceled | It won't be sent. Final. Check substatus for the reason. | Released |
Treat a withdrawal as complete only when it reaches
done.
substatus on canceled
substatus on canceledsubstatus | Meaning |
|---|---|
manually_canceled | You (or a Confirmo administrator) cancelled it. |
rejected | It couldn't be processed and won't be retried. The reserved funds have been released. |
| (null) | No specific reason is available. Contact support if this happens unexpectedly. |
A cancelled withdrawal is never retried. To try again, create a new one.
Reading withdrawals
| Action | Request |
|---|---|
| Get one | GET /v3/withdrawals/crypto/{id} |
| List | GET /v3/withdrawals/crypto?status=done&createdAtFrom=1772438400&createdAtTo=1772524800&limit=20&offset=0 |
The list is newest first. createdAtFrom and createdAtTo are inclusive Unix timestamps in seconds. limit is at most 100.
On-chain details are in the nested transaction object. It is absent until a transaction exists. Its hash is absent until the transaction is broadcast.
Withdrawals are reported separately from payouts in the settlements API (GET /v3/settlements: cryptoWithdrawalAmountSum, cryptoWithdrawalFeeSum, cryptoWithdrawalIds).
Webhooks and emails
- Webhooks. If you set
notifyUrl, Confirmo sends aPOSTwith the full withdrawal object every time the status changes (prepared,confirmed,sending,done,canceled,expired). Webhooks are signed with your callback password, like payout webhooks. Re-read the withdrawal before acting on a webhook. - Delivery-failure email. If webhook delivery keeps failing, Confirmo sends a warning to
notifyEmail, or to your account email if you didn't set one. - No webhook configured. If you didn't set a
notifyUrl, Confirmo emailsnotifyEmailwhen a withdrawal iscanceled.
Permissions
| Action | API key | Dashboard user |
|---|---|---|
| View withdrawals | Any key | Any role |
| Create, confirm and cancel withdrawals | Key with Enable for payouts and withdrawals | Full access, Owner |
Updated about 10 hours ago

