Crypto Withdrawals
Create and follow crypto withdrawals. POST /api/v1/crypto-withdrawals creates a withdrawal request and sends a confirmation e-mail to the account holder. Funds leave your account only after you confirm the request from that e-mail. The link is valid for 1 hour; after that the request is cancelled automatically. Use Get Crypto Withdrawal by Id to follow its status.
| status | Meaning |
|---|---|
| PendingForUserAction | Waiting for you to confirm from the e-mail |
| PendingForAdminAction | Confirmed; waiting for a review by BtcTurk Global before it is sent |
| Confirmed | Confirmed; being processed and sent |
| UserCancelled | Cancelled by you |
| AdminCancelled | Cancelled by BtcTurk Global |
| SystemCancelled | Not confirmed within 1 hour, or stopped by an automatic check; cancelled automatically |
For all transactions related to the private endpoint, you must authorize before sending your request.
For more information you can check our Authentication V1 article. This endpoint requires the Crypto Asset Withdrawal API key permission group.
Headers
| Name | Type | Description |
|---|---|---|
| X-PCK* | string | API public key. |
| X-Stamp* | integer | Current time in milliseconds since the Unix epoch (UTC). |
| X-Signature* | string | HMAC-SHA256 signature. See Authentication V1. |
| X-Nonce | integer | Optional. Backward tolerance for X-Stamp in milliseconds. Default 5000, maximum 60000. |
Create Crypto Withdrawal
POST /api/v1/crypto-withdrawals
Request Body
| Name | Type | Description |
|---|---|---|
| asset* | string | channelSymbol from Get Currency Channels, case-sensitive. It selects both the asset and the network, e.g. TRC20USDT for USDT on Tron, USDT for USDT on Ethereum, BTC for Bitcoin. |
| amount* | string | Decimal string, up to 12 integer digits and 16 decimal digits. |
| address* | string | Destination address. Must be one of your withdrawal addresses for this currency and network, added in the BtcTurk Global app. |
| addressTag | string | Memo/tag, required by some networks. |
| uniqueTransactionId | guid | Optional idempotency key. A new GUID is generated if omitted or empty. |
- The address (and its tag, on networks that use one) must be saved as a withdrawal address for the same
currency and network in the BtcTurk Global app; otherwise you receive
400WITHDRAWAL_ADDRESS_NOT_WHITELISTED (1091). - Only one withdrawal per currency and network can be pending at a time. While one waits for your e-mail
confirmation or for review, creating another returns
409EXIST_PENDING_REQUEST (1059). - The fee is charged in addition to
amount: your balance is debitedamountplusfee. The fee is returned infeewhen the request is created.
- 200
- 400: balance not enough
{
"success": true,
"message": "SUCCESS",
"code": 0,
"data": {
"id": 778899,
"timestamp": 1735866257711,
"type": "Withdrawal",
"amount": "-0.5",
"fee": "-0.0001",
"address": "bc1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"addressTag": null,
"asset": "BTC"
}
}
{
"success": false,
"code": 1055,
"message": "BALANCE_NOT_ENOUGH"
}
| Field | Type | Description |
|---|---|---|
| id | long | Withdrawal id. |
| timestamp | long | Creation time, milliseconds since the Unix epoch. |
| type | string | Always Withdrawal. |
| amount | string | Amount debited, as a negative decimal string. |
| fee | string | Fee debited, as a negative decimal string; "0" when no fee is charged. |
| address | string | Destination address. |
| addressTag | string | Memo/tag, or null. |
| asset | string | Currency symbol, e.g. BTC. |
List Crypto Withdrawals
GET /api/v1/crypto-withdrawals
Query Parameters
| Name | Type | Description |
|---|---|---|
| uniqueTransactionId* | guid | The uniqueTransactionId used when creating the withdrawal. |
Response is a raw JSON array.
- 200
[
{
"id": 778899,
"address": "bc1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"amount": -0.5,
"confirmationDate": null,
"confirmCount": 2,
"cryptoChannelId": 25,
"cryptoStatus": "PendingForUserAction",
"cryptoType": "Withdrawal",
"currencyId": 2,
"currencySymbol": "BTC",
"fee": -0.0001,
"feeCurrencyId": 2,
"pairLastPrice": null,
"remainingFunds": 0,
"tag": null,
"txHash": null,
"userId": 12345,
"uniqueTransactionId": "b1a2c3d4-e5f6-4789-0abc-def123456789",
"createdDate": "2025-08-24T10:00:00Z",
"updatedDate": "2025-08-24T10:00:05Z"
}
]
amount and fee are JSON numbers, negative for a withdrawal. cryptoStatus uses the same names as
status (see the table above), and createdDate is an ISO-8601 date-time string.
Get Crypto Withdrawal by Id
GET /api/v1/crypto-withdrawals/{id}
- 200
- 404: not found
{
"id": 778899,
"address": "bc1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"balanceAmount": -0.5,
"feeBalanceAmount": -0.0001,
"createdAt": "2025-08-24T10:00:00Z",
"cryptoChannelId": 25,
"currencyId": 2,
"status": "PendingForUserAction"
}
{
"title": "Not Found",
"type": "crypto-withdrawal-not-found",
"status": 404,
"detail": "Not found"
}
balanceAmount (the amount) and feeBalanceAmount (the fee) are JSON numbers, negative for a
withdrawal. createdAt is an ISO-8601 date-time string, and status is the withdrawal status (see the table above).
Code Example
- curl
- C#
curl -X POST "https://api.global.btcturk.com/api/v1/crypto-withdrawals" \
-H "X-PCK: YOUR_API_PUBLIC_KEY" \
-H "X-Stamp: 1735866257711" \
-H "X-Signature: COMPUTED_SIGNATURE" \
-H "Content-Type: application/json" \
-d '{
"asset": "BTC",
"amount": "0.5",
"address": "bc1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'
var payload = new { asset = "BTC", amount = "0.5", address = "bc1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" };
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
using var client = new HttpClient { BaseAddress = new Uri("https://api.global.btcturk.com") };
client.DefaultRequestHeaders.Add("X-PCK", apiKey);
client.DefaultRequestHeaders.Add("X-Stamp", stamp);
client.DefaultRequestHeaders.Add("X-Signature", signature);
var response = await client.PostAsync("/api/v1/crypto-withdrawals", content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Expected Errors
Create Crypto Withdrawal returns errors in the envelope format; handle them by code.
| Status | Code | Message | Meaning |
|---|---|---|---|
| 400 | 1038 | INVALID_WITHDRAWAL_AMOUNT | amount is zero, negative or malformed |
| 400 | 1038 | WITHDRAWAL_AMOUNT_EXCEEDED | amount is above the maximum for the asset |
| 400 | 1038 | INVALID_ADDRESS_TAG | The address tag is missing or invalid for the network |
| 400 | 1055 | BALANCE_NOT_ENOUGH | Not enough free balance for amount plus fee |
| 400 | 1242 | BALANCE_NOT_ENOUGH_DUE_TO_OPEN_ORDERS | The balance is reserved by open orders; data holds the reserved amount |
| 400 | 1064 | CURRENCY_NOT_FOUND | The currency does not exist |
| 400 | 1068 | AMOUNT_BELOW_MINIMUM_WITHDRAWAL_AMOUNT | amount is below the minimum withdrawal |
| 400 | 1081 | CURRENCY_CHANNEL_NOT_FOUND | asset does not match a currency channel |
| 400 | 1091 | WITHDRAWAL_ADDRESS_NOT_WHITELISTED | The address is not one of your saved withdrawal addresses |
| 400 | 1095 | ADDRESS_IS_NOT_VALID | The address is not valid for the network |
| 400 | 1096 | ADDRESS_CAN_NOT_BE_INTERNAL | The address belongs to BtcTurk and cannot be used |
| 400 | 1211 | GLVL1_CRYPTO_WTH_30D_LIMIT_EXCEED | 30-day withdrawal limit exceeded; data holds the remaining limit |
| 400 | 1212 | GLVL1_CRYPTO_WTH_24H_LIMIT_EXCEED | 24-hour withdrawal limit exceeded; data holds the remaining limit |
| 400 | 1218 | ACCESS_DENIED | Withdrawals are not available for this asset on your account |
| 400 | 1232 | CURRENCY_WITHDRAWAL_DISABLED | Withdrawals are disabled for this network |
| 400 | 8009 | SUSPICIOUS_ADDRESS | The address is flagged as suspicious |
| 403 | 1229 | BLOCKED_CRYPTO_WITHDRAWAL | Crypto withdrawals are blocked for your account; data holds the end date |
| 403 | 1240 | SUSPENDED_WITHDRAW_CRYPTO | Crypto withdrawals are suspended for your account; data holds the end date |
| 403 | 8015 | CRYPTO_WITHDRAWAL_BLOCKED_ADDRESS | Withdrawals to this address are blocked |
| 409 | 1059 | EXIST_PENDING_REQUEST | Another withdrawal for this currency and network is still pending |
| 409 | 1245 | DUPLICATE_WITHDRAWAL_TRANSACTION | uniqueTransactionId was already used |
| 500 | 500 | INTERNAL_ERROR | Unexpected error; check List Crypto Withdrawals before retrying |
Any other rejection keeps its HTTP status (400, 403 or 409), with code 1218 for 403 and 1038
otherwise, and gives the reason in message, for example
CRYPTO_WITHDRAWAL_HOLDING_72_HOURS_RULE_RESTRICTION. Do not retry these without changing the request.
When a field is rejected, the response is a list of field / message pairs instead, for example
[{ "field": "Address", "message": "MIN_LENGTH_10" }]. Messages are ADDRESS_REQUIRED, MIN_LENGTH_10,
MAX_LENGTH_250 (address), MAX_LENGTH_200 (address tag), INVALID_WITHDRAWAL_AMOUNT, INVALID_ASSET
and INVALID_VALUE.
If the withdrawals cannot be read, List Crypto Withdrawals returns a 500 internal-server-error
problem document.