Create a Coin Withdrawal

Let’s take a look at our API reference and go through the parameters that needs to be used in order to create the coin withdrawal request:

  • address (string) — the recipient's wallet address. For example, 2MvWu1QjMuDWP4x3wZpPxhuVHpvfzBJmyw3.

  • network (string) — the blockchain in which the withdrawal is going to be created. The list of available networks can be found here.

  • charged_currency (string) — your account currency to send a transaction from.

  • received_currency (string) — a recipient's cryptocurrency wallet address

  • custom_id (string) — we recommend you specify a certain reference by which you associate your customer with the payment, for example 113562013

  • amount (decimal_string) — withdrawal amount specified by the user.

  • amount_currency (string) — currency of the specified amount.

  • amount_includes_processing_fee (bool) — indicates whether the amount includes the processing fee; can be true or false.

  • amount_includes_network_fee (bool) — indicates whether the amount includes the network fee; can be true or false.

  • force_commit - the setting to set up the two-step withdrawal process. If false the coin withdrawal transaction needs to be committed within 30 seconds. Is false if omitted. If you use this parameter when sending a request, the withdrawal won't be created immediately, but rather only after receiving an additional commit within 30 seconds. When information will be returned in the response, you will be able to check the network fee and the amounts to be debited and sent and only then send a confirmation to proceed with the withdrawal. Confirmation reference is here. If we don't receive a commit in 30 seconds, the withdrawal won't be processed and a new request would have to be sent.

All amount_ fields are dedicated to help you to separate processing and network fees.

Here are the example requests for each possible fee configuration:

  1. Both fees are deducted from the transaction amount = amount paid by the recipient (end-user). This is the same as using charged_amount.

{
"address": "Cc6yDWNNCVMnauWPHW82Tp8BKCoAodzcrTji3yDeJXc8",
"charged_currency": "EUR",
"received_currency": "USDT",
"network": "solana",
"amount": "100.0",
"amount_currency": "EUR",
"amount_includes_processing_fee": true,
"amount_includes_network_fee": true,
"network_fee_level": "average",
"force_commit": true
}

  1. Both fees are charged on top of the transaction amount = paid by the sender (= merchant). This is the same as using charged_amount_to_send.

{
"address": "Cc6yDWNNCVMnauWPHW82Tp8BKCoAodzcrTji3yDeJXc8",
"charged_currency": "EUR",
"received_currency": "USDT",
"network": "solana",
"amount": "100.0",
"amount_currency": "EUR",
"amount_includes_processing_fee": false,
"amount_includes_network_fee": false,
"network_fee_level": "average",
"force_commit": true
}

  1. The network fee is included in the transaction amount (paid by the recipient), while the processing fee is charged on top of it (= paid by the sender)

{
"address": "Cc6yDWNNCVMnauWPHW82Tp8BKCoAodzcrTji3yDeJXc8",
"charged_currency": "EUR",
"received_currency": "USDT",
"network": "solana",
"amount": "100.0",
"amount_currency": "EUR",
"amount_includes_processing_fee": false,
"amount_includes_network_fee": true,
"network_fee_level": "average",
"force_commit": true
}

  1. The processing fee is included in the transaction amount (paid by the recipient), while the network fee is charged on top of it (= paid by the sender)

{
"address": "Cc6yDWNNCVMnauWPHW82Tp8BKCoAodzcrTji3yDeJXc8",
"charged_currency": "EUR",
"received_currency": "USDT",
"network": "solana",
"amount": "100.0",
"amount_currency": "EUR",
"amount_includes_processing_fee": true,
"amount_includes_network_fee": false,
"network_fee_level": "average",
"force_commit": true

Here's what the response would look like in the first case:

{
    "data": {
        "id": "4d1fa4cf-1cc9-41fb-b0c3-98c235c6dc06",
        "custom_id": null,
        "customer_id": null,
        "address": "Cc6yDWNNCVMnauWPHW82Tp8BKCoAodzcrTji3yDeJXc8",
        "network": "solana",
        "txid": null,
        "status": "pending",
        "charged_amount": "100.0",
        "charged_currency": "EUR",
        "received_amount": "113.414253",
        "received_currency": "USDT",
        "network_fee": "0.0008",
        "network_fee_level": "average",
        "fee": "1.0",
        "fee_currency": "EUR",
        "description": null,
        "exchange": {
            "pair": "USDTEUR",
            "rate": "0.8729",
            "fee": "0.0",
            "fee_currency": "EUR"
        },
        "risk": null,
        "created_at": "2025-10-30T08:38:11+00:00"
    }
}

The coin withdrawal was created with the initial status “Pending”.

The “Completed” status means that MinFee has processed your request and sent the transaction has been sent to the network. This status does not mean that the transaction has shown up on the recipient's wallet balance, since, as explained above, it will take some time for the transaction to be confirmed by the miners.

Sometimes when the transaction status is updated to “Failed” instead of “Completed”, it means that MinFee was unable to send the transaction. In this case, the funds charged from the merchant's account will be refunded to the balance. It usually takes from minutes to several hours to return the funds and does not require any action by the merchant.

Once you have created a Coin withdrawal, we recommend that you check the payment status with a separate request, as the delivery of the callbacks is not guaranteed.

Deprecated fields:

  • сharged_amount_to_send - the payment amount. when using this parameter, Cryptopay will deduct the entire fee from the merchant balance and not the transaction amount. For example, the BTC transaction with the amount of 100 EUR will be sent to the recipient's address at the rate at the time of processing the payment request.

  • charged_amount - in this case, Cryptopay would include the amount of all fees in the amount of the transaction sent. Thus, the BTC transaction with an amount of less than 100 EUR at the exchange rate at the time of the payment request would have been sent to the recipient's address.

Last updated