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

Example: 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357

API

Дані щодо курсів можна отримати за допомогою виклику API v1 до endpoint-у /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": {
    "minAmount": "51.324600057525118367",
    "maxAmount": "0",
    "withdrawalFeeRules": {
      "maxAmount": "1",
      "minAmount": "1"
    }
  },
  "minConfirmationsToWithdraw": 2,
  "minConfirmationsToTrade": 2,
  "updatedAt": "2024-08-05T13:31:44.315Z",
  "liquidityProviderPublicCode": "radio",
  "amountToGet": "50201.90689595",
  "amountToGive": "1",
  "marketMinAmount": "0.1",
  "enableFixedRate": true,
  "amountToGiveCurrencyTitle": "BTC",
  "rateMode": "FLOATING",
  "finalNetworkFeeAmount": "0",
  "platformFee_Absolute": null,
  "liquidityProviderQuotes": {
    "sellQuote": {
      "baseValue": "1",
      "quoteValue": "50304.27"
    },
    "buyQuote": {
      "baseValue": "50294.99",
      "quoteValue": "1"
    }
  },
  "price": "50201.90689595",
  "marketLeftPrice": "50304.27",
  "marketRightPrice": "0.000019882696069727819809",
  "marketAmountToGet": "50243.798064469251204",
  "marketAmountToGetUSDT": "50243.798064469251204",
  "quotesWithoutNetworkFee": {
    "sellQuote": {
      "baseValue": "1",
      "quoteValue": "50202.90689595"
    },
    "buyQuote": {
      "baseValue": "50294.99",
      "quoteValue": "0.997985"
    }
  },
  "quotes": {
    "sellQuote": {
      "baseValue": "1",
      "quoteValue": "50201.90689595"
    },
    "buyQuote": {
      "baseValue": "50294.99",
      "quoteValue": "0.99796512097183797717"
    }
  },
  "markup": "0.3"
}

Параметр 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

Використання endpoint-ів API v2 вимагає додаткового налаштування авторизації. Без необхідних параметрів авторизації endpoint-и v2 повертатимуть помилки 403 Forbidden.

Інтеграція складається з двох кроків — створення ключа API та інтеграція його використання в запитах до API. Створивши ключ API, наші b2b-клієнти отримують пару ключів для підпису своїх запитів, а також список IP-адрес у білому списку, які можуть отримувати доступ до endpoint-ів API.

!
Примітка:
щоб виконувати запити
/api/v1/users/*,
у вас має бути активний cookie авторизації.

Створення ключа 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

Якщо ваша інтеграція потребує використання більше ніж одного ключа API, ви можете легко отримати їх список через endpoint 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. Викличте endpoint create-order API v2

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(); 

Поділитись статтею: