Withdrawal Endpoints¶
This section covers API endpoints related to withdrawals. Withdrawal operations allow users to send funds from their platform balance to external addresses or accounts. Depending on the cryptocurrency or fiat method, withdrawals may require additional attributes like tags, memos, or bank details, and have specific network fees and processing conditions.
Get Personal Withdrawal Methods¶
Returns withdrawal methods available to the authenticated user, considering their segments. It also reports the user's specific limits and fees for each method.
Required Permissions¶
allow_withdraw
Rate Limit¶
30 requests per minute
Response¶
Returns list of objects:
| Field | Type | Description |
|---|---|---|
code | string | Unique identified of the method |
name | string | Human readable name of the |
method_type | string | Type of method. One of: crypto, card and other possible in the future |
currency | string | Code of currency to be withdrawn from balance |
coin | string | Code of coin asset to be received in destination. It carries the info of token symbol and network |
network | string | Network code |
min_amount | string | Minimum amount allowed for withdrawal |
max_amount | string | Maximum amount allowed for withdrawal |
fee_percent | string | Percentage fee applied to the withdrawal amount (e.g., "0.5" for 0.5%) |
fee_percent_min | string | Minimum fee amount applied based on the percentage (e.g., "1.00" for 1 unit of currency) |
fee_percent_max | string | Maximum fee amount applied based on the percentage (e.g., "10.00" for 10 units of currency) |
fee_absolute | string | Fixed fee amount applied to the withdrawal (e.g., "2.00" for 2 units of currency) |
attributes_config | object | Configuration of additional attributes required for this method (like address, tag, etc.) |
is_enabled | bool | Whether the method is currently enabled for the user |
spend_precision | integer | Number of decimal places allowed for the withdrawal amount. Usually 8. |
receive_precision | integer | Number of decimal places allowed for the received amount. Usually 8. |
Attributes Config Object¶
The attributes_config field contains a JSON object defining any additional attributes required for the withdrawal method. Each key in this object represents an attribute name, and its value is another object with the following fields:
| Field | Type | Description |
|---|---|---|
class_name | string | Type of the attribute. See below. |
params | object | Possibly additional parameters in the future |
Attributes Class Names¶
Crypto Address¶
Those classes are only require address that has valid format according to network of withdraw method.
AnyAddressAttributes- onlyaddressfield required, valid for any network. Used only for testing.CryptoAddressAttributes- onlyaddressfield required. Same asAnyAddressAttributesbut with validation according to network.CryptoAddressWithTagAttributes- requires additionaltagfield.BitcoinAddressAttributes- onlyaddressfield required, valid for Bitcoin network.LitecoinAddressAttributes- onlyaddressfield required, valid for Litecoin network.EthereumAddressAttributes- onlyaddressfield required, valid for Ethereum network. Other EVM networks also supported.RippleAddressAttributes- requires additionaltagfield, valid for Ripple network.StellarAddressAttributes- requires additionaltagfield, valid for Stellar networkTronAddressAttributes- onlyaddressfield required, valid for Tron networkSolanaAddressAttributes- onlyaddressfield required, valid for Solana networkTonAddressAttributes-addressfield is required, valid for TON network. Additionalmessageortagfields are optional.tagis an alias formessagefield.MoneroAddressAttributes- has additionalpayment_idfield, valid for Monero network. Usetagto setpayment_idfield.
Fiat Withdrawal¶
Those classes require address field that may contain bank account number, card number or other identifier. Also additional fields may be required in beneficiary object.
CardNumberAttributes- requiresaddressfield to contain card number.CardBeneficiaryAttributes- requiresaddressfield to contain card number and additional fields inbeneficiaryobject.CardEDRPOUAttributes- requiresaddressfield to contain card number, additional fields inbeneficiaryobject andedrpoufield inbeneficiaryobject.
Internal transfers¶
Those classes require only address field that should contain account identifier uid.
UserUIDAttributes- requiresaddressfield to contain useruid.
Future classes¶
More classes may be added in the future to support additional networks and methods.
Example of Withdraw Methods Response¶
[
{
"code": "BTC",
"name": "BTC Bitcoin",
"method_type": "crypto",
"currency": "BTC",
"coin": "BTC",
"network": "bitcoin",
"min_amount": "0.00000001",
"max_amount": null,
"fee_percent": "0.00000000",
"fee_percent_min": null,
"fee_percent_max": null,
"fee_absolute": "0.00000000",
"attributes_config": {
"class_name": "BitcoinAddressAttributes",
"params": null
},
"is_enabled": true,
"spend_precision": 8,
"receive_precision": 8
},
{
"code": "USDTTRC20",
"name": "USDT Tron",
"method_type": "crypto",
"currency": "USDT",
"coin": "USDTTRC20",
"network": "tron",
"min_amount": "0.00000001",
"max_amount": null,
"fee_percent": "0.00000000",
"fee_percent_min": null,
"fee_percent_max": null,
"fee_absolute": "0.00000000",
"attributes_config": {
"class_name": "TronAddressAttributes",
"params": null
},
"is_enabled": true,
"spend_precision": 8,
"receive_precision": 8
},
{
"code": "USDTERC20",
"name": "USDT Ethereum",
"method_type": "crypto",
"currency": "USDT",
"coin": "USDTERC20",
"network": "ethereum",
"min_amount": "0.00000001",
"max_amount": null,
"fee_percent": "0.00000000",
"fee_percent_min": null,
"fee_percent_max": null,
"fee_absolute": "0.00000000",
"attributes_config": {
"class_name": "EthereumAddressAttributes",
"params": null
},
"is_enabled": true,
"spend_precision": 8,
"receive_precision": 8
}
]
Create Withdrawal¶
Initiates a withdrawal request.
Required Permissions¶
allow_withdraw
Rate Limit¶
600 requests per minute
Request Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
currency | string | Yes | Currency code for the withdrawal |
method | string | No | Specific withdrawal method code. If not provided, the default method for the currency will be used. See available methods in your account settings |
amount | string | Yes | Amount to withdraw |
address | string | Yes | Destination address |
tag | string | No | Destination tag/memo (required for some currencies) |
beneficiary | object | No | Beneficiary details (required for fiat withdrawals) |
callback_url | string | No | URL that will be called with status updates |
custom_id | string | No | Custom identifier for tracking this withdrawal. Highly recommend to use as it works as idempotency key if set. |
receive_mode | bool | No | true – The specified withdrawal amount will be sent in full to the destination address. The transaction fee will be charged separately from the balance in addition to the withdrawal amount. false – The specified withdrawal amount will be deducted from the balance, and after subtracting the transaction fee, the remaining amount will be sent to the destination address. |
address_book_code | string | No | Address book entry code to use for withdrawal |
Beneficiary object (for fiat withdrawals)¶
Here are the fields for the beneficiary object used in fiat withdrawals:
| Field | Type | Required | Description |
|---|---|---|---|
first_name | string | Yes | First name of the beneficiary |
last_name | string | Yes | Last name of the beneficiary |
email | string | Yes | Email of the beneficiary |
phone | string | No | Phone number of the beneficiary |
iban | string | Yes | IBAN of the beneficiary |
tin | string | No | Tax identification number of the beneficiary |
edrpou | string | No | EDRPOU code ( for Ukrainian businesses) |
Also note that in case of fiat withdrawal if card used card number should be passed in address field and other beneficiary fields should be passed in beneficiary object.
On other hand if for example SEPA method used address field should contain IBAN and other beneficiary fields should be passed in beneficiary object.
Example Request for Crypto Withdrawal¶
{
"currency": "BTC",
"method": "BTC",
"amount": "0.05000000",
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"callback_url": "https://example.com/callbacks/withdrawals",
"custom_id": "my-withdrawal-123",
"receive_mode": true
}
Example Request for Fiat Withdrawal¶
{
"currency": "EUR",
"method": "sepa",
"amount": "1000.00",
"address": "DE89370400440532013000",
"beneficiary": {
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"iban": "DE89370400440532013000"
},
"callback_url": "https://example.com/callbacks/withdrawals",
"custom_id": "my-withdrawal-456",
"receive_mode": true
}
Response¶
{
"code": "WDR123456",
"custom_id": "my-withdrawal-123",
"callback_url": "https://example.com/callbacks/withdrawals",
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"closed_at": null,
"currency": "BTC",
"coin": "BTC",
"method": "BTC",
"network": "bitcoin",
"contract": null,
"status": "pending",
"reason_code": null,
"reason_message": null,
"amount": "0.05000000",
"fee_amount": "0.00020000",
"paid_amount": "0.00000000",
"paid_fee_amount": "0.00000000",
"txid": null,
"attributes": {
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
},
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
}
Response Fields¶
| Field | Type | Description |
|---|---|---|
code | string | Unique withdrawal code |
custom_id | string | Custom identifier provided in the request |
callback_url | string | URL that will be called with status updates |
created_at | string | Creation timestamp (ISO 8601 format) |
updated_at | string | Last update timestamp (ISO 8601 format) |
closed_at | string | Completion timestamp (ISO 8601 format) |
currency | string | Currency code |
coin | string | Coin symbol |
method | string | Withdrawal method code |
network | string | Network code |
contract | object | Contract details (for token withdrawals) |
status | string | Current status of the withdrawal |
reason_code | string | Error code (if the withdrawal failed or suspended) |
reason_message | string | Error message (if the withdrawal failed or suspended) |
amount | string | Withdrawal amount requested |
fee_amount | string | Fee amount reserved |
paid_amount | string | Withdrawal amount paid |
paid_fee_amount | string | Fee amount paid |
txid | string | Transaction ID on the blockchain (once available) |
attributes | object | Additional attributes (like address and tag) |
address | string | Addresses of crypto wallet |
tag | string | Additional tag of crypto wallet |
address_book_code | string | Identifier of address book that reference's attributes |
Beneficiary Object (for fiat withdrawals)¶
| Field | Type | Description |
|---|---|---|
first_name | string | First name of the beneficiary |
last_name | string | Last name of the beneficiary |
email | string | Email of the beneficiary |
phone | string | Phone number of the beneficiary |
iban | string | IBAN of the beneficiary |
tin | string | Tax identification number of the beneficiary |
edrpou | string | EDRPOU code (for Ukrainian businesses) |
All fields are optional, but some may be required depending on the withdrawal method.
List Withdrawals¶
Returns a list of withdrawals.
Required Permissions¶
allow_withdraw
Rate Limit¶
600 requests per minute
Query Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by status (see Withdrawal Status Values) |
currency | string | No | Filter by currency |
custom_id | string | No | Filter by custom ID |
start_at | string | No | Filter by start datetime on field created_at (inclusive, ISO 8601 format) |
end_at | string | No | Filter by end datetime on field created_at (inclusive, ISO 8601 format) |
limit | integer | No | Number of results to return (default: 100, max: 200) |
offset | integer | No | Number of results to skip (for pagination) |
Response¶
The API uses simple offset-based pagination with limit and offset parameters. Offset is limited for maximum 10000, if you set more - error will be returned. The default limit is 100, and the maximum limit is 200. The response is a direct list of withdrawal objects without pagination metadata wrapper. If you need to fetch more than 200 withdrawals, you should use the start_at and end_at parameters to fetch withdrawals in smaller date ranges. List is sorted by creation date in descending order.
[
{
"code": "WDR123456",
"custom_id": "my-withdrawal-123",
"callback_url": "https://example.com/callbacks/withdrawals",
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"closed_at": null,
"currency": "BTC",
"coin": "BTC",
"method": "BTC",
"network": "bitcoin",
"contract": null,
"status": "pending",
"reason_code": null,
"reason_message": null,
"amount": "0.05000000",
"fee_amount": "0.00020000",
"paid_amount": "0.00000000",
"paid_fee_amount": "0.00000000",
"txid": null,
"attributes": {
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
},
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
}
// More withdrawals...
]
Response Fields¶
Same as the creation withdrawal response.
Pagination¶
The API uses simple offset-based pagination with limit and offset parameters. No additional pagination metadata is returned in the response or headers.
Withdrawal Status Values¶
| Status | Description |
|---|---|
pending | Withdrawal being processed |
suspended | Withdrawal is suspended or paused |
failed | Withdrawal was rejected or failed |
success | Withdrawal successfully completed |
Transaction hash¶
Withdrawal order may receive a transaction hash before order is success, while transaction is pending and not confirmed in blockchain. In some cases such transaction hash may be replaced, if for example transaction gas need to be bumped or transaction is replaced by another one. In such cases transaction hash will be updated in withdrawal order.
Get Withdrawal Details¶
Returns details of a specific withdrawal.
Required Permissions¶
allow_withdraw
Rate Limit¶
600 requests per minute
Path Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
code | string | Yes | Unique withdrawal code |
Response¶
Same as a single withdrawal object from the list endpoint.
Callback Notifications¶
If a callback_url was provided when creating the withdrawal, the system will send POST requests to this URL when the withdrawal status changes.
Important Note: You may not receive callbacks for every intermediate status change or field update if changes occur very rapidly. When operations transition through multiple states quickly, intermediate callbacks may be skipped. However, you will always receive callbacks for the final states of operations. Design your callback handling to be idempotent and not dependent on receiving every single state transition.
Callback Security
Currently, callbacks are not signed. The signature mechanism for callbacks is planned for a future update. You should validate callback data by making an authenticated API request to verify the withdrawal status.
Callback Payload¶
The callback payload contains the same data as the withdrawal details response, with essential fields for status updates:
{
"code": "WDR123456",
"custom_id": "my-withdrawal-123",
"callback_url": "https://example.com/callbacks/withdrawals",
"created_at": "2023-01-15T14:30:15Z",
"updated_at": "2023-01-15T14:30:15Z",
"closed_at": null,
"currency": "BTC",
"coin": "BTC",
"method": "BTC",
"network": "bitcoin",
"contract": null,
"status": "pending",
"reason_code": null,
"reason_message": null,
"amount": "0.05000000",
"fee_amount": "0.00020000",
"paid_amount": "0.00000000",
"paid_fee_amount": "0.00000000",
"txid": null,
"attributes": {
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
},
"address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
}
Securing Callbacks¶
Since callbacks are not currently signed, you should implement these security measures:
- Whitelist IPs: Accept callbacks only from the service's IP addresses. Contact support to get the list of server IPs.
- Verify Data: Always make an authenticated API request to
/withdraw/{code}to verify the status and details of any withdrawal after receiving a callback. - Use HTTPS: Ensure your callback URL uses HTTPS to encrypt the data in transit.
Common Use Cases¶
- Initiating withdrawals: Send funds to external addresses
- Monitoring withdrawals: Track the status of outgoing withdrawals
- Reconciling withdrawals: Verify that withdrawals have been correctly processed