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/json
header.
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){
// ...
}
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 -
base64
encodedSHA256
hash of serialized content (empty for GET requests)
List all currencies and networks
Use this endpoint to list all currencies 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,
"code": "string",
"name": "string"
}
]
}
Response Fields
Name | Type | Description |
---|---|---|
currency |
string |
Acronym of currency. |
type |
string |
Type of currency. |
addressType |
string |
Type of network. |
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:
- 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, 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}¤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 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
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. |
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. |
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. |
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. |
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. |
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 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-01T12:56:01.776Z",
"validTo": "2022-12-01T12: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
POST /v1/otc-trading/history
Successful response
{
"items": [
{
"id": 0,
"operationExecutionTime": "2022-12-02T11: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
with XBO Client API you can execute market 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 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. |
volumeStep |
float |
the minimal amount of increment in trade volume. |
Place a market order
Use it to trade for a market price, active at the time of order execution.
HTTP Request
POST /v1/spot-trading/orders
Request Body Example
{
"symbol": "ETH/USDT",
"type": "Market",
"side": "Sell",
"amount": 0.009
}
Parameters
Name | Type | Required | Description |
---|---|---|---|
symbol |
string |
+ | Acronym for the trading pair. |
type |
string |
+ | Type of the order you are making. Only "Market" type is supported for now. |
side |
string |
+ | Are you buying or selling. Can be "Buy" or "Sell". |
amount |
double |
+ | The volume of the trade. |
Successful Response
{
"id": 353108531,
"symbol": ETH/USDT,
"baseCurrency": ETH,
"quoteCurrency": USDT,
"takerCommission": 0.0,
"makerCommission": 0.0,
"type": Market,
"side": Sell,
"amount": 0.009,
"price": 1537.24,
"openTime": "0001-01-01T00:00:00",
"updatedOn": "0001-01-01T00:00:00",
"time": 0
}
Response Fields
Name | Type | Description |
---|---|---|
id |
int64 |
Unique ID of the transaction. |
symbol |
string |
Acronym for the trading pair. |
baseCurrency |
string |
Acronym of the base currency in the pair. |
quoteCurrency |
string |
Acronym of the quote currency in the pair. |
makerCommission |
decimal |
Commission fee for order maker. |
takerCommission |
decimal |
Commission fee for order taker. |
type |
string |
Type of the order you are making. Only "Market" type is supported for now. |
side |
string |
Are you buying or selling. Can be "Buy" or "Sell". |
amount |
decimal |
The volume of the trade. |
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 executed. |
time |
int32 |
Time in ms, passed from order placement to execution. |
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.
OBSOLETE 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. |
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. |
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. |
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 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:
- 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 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 a general info about a certain endpoint. 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. |
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
json { "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 succesfully, 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 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-02T06: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. |
currency |
string |
Currency of the withdrawal. |
status |
string |
Status of withdrawal. |
reason |
string |
Reason of the withdrawal status. |
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. | |
dateTo |
string(dateTtime) |
End date for the transactions. |
Successful response
{
"total": 1,
"data":
[
{
"id": "CTN77926",
"currency": "XRP",
"type": "Receive",
"status": "Completed",
"createdOn": "2024-02-12T14: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. |
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": "2023-01-05T11:01:48.853Z",
"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. |
Public Trading Data Statistics
This chapter's reference is aimed to help integrate XBO exchange into trading data aggregation platforms.
Base URL
The base url is https://api.xbo.com
URL needs to be encoded.
As per RESTful design patterns, Public API uses the following HTTP methods:
GET
- Read resources
When you are making a request, you can pass arguments in it as:
- Parameters
- Valid JSON with
application/json
header.
Timestamps and other time-related fields are in milliseconds.
Parameters for GET
endpoints must be sent as a query string.
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.
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 us for more information.
404
Resource is missing. Contact us for more information.
Authentication
No authentication is required. All the endpoints listed are public.
Public Trading Data Endpoints
API endpoints listed below give access to XBO exchange Spot trading data.
Orderbook
The order book endpoint is used to request a complete level 2 order book, arranged by best asks/bids, for a particular market pair.
HTTP Request
[GET] /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. |
Currencies
Currencies endpoint is used to provide a detailed summary for each currency available on XBO exchange.
HTTP Request
[GET] /currencies
Successful Response
[
{
"code": "ALGO",
"name": "Algorant, Ⱥ",
"type": "Crypto",
"isDepositEnabled": true,
"isWithdrawalEnabled": true,
"minWithdrawalAmount": 25
},
{
"code": "AOA",
"name": "Angolan Kwanza, Kz",
"type": "Fiat",
"isDepositEnabled": false,
"isWithdrawalEnabled": false
},
{
"code": "APE",
"name": "Ape coin, ௐ",
"type": "Crypto",
"isDepositEnabled": true,
"isWithdrawalEnabled": true,
"minWithdrawalAmount": 12
}
]
Response Fields
Name | Type | Description |
---|---|---|
code |
string |
Currency acronym. |
name |
string |
Full currency name. |
type |
string |
Type of currency. Can be Fiat or Crypto. |
isDepositEnabled |
boolean |
Are deposits available for the currency. |
isWithdrawalEnabled |
boolean |
Are deposits available for the currency. |
minWithdrawalAmount |
boolean |
Minimum withdrawal amount of a currency. |
Trading Pairs
Trading pairs endpoint is used to provide a 24-hour pricing and volume summary for each market pair available on XBO exchange.
HTTP Request
[GET] /trading-pairs
Successful Response
[
{
"symbol": "AAVE/EUR",
"description": "AAVE vs Euro",
"baseCurrency": "AAVE",
"quoteCurrency": "EUR",
"lastPrice": 91.5515,
"isEnabled": true,
"last24HTradeVolume": 3674.694,
"last24HTradeVolumeUsd": 436423.747
},
{
"symbol": "AAVE/USD",
"description": "AAVE vs US Dollar",
"baseCurrency": "AAVE",
"quoteCurrency": "USD",
"lastPrice": 97.8628,
"isEnabled": true,
"last24HTradeVolume": 2942.861,
"last24HTradeVolumeUsd": 287064.214
},
{
"symbol": "ADA/BTC",
"description": "Cardano vs Bitcoin",
"baseCurrency": "ADA",
"quoteCurrency": "BTC",
"lastPrice": 0.00000647,
"isEnabled": true,
"last24HTradeVolume": 636680.3,
"last24HTradeVolumeUsd": 221978.59
}
]
Response Fields
Name | Type | Description |
---|---|---|
symbol |
string |
Market pair in base currency/quote currency format. |
description |
string |
Full market pair currency names. |
baseCurrency |
string |
Acronym of a base currency. |
quoteCurrency |
string |
Acronym of a quote currency. |
lastPrice |
number($decimal) |
Last price of base currency based on given quote currency. |
isEnabled |
boolean |
Is the market enabled for the currency. Can be true or false. |
last24HTradeVolume |
number($decimal) |
Trading volume for the last 24 hours. |
last24HTradeVolumeUsd |
number($decimal) |
Trading volume for the last 24 hours in USD equivalent. |
Trades
Trades endpoint is used to return data on all recently completed trades for a particular market pair for the last 24 hours.
HTTP Request
[GET] /trades?symbol={symbol}
Parameter
Name | Type | Required | Description |
---|---|---|---|
symbol |
string |
+ | Market pair in base currency/quote currency format, divided by encoded slash (%2F ). Format example: BTC%2FUSDT |
Successful Response
[
{
"id": 251209707,
"symbol": "BTC/USDT",
"price": 56103.02,
"volume": 1,
"quoteVolume": 60244.40,
"type": "Buy",
"timeStamp": 1719918009
},
{
"id": 251126073,
"symbol": "BTC/USDT",
"price": 56122.76,
"volume": 1.4363,
"quoteVolume": 63267.40,
"type": "Sell",
"timeStamp": 1719909799
}
]
Response Fields
Name | Type | Description |
---|---|---|
id |
number($int32) |
A unique ID associated with the trade for the currency pair transaction. |
symbol |
string |
Market pair the trading order is associated with. in base currency/quote currency format. |
price |
number($decimal) |
Transacted price of base currency based on given quote currency. |
volume |
number($decimal) |
Transaction amount in BASE currency. |
quoteVolume |
number($decimal) |
Transaction amount in QUOTE currency. |
type |
string |
Type of the transaction. Can be Buy or Sell. |
timeStamp |
boolean |
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 exchange.
HTTP Request
[GET] /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. |
API Updates
Keep yourself up to date on new and updated API features.
(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.