Introduction
Base URL
The base url is https://api.xbo.com
As per RESTful design patterns, XBO Client API uses following HTTP methods:
GET- Read resourcesPOST- Create new resourcesPUT- Modify existing resourcesDELETE- Remove resources
When you are making a request, you can pass arguments in it as:
- Parameters
- Valid JSON with
application/jsonheader.
Timestamps and other time-related fields are in milliseconds.
Data in response is listed in chronological order, newest on top.
Parameters for GET endpoints must be sent as a query string.
Parameters For POST, PUT, and DELETE endpoints may be sent as a query string or in the request body with content type application/json. You can mix parameters between both the query string and request body.
Parameters can be sent in any order.
If a parameter is sent in both the query string and request body, the query string parameter will be used.
Postman
We provide postman collections and environments for quick and easy use:
Return codes
200 Successful Request.
201 Created successfully.
400 Bad Request. Check the format of your request for mistakes and try again.
401 Unauthorized. Check if your API key is eligible for using the endpoint.
500 Server Error. Issue on our side. Contact XBO Customer Support for more information.
404 Resource is missing. Contact XBO Customer Support for more information.
Authentication
API Key
To access Client API endpoints you have to obtain API Key and secret. Starting 09/12/2024, We added a possibility for customers to generate and manage Client API credentials directly from Client Area.
For the customers with this functionality enabled, it can be accessed in their account Security settings.

The following API key management functionality is possible within the Client Area: - New API key request. Multiple pairs (key/secret) can be requested for Client API. - Delete the existing API key. - Reset. Delete the existing API key and create a new one.
// C# example
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
var apiKey = "<apiKey>";
var apiSecret = "<apiSecret>";
var client = new HttpClient
{
BaseAddress = new Uri("https://api.xbo.com")
};
var pathWithQuery = "/v1/test-api?testParam1=test1&testParam2=test2";
var pathWithOutQuery = "/v1/test-api";
var requestBody = JsonConvert.SerializeObject(
new
{
testProperty1 = "test1",
testProperty2 = "test12"
});
var request = new HttpRequestMessage()
{
Method = HttpMethod.Post,
Content = new StringContent(requestBody, Encoding.UTF8, "application/json"),
RequestUri = new Uri($"{pathWithQuery}", UriKind.Relative)
};
using HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(apiSecret));
using var sha256 = SHA256.Create();
var contentHash = Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(content)));
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
var signatureString = $"{timestamp}{request.Method}{pathWithOutQuery}{contentHash}";
var signatureHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(signatureString));
request.Headers.Add("XBO-API-KEY", apiKey);
request.Headers.Add("XBO-API-SIGN", Convert.ToBase64String(signatureHash));
request.Headers.Add("XBO-API-TIMESTAMP", timestamp.ToString());
var response = await client.SendAsync(request);
// ...
//JavaScript example
const crypto = require('crypto');
const request = require('request');
const apiKey = "<apiKey>";
const apiSecret = "<apiSecret>";
const pathWithOutQuery = "/v1/test-api";
const req = {
method: 'POST',
url: '/v1/test-api?testParam1=test1&testParam2=test2',
body: JSON.stringify({testProperty1:"test1",testProperty2:"test2"})
};
const timestamp = Math.floor(Date.now());
const contentHash = crypto.createHash("sha256").update(req.body).digest().toString("base64");
const signatureString = timestamp + req.method + pathWithOutQuery + contentHash;
const signature = crypto.createHmac("sha256", Buffer.from(apiSecret, "base64")).update(Buffer.from(signatureString,"utf8")).digest().toString("base64");
const options = {
baseUrl: 'https://api.xbo.com',
url: req.url,
method: req.method,
headers: {
'XBO-API-SIGN': signature,
'XBO-API-TIMESTAMP': timestamp,
'XBO-API-KEY': apiKey,
'content-type': 'application/json'
},
body: req.body
};
request(options,function(err, response){
// ...
}
//PHP example
<?php
declare(strict_types=1);
$apiKey = '';
$apiSecret = '';
$apiBaseUrl = 'https://api.xbo.com';
$pathWithOutQuery = '/v1/test-api';
$request = [
'method' => 'POST',
'url' => $pathWithOutQuery . '?testParam1=test1&testParam2=test2',
'body' => json_encode(['testProperty1' => 'test1', 'testProperty2' => 'test2']),
];
$timestamp = time();
$signature = generateSignature($apiSecret, $timestamp, $request['url'], $request['method'], $request['body']);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $apiBaseUrl . $request['url'],
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => $request['method'],
CURLOPT_POSTFIELDS => $request['body'],
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'XBO-API-KEY: ' . $apiKey,
'XBO-API-SIGN: ' . $signature,
'XBO-API-TIMESTAMP: ' . $timestamp,
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo 'cURL Error #:' . $err;
} else {
echo 'Response Code: ' . curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL;
echo 'Response: ' . $response;
}
function generateSignature(
string $apiSecret,
int $timestamp,
string $uriPath,
string $httpMethod,
?string $requestBody = null,
): string {
$requestBodyHash = '';
if ($requestBody !== null) {
$requestBodyHash = base64_encode(hash('sha256', $requestBody, true));
}
$signature = sprintf('%d%s%s%s', $timestamp, $httpMethod, $uriPath, $requestBodyHash);
$hmacKey = base64_decode($apiSecret, true);
return base64_encode(hash_hmac('sha256', $signature, $hmacKey, true));
}
Make sure to replace
<apiKey>and<apiSecret>with your API key and secret respectively.
Making request
All requests to authorized endpoints must contain the following headers:
XBO-API-KEY - API Key
XBO-API-SIGN - Signature (see below)
XBO-API-TIMESTAMP - request timestamp
All request bodies should have content type application/json and be valid JSON
Selecting timestamp
XBO-API-TIMESTAMP must be number of milliseconds since
UNIX Epoch. It should be within 60 seconds of the API service time to be considered as valid.
Signing message
Signature is generated by creating a SHA256 HMAC using the API secret on the string timestamp + method + pathWithQuery + contentHash
- timestamp - the same value as
XBO-API-TIMESTAMP - method - HTTP method in UPPER CASE
- pathWithQuery - path of the URL with query string
- contentHash -
base64encodedSHA256hash of serialized content (empty for GET requests)
Currencies & Networks
Get a list of all currencies and networks
Use this endpoint to get a list of all the currencies allowed by the regulation of your region and, in case of cryptocurrencies, with their networks listed as well.
HTTP Request
GET /v1/currencies/
Successful Response
{
"currency": "string",
"type": "string",
"networks": [
{
"addressType": 0,
"IsTagRequiredForWithdrawals": false,
"code": "string",
"name": "string"
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Acronym of currency. |
type |
string |
Type of currency. |
addressType |
string |
Type of network. |
IsTagRequiredForWithdrawals |
boolean |
Is TAG, MEMO, or NOTE field required (true) or optional (false) for the currency, in case its addressType is MultipleWithTag, MultipleWithMemo, or MultipleWithNote respectively. |
code |
string |
Acronym (code) of network. |
name |
string |
Name of network. |
Deposit Fiat
XBO makes it possible to deposit funds to your account via wire transfer.
To initiate the deposit via wire transfer, you need to use the endpoints below in the following order:
- Get a list of available bank accounts for your country and currency of choice.
- Get a fee quote calculated for your deposit amount.
- Initiate a wire transfer deposit with the currency and sum you want to deposit and bank details of your bank.
In the response to the third endpoint you will get XBO bank details, where you need to transfer your funds.
After the wire transfer deposit has been initialized, its transaction status will be Pending.
Once we have received the sum of deposit, the funds will appear on your trading account and transaction status will become Completed.
Track your deposit status using Fiat transactions history deposit.
Get a list of available bank accounts
HTTP Request
GET /v1/fiat/deposits/wire-transfer/bank-accounts?countryIso2={countryIso2}¤cy={currency}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
countryIso2 |
string |
+ | Two-letter code of your country, in ISO 3166-2 format. |
currency |
string |
+ | Fiat currency in which you want to make a wire transfer. In three-letter ISO 4217 format. |
Successful Response (countryIso2=UA,currency=USD)
[
{
"id": 5832,
"minDepositAmount": 5.10,
"depositFeeFixedAmount": 5.00,
"depositFeePercentAmount": 1.00,
"currency": "USD",
"bankName": "(USD) UA Test Bank",
"iban": "(USD)UA458247823336334351911799216"
},
{
"id": 5835,
"minDepositAmount": 7.50,
"depositFeeFixedAmount": 5.00,
"depositFeePercentAmount": 0.00,
"currency": "USD",
"bankName": "(NEW_USD) UA Test Bank",
"iban": "(NEW)UA458247823336334351911799216"
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
id |
number($int32) |
Bank unique ID. Use it to calculate the fee in the next endpoint. |
minDepositAmount |
number($decimal) |
Minimum amount of deposit that can be made to the bank. |
depositFeeFixedAmount |
number($decimal) |
Fixed deposit fee. |
depositFeePercentAmount |
number($decimal) |
Deposit amount percentage fee. |
currency |
string |
Currency that needs to be deposited. In three-letter ISO 4217 format. |
bankName |
string |
Full bank name. |
iban |
string |
Bank IBAN. |
Fee quote for deposit amount
HTTP Request
POST /v1/fiat/deposits/wire-transfer/fee
Request Body Example
{
"amount": 100,
"currency": "USD",
"countryIso2": "UA",
"bankAccountId": 5832
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount |
number($decimal) |
+ | The amount you want to transfer. |
currency |
string |
+ | Fiat currency in which you want to make a wire transfer. In three-letter ISO 4217 format. |
countryIso2 |
string |
+ | Two-letter code of your country, in ISO 3166-2 format. |
bankAccountId |
number($int32) |
+ | ID bank you've chosen to transfer deposit to in the previous endpoint. |
Successful Response
{
"netAmount": 94.00,
"feeAmount": 6.00,
"grossAmount": 100.0
}
Response Fields
| Name | Type | Description |
|---|---|---|
netAmount |
number($decimal) |
The amount that will be deposited on your XBO account. Fee excluded. |
feeAmount |
number($decimal) |
The amount of fee that will be deducted from the amount you transfer. |
grossAmount |
number($decimal) |
Total amount that you want to transfer. |
Initiate deposit via wire transfer
HTTP Request
POST /v1/fiat/deposits/wire-transfer
Request Body Example
{
"netAmount":94.00,
"feeAmount":6.00,
"currency":"USD",
"customerBankName":"string",
"customerIban":"UA458247823336334361411799216",
"customerBankCountryIso2":"UA",
"bankAccountId":5832
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
netAmount |
number($decimal) |
+ | The amount that will be deposited on your XBO account. Fee excluded. |
feeAmount |
number($decimal) |
+ | The amount of fee that will be deducted from the amount you transfer. |
currency |
string |
+ | Fiat currency in which you want to make a wire transfer. In three-letter ISO 4217 format. |
customerBankName |
string |
+ | Name of the bank you will be making a wire transfer from. |
customerIban |
string |
+ | IBAN of the account you will be making a wire transfer from. |
customerBankCountryIso2 |
string |
+ | Two-letter code of your bank's country, according to ISO 3166-2. |
bankAccountId |
number($int32) |
+ | ID of the bank you have chosen to transfer deposit to in the first endpoint and calculated the commission for. |
Successful Response (make a wire transfer with these recipient details)
{
"amount": 100.00,
"recipient": "(USD) Test Account",
"bankAddress": "(USD) 54/19 AVTOZAVODSKAYA STR 1",
"bankZip": "(USD) 01001",
"bankCity": "(USD) Kyiv",
"bankCountry": "(USD) Ukraine",
"swiftCode": "(USD) UNJSUAUK",
"iban": "(USD)UA458247823336334351911799216",
"paymentReference": "TXN58444",
"referenceNumber": "(USD)Reference",
"routingNumber": ""
}
Response Fields
| Name | Type | Description |
|---|---|---|
amount |
number($decimal) |
The amount that you need to transfer. |
recipient |
string |
The name of the bank you need to make wire transfer to (recipient bank). |
bankAddress |
string |
The address of recipient bank. |
bankZip |
string |
ZIP code of recipient bank. |
bankCity |
string |
City of recipient bank. |
bankCountry |
string |
Country of recipient bank. |
swiftCode |
string |
SWIFT of recipient bank. |
iban |
string |
Recipient bank IBAN. |
paymentReference |
string |
Internal reference of deposit transaction. |
referenceNumber |
string |
Reference number of recipient bank. |
routingNumber |
string |
Routing number of recipient bank. |
Deposit Crypto
Get a unique deposit address
You can request a unique deposit address for each coin and network.
HTTP Request
POST /v2/deposit-addresses/
Request Body Example
{
"currency": "BTC",
"networkCode": "BTC_TEST",
"addressType": "Additional",
"clientTag": "tests"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Symbol of the cryptocurrency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
+ | The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
addressType |
string |
+ | Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Required for "addressType" = "UniqueTag", always empty for "addressType" = "Primary", optional for "addressType" = "Additional" |
Unique client's identifier in external system. |
Successful Response
{
"currency": "BTC",
"address": "tb1qpcz67g5fv6y5vhrtvmxmqtnsg2zv5pxclece5n",
"destinationTag": "string",
"destinationTagType": "string",
"addressType": "Additional",
"clientTag": "testtag1"
}
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
address |
string |
One-time Address of the wallet. |
destinationTag |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
destinationTagType |
string |
Type of the info in destinationTag field. |
addressType |
string |
Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Unique client's identifier in external system. |
Get a list of all crypto addresses
You can request the list of all the cryptowallets belonging to you as an XBO client.
HTTP Request
GET /v2/deposit-addresses/
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
address |
string |
Wallet address. Use this parameter, to check if the exact wallet address belongs to your client account, and display its details. | |
networkCode |
string |
The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. | |
clientTag |
string |
Unique client's identifier in external system. |
Successful Response
[
{
"currency": "XRP",
"networkCode": "XRP_TEST",
"address": "rBo6XnbVWFzfdCxfX9Ym4mmcEQtoMNr3Gh",
"destinationTag": "1128467660",
"type": "Additional",
"clientTag": "12346"
},
{
"currency": "BTC",
"networkCode": "BTC_TEST",
"address": "tb1q72xg8d4w0avuzvj3fzerr76vcumve96smnlhvk",
"destinationTag": "string",
"type": "UniqueTag",
"clientTag": "123467"
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
address |
string |
Address of the wallet. |
destinationTag |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
type |
string |
Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Unique client's identifier in external system. |
Convert
XBO Client API gives you the possibility to execute Convert transactions.
List currency pairs
See List all currencies and networks for more information.
Request for conversion quote
Send the request to get the conversion rate for your selected currency pair, from the currencies allowed by the regulation of your region in selected amount.
HTTP Request
POST /v1/otc-trading/request-for-quote/
Request Body Example
{
"fromCurrency": "string",
"toCurrency": "string",
"fromAmount": 0,
"toAmount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
fromCurrency |
string |
+ | Acronym of the currency you want to convert FROM. |
toCurrency |
string |
+ | Acronym of the currency you want to convert your existing currency TO. |
fromAmount |
double |
Select one parameter out of two, otherwise your request will be invalid. | Amount of the currency you want to convert FROM. |
toAmount |
double |
Amount of the currency you want to convert your existing currency TO. |
Successful Response
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"occuredOn": "2022-12-31T12:56:01.776Z",
"validTo": "2022-12-31T12:56:01.776Z",
"fromCurrency": "string",
"toCurrency": "string",
"amountFrom": 0,
"amountTo": 0,
"rate": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
string |
Unique ID of request. |
occuredOn |
string(dateTime) |
Time when the request reached our server. |
validTo |
string(dateTime) |
Time until the stated rate is valid. If the time has elapsed, you need to send another request to convert your funds. |
fromCurrency |
string |
Acronym of the currency you want to convert FROM. |
toCurrency |
string |
Acronym of the currency you want to convert your existing currency TO. |
amountFrom |
decimal |
Amount of the currency you want to convert FROM. |
amountTo |
decimal |
Amount of the currency you want to convert your existing currency TO. |
rate |
decimal |
Conversion rate, relevant for your request. |
Convert funds
Place a conversion order, if you agree with the conversion rate for your selected currency pair.
HTTP Request
POST /v1/otc-trading/convert
Request Body Example
{
"id": "string",
"fromCurrency": "string",
"toCurrency": "string",
"fromAmount": 0,
"toAmount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string |
+ | Unique ID of request-for-quote endpoint response. |
fromCurrency |
string |
+ | Acronym of the currency you want to convert FROM. |
toCurrency |
string |
+ | Acronym of the currency you want to convert your existing currency TO. |
fromAmount |
decimal |
+ | Amount of the currency you want to convert FROM. |
toAmount |
decimal |
+ | Amount of the currency you want to convert your existing currency TO. |
In response you get the ID of the conversion transaction initiation.
Check balance on wallet
See Check balance for more information.
Get Convert history
Display the desired number of previous records in Convert history.
HTTP Request
GET /v1/otc-trading/history
Successful Response
{
"items": [
{
"id": 0,
"operationExecutionTime": "2022-12-31T11:19:33.448Z",
"amountFrom": 0,
"amountTo": 0,
"fromCurrency": "string",
"toCurrency": "string",
"rate": 0,
"status": "string"
}
],
"count": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page |
int32 |
+ | Offset, each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. |
count |
int32 |
+ | How many records to return. |
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique transaction ID. |
operationExecutionTime |
string(dateTime) |
Time the transaction was executed. |
amountFrom |
decimal |
Amount of the currency converted FROM. |
amountTo |
decimal |
Amount of the currency converted TO. |
fromCurrency |
string |
Acronym of the currency converted FROM. |
toCurrency |
string |
Acronym of the currency converted TO. |
rate |
decimal |
Rate of conversion. |
status |
string |
Status of the transaction. |
count |
int32 |
Count of the record. |
Spot Trading
XBO Client API gives customer the access to a full range of tools for spot trading, including the possibility to:
- Create a market or limit order.
- Update and existing order with new amount and/or price.
- Cancel an existing order by ID.
- Retrieve the list of the orders that are currently open.
- Get a history of closed orders.
Get the list of pairs for trading
Use this endpoint to get a list of asset pairs, available for trading.
HTTP Request
GET /v1/spot-trading/symbols
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page |
int32 |
+ | Offset, each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. |
count |
int32 |
+ | How many records to return. |
Successful Response
{
"total": 617,
"data": [
{
"symbol": "1INCH/BTC",
"description": "1INCH/BTC",
"baseCurrency": "1INCH",
"quoteCurrency": "BTC",
"minVolumeTrade": 1000,
"maxVolumeTrade": 27586,
"precision": 8,
"volumeStep": 0.1
},
{
"symbol": "1INCH/USD",
"description": "USD",
"baseCurrency": "1INCH",
"quoteCurrency": "USD",
"minVolumeTrade": 200,
"maxVolumeTrade": 1000,
"precision": 8,
"volumeStep": 0.01
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
total |
int32 |
Total number of trading pairs. |
symbol |
string |
Acronym for the trading pair. |
description |
string |
Description of the pair. |
baseCurrency |
string |
Acronym of the base currency in the pair. |
quoteCurrency |
string |
Acronym of the quote currency in the pair. |
minVolumeTrade |
float |
The minimal amount of trade you can place an order for the pair. |
maxVolumeTrade |
float |
The maximal amount of trade you can place an order for the pair. |
precision |
int32 |
The number of decimal places allowed for the price of the trading pair. |
volumeStep |
float |
The minimal amount of increment in trade volume. |
Create an order
Use it to place a market or limit order.
HTTP Request
POST /v1/spot-trading/orders
Request Body Example
{
"symbol": "BTC/USDT",
"type": "Limit",
"side": "Buy",
"amount": 0.01,
"price": 29000.00
}
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
symbol |
string |
+ | Trading pair symbol (e.g., BTC/USDT). Only for the currencies allowed by the regulation of your region. |
type |
string |
+ | Type of the order you are making. Can be Market or Limit. |
side |
string |
+ | Buy or Sell. |
amount |
decimal |
+ | The amount of the order, must be > 0. |
price |
decimal |
Required only for limit orders | Price for limit orders. |
Successful Response
{
"id": 444123,
"symbol": "BTC/USDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"type": "Limit",
"side": "Buy",
"amount": 0.01,
"initialAmount": 0.01,
"price": 29000.00,
"openTime": "2025-05-29T10:00:00Z",
"updatedOn": "2025-05-29T10:00:00Z",
"takerCommission": 0,
"makerCommission": 0,
"time": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
long |
Unique ID of the transaction. |
symbol |
string |
Trading pair symbol. |
baseCurrency |
string |
Symbol of the base currency in the pair. |
quoteCurrency |
string |
Symbol of the quote currency in the pair. |
type |
string |
Type of the order you are making. |
side |
string |
Direction of the order. Can be "Buy" or "Sell". |
amount |
decimal |
The current amount of the order. Can differ from initialAmount in case of partial order closure. |
initialAmount |
decimal |
The initially requested amount of the order. |
price |
decimal |
The price at which the order is executed. |
openTime |
string(dateTime) |
Time at which the order was placed. |
updatedOn |
string(dateTime) |
Time at which the order was updated. |
makerCommission |
decimal |
Commission fee for order maker. |
takerCommission |
decimal |
Commission fee for order taker. |
time |
int32 |
Time in ms, passed from order placement to execution in Unix timestamp format. |
Response Codes
| Code | Description |
|---|---|
201 |
Created - order placed. |
400 |
Bad Request - invalid payload. |
401 |
Unauthorized - not authenticated. |
Replace Order
Use it to change an existing order's amount and/or price.
HTTP Request
POST /v1/spot-trading/orders/{orderId}/replace
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
orderId |
long |
+ | ID of the order to change. |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
amount |
decimal |
+ | New amount, must be > 0. |
price |
decimal |
New price. If provided, must be > 0. |
Successful Response
{
"id": 444124,
"symbol": "BTC/USDT",
"type": "Limit",
"side": "Sell",
"amount": 0.05,
"price": 31000.00,
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"takerCommission": 0.001,
"makerCommission": 0.0005,
"openTime": "2025-05-29T10:30:00Z",
"updatedOn": "2025-05-29T10:35:00Z",
"time": 5000
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
long |
Unique ID of the transaction. |
symbol |
string |
Trading pair symbol. |
type |
string |
Type of the order you are making. |
side |
string |
Direction of the order. Can be "Buy" or "Sell". |
amount |
decimal |
The current amount of the order. |
price |
decimal |
The price at which the order is executed. |
baseCurrency |
string |
Symbol of the base currency in the pair. |
quoteCurrency |
string |
Symbol of the quote currency in the pair. |
makerCommission |
decimal |
Commission fee for order maker. |
takerCommission |
decimal |
Commission fee for order taker. |
openTime |
string(dateTime) |
Time at which the order was placed. |
updatedOn |
string(dateTime) |
Time at which the order was updated. |
time |
int32 |
Time in ms, passed from order placement to execution in Unix timestamp format. |
Response Codes
| Code | Description |
|---|---|
201 |
Created - order replaced. |
400 |
Bad Request - invalid input. |
401 |
Unauthorized - not authenticated. |
Cancel Order
Cancels an existing order by ID.
HTTP Request
DELETE /v1/spot-trading/orders/{orderId}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
orderId |
long |
+ | ID of the order to cancel. |
Response Codes
| Code | Description |
|---|---|
200 |
OK - order successfully cancelled. |
400 |
Bad Request - invalid ID/state. |
401 |
Unauthorized - not authenticated. |
Get Open Orders
Returns a paginated list of all currently open orders for the authenticated customer.
HTTP Request
GET /v1/spot-trading/orders
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
orderId |
long |
Filter by order ID. | |
symbol |
string |
Trading pair symbol (e.g., BTC/USDT). | |
side |
string |
Order action: Buy or Sell. |
|
from |
string(dateTime) |
Start of order creation date. | |
to |
string(dateTime) |
End of order creation date. | |
page |
int |
Page number. Default: 1. | |
count |
int |
Items per page. Default: 100. |
Successful Response
{
"total": 1,
"items": [
{
"id": 101,
"symbol": "BTC/USDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"takerCommission": 0.001,
"makerCommission": 0.0005,
"side": "Buy",
"type": "Limit",
"amount": 0.5,
"initialAmount": 1.0,
"price": 30000.00,
"openTime": "2024-12-31T12:00:00Z",
"updatedOn": "2024-12-31T12:05:00Z",
"time": 3000
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
long |
Unique ID of the transaction. |
symbol |
string |
Trading pair symbol. |
baseCurrency |
string |
Symbol of the base currency in the pair. |
quoteCurrency |
string |
Symbol of the quote currency in the pair. |
type |
string |
Type of the order you are making. |
side |
string |
Direction of the order. Can be "Buy" or "Sell". |
amount |
decimal |
The current amount of the order. |
initialAmount |
decimal |
The initially requested amount of the order. |
price |
decimal |
The price at which the order is executed. |
openTime |
string(dateTime) |
Time at which the order was placed. |
updatedOn |
string(dateTime) |
Time at which the order was updated. |
makerCommission |
decimal |
Commission fee for order maker. |
takerCommission |
decimal |
Commission fee for order taker. |
time |
int32 |
Time in ms, passed from order placement to execution in Unix timestamp format. |
Response Codes
| Code | Description |
|---|---|
200 |
OK - returns order list. |
400 |
Bad Request - invalid input. |
401 |
Unauthorized - not authenticated. |
Get orders history
Returns a paginated list of closed orders for the authenticated customer.
HTTP Request
GET /v1/spot-trading/trades
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
symbol |
string |
Trading pair symbol (e.g., ETH/USDT). | |
type |
string |
Filter by order type: Market, Limit. |
|
status |
string |
Filter by order status: Executed, Canceled, PartiallyExecuted. |
|
orderId |
long |
Filter by related order ID. | |
dateFrom |
string(dateTime) |
Start of trade date range. | |
dateTo |
string(dateTime) |
End of trade date range. | |
page |
int |
+ | Page number. |
count |
int |
+ | Items per page. |
Successful Response
{
"total": 1,
"items": [
{
"id": 98765,
"price": 1500.50,
"amount": 0.3,
"symbol": "ETH/USDT",
"type": "Limit",
"side": "Sell",
"status": "Executed",
"baseCurrency": "ETH",
"quoteCurrency": "USDT",
"fee": 2.5,
"feeCurrency": "USDT",
"feeType": "Taker",
"openTime": "2025-01-01T10:00:00Z",
"tradeDate": "2025-01-01T10:02:00Z"
}
]
}
Response Codes
| Code | Description |
|---|---|
200 |
OK - returns a trade list. |
400 |
Bad Request - invalid filters. |
401 |
Unauthorized - not authenticated. |
Orderbook
The orderbook endpoint is used to request a complete level 2 order book, arranged by best asks/bids, for a particular asset pair.
HTTP Request
GET /v1/spot-trading/orderbook/{symbol}?depth={depth}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
symbol |
string |
+ | Market pair for which the orderbook is requested, divided by encoded slash (%2F). Format example: BTC%2FUSDT |
depth |
number($int32) |
Orders depth quantity. Depth = 100 means 100 for each bid/ask side. Default depth is 50 Max depth is 250. |
Successful Response(BTC%2FUSDT, depth=2)
{
"bids": [
[
50010,
0.02
],
[
40020,
0.15
]
],
"asks": [
[
70694.8,
0.0005
],
[
74000,
0.0005
]
],
"timestamp": 1719881818486
}
Response Fields
| Name | Type | Description |
|---|---|---|
bids |
array |
An array of [price, quantity] pairs for each bid order. |
asks |
array |
An array of [price, quantity] pairs for each ask order. |
timestamp |
int32 |
Unix UTC timestamp in milliseconds. States when the last updated time has occurred. |
Trading pairs Stats
Trading pairs stats endpoint is to provide a statistical overview of market data for all trading pairs on XBO.
HTTP Request
GET /v1/spot-trading/trading-pairs/stats
Successful Response
[
{
"symbol": "AAVE/EUR",
"lastPrice": 91.5615,
"lowestAsk": 90.5505,
"highestBid": 92.7372,
"baseCurrency": "AAVE",
"quoteCurrency": "EUR",
"quoteVolume": 357658.30,
"last24HTradeVolume": 3190.956,
"last24HTradeVolumeUsd": 436423.747,
"priceChangePercent24H": 1.22,
"highestPrice24H": 92.9529,
"lowestPrice24H": 90.3496
},
{
"symbol": "AAVE/USD",
"lastPrice": 98.1573,
"lowestAsk": 97.4062,
"highestBid": 99.6304,
"baseCurrency": "AAVE",
"quoteCurrency": "USD",
"quoteVolume": 242767.98,
"last24HTradeVolume": 2697.422,
"last24HTradeVolumeUsd": 326113.675,
"priceChangePercent24H": 0.51,
"highestPrice24H": 99.9398,
"lowestPrice24H": 97.064
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
symbol |
string |
Market pair in base currency/quote currency format. |
lastPrice |
number($decimal) |
Last price of base currency based on given quote currency. |
lowestAsk |
number($decimal) |
Lowest Ask price of base currency based on given quote currency. |
highestBid |
number($decimal) |
Highest bid price of base currency based on given quote currency. |
baseCurrency |
string |
Symbol of the base coin. |
quoteCurrency |
string |
Symbol of the quote coin. |
quoteVolume |
number($decimal) |
24 hour trading volume for the pair in QUOTE coin. |
last24HTradeVolume |
number($decimal) |
24 hour trading volume for the pair in BASE coin. |
last24HTradeVolumeUsd |
number($decimal) |
24 hour trading volume for the pair in BASE coin in USD equivalent. |
priceChangePercent24H |
number($decimal) |
24 hour price change of market pair in percent. |
highestPrice24H |
number($decimal) |
Highest price of base currency based on given quote currency in the last 24 hours. |
lowestPrice24H |
number($decimal) |
Lowest price of base currency based on given quote currency in the last 24 hours. |
Withdraw
You can withdraw your funds using XBO Client API by using the endpoints described below.
Withdrawal Fees
We provide the possibility to select the logic, by which the fee will be charged.
Withdrawal fee can be charged in two ways:
- On top of the sum from client's account.
- From the amount of withdrawal entered by client.
To select the preferred logic, use feeType parameter in request for crypto and fiat withdrawals.
Values of feeType parameter can be:
| Value | Description |
| --- | --- |
| default | If client available amount allows it, fee is charged on top of the requested withdrawal amount, and client gets the exact amount of the requested withdrawal. In case the available balance is only enough for the requested amount, fee will be charged from the requested amount. |
| net | Fee is always charged on top of the requested withdrawal amount, and client gets the exact amount of the requested withdrawal. If available balance is not enough for it, withdrawal request will be declined with error. |
| gross | Fee is always charged from the requested withdrawal amount. |
feeType parameter is optional. If the parameter is not added to the request, we apply default withdrawal fee charging logic.
Crypto withdrawal fee and minimal withdrawal amount
Travel rules fields are required for EU-based customers for withdrawal amounts $1000 or above.
Use this endpoint to get the:
- Amount of fee for the amount you want to withdraw.
- Minimal amount that you can withdraw, based on withdrawal address.
Use this endpoint to get crypto withdrawal info before creating an actual withdrawal.
HTTP Request
POST /v2/withdrawals/fee
Request Body Example
{
"amount": 0,
"currency": "string",
"networkCode": "string",
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"feeType": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount |
decimal |
+ | The amount the client wants to withdraw. |
currency |
string |
+ | Cryptocurrency of the withdrawal. |
networkCode |
string |
+ | Network code of the withdrawal. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
Successful Response
"travelRuleBeneficiaryFields" in response indicates that the crypto withdrawal falls under Travel Rule and "beneficiary" object is mandatory for successful execution in compliance with MiCA regulation.
{
"amount": 100,
"feeAmount": 5,
"netAmount": 100,
"grossAmount": 105,
"minWithdrawalAmount": 5,
"travelRuleBeneficiaryFields": [
{
"firstName": "string",
"lastName": "string",
"countryOfBirthCode": "string",
"dateOfBirth": "2024-12-20"
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
amount |
decimal |
The amount entered by client. |
feeAmount |
decimal |
Fee amount for that withdrawal amount. |
netAmount |
decimal |
Net amount of the withdrawal, fee deducted. |
grossAmount |
decimal |
Total amount of the withdrawal, fee included. |
minWithdrawalAmount |
decimal |
Minimal withdrawal amount, based on withdrawal address. |
travelRuleBeneficiaryFields |
string array |
Recipient(beneficiary) data: first name, last name, date of birth, country of birth. Required by MiCA regulation Travel Rule for EU region. Is not present in the response for other countries. |
Crypto withdrawal
"beneficiary" object in this endpoint is required to initiate a crypto withdrawal over USD 1000 for EU-based customers due to MiCA regulation Travel Rule.
Use this endpoint to make a crypto withdrawal.
HTTP Request
POST /v2/withdrawals
Request Body Example
{
"currency": "string",
"networkCode": "string",
"amount": 0,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string",
"feeType": "string",
"beneficiary": {
"firstName": "string",
"lastName": "string",
"countryOfBirthCode": "string",
"dateOfBirth": "2004-12-20"
}
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Cryptocurrency of the transaction. |
networkCode |
string |
+ | Network code of the transaction. |
amount |
decimal |
+ | Amount of transaction. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. | |
clientTag |
string |
Unique client's identifier in external system. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
For EU-based customers, if the withdrawal amount is greater than USD 1000, you need to add the "beneficiary" object to the request body (see example) with the following parameters:
| Name | Type | Required | Description |
|---|---|---|---|
firstName |
string |
+ | Recipient(beneficiary) first name. |
lastName |
string |
+ | Recipient(beneficiary) last name |
countryOfBirthCode |
string |
+ | Recipient(beneficiary) country of birth two-letter code, as per ISO 3166 standard. |
dateOfBirth |
string(date) |
+ | Recipient(beneficiary) date of birth in YYYY-MM-DD format. |
Successful Response
{
"id": 0,
"currency": "USDT",
"networkCode": "string",
"grossAmount": 105,
"netAmount": 100,
"amount": 100,
"fee": 5,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string",
"beneficiary":
{
"firstName": "John",
"lastName": "Doe",
"countryOfBirthCode": "BE",
"dateOfBirth": "2004-12-20"
}
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal. |
currency |
string |
Cryptocurrency of the transaction. |
networkCode |
string |
Network code of the transaction. |
grossAmount |
decimal |
Total amount of the transaction, fee included. |
netAmount |
decimal |
Amount of the transaction received by client, fee deducted. |
amount |
decimal |
Amount entered by client. |
fee |
decimal |
Fee for the transaction. |
destinationAddress |
string |
Address, to which the crypto was withdrawn. |
destinationAdditionalAddress |
string |
Additional address field, if applicable. |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. |
clientTag |
string |
Unique client's identifier in external system. |
Mass crypto withdrawal
It is possible to send batches with multiple crypto withdrawal transactions for mass processing.
Batch should meet the following requirements:
- Have the correct format. See Mass withdrawal error handling for field validation requirements.
- Contain from one to 200 transactions.
- Transactions in the batch need to be in the same currency.
- General and multi-destination (e.g BTC and other coins with UTXO) transaction types are supported in one batch.
For multi-destination transactions with UTXO coins, a single UTXO fee will be calculated and applied to the entire batch as one fee, regardless of the number of destination addresses. For general (single transaction) type, each withdrawal within the batch will be charged a separate withdrawal fee, calculated per destination address.
Mass withdrawal is executed by the following flow:
- Validating the payment batch draft, so there are no errors in it. Required step. Endpoint.
If even one transaction in the batch has errors, the whole batch will not be validated and will not be available for further processing until the errors are fixed.
- Confirm the processing of validated batch draft. Endpoint.
After successful validation, batch draft needs to be confirmed with the separate endpoint to start mass withdrawal processing.
- Monitor the batch status in real time. Endpoint.
Using this endpoint will return general info about a certain batch. To get detailed information about transaction(s) from the batch, use GET /v1/transactions endpoint with withdrawalBatchId parameter to filter the response.
Mass withdrawal batch validation
Use this endpoint to validate mass crypto withdrawal batch.
HTTP Request
POST /v1/withdrawals/batches
Request Body Example
[
{
"currency": "string",
"networkCode": "string",
"amount": "string",
"destinationAddress": "string",
"destinationTag": "string",
"comment": "string",
"referenceId": "string",
"beneficiary":
{
"firstName": "string",
"lastName": "string",
"countryOfBirthCode": "string",
"dateOfBirth": "2004-12-20"
}
},
...,
{
"currency": "string",
"networkCode": "string",
"amount": "string",
"destinationAddress": "string",
"destinationTag": "string",
"comment": "string",
"referenceId": "string"
}
]
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Cryptocurrency of the transaction. Only for the currencies allowed by the regulation of your region. |
networkCode |
string |
+ | Network code of the transaction. |
amount |
decimal |
+ | Amount of transaction. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationTag |
string |
Additional address tag, if applicable. | |
comment |
string |
Transaction commentary or note. | |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. |
For EU-based customers, if the withdrawal amount is greater than USD 1000, you need to add the "beneficiary" object to the request body (see example) with the following parameters:
| Name | Type | Required | Description |
|---|---|---|---|
firstName |
string |
+ | Recipient(beneficiary) first name. |
lastName |
string |
+ | Recipient(beneficiary) last name |
countryOfBirthCode |
string |
+ | Recipient(beneficiary) country of birth two-letter code, as per ISO 3166 standard. |
dateOfBirth |
string(date) |
+ | Recipient(beneficiary) date of birth in YYYY-MM-DD format. |
Successful Response
[
{
"id": 2408,
"currency": "USDT",
"transactionCount": 123,
"amount": 540.0,
"feeAmount": 0.0
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal batch. Use it to confirm the draft for further processing. |
currency |
string |
Currency of withdrawal batch. |
transactionCount |
int32 |
The amount of separate transactions within the batch. |
amount |
decimal |
Total withdrawal amount for the transactions in the batch. |
feeAmount |
decimal |
Total fee for all the transactions in the batch. |
In case the batch was verified successfully, it will be created with "Draft" status. Confirm the batch draft to start processing withdrawals.
For more info on batch errors, see Mass withdrawal error handling.
Mass withdrawal batch draft confirmation
Use this endpoint to confirm the verified batch draft.
HTTP Request
POST /v1/withdrawals/batches/{withdrawalBatchId}/confirmation
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
withdrawalBatchId |
int32 |
+ | The ID of the verified batch draft. |
In case the confirmation was successful, the response will return 202, status of the batch will change to "Processing", and mass withdrawal will start.
Mass withdrawal batch status
Use this endpoint to check the status of the mass withdrawal batch.
HTTP Request
GET /v1/withdrawals/batches/{withdrawalBatchId}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
withdrawalBatchId |
decimal |
+ | The ID of mass withdrawal batch. |
Successful Response
{
"id": 2408,
"status": "Processing",
"currency": "USDT",
"amount": 548.0,
"amountUsd": 548.0,
"feeAmount": 0.0,
"feeAmountUsd": 0.0,
"draftTransactionCount": 0,
"pendingTransactionCount": 10,
"declinedTransactionCount": 0,
"completedTransactionCount": 224,
"createdOn": "2024-07-02T07:34:49.183Z",
"updatedOn": "2024-07-02T07:34:49.183Z"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal batch. |
status |
string |
Status of the withdrawal batch. |
currency |
string |
Currency of the withdrawal. |
amount |
decimal |
Total amount of withdrawal for all the transactions in the batch. |
amountUsd |
decimal |
Total amount of withdrawal for all the transactions in the batch in USD equivalent. |
feeAmount |
decimal |
Total fee for the withdrawal batch. |
feeAmountUsd |
decimal |
Total fee for the withdrawal batch in USD equivalent. |
draftTransactionCount |
int32 |
Transactions in "Draft" status in the batch at the time of response. |
pendingTransactionCount |
int32 |
Transactions in "Pending" status in the batch at the time of response. |
declinedTransactionCount |
int32 |
Transactions in "Declined" status in the batch at the time of response. |
completedTransactionCount |
int32 |
Transactions in "Completed" status in the batch at the time of response. |
createdOn |
string(dateTime) |
When the withdrawal batch was created. |
updatedOn |
string(dateTime) |
Time of the last withdrawal batch update. |
Status of the withdrawal batch can have the following values.
| Status | Comment |
|---|---|
Draft |
The withdrawal batch is not yet confirmed for further processing. |
Processing |
Processing started, funds are blocked. |
Processed |
Processing ended successfully, withdrawals sent. |
Declined |
Error processing batch, funds are not locked. |
Mass withdrawal error handling
Mass withdrawal batch has the following validation requirements per field.
| Parameter | Validation |
|---|---|
Currency |
Should not be empty. Can contain only digits and letters. |
Network |
Should not be empty. Can contain only digits, letters, '.', '-' and '_'. |
Amount |
Should not be empty. Should be a positive number in format '1234.567' with max precision 8. |
DestinationAddress |
Should not be empty. Should not be longer than 250 characters. Can contain only digits, letters and symbols ':' or '_'. |
DestinationTag |
Should not be longer than 250 characters. Can contain only digits and letters. |
Comment |
Should not be longer than 32 characters. |
ReferenceId |
Should not be longer than 50 characters. |
If there is only one mistake in the mass withdrawal batch, it will not be verified, and will return a response as a sent batch with "code" and "message" fields in the batch root, with the general error description, and "error" field added to each transaction.
In case the transaction has an error in it, this error will be written in that field. In other cases error field will be empty.
Error example
{
"rows": [
{
"error": "",
"currency": "USDT",
"networkCode": "BNB_TEST",
"amount": "100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb"
},
{
"error": "",
"currency": "USDT",
"networkCode": "BNB_TEST3242",
"amount": "100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb"
},
{
"error": "'Amount' should be positive number in format '1234.567' with max precision 8",
"currency": "USDT",
"networkCode": "BNB_TEST",
"amount": "-100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb"
},
{
"error": "",
"currency": "USDT",
"networkCode": "BNB_TEST",
"amount": "-100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb",
"destinationTag": "sdfs"
},
{
"error": "",
"currency": "USDT",
"networkCode": "BNB_TEST",
"amount": "100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb",
"destinationTag": "sdfs"
},
{
"error": "",
"currency": "USDT",
"networkCode": "BNB_TEST",
"amount": "100",
"destinationAddress": "0x0B8395973A1e09E6121Ce76AE1ACf0DBf85161cb"
}
],
"code": "data-contains-invalid-value",
"message": "One or more rows in data contains invalid data"
}
Error codes for the batch can be:
| Code | Description |
|---|---|
multiple-currency |
Transactions in the batch contain multiple currencies. |
max-row-count-limit-exceeded |
More than transaction limit (200) in batch. |
data-contains-invalid-value |
Errors in transaction field data,e.g. typo. See detailed info within the error field for a specific transaction. |
not-enough-balance |
Not enough balance for the mass withdrawal amount. |
Fiat withdrawal fee and minimal withdrawal amount
Use this endpoint to get fiat withdrawal info before creating an actual withdrawal.
Use this endpoint to get the:
- Amount of fee for the amount you want to withdraw.
- Minimal amount that you can withdraw, based on withdrawal address.
HTTP Request
POST /v1/fiat/withdrawals/fee
Request Body Example
{
"amount": 0,
"currency": "string",
"bankCountryIso2": "string",
"feeType": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount |
decimal |
+ | The amount the client wants to withdraw. |
currency |
string |
+ | Currency of the withdrawal. |
bankCountryIso2 |
string |
+ | Two-letter code of your bank's country, according to ISO 3166-2. |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
Successful Response
{
"amount": 100,
"feeAmount": 5,
"netAmount": 100,
"grossAmount": 105,
"minWithdrawalAmount": 5
}
Response Fields
| Name | Type | Description |
|---|---|---|
amount |
decimal |
The amount entered by client. |
feeAmount |
decimal |
Fee amount for that withdrawal amount. |
netAmount |
decimal |
Net amount of the withdrawal, fee deducted. |
grossAmount |
decimal |
Total amount of the withdrawal, fee included. |
minWithdrawalAmount |
decimal |
Minimal withdrawal amount, based on withdrawal address. |
Fiat withdrawal
Use the following endpoint to execute fiat withdrawal.
HTTP Request
POST /v1/fiat/withdrawals
Request Body Example
{
"amount": 0,
"currency": "string",
"iban": "string",
"bankCountryIso2": "string",
"recipientName": "string",
"paymentReason": "string",
"referenceId": "string",
"feeType": "string",
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount |
decimal |
+ | Amount you want to withdraw. |
currency |
string |
+ | Currency in which you want to withdraw. |
iban |
string |
+ | IBAN of recipient bank. |
bankCountryIso2 |
string |
+ | Bank country. |
recipientName |
string |
+ | Name of the recipient. |
paymentReason |
string |
+ | Payment reason. |
referenceId |
string |
Client's internal transaction ID. Needs to be unique within our system, not only for client's transactions. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
Successful Response
{
"id": 0,
"grossAmount": 105,
"netAmount": 100,
"amount": 100,
"fee": 5,
"createdDate": "2022-12-31T06:47:58.261Z",
"currency": "string",
"status": "string",
"reason": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal. |
grossAmount |
decimal |
Total amount of the transaction, fee included. |
netAmount |
decimal |
Amount of the transaction received by client, fee deducted. |
amount |
decimal |
Amount entered by client. |
fee |
decimal |
Fee for the withdrawal. |
createdDate |
string(dateTime) |
When the withdrawal was created. In UTC format. |
currency |
string |
Currency of the withdrawal. |
status |
string |
Status of withdrawal. |
reason |
string |
Reason of the withdrawal status. |
Balance
Check account balances
To check your balance on your wallets, use the following endpoint.
HTTP Request
GET /v1/wallet/accounts
Successful Response
{
"name": "string",
"type": "string",
"currency": "string",
"totalBalance": 0,
"availableBalance": 0,
"totalBalanceUsd": 0,
"availableBalanceUsd": 0
"availableWithdrawalBalance" : 0,
"availableWithdrawalBalanceUsd": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
name |
string |
Wallet name. |
type |
string |
Wallet type. |
currency |
string |
Wallet currency. |
totalBalance |
decimal |
Total balance in wallet's currency. |
availableBalance |
decimal |
Available balance in wallet's currency. |
totalBalanceUsd |
decimal |
Total wallet's balance equivalent in USD. |
availableBalanceUsd |
decimal |
Available wallet's balance equivalent in USD. |
availableWithdrawalBalance |
decimal |
Wallet's balance available for withdrawal. Credit funds are deducted from the available balance. |
availableWithdrawalBalanceUsd |
decimal |
Wallet's balance available for withdrawal equivalent in USD. |
Transaction History
Use the corresponding endpoints below to retrieve the history of transactions of a specific type.
Crypto transactions history
HTTP Request
GET /v1/transactions
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
A specific cryptocurrency of transactions, if needed. | |
page |
int32 |
+ | Offset, each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. |
count |
int32 |
+ | How many records to return. Record limit per one request is 500 transactions. |
withdrawalBatchId |
int32 |
Show records only for transactions within a specific mass withdrawal batch. | |
address |
string |
Show records only for transactions to a specific destination address. | |
clientTag |
string |
Show records only for transactions with a specific clientTag. | |
dateFrom |
string(dateTime) |
Starting date for the transactions. In UTC format. | |
dateTo |
string(dateTime) |
End date for the transactions. In UTC format. |
Successful Response
{
"total": 1,
"data":
[
{
"id": "CTN77926",
"currency": "XRP",
"type": "Receive",
"status": "Completed",
"createdOn": "2024-02-31T14:06:32.2440677Z",
"totalAmount": 20.00,
"executedAmount": 20.00,
"fee": 0.0,
"networkCode": "XRP_TEST",
"networkName": "XRP Testnet",
"destinationAddress": "rBo6XnbVWFzfdCxfX9Ym4mmcEQtoMNr3Gh",
"destinationAdditionalAddress": "1128467660",
"referenceId": "string",
"traceId": "string",
"clientTag": "12346",
"sourceAddress": "string"
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
string |
Unique ID of the transaction. |
currency |
string |
Cryptocurrency of the transaction. |
type |
string |
Type of the transaction. Can be "Send" or "Receive". |
status |
string |
Status of the transaction. Can be "Pending", "Completed", or "Declined". |
createdOn |
string(dateTime) |
When the transaction was created. In UTC format. |
totalAmount |
decimal |
Gross amount of the transaction. |
executedAmount |
decimal |
Amount of the transaction, with the fee amount deducted. |
fee |
decimal |
Fee for the transaction. |
networkCode |
string |
Network code of the transaction. |
networkName |
string |
Network name of the transaction. |
networkTransactionId |
string |
Unique network ID of the transaction. |
destinationAddress |
string |
Destination address of the transaction. |
destinationAdditionalAddress |
string |
Additional address field, if applicable. |
referenceId |
string |
Client's internal transaction ID. Needs to be unique within our system, not only for client's transactions. |
traceId |
string |
ID of the transaction in external payment system. For example, in case of Crypto Payx transaction, it can be payment intent ID for the deposit, and payout intent ID for the withdrawal. |
clientTag |
string |
Unique client's identifier in external system. |
sourceAddress |
string |
Source address of the transaction. Is empty in case of internal transaction. |
Fiat transactions history
HTTP Request
GET /v1/fiat/transactions
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
A specific currency of transactions, if needed. | |
page |
int32 |
+ | Offset, each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. |
count |
int32 |
+ | How many records to return. Record limit per one request is 500 transactions. |
dateFrom |
string(dateTime) |
Starting date for the transactions. | |
dateTo |
string(dateTime) |
End date for the transactions. |
Successful Response
{
"data": [
{
"id": "string",
"status": "string",
"type": "string",
"paymentMethod": "string",
"createdOn": "2024-02-31T11:01:48.8533131Z",
"totalAmount": 0,
"executedAmount": 0,
"fee": 0,
"currency": "string",
"lastCreditCardDigits": "string",
"bankCountryCode": "string",
"bankAccount": "string",
"bankName": "string",
"acquirerBank": "string",
"acquirerAddress": "string",
"acquirerSwift": "string",
"acquirerAccount": "string",
"referenceId": "string"
}
],
"total": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
string |
Unique ID of the transaction. |
status |
string |
Status of the transaction. Can be "Pending", "Completed", or "Declined". |
type |
string |
Type of the transaction. Can be "Deposit" or "Withdrawal". |
paymentMethod |
string |
Payment method of the transaction. Can be "CreditCard","Apm","WireTransfer" or 0, if "type"="Withdrawal" |
createdOn |
string(dateTime) |
When the transaction was created. |
totalAmount |
decimal |
Gross amount of the transaction. |
executedAmount |
decimal |
Amount of the transaction, with the fee amount deducted. |
fee |
decimal |
Fee for the transaction. |
currency |
string |
Currency of the transaction. |
lastCreditCardDigits |
string |
First and last digits of the credit card for the transaction. For "CreditCard" payment method. |
bankCountryCode |
string |
Bank country code. For "Withdrawal" transaction type or "WireTransfer" payment method. |
bankAccount |
string |
Bank account number. For "Withdrawal" transaction type or "WireTransfer" payment method. |
bankName |
string |
Bank name. For "WireTransfer" payment method. |
acquirerBank |
string |
Acquirer name. For "WireTransfer" payment method. |
acquirerAddress |
string |
Acquirer address. For "WireTransfer" payment method. |
acquirerSwift |
string |
Acquirer SWIFT code. For "WireTransfer" payment method. |
acquirerAccount |
string |
Acquirer account number. For "WireTransfer" payment method. |
Earn Products
Use the corresponding endpoints below to manage Earn products and subscriptions.
Get Products List
Returns all Earn products currently available to the requesting customer. Results are filtered based on the customer's jurisdiction — only enabled products and permitted coins are returned. If no products are available, the response returns an empty list.
HTTP Request
GET /v1/earn/products
Successful Response
[
{
"id": 0,
"currencyCode": "string",
"currencyName": "string",
"type": "Fix",
"periodDays": 0,
"redeemPeriodDays": 0,
"interestRate": 0,
"penaltyRate": 0,
"autoSubscribeEnabled": true,
"paymentPeriod": "Daily"
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the Earn product. |
currencyCode |
string |
Currency code for the product (e.g., BTC, ETH). |
currencyName |
string |
Full name of the currency. |
type |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix and FixBonded products. |
redeemPeriodDays |
int32 |
Number of days funds are locked after a redemption is requested. Applicable to FixBonded and FlexBonded products. null for Fix and Flex. |
interestRate |
decimal |
Annual interest rate (APR) offered to the customer. For products with automatic provider rate sync, this reflects the current rate at the time of the request. |
penaltyRate |
decimal |
Early termination penalty rate. |
autoSubscribeEnabled |
bool |
Indicates whether auto-renew is available for this product. |
paymentPeriod |
string |
Reward payment frequency. Can be Daily, Weekly, Monthly, or EndOfSubscription. |
Create Subscription
Creates a new Earn subscription for the specified product for the authorized client. Funds are moved from the client's Spot account to the Earn account on success.
For Flex/FlexBonded products, if the client already has an active subscription for the same product and currency, the request is treated as a top-up on the existing subscription rather than creating a new one.
HTTP Request
POST /v1/earn/subscriptions
Request Body Example
{
"productId": 0,
"amount": 0,
"autoRenewEnabled": true
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
productId |
int32 |
+ | ID of the Earn product to subscribe to. |
amount |
decimal |
+ | Amount to subscribe. Must be within the product's minimum and maximum subscription limits, and large enough to generate a reward greater than 0. |
autoRenewEnabled |
bool |
Whether the subscription should automatically renew at the end of the term. Applicable to Fix/FixBonded products only; ignored for Flex/FlexBonded. |
Successful Response
{
"id": 0,
"customerId": 0,
"productId": 0,
"productType": "Fix",
"status": "Active",
"periodDays": 0,
"amount": 0,
"currencyCode": "string",
"currencyName": "string",
"autoSubscribeEnabled": true,
"autoRenewEnabled": true,
"closedOn": "2026-04-09T06:38:35.399Z"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the created subscription. |
customerId |
int32 |
ID of the customer who owns the subscription. |
productId |
int32 |
ID of the Earn product. |
productType |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
status |
string |
Current status of the subscription. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix/FixBonded products. |
amount |
decimal |
Subscribed amount. |
currencyCode |
string |
Currency code of the subscription. |
currencyName |
string |
Full name of the currency. |
autoSubscribeEnabled |
bool |
Whether auto-renew is available for this product. |
autoRenewEnabled |
bool |
Whether auto-renew is enabled for this subscription. Applicable to Fix/FixBonded products. |
closedOn |
string(dateTime) |
Date and time when the subscription term ends or was closed. In UTC format. null for open-ended Flex/FlexBonded subscriptions. |
Get Subscriptions
Returns all Earn subscriptions belonging to the authenticated customer across all statuses. Supports filtering and pagination.
HTTP Request
GET /v1/earn/subscriptions
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
status |
string |
Filter by subscription status. Can be Active, Closed, or Terminated. |
|
productType |
string |
Filter by product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
|
currencyCode |
string |
Filter by currency code. | |
page |
int32 |
+ | Offset, each page equals the count value. For example, to get results 20–30, set page to 2 and count to 10. |
count |
int32 |
+ | Number of records to return per page. |
Successful Response
{
"data": [
{
"id": 0,
"productId": 0,
"productType": "Fix",
"periodDays": 0,
"redeemPeriodDays": 0,
"amount": 0,
"amountUsd": 0,
"lastDailyReward": 0,
"lastDailyRewardUsd": 0,
"calculationDate": "2026-04-09T06:40:01.657Z",
"accruedReward": 0,
"paidReward": 0,
"paidRewardUsd": 0,
"currencyCode": "string",
"interestRate": 0,
"penaltyRate": 0,
"autoSubscribeEnabled": true,
"autoRenewEnabled": true,
"status": "Active",
"paymentPeriod": "Daily",
"isStartDayIncluded": true,
"isNewFlow": true,
"createdOn": "2026-04-09T06:40:01.657Z",
"closedOn": "2026-04-09T06:40:01.657Z"
}
],
"total": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
data |
array |
List of subscription objects. |
total |
int32 |
Total number of subscriptions matching the request filters. |
id |
int32 |
Unique ID of the subscription. |
productId |
int32 |
ID of the Earn product. |
productType |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix/FixBonded products. |
redeemPeriodDays |
int32 |
Number of days funds are locked after a redemption is requested. Applicable to FixBonded/FlexBonded products. null for Fix/Flex. |
amount |
decimal |
Current subscription principal amount. |
amountUsd |
decimal |
Subscription principal amount in USD equivalent. |
lastDailyReward |
decimal |
Most recent daily reward payout amount. |
lastDailyRewardUsd |
decimal |
Most recent daily reward in USD equivalent. |
calculationDate |
string(dateTime) |
Date of the last reward calculation. In UTC format. |
accruedReward |
decimal |
Total reward accrued but not yet paid out. |
paidReward |
decimal |
Total reward paid to date. |
paidRewardUsd |
decimal |
Total paid reward in USD equivalent. |
currencyCode |
string |
Currency code of the subscription. |
interestRate |
decimal |
Annual interest rate (APR) applied to this subscription. For Fix/FixBonded, this is the rate locked at creation time. |
penaltyRate |
decimal |
Early termination penalty rate. |
autoSubscribeEnabled |
bool |
Whether auto-renew is available for this product. |
autoRenewEnabled |
bool |
Whether auto-renew is enabled for this subscription. Applicable to Fix/FixBonded products. |
status |
string |
Current status of the subscription. Can be Active, Closed, Terminated, or PendingRedemption. |
paymentPeriod |
string |
Reward payment frequency. Can be Daily, Weekly, Monthly, or EndOfSubscription. |
isStartDayIncluded |
bool |
Whether the subscription start day is counted in the term period. |
isNewFlow |
bool |
Indicates whether the subscription uses the current platform flow. |
createdOn |
string(dateTime) |
When the subscription was created. In UTC format. |
closedOn |
string(dateTime) |
When the subscription was closed. In UTC format. null if still active. |
Get Subscription Transactions
Returns all transactions associated with a specific subscription for the authenticated customer. The subscription must belong to the requesting customer, in other case we will return Unauthorized error.
HTTP Request
GET /v1/earn/subscriptions/{subscriptionId}/transactions
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
subscriptionId |
int32 |
+ | The ID of the subscription whose transactions are being requested. |
transactionType |
string |
Filter by transaction type. Can be TopUp, Redemption, Reward, or Termination. |
|
page |
int32 |
+ | Offset, each page equals the count value. For example, to get results 20–30, set page to 2 and count to 10. |
count |
int32 |
+ | Number of records to return per page. |
Successful Response
{
"data": [
{
"id": 0,
"currency": "string",
"amount": 0,
"planAmount": 0,
"amountUsd": 0,
"terminationFeeAmount": 0,
"transactionStatus": "Processing",
"transactionType": "TopUp",
"subscriptionId": 0,
"customerId": 0,
"statusDescription": "string",
"productType": "Fix",
"paymentPeriod": "Daily",
"productPeriodDays": 0,
"interestRate": 0,
"redeemFundsUnlockAt": "2026-04-09T06:40:46.565Z",
"createdOn": "2026-04-09T06:40:46.565Z",
"updatedOn": "2026-04-09T06:40:46.565Z"
}
],
"total": 0
}
Response Fields
| Name | Type | Description |
|---|---|---|
data |
array |
List of transaction objects. |
total |
int32 |
Total number of transactions matching the request filters. |
id |
int32 |
Unique ID of the transaction. |
currency |
string |
Currency code of the transaction. |
amount |
decimal |
Actual transaction amount. |
planAmount |
decimal |
Planned amount for the transaction (e.g., the scheduled reward amount before payout). |
amountUsd |
decimal |
Transaction amount in USD equivalent. |
terminationFeeAmount |
decimal |
Penalty fee charged upon early termination. Applicable to Termination transactions. |
transactionStatus |
string |
Current status of the transaction. Can be Processing, Completed, or Declined. |
transactionType |
string |
Type of the transaction. Can be TopUp, Redemption, Reward, or Termination. |
subscriptionId |
int32 |
ID of the subscription this transaction belongs to. |
customerId |
int32 |
ID of the customer who owns the subscription. |
statusDescription |
string |
Human-readable description of the transaction status. |
productType |
string |
Product type of the subscription. Can be Fix, FixBonded, Flex, or FlexBonded. |
paymentPeriod |
string |
Reward payment frequency of the subscription. Can be Daily, Weekly, Monthly, or EndOfSubscription. |
productPeriodDays |
int32 |
Term length in days for the product. |
interestRate |
decimal |
Annual interest rate (APR) applied to the subscription. |
redeemFundsUnlockAt |
string(dateTime) |
Expected date when redeemed funds will be unlocked. Applicable to FixBonded/FlexBonded redemptions. In UTC format. |
createdOn |
string(dateTime) |
When the transaction was created. In UTC format. |
updatedOn |
string(dateTime) |
Time of the last transaction update. In UTC format. |
Top Up Subscription
Adds funds to an existing active Flex or FlexBonded subscription. Funds are transferred from the customer's Spot account to the Earn account on success.
HTTP Request
POST /v1/earn/subscriptions/{subscriptionId}/topUp
Request Body Example
{
"amount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
subscriptionId |
int32 |
+ | The ID of the subscription to top up. |
amount |
decimal |
+ | Amount to add to the subscription. Must be within the product's minimum and maximum subscription limits and large enough to generate a reward greater than 0. |
Successful Response
{
"id": 0,
"customerId": 0,
"productId": 0,
"productType": "Fix",
"status": "Active",
"periodDays": 0,
"amount": 0,
"currencyCode": "string",
"currencyName": "string",
"autoSubscribeEnabled": true,
"autoRenewEnabled": true,
"closedOn": "2026-04-09T06:38:35.399Z"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the subscription. |
customerId |
int32 |
ID of the customer who owns the subscription. |
productId |
int32 |
ID of the Earn product. |
productType |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
status |
string |
Current status of the subscription. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix/FixBonded products. |
amount |
decimal |
Subscribed amount after the top-up. |
currencyCode |
string |
Currency code of the subscription. |
currencyName |
string |
Full name of the currency. |
autoSubscribeEnabled |
bool |
Whether auto-renew is available for this product. |
autoRenewEnabled |
bool |
Whether auto-renew is enabled for this subscription. Applicable to Fix/FixBonded products. |
closedOn |
string(dateTime) |
Date and time when the subscription term ends or was closed. In UTC format. null for open-ended Flex/FlexBonded subscriptions. |
Update Auto-Renew
Updates the auto-renew setting for a Fix or FixBonded subscription. When enabled, the subscription automatically renews at the end of the term at the current product rate.
HTTP Request
PATCH /v1/earn/subscriptions/{subscriptionId}/autoRenew
Request Body Example
{
"autoRenewEnabled": true
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
subscriptionId |
int32 |
+ | The ID of the subscription to update. |
autoRenewEnabled |
bool |
+ | Whether the subscription should automatically renew at the end of the term. Applicable to Fix/FixBonded subscriptions only. |
Successful Response
{
"id": 0,
"customerId": 0,
"productId": 0,
"productType": "Fix",
"status": "Active",
"periodDays": 0,
"amount": 0,
"currencyCode": "string",
"currencyName": "string",
"autoSubscribeEnabled": true,
"autoRenewEnabled": true,
"closedOn": "2026-04-09T06:38:35.399Z"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the subscription. |
customerId |
int32 |
ID of the customer who owns the subscription. |
productId |
int32 |
ID of the Earn product. |
productType |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
status |
string |
Current status of the subscription. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix/FixBonded products. |
amount |
decimal |
Subscribed amount. |
currencyCode |
string |
Currency code of the subscription. |
currencyName |
string |
Full name of the currency. |
autoSubscribeEnabled |
bool |
Whether auto-renew is available for this product. |
autoRenewEnabled |
bool |
Updated auto-renew status for this subscription. |
closedOn |
string(dateTime) |
Date and time when the subscription term ends or was closed. In UTC format. null for open-ended Flex/FlexBonded subscriptions. |
Create Redemption
Initiates a redemption request for a FixBonded or FlexBonded subscription. Redeemed funds are locked for the product's configured redeem period before being returned to the customer's Spot account.
For FlexBonded subscriptions, a partial redemption amount may be specified. For FixBonded subscriptions, the full principal is redeemed at the end of the term.
HTTP Request
POST /v1/earn/subscriptions/{subscriptionId}/redemptions
Request Body Example
{
"amount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
subscriptionId |
int32 |
+ | The ID of the subscription to redeem from. |
amount |
decimal |
Amount to redeem. Applicable to FlexBonded subscriptions for partial redemptions. For FixBonded, the full principal is redeemed. |
Successful Response
{
"id": 0,
"customerId": 0,
"productId": 0,
"productType": "Fix",
"status": "Active",
"periodDays": 0,
"amount": 0,
"currencyCode": "string",
"currencyName": "string",
"autoSubscribeEnabled": true,
"autoRenewEnabled": true,
"closedOn": "2026-04-09T06:38:35.399Z"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the subscription. |
customerId |
int32 |
ID of the customer who owns the subscription. |
productId |
int32 |
ID of the Earn product. |
productType |
string |
Product type. Can be Fix, FixBonded, Flex, or FlexBonded. |
status |
string |
Current status of the subscription. Reflects PendingRedemption while the redeem period is in progress. |
periodDays |
int32 |
Subscription term length in days. Applicable to Fix/FixBonded products. |
amount |
decimal |
Remaining subscribed amount after the redemption request. |
currencyCode |
string |
Currency code of the subscription. |
currencyName |
string |
Full name of the currency. |
autoSubscribeEnabled |
bool |
Whether auto-renew is available for this product. |
autoRenewEnabled |
bool |
Whether auto-renew is enabled for this subscription. Applicable to Fix/FixBonded products. |
closedOn |
string(dateTime) |
Date and time when the subscription term ends or was closed. In UTC format. null for open-ended Flex/FlexBonded subscriptions. |
Callback Settings
You, as a merchant, can configure a callback notification URL to receive notifications for deposit status changes, made by your customers.
Merchant can update or remove a previously registered callback URL. Only one active callback URL per merchant is supported at a time.
Callback URL registration is available to both CaaS corporate and other Client API merchants.
If enabled, webhook notification is sent on every deposit status transition: Created, Completed, and Declined.
Webhook notification
Webhook is sent for deposits to both default account and Virtual Wallets. One webhook notification is sent per status change per deposit transaction.
A single deposit may generate multiple webhooks as it progresses through statuses (e.g., Created → Completed).
Notification payload includes: transaction ID, currency, deposited amount, source blockchain address, destination deposit address, network code, transaction hash, current transaction status, timestamp of the status change, and Virtual Wallet Reference ID (if exists as a client tag).
For CaaS corporate merchants, notification additionally includes Virtual Wallet Reference ID and Virtual Wallet Name when the deposit is attributed to a Virtual Wallet.
For deposits to default account (both CaaS corporate and standard merchants), Virtual Wallet Reference ID and Virtual Wallet Name fields are absent or null.
All monetary amounts use the same precision as the corresponding currency configuration. Timestamp is in UTC format.
Deposit Created Notification Example
{
"CustomerId": 1,
"TransactionId": "546934",
"Currency": "USDT",
"NetworkCode": "BNB_TEST",
"Amount": 10,
"AmountUsd": 9.9895,
"SourceAddress": "0x9586180f8D56779ae61c9d6E80c037fB59e47DBc",
"DestinationAddress": "0x7e7D0330A842b9B440598BaA47597E60689AF90e",
"TransactionHash": "f50be37f-f932-445d-8fb2-3c2a185bc22d",
"Status": "Created",
"NotificationType": "DepositNotification",
"VirtualWalletReferenceId": "vw_1_a5817155",
"ProducedOn": "2026-04-06T12:25:03.9314469Z"
}
Get callback URL
Retrieves the currently configured callback notification URL.
HTTP Request
GET /v1/settings/callback-url
Response Fields
| Name | Type | Description |
|---|---|---|
callbackUrl |
string |
The webhook endpoint URL configured for notifications. |
Response Example
{
"callbackUrl": "https://example.com/webhooks/xbo"
}
Update callback URL
Modifies the webhook notification URL configuration.
HTTP Request
PUT /v1/settings/callback-url
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
callbackUrl |
string |
+ | The new webhook endpoint URL for receiving notifications. |
Request Body Example
{
"callbackUrl": "https://example.com/webhooks/xbo"
}
Crypto-as-a-service (CaaS)
XBO offers Virtual Wallet functionality to our CaaS corporate clients, which allows them to create multiple segregated wallets under a single merchant account.
Each Virtual Wallet will have its own balance, transaction history, and optional human-readable name, while the merchant retains a unified compliance and operational setup for the optimal workflow.
Merchants can create Virtual Wallets, assign deposit addresses, receive and credit deposits, and execute withdrawals and asset conversion via OTC, all tied to the specific Virtual Wallet.
Use XBO API CaaS endpoints to:
- Create and update Virtual Wallets with a merchant-defined reference ID (required) and a name (optional).
- List all Virtual Wallets for the merchant.
- Generate and retrieve deposit addresses per Virtual Wallet, by currency and network.
- Retrieve the estimated withdrawal fee before initiating a withdrawal.
- Submit a withdrawal request from a specific Virtual Wallet.
- Check the balance of a specific Virtual Wallet for each currency.
- View transaction history for a specific Virtual Wallet.
- Request a conversion quote and execute an asset conversion through OTC within a specific Virtual Wallet.
- Access the history of asset conversions for a specific Virtual Wallet.
Request a Virtual Wallet
You can request a unique address for your Virtual Wallet, individual for each coin and network.
HTTP Request
[POST] /v1/virtual-wallets
Request Body Example
{
"referenceId": "string",
"name": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
referenceId |
string |
+ | A unique client identifier. Should be an alphanumeric string with additional "-" and "_" characters allowed, case-insensitive, 64 characters max. |
name |
string |
+ | Virtual Wallet human-readable name. |
Successful Response
{
"referenceId": "string",
"name": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
referenceId |
string |
A unique client identifier. |
name |
string |
Virtual Wallet human-readable name. |
Get a list of all Virtual Wallets
You can request the list of all the Virtual Wallets belonging to you as XBO CaaS corporate client.
HTTP Request
[GET] /v1/virtual-wallets
Successful Response
[
{
"referenceId": "string",
"name": "string"
},
{
"referenceId": "string",
"name": "string"
},
]
Response Fields
| Name | Type | Description |
|---|---|---|
referenceId |
string |
A unique client identifier. |
name |
string |
Virtual Wallet human-readable name, if it was defined by the client. |
Get a unique Virtual Wallet deposit address
You can request a unique address for your Virtual Wallet, individual for each coin and network.
HTTP Request
[POST] /v1/virtual-wallets/{virtualWalletReferenceId}/deposit-addresses
Request Body Example
{
"currency": "string",
"networkCode": "string",
"addressType": "Primary",
"clientTag": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet for which the deposit address needs to be created. |
currency |
string |
+ | Symbol of the cryptocurrency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
+ | The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
addressType |
string |
+ | Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Required for "addressType" = "UniqueTag", always empty for "addressType" = "Primary", optional for "addressType" = "Additional" |
Unique client's identifier in external system. |
Successful Response
{
"currency": "BTC",
"address": "tb1qpcz67g5fv6y5vhrtvmxmqtnsg2zv5pxclece5n",
"destinationTag": "string",
"destinationTagType": "string",
"addressType": "Additional",
"clientTag": "testtag1",
"virtualWalletReferenceId": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
address |
string |
One-time Address of the wallet. |
destinationTag |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
destinationTagType |
string |
Type of the info in destinationTag field. |
addressType |
string |
Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Unique client's identifier in external system. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the deposit address is created. |
Get Virtual Wallet deposit addresses list
Request the list of all the deposit addresses for the specific Virtual Wallet.
HTTP Request
GET /v1/virtual-wallets/{virtualWalletReferenceId}/deposit-addresses?address={address}&networkCode={networkCode}&clientTag={clientTag}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet for which you want the deposit addresses to be retreived. |
address |
string |
Wallet address. Use this parameter to retreive a specific deposit address. | |
networkCode |
string |
The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. | |
clientTag |
string |
Unique client's identifier in external system. |
Successful Response
[
{
"currency": "string",
"networkCode": "string",
"address": "string",
"destinationTag": "string",
"type": "Primary",
"clientTag": "string",
"virtualWalletReferenceId": "string"
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of the address currency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
The chain network code for the currency. |
address |
string |
Address of the wallet. |
destinationTag |
string |
Additional address info of network, if applicable. |
type |
string |
Address type. Can be: Primary, Additional, UniqueTag. |
clientTag |
string |
Unique client's identifier in external system. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the deposit address is created. |
Check Virtual Wallet Balance
To check your balance on your Virtual Wallet, use the following endpoint.
HTTP Request
[GET] /v1/virtual-wallets/{virtualWalletReferenceId}/accounts
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to retreive the balance. |
Successful response
{
"name": "string",
"type": "string",
"currency": "string",
"totalBalance": 0,
"availableBalance": 0,
"totalBalanceUsd": 0,
"availableBalanceUsd": 0,
"availableWithdrawalBalance" : 0,
"availableWithdrawalBalanceUsd": 0,
"virtualWalletReferenceId": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
name |
string |
Wallet name. |
type |
string |
Wallet type. |
currency |
string |
Wallet currency. |
totalBalance |
decimal |
Total balance in wallet's currency. |
availableBalance |
decimal |
Available balance in wallet's currency. |
totalBalanceUsd |
decimal |
Total wallet's balance equivalent in USD. |
availableBalanceUsd |
decimal |
Available wallet's balance equivalent in USD. |
availableWithdrawalBalance |
decimal |
Wallet's balance available for withdrawal. Credit funds are deducted from the available balance. |
availableWithdrawalBalanceUsd |
decimal |
Wallet's balance available for withdrawal equivalent in USD. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the balance is retreived. |
Get a Withdrawal Fee for Virtual Wallet
Use this endpoint to get the:
- Amount of fee for the amount you want to withdraw.
- Minimal amount that you can withdraw, based on withdrawal address.
Use this endpoint to get withdrawal fee info before creating an actual withdrawal.
HTTP Request
[POST] /v1/virtual-wallets/{virtualWalletReferenceId}/withdrawals/fee
Request Body Example
{
"amount": 0,
"currency": "string",
"networkCode": "string",
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"feeType": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to request the withdrawal fee info. |
amount |
decimal |
+ | The amount the client wants to withdraw. |
currency |
string |
+ | Cryptocurrency of the withdrawal. |
networkCode |
string |
+ | Network code of the withdrawal. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
"travelRuleBeneficiaryFields" in response indicates that the crypto withdrawal falls under Travel Rule and "beneficiary" object is mandatory for successful execution in compliance with MiCA regulation.
Successful response
{
"amount": 100,
"feeAmount": 5,
"netAmount": 100,
"grossAmount": 105,
"minWithdrawalAmount": 5,
"virtualWalletReferenceId": "string",
"travelRuleBeneficiaryFields":
[
"firstName": "string",
"lastName": "string",
"countryOfBirthCode": "string",
"dateOfBirth": "1980-02-23"
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
amount |
decimal |
The amount entered by client. |
feeAmount |
decimal |
Fee amount for that withdrawal amount. |
netAmount |
decimal |
Net amount of the withdrawal, fee deducted. |
grossAmount |
decimal |
Total amount of the withdrawal, fee included. |
minWithdrawalAmount |
decimal |
Minimal withdrawal amount, based on withdrawal address. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the withdrawal fee info is retreived. |
travelRuleBeneficiaryFields |
string array |
Recipient(beneficiary) data: first name, last name, date of birth, country of birth. Required by MiCA regulation Travel Rule for EU region. Is not present in the response for other countries. |
Create a Virtual Wallet Withdrawal
Use this endpoint to initiate a withdrawal from Virtual Wallet.
HTTP Request
[POST] /v1/virtual-wallets/{virtualWalletReferenceId}/withdrawals
Request Body Example
{
"currency": "string",
"networkCode": "string",
"amount": 0,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string",
"feeType": "Default",
"beneficiary": {
"firstName": "string",
"lastName": "string",
"dateOfBirth": "1980-02-23",
"countryOfBirthCode": "string"
}
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet for the withdrawal |
currency |
string |
+ | Cryptocurrency of the transaction. |
networkCode |
string |
+ | Network code of the transaction. |
amount |
decimal |
+ | Amount of transaction. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
referenceId |
string |
ID of the transaction in external payment system. | |
clientTag |
string |
Unique client's identifier in external system. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
For EU-based customers, if the withdrawal amount is greater than USD 1000, you need to add the "beneficiary" object to the request body (see example) with the following parameters:
| Name | Type | Required | Description |
|---|---|---|---|
firstName |
string |
+ | Recipient(beneficiary) first name. |
lastName |
string |
+ | Recipient(beneficiary) last name |
countryOfBirthCode |
string |
+ | Recipient(beneficiary) country of birth two-letter code, as per ISO 3166 standard. |
dateOfBirth |
string(date) |
+ | Recipient(beneficiary) date of birth in YYYY-MM-DD format. |
Successful response
{
"id": 0,
"currency": "string",
"networkCode": "string",
"amount": 0,
"grossAmount": 0,
"netAmount": 0,
"fee": 0,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string",
"virtualWalletReferenceId": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal. |
currency |
string |
Cryptocurrency of the transaction. |
networkCode |
string |
Network code of the transaction. |
grossAmount |
decimal |
Total amount of the transaction, fee included. |
netAmount |
decimal |
Amount of the transaction recieved by client, fee deducted. |
amount |
decimal |
Amount entered by client. |
fee |
decimal |
Fee for the transaction. |
destinationAddress |
string |
Address, to which the crypto was withdrawn. |
destinationAdditionalAddress |
string |
Additional address field, if applicable. |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. |
clientTag |
string |
Unique client's identifier in external system. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet used for withdrawal. |
Get Virtual Wallet transactions history
Get transaction history for the Virtual Wallet
HTTP Request
[GET] /v1/virtual-wallets/{virtualWalletReferenceId}/transactions
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to retreive the transaction history. |
currency |
string |
A specific currency of transactions, if needed. | |
page |
int32 |
Offset , each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. | |
count |
int32 |
How much records to return. Record limit per one request is 500 transactions. | |
withdrawalBatchId |
int32 |
Show records only for the transactions within a specific mass withdrawal batch. | |
address |
string |
Show records only for the transactions to specific destination address, if needed. | |
clientTag |
string |
Show records only for the transactions to specific clientTag, if needed. | |
dateFrom |
string(dateTtime) |
Starting date for the transactions. In UTC format. | |
dateTo |
string(dateTtime) |
End date for the transactions. In UTC format. |
Successful response
{
"total": 1,
"data":
[
{
"id": "CTN77926",
"currency": "XRP",
"type": "Receive",
"status": "Completed",
"createdOn": "2024-02-31T14:06:32.2440677Z",
"totalAmount": 20.00,
"executedAmount": 20.00,
"fee": 0.0,
"networkCode": "XRP_TEST",
"networkName": "XRP Testnet",
"destinationAddress": "rBo6XnbVWFzfdCxfX9Ym4mmcEQtoMNr3Gh",
"destinationAdditionalAddress": "1128467660",
"referenceId": "string",
"traceId": "string",
"clientTag": "12346",
"sourceAddress": "string",
"withdrawalBatchId": 0,
"virtualWalletReferenceId": "string"
}
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
string |
Unique ID of the transaction. |
currency |
string |
Cryptocurrency of the transaction. |
type |
string |
Type of the transaction. Can be "Send" or "Receive" |
status |
string |
Status of the transaction. Can be Pending, Completed, and Declined |
createdOn |
string(dateTtime) |
When the transaction was created. In UTC format. |
totalAmount |
decimal |
Gross amount of the transaction. |
executedAmount |
decimal |
Amount of the transaction, with the fee amount deducted. |
fee |
decimal |
Fee for the transaction. |
networkCode |
string |
Network code of the transaction. |
networkName |
string |
Network name of the transaction. |
networkTransactionId |
string |
Unique network ID of the transaction. |
destinationAddress |
string |
Destination address of the transaction. |
destinationAdditionalAddress |
string |
Additional address field, if applicable. |
referenceId |
string |
Client's internal transaction ID. Needs to be unique within our system, not only for client's transactions. |
traceId |
string |
ID of the transaction in external payment system. |
clientTag |
string |
Unique client's identifier in external system. |
sourceAddress |
string |
Source address of the transaction. is empty in case of internal transaction. |
withdrawalBatchId |
int32 |
A specific mass withdrawal batch for the transaction, if applicable. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the transaction history is retreived. |
List all currencies and networks
Use this endpoint to list all the currencies allowed by the regulation of your region and, in case of cryptocurrencies, with their networks listed as well.
HTTP Request
[GET] /v1/virtual-wallets/currencies
Successful Response
[
{
"currency": "string",
"type": "string",
"decimalPlaces": 0,
"networks": [
{
"addressType": "Single",
"code": "string",
"name": "string",
"isTagRequiredForWithdrawals": true
}
]
}
]
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Acronym of currency. |
type |
string |
Type of currency. |
addressType |
string |
Type of network. |
IsTagRequiredForWithdrawal |
boolean |
Is TAG, MEMO or NOTE field required(true) or optional(false) for the currency, in case its addressType is MultipleWithTag, MultipleWithMemo, MultipleWithNote respectively. |
code |
string |
Acronym (code) of network. |
name |
string |
Name of network. |
Request for a Virtual Wallet asset conversion quote
Send the request to get the conversion rate for your selected asset pair and amount.
HTTP Request
[POST] /v1/virtual-wallets/{virtualWalletReferenceId}/otc-trading/request-for-quote
Request Body Example
{
"fromCurrency": "string",
"toCurrency": "string",
"fromAmount": 0,
"toAmount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to request the conversion quote. |
fromCurrency |
string |
+ | Acronym of the currency you want to convert FROM. |
toCurrency |
string |
+ | Acronym of the currency you want to convert your existing currency TO. |
fromAmount |
double |
One of fromAmount or toAmount |
Amount of the currency you want to convert FROM. |
toAmount |
double |
One of fromAmount or toAmount |
Amount of the currency you want to convert your existing currency TO. |
Successful response
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"occuredOn": "2026-03-02T08:42:56.985Z",
"validTo": "2026-03-02T08:42:56.985Z",
"fromCurrency": "string",
"toCurrency": "string",
"amountFrom": 0,
"amountTo": 0,
"rate": 0,
"virtualWalletReferenceId": "{virtualWalletReferenceId}"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
string |
Unique request ID. |
occuredOn |
string(dateTtime) |
Time when the request reached our server. |
validTo |
string(dateTtime) |
Time until the stated rate is valid. If the time has elapsed, you need to send another quote request. |
fromCurrency |
string |
Acronym of the currency you want to convert FROM. |
toCurrency |
string |
Acronym of the currency you want to convert your existing currency TO. |
amountFrom |
decimal |
Amount of the currency you want to convert FROM. |
amountTo |
decimal |
Amount of the currency you want to convert your existing currency TO. |
rate |
decimal |
Conversion rate, relevant for your request. |
virtualWalletReferenceId |
string |
referenceId of the Virtual Wallet for which the conversion quote is requested. |
Execute Virtual Wallet conversion via OTC
If you agree with the quote for the conversion, place a conversion order.
HTTP Request
[POST] /v1/virtual-wallets/{virtualWalletReferenceId}/otc-trading/convert
Request Body Example
{
"id": "string",
"fromCurrency": "string",
"toCurrency": "string",
"fromAmount": 0,
"toAmount": 0
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to execute the conversion for. Must be the same as the one used to request the conversion quote. |
id |
string |
+ | Unique ID of request-for-quote endpoint response. |
fromCurrency |
string |
+ | Acronym of the currency you want to convert FROM. |
toCurrency |
string |
+ | Acronym of the currency you want to convert TO. |
fromAmount |
decimal |
+ | Amount of the currency you want to convert FROM. |
toAmount |
decimal |
+ | Amount of the currency you want to convert TO. |
In response you get the ID of the conversion transaction initiation.
Get Virtual Wallet conversion history
Display the desired number of previous records in a specific Virtual Wallet's conversion history.
HTTP request
[GET] /v1/virtual-wallets/{virtualWalletReferenceId}/otc-trading/history?page={page}&count={count}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
virtualWalletReferenceId |
string |
+ | referenceId of the Virtual Wallet to get the conversion history. |
page |
int32 |
+ | Offset , each page equals count value. For example, to get results 20-30, set page to 2, and count to 10. |
count |
int32 |
+ | How much records to return. |
Successful response
{
"items": [
{
"id": 0,
"operationExecutionTime": "2022-12-31T11:19:33.448Z",
"amountFrom": 0,
"amountTo": 0,
"fromCurrency": "string",
"toCurrency": "string",
"rate": 0,
"status": "string"
}
],
"count": 0
}
Response fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique conversion ID. |
operationExecutionTime |
string(dateTtime) |
TIme the conversion was executed. |
amountFrom |
decimal |
Amount of the currency converted FROM. |
amountTo |
decimal |
Amount of the currency converted TO. |
fromCurrency |
string |
Acronym of the currency converted FROM. |
toCurrency |
string |
Acronym of the currency converted TO. |
rate |
decimal |
Rate of conversion. |
status |
string |
Status of the conversion. |
count |
int32 |
total count of the records displayed. |
API Updates
Keep yourself up to date on new and updated API features.
(09/04/2026)
Deposit callback notifications
We have added a functionality, which allows merchants, including CaaS corporate clients, to receive real-time notifications for their end-customers deposit status changes via a preconfigured callback.
See Callback Settings for more info.
Earn products management via API
We have extended XBO Client API with the endpoints that allow our clients to view and manage available Earn products.
See Earn products for more info.
(16/03/2026)
Crypto-as-a-Service. Virtual Wallet
XBO offers Virtual Wallet functionality to our CaaS corporate clients, which allows them to create multiple segregated wallets under a single merchant account.
Each Virtual Wallet will have its own balance, transaction history, and optional human-readable name, while the merchant retains a unified compliance and operational setup for the optimal workflow.
Merchants can create Virtual Wallets, assign deposit addresses, receive and credit deposits, and execute withdrawals and asset conversion via OTC, all tied to the specific Virtual Wallet.
See Crypto-as-a-service (CaaS) for more info
(02/06/2025)
Full spot trading order lifecycle support
We have added a full support of limit orders trading as well as extended the toolset for spot trading via XBO Client API.
Now XBO Client API clients have the possibility to:
- Create a market or limit order.
- Update and existing order with new amount and/or price.
- Cancel an existing order by ID.
- Retreive the list of the orders that are currently open.
- Get a history of closed orders.
Withdrawal address and network validation
In case of withdrawal, we now validate the client destination address and network and return an error in case their withdrawal address does not match the network entered by them.
(27/03/2025)
Restrict available currencies by regulation
To comply with the MiCA regulation in EU region, we will now return an error on an attempt to use regulation-restricted currencies in XBO Client API endpoints.
Error Example:
{
"code": "operation-for-currency-not-allowed",
"message": "{Currency} is not allowed due to regulation requirements"
}
(30/01/2025)
Optional MEMO/TAG/NOTE supported
We've extended relevant endpoints with IsTagRequiredForWithdrawal parameter, stating whether MEMO/TAG/NOTE field is required for the currencies with addressType:MultipleWithTag, MultipleWithMemo, MultipleWithNote. |
(26/12/2024)
Travel rule data collection
To comply with the MiCA regulation in EU region, Travel Rule data is going to be collected for the crypto withdrawals that exceed $1,000.
Endpoint updates: - Crypto withdrawal fee and minimal withdrawal amount - Crypto withdrawal - Mass withdrawal batch validation
(9/12/2024)
API key management via Client Area
API keys can be generated and managed in your Client Areа Security settings.
(24/10/2024)
Mass payments via API
We extended API functionality to make it possible to send a batch with up to 200 withdrawals within a single request using API endpoints.
Mass withdrawal functionality will support both general (single transaction) and multidestination (some types of coins like BTC with the UTXO network) transaction types. It will be possible to mix transaction types within one batch.
For multi-destination transactions within the UTXO network, a single UTXO fee will be calculated and applied to the entire batch as one fee, regardless of the number of destination addresses. For general (single transaction) type. Each withdrawal within the batch will be charged a separate withdrawal fee, calculated per destination address.
(17/09/2024)
Forbid Credit In funds withdrawal
With the release we validate withdrawal transactions to make sure clients can’t withdraw credit funds.
In case the client tries to withdraw more than the amount available for the withdrawal, we will decline the transaction.
(12/09/2024)
Choose fee charge option for withdrawals
We added a possibility to select a way withdrawal fee is charged upon withdrawal request creation via API.
To do that we added a new feeType request parameter to [POST] /v1/withdrawals
endpoint.
Parameter has the following values to select between the following fee charging modes:
- default.Default hybrid model. Fee will be calculated on top of the withdrawal request if
the balance has enough funds for that.
- net.Fee will be charged on top.
- gross.Fee will be charged from the amount of withdrawal.
We also added [POST] /v1/fiat/withdrawals/fee endpoint, where clients add
withdrawal details in the request, and receive the information on the amounts that will be
charged from their balance in case of different fee modes.
(29/08/2024)
Fee amount & minimal withdrawal amount info
We added a possibility to obtain the fee amount in original currency and minimal amount of withdrawal, before executing the withdrawal.
To do that, we added a new [POST] v1/withdrawals/fee endpoint, where clients send the
amount they want to withdraw, currency of the withdrawal and recipient wallet address and
network, and receive the amount of fee that will be charged for that withdrawal, as well as the
minimal amount that can be withdrawn with these parameters.
OTC transaction available balance validation
We have added an additional validation for OTC quote request and conversion via API, which
will check the available balance on client’s account, and return fromAmount is greater
than Available Balance error, if the available balance is less than the amount client tries
to convert.
CoinGecko API updates
We added new parameters to preexisting endpoints, to ensure XBO Public API is compliant with CoinGecko platform listing requirements.
Parameters added are: - For Trades endpoint: - target_volume. 24 hour trading volume for the pair in target coin. - For Trading pairs Stats endpoint: - base_currency. 24 hour trading volume for the pair in base coin. - target_currency. Symbol of the target coin. - target_volume. 24 hour trading volume for the pair in target coin.
Deprecated
The following endpoints are obsolete and supported as legacy only.
[Deprecated] Get wallet address
You can get the address of your wallet in one or more selected currencies using the following endpoint
HTTP Request
GET /v1/deposit-address/{ **currency** }/{ **network** }
Successful Response
{
"currency": "string",
"address": "string",
"additionalAddress": "string",
"additionalAddressType": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Symbol of the cryptocurrency in acronym format, e.g., ETH, BTC, USDT, etc.. Only for the currencies allowed by the regulation of your region. |
network |
string |
+ | The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
address |
string |
Address of the wallet. |
additionalAddress |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
additionalAddressType |
string |
Type of the info in additional address field. |
[Deprecated] Get a unique deposit address
You can request a unique address for your wallet, individual for each coin and network.
HTTP Request
POST /v1/deposit-addresses/
Request Body Example
{
"currency": "string",
"networkCode": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Symbol of the cryptocurrency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
+ | The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
Successful Response
{
"currency": "string",
"address": "string",
"additionalAddress": "string",
"additionalAddressType": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
address |
string |
One-time Address of the wallet. |
additionalAddress |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
additionalAddressType |
string |
Type of the info in additional address field. |
[Deprecated] Get a list of all crypto addresses
You can request the list of all the cryptowallets belonging to you as XBO client.
HTTP Request
GET /v1/deposit-addresses/
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
address |
string |
Wallet address. Use this parameter, to check if the exact wallet address belongs to your client account, and display its details. | |
networkCode |
string |
The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
Successful Response
[
{
"currency": "string",
"networkCode": "string",
"address": "string",
"additionalAddress": "string"
},
....
{
"currency": "string",
"networkCode": "string",
"address": "string",
"additionalAddress": "string"
},
]
Response Fields
| Name | Type | Description |
|---|---|---|
currency |
string |
Symbol of wallet's currency in acronym format, e.g., ETH, BTC, USDT, etc. |
networkCode |
string |
The chain network code for the currency, e.g., for USDT - OMNI, ERC20, TRC20. |
address |
string |
Address of the wallet. |
additionalAddress |
string |
Additional address info of network, if applicable. Used for tag, memo and notes of the network. |
[Deprecated] Crypto withdrawal fee and minimal withdrawal amount
Use this endpoint to get the:
- Amount of fee for the amount you want to withdraw.
- Minimal amount that you can withdraw, based on network.
Use this endpoint to get crypto withdrawal info before creating an actual withdrawal.
HTTP Request
[POST] v1/withdrawals/fee
Request Body Example
{
"amount": 0,
"currency": "string",
"networkCode": "string",
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"feeType": "string"
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
amount |
decimal |
+ | The amount the client wants to withdraw. |
currency |
string |
+ | Cryptocurrency of the withdrawal. Only for the currencies allowed by the regulation of your region. |
networkCode |
string |
+ | Network code of the withdrawal. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
Successful response
{
"amount": 100,
"feeAmount": 5,
"netAmount": 100,
"grossAmount": 105,
"minWithdrawalAmount": 5
}
Response Fields
| Name | Type | Description |
|---|---|---|
amount |
decimal |
The amount entered by client. |
feeAmount |
decimal |
Fee amount for that withdrawal amount. |
netAmount |
decimal |
Net amount of the withdrawal, fee deducted. |
grossAmount |
decimal |
Total amount of the withdrawal, fee included. |
minWithdrawalAmount |
decimal |
Minimal withdrawal amount, based on withdrawal address. |
[Deprecated] Crypto withdrawal
Use this endpoint to make a crypto withdrawal.
HTTP Request
POST /v1/withdrawals
Request Body Example
{
"currency": "string",
"networkCode": "string",
"amount": 0,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string",
"feeType": "string",
}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
currency |
string |
+ | Cryptocurrency of the transaction. Only for the currencies allowed by the regulation of your region. |
networkCode |
string |
+ | Network code of the transaction. |
amount |
decimal |
+ | Amount of transaction. |
destinationAddress |
string |
+ | Address, to which you are withdrawing. |
destinationAdditionalAddress |
string |
Additional address, if applicable. | |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. | |
clientTag |
string |
Unique client's identifier in external system. | |
feeType |
string |
The way the fee is charged from the transaction. Can be default, net, gross. See Withdrawal Fees for more information. |
Successful response
{
"id": 0,
"currency": "USDT",
"networkCode": "string",
"grossAmount": 105,
"netAmount": 100,
"amount": 100,
"fee": 5,
"destinationAddress": "string",
"destinationAdditionalAddress": "string",
"referenceId": "string",
"clientTag": "string"
}
Response Fields
| Name | Type | Description |
|---|---|---|
id |
int32 |
Unique ID of the withdrawal. |
currency |
string |
Cryptocurrency of the transaction. |
networkCode |
string |
Network code of the transaction. |
grossAmount |
decimal |
Total amount of the transaction, fee included. |
netAmount |
decimal |
Amount of the transaction recieved by client, fee deducted. |
amount |
decimal |
Amount entered by client. |
fee |
decimal |
Fee for the transaction. |
destinationAddress |
string |
Address, to which the crypto was withdrawn. |
destinationAdditionalAddress |
string |
Additional address field, if applicable. |
referenceId |
string |
ID of the transaction in external payment system. In case of Crypto Payx withdrawal, it will be a payout intent ID. |
clientTag |
string |
Unique client's identifier in external system. |
