Разметка API

Author profile photo
Команда Quickex
26 ноября 2025 г.
~5 мин. чтения

Предварительный расчёт курса

Алгоритм

Quickex использует динамическую систему курсов для формирования прогноза обменного курса на основе анализа глубины рынка поставщиков ликвидности. При этом стандартный процесс анализирует глубину рынка и возвращает реалистично рассчитанный результат, однако параметр markup может повлиять на курс, возвращаемый алгоритмом прогнозирования.

Параметр markup будет влиять на предварительный расчёт курса, возвращаемый нашей системой, следующим образом:

A_final = A_calculated × (1 − (K_markup / 100))
Параметр Описание
A_final Итоговая сумма к получению (прогноз)
A_calculated Сумма до применения Markup
K_markup Процент наценки

Исходя из приведённой формулы, значение markup 0.3 для обмена 1 BTC → USDT даст следующий результат, увеличивая итоговую прогнозную цену на 0,3%:

Пример: 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357

API

Данные по курсам можно получить через вызов API v1 к эндпоинту /api/v1/rates/public/one. Для API v1 не требуется авторизация по API-ключу или добавление IP-адреса в белый список.

Параметр Описание Пример

instrumentFromCurrencyTitle
Исходная валюта BTC

instrumentFromNetworkTitle
Сеть исходной валюты BTC

instrumentToCurrencyTitle
Целевая валюта USDT

instrumentToNetworkTitle
Сеть целевой валюты TRC20

rateMode
FLOATING / FIXED FLOATING

claimedDepositAmount
Сумма депозита 1

markup
Процент наценки 0.3
GET /api/v1/rates/public/one
    ?instrumentFromCurrencyTitle=BTC
    &instrumentFromNetworkTitle=BTC
    &instrumentToCurrencyTitle=USDT
    &instrumentToNetworkTitle=TRC20
    &rateMode=FLOATING
    &claimedDepositAmount=1
    &markup=0.3

{
instrumentFrom“: {
currencyTitle“: “BTC”,
networkTitle“: “BTC”,
precisionDecimals“: 11
},
instrumentTo“: {
currencyTitle“: “USDT”,
networkTitle“: “TRC20”,
precisionDecimals“: 1
},
depositRules“: {
minAmount“: “0.0010202831699481001984”,
maxAmount“: “0”
},
withdrawalRules“: {

Параметр markup в процессе обработки ордера

Алгоритм

Параметр markup также должен передаваться при создании ордера, чтобы корректно рассчитать комиссию по ордеру. При передаче параметра markup Quickex применяет к алгоритму расчёта комиссии следующую формулу:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {(C_{platform\ (\%)} + K_{markup})}{100})
Awithdrawal Сумма валюты, отправляемая клиенту по результатам обмена
Aexchange Сумма валюты, которой располагает Quickex после выполнения нашей торговой стратегии
Cplatform (%) Процент комиссии, определённый Quickex
Kmarkup markup
значение параметра

На основе приведённой формулы значение markup 0.3, переданное при создании ордера, увеличит процент комиссии Quickex на 0,3. В следующем примере комиссия Quickex установлена на уровне 1 процента:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {1 + 0.3}{100})

Используя предыдущий пример, обмен 1 BTC на USDT по рыночной цене 50243.798064469251204 BTC:USDT даст следующую сумму вывода для клиента:

50243.798064469251204 * (1 – \dfrac{1 + 0.3}{100}) = 49590.62868963115

На основе приведённой формулы значение markup 0.3, переданное при создании ордера, увеличит процент комиссии Quickex на 0,3.

После того как обмен с параметром markup переходит в состояние COMPLETED, параметр markup используется в формуле расчёта партнёрской маржи:

C_{affiliate} = (C_{platform} * \dfrac{C_{affiliate\ (\%)}}{100}) + (C_{platform} * \dfrac{K_{markup}}{100})
Caffiliate Сумма валюты, отправляемая на кошелёк партнёра за один обмен (партнёрская маржа)
Cplatform Сумма валюты, которую Quickex получил от обмена (маржа платформы)
Caffiliate (%) Процент комиссии, установленный для партнёра
Kmarkup markup
значение параметра

Передача параметра markup

При создании ордера API Quickex принимает параметр markup вместе с другими параметрами ордера:

{
“rateMode”: “FLOATING”,
“instrumentFrom”: {
“currencyTitle”: “USDT”,
“networkTitle”: “TRC20”
},
“instrumentTo”: {
“currencyTitle”: “BTC”,
“networkTitle”: “BTC”
},
“destinationAddress”: “bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh”,
“destinationAddressMemo”: null,
“refundAddress”: null,
“refundAddressMemo”: null,
“claimedNetworkFee”: null,
“legacyOrderId”: null,
“referrerId”: “aff_616”,
“claimedDepositAmount”: “125000”,
“utmData”: [],
“browserFingerprint”: “6b3add86bec11616427d069556a33548”,
“markup”: “0.2” // <— здесь
}

Значение множителя markup передаётся вместе с другими параметрами.

Использование API v2

Использование эндпоинтов API v2 требует дополнительной настройки авторизации. Без необходимых параметров авторизации эндпоинты v2 будут возвращать ошибку 403 Forbidden.

Интеграция состоит из двух шагов: создание API-ключа и использование этого ключа в API-запросах. После создания API-ключа наши b2b-клиенты получают пару ключей для подписания своих запросов, а также список IP-адресов в белом списке, которые могут обращаться к API-эндпоинтам.

!
Примечание: у вас должен быть активный авторизационный cookie, чтобы выполнять запросы /api/v1/users/* .

Создание API-ключа

При создании API-ключа необходимо передать массив IP-адресов, добавленных в белый список:

POST /api/v1/users/generate-api-key

Request:
{
  "name": "test",
  "whiteListIp": ["127.0.0.1"],
  "isActive": true
}

Response:
{
  "apiId": 40,
  "name": "test",
  "isActive": true,
  "publicKey": "ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=",
  "secretKey": "a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6",
  "whiteListIp": [
    "127.0.0.1"
  ],
  "createdAt": "2024-08-05T13:54:18.427Z"
}

Ответ будет содержать пару ключей, необходимых для авторизации при работе с API v2 .

!
Примечание: поле secretKey будет показано только один раз — при создании API-ключа. Мы рекомендуем сохранить его сразу после создания ключа.

Просмотр ваших API-ключей

Если для вашей интеграции требуется использовать более одного API-ключа, вы можете получить их список через эндпоинт list:

GET /api/v1/users/list-api-key

[

{

“apiId”: 40,

“name”: “test”,

“isActive”: true,

“settings”: {},

“publicKey”: “ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=”,

“whiteListIp”: [

“127.0.0.1”

],

“createdAt”: “2024-08-05T13:54:18.427Z”

}

]

Управление вашими API-ключами

Управление существующими API-ключами выполняется через нашу линию поддержки b2b-клиентов. Это включает:

  • Удаление API-ключей
  • Добавление новых IP-адресов в белый список для существующего API-ключа
  • Обновление и добавление настроек для API-ключа (например, минимальные/максимальные значения параметра markup)
  • Деактивацию API-ключей

Использование API-ключа

Для работы с API v2 в каждом запросе необходимо указывать 3 заголовка:

Заголовок Значение
x-api-public-key Ваш открытый ключ, полученный при создании API-ключа
x-api-timestamp UNIX-временная метка
x-api-signature Подпись запроса

Значение подписи генерируется с использованием hmac sha256. Передаваемые данные представляют собой конкатенацию в строку метки времени, строкового представления тела запроса и публичного ключа, тогда как приватный ключ используется в качестве ключа для функции hmac :

function signRequest(requestBody) {
const timestamp = new Date().getTime();
const publicKey = “ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=”;
const privateKey = “a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6”;
const encoder = new TextEncoder();
const data = encoder.encode(
timestamp + JSON.stringify(requestBody) + publicKey,
);
const hmac = createHmac(‘sha256’, privateKey);
const dataSign = hmac.update(data);
const signature = dataSign.digest(‘base64’);
return signature;
}
signRequest({ myKey: “myValue” })

Пример кода интеграции

i
Версию на Python смотрите в нашем

SDK на PyPi
const { createHmac } = require(‘crypto’);
const API_PREFIX = ‘https://quickex.io/api/’;
const PUBKEY = ‘public_key’; // измените значение
const PRIVKEY = ‘private_key’; // измените значение
function signRequest(requestBody, timestamp) {
const encoder = new TextEncoder();
const data = encoder.encode(timestamp + JSON.stringify(requestBody) + PUBKEY);
const hmac = createHmac(‘sha256’, PRIVKEY);
const dataSign = hmac.update(data);
const signature = dataSign.digest(‘base64’);
return signature;
}
async function createOrder() {
const clientBrowserFingerprint = ‘6b3add86bec11616427d069556a33548’;
const orderRateMode = ‘FLOATING’;
const depositAmount = ‘1’;
const clientDestinationAddress = ‘TUhw6S1HyXDhycKvTec3x7HNGQfNn3Vhpc’;
const clientDestinationAddressMemo = null;
const markup = ‘0.3’;
const instrumentFromCurrencyTitle = ‘BTC’;
const instrumentFromNetworkTitle = ‘BTC’;
const instrumentToCurrencyTitle = ‘USDT’;
const instrumentToNetworkTitle = ‘TRC20’;
// Шаг 1. Подготовьте тело запроса createOrder, используя полученные данные по курсу
const createOrderRequestBody = {
rateMode: orderRateMode,
instrumentFrom: {
currencyTitle: instrumentFromCurrencyTitle,
networkTitle: instrumentFromNetworkTitle,
},
instrumentTo: {
currencyTitle: instrumentToCurrencyTitle,
networkTitle: instrumentToNetworkTitle,
},
destinationAddress: clientDestinationAddress,
destinationAddressMemo: clientDestinationAddressMemo,
refundAddress: null,
refundAddressMemo: null,
markup: markup,
claimedNetworkFee: null,
legacyOrderId: null,
referrerId: null,
claimedDepositAmount: depositAmount,
utmData: [],
browserFingerprint: clientBrowserFingerprint,
};
// Шаг 2. Подготовьте подпись на основе пары ключей и данных запроса createOrder
const timestamp = new Date().getTime();
const signature = signRequest(createOrderRequestBody, timestamp);
// Шаг 3. Вызовите эндпоинт API v2 create-order
const order = JSON.parse(
await (
await fetch(${API_PREFIX}v2/orders/public/create, {
method: ‘POST’,
headers: {
‘x-api-public-key’: PUBKEY,
‘x-api-timestamp’: timestamp,
‘x-api-signature’: signature,
‘content-type’: ‘application/json; charset=utf-8’,
},
body: JSON.stringify(createOrderRequestBody),
})
).text(),
);
console.log(‘order’, order);
}
void createOrder();
Поделиться статьей: