NAV

Introduction

Base URL

The base url is https://api.xbo.com

As per RESTful design patterns, XBO Client API uses following HTTP methods:

When you are making a request, you can pass arguments in it as:

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.

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

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/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.
IsTagRequiredForWithdrawal boolean Is TAG, MEMO' or 'NOTE' field required(true) or optional(false) for the currency, in case itsaddressTypeisMultipleWithTag,MultipleWithMemo,MultipleWithNote` respectively.
code string Acronym (code) of network.
name string Name of network.

Wire Transfer Deposit

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:

  1. Get a list of available bank accounts for your country and currency of choice.
  2. Get a fee quote calculated for your deposit amount.
  3. 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, it's transaction status will be Pending. Once we have recieved 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}&currency={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 recepient 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 address for your wallet, individual 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 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.
additionalAddress string Additional address info of network, if applicable. Used for tag, memo and notes of the network.
clientTag string Unique client's identifier in external system.

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

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

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

OTC Trading

XBO Client API gives you the possibility to execute OTC trading 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(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 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 OTC trading history

Display the desired number of previous records in OTC trading 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 much records to return.

Response fields

Name Type Description
id int32 Unique transaction ID.
operationExecutionTime string(dateTtime) 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:

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 much 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 beMarket 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 Are you buying or selling. Can be "Buy" or "Sell".
amount decimal The current amount of the order. Сan 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(dateTtime) Time at which the order was placed.
updatedOn string(dateTtime) 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 Are you buying or selling. 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(dateTtime) Time at which the order was placed.
updatedOn string(dateTtime) 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

Request Body

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(dateTtime) Start of order creation date.
to string(dateTtime) 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 Are you buying or selling. 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(dateTtime) Time at which the order was placed.
updatedOn string(dateTtime) 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

Request Body

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(dateTtime) Start of trade date range.
dateTo string(dateTtime) 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 number($decimal) An array containing two elements: the ask price and quantity for each ask order.
asks number($decimal) An array containing two elements: the offer price and quantity for each bid 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 number($decimal) Symbol of the base coin.
quoteCurrency number($decimal) 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:

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:

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

Mass crypto withdrawal

It is possible to send batches with multiple crypto withdrawal transaction for mass processing.

Batch should meet the following requirements:

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:

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

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

  1. Monitor the batch status in real time. Endpoint.

Using this endpoint will return a general info about a certain endpoint. To get detailed information about transaction(s) from the batch, use GET /v1/transactionsendpoint 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 decimal 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 decimal + The ID of 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 decimal 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 otal amount of withdrawal for all the transactions in the batch in USD equivalent.
fee decimal Total fee for the withdrawal batch.
feeUsd decimal Total fee for the withdrawal batch in USD equivalent.
draftTransactionCount decimal Transactions in "Draft" status in the batch at the time of response.
pendingTransactionCount decimal Transactions in "Pending" status in the batch at the time of response.
declinedTransactionCount decimal Transactions in "Declined" status in the batch at the time of response.
completedTransactionCount decimal Transactions in "Completed" status in the batch at the time of response.
createdOn string(dateTtime) When the withdrawal batch was created.
updatedOn string(dateTtime) Time of the last withdrawal batch update.

Status of the withdrawal batch can have the following values.

Status Commment
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:

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 client wants to withdrawal.
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 recieved by client, fee deducted.
amount decimal Amount entered by client.
fee decimal Fee for the withdrawal.
createdDate string(dateTtime) 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.

OBSOLETE crypto withdrawal fee and minimal withdrawal amount

Use this endpoint to get the:

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.

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

Check Balance

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 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"
        }   
      ]
}

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. 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 much records to return. Record limit per one request is 500 transactions.
dateFrom string(dateTtime) Starting date for the transactions.
dateTo string(dateTtime) 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", and "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(dateTtime) 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.

API Updates

Keep yourself up to date on new and updated API features.

(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 Virtual Wallet 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 customers have the possibility to:

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.

Crypto-as-a-service (CaaS)

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.

Use XBO API CaaS endpoints to:

CaaS Endpoints

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

Successful Response

  {
    "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 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

/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:

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.