---
title: "Confirm or cancel a crypto withdrawal"
method: PATCH
path: "/v3/withdrawals/crypto/{id}"
tags: ["Crypto Withdrawal"]
---

# Confirm or cancel a crypto withdrawal

`PATCH /v3/withdrawals/crypto/{id}`

## Request

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

Performs an action on a `prepared` crypto withdrawal. CONFIRM accepts the locked network fee and starts on-chain execution via the payout pipeline; it must be called within the confirmation window, after which the withdrawal auto-expires. CANCEL discards the withdrawal and releases the blocked balance. Both actions require the withdrawal to still be awaiting confirmation.

> 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.

## Path parameters

- `id` string, required

## Request body

- PerformCryptoWithdrawalActionRequest
  - `action` 'CONFIRM' | 'CANCEL', required

## Response `200`

Crypto withdrawal successfully confirmed or canceled

- 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
- `403`: Not authenticated by an API key, no authenticated merchant, or missing withdrawal permission
- `404`: No withdrawal with the given id exists
- `409`: The withdrawal is no longer in a state the requested action allows

---

[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)
