Markup da API

Author profile photo
Equipe Quickex
1 de dezembro de 2025
~4 min de leitura

Pre-calculating rate

Algorithm

Quickex utiliza um sistema de taxa dinâmica para gerar previsões de taxa de câmbio, usando a análise da profundidade de mercado dos provedores de liquidez. Enquanto o fluxo padrão analisa a profundidade de mercado e retorna um resultado calculado de forma realista, o parâmetro markup pode influenciar a taxa retornada pelo algoritmo de previsão de taxa.

O parâmetro markup irá influenciar o pré-cálculo da taxa retornado pelo nosso sistema da seguinte forma:

A_final = A_calculated × (1 − (K_markup / 100))
Parameter Description
A_final Montante final a receber (previsto)
A_calculated Montante antes da aplicação do markup
K_markup Percentual de markup

Com base na fórmula fornecida, um valor de markup de 0.3, aplicado a uma troca de 1 BTC → USDT, produzirá os seguintes resultados, fazendo com que o preço previsto final aumente em 0,3%:

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

API

Os dados de taxas podem ser obtidos por meio de uma chamada de API v1 para o endpoint /api/v1/rates/public/one. A API v1 não requer autorização por chave de API nem whitelisting de IP.

Parameter Description Example
instrumentFromCurrencyTitle Moeda de origem BTC
instrumentFromNetworkTitle Rede da moeda de origem BTC
instrumentToCurrencyTitle Moeda de destino USDT
instrumentToNetworkTitle Rede da moeda de destino TRC20
rateMode FLOATING / FIXED FLOATING
claimedDepositAmount Valor do depósito 1
markup Percentual de 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'
}

Parâmetro markup no fluxo de ordens

Algorithm

O parâmetro markup também deve ser enviado durante a criação do pedido para garantir uma comissão de ordem válida. Com o parâmetro markup informado, a Quickex aplicará a seguinte fórmula ao algoritmo de cálculo da comissão da ordem:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {(C_{platform\ (\%)} + K_{markup})}{100})
Awithdrawal Quantidade de moeda enviada ao cliente como resultado da troca
Aexchange Quantidade de moeda que a Quickex tinha disponível após executar nossa estratégia de negociação
Cplatform (%) Percentual de comissão definido pela Quickex
Kmarkup Valor do parâmetro markup

Com base na fórmula fornecida, um valor de markup de 0.3 informado durante a criação do pedido aumentará em 0.3 o percentual de comissão da Quickex. No exemplo a seguir, a comissão da Quickex está definida em 1 por cento:

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

Usando o exemplo anterior, uma troca de 1 BTC para USDT com base no preço de mercado de 50243.798064469251204 BTC: USDT resultará no seguinte montante de saque do cliente:

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

Com base na fórmula fornecida, um valor de markup de 0.3 informado durante a criação do pedido aumentará em 0.3 o percentual de comissão da Quickex.

Depois que uma troca com um parâmetro markup entra no estado COMPLETED, o parâmetro markup será usado na fórmula de cálculo da margem do parceiro:

C_{affiliate} = (C_{platform} * \dfrac{C_{affiliate\ (\%)}}{100}) + (C_{platform} * \dfrac{K_{markup}}{100})
Caffiliate Quantidade de moeda enviada para a carteira do afiliado por troca (margem do afiliado)
Cplatform Quantidade de moeda que a Quickex obteve com a troca (margem da plataforma)
Caffiliate (%) Percentual de comissão definido para o afiliado
Kmarkup Valor do parâmetro markup

Passing the markup parameter

Durante a criação do pedido, a API da Quickex aceita o parâmetro markup juntamente com outros parâmetros de criação de pedidos:

{
‘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’ // <— here
}

O valor multiplicador de markup é enviado juntamente com os demais parâmetros.

Using API v2

O uso dos endpoints da API v2 exige uma configuração adicional de autorização. Sem os parâmetros de autorização necessários, os endpoints v2 retornarão erros 403 Forbidden.

A integração é composta de duas etapas – criar uma chave de API e integrar seu uso nas requisições à API. Ao criar uma chave de API, nossos clientes B2B receberão um par de chaves para assinar suas requisições, juntamente com uma lista de endereços IP em whitelist que podem acessar os endpoints da API.

!
Note:
é necessário ter um cookie de autorização ativo para executar
/api/v1/users/*
requisições.

Creating an API key

Ao criar a chave de API, é necessário enviar um array de IPs em whitelist:

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'
}

A resposta conterá o par de chaves que é necessário para uso durante a autorização da API v2 .

!
Note:
O campo
secretKey
será exibido apenas uma vez, durante a criação da chave de API. Recomendamos salvá-lo imediatamente após criar a chave de API.

Listing your API keys

Se a sua integração precisar utilizar mais de uma chave de API, você pode listá-las facilmente por meio do 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'
  }
]

Managing your API keys

O gerenciamento de chaves de API existentes pode ser feito por meio da nossa linha de suporte ao cliente B2B. Isso inclui:

  • Exclusão de chaves de API
  • Adição de novos IPs em whitelist a uma chave de API existente
  • Atualização e adição de configurações para uma chave de API (por exemplo: valores mínimo/máximo para o valor de markup)
  • Desativação de chaves de API

Using the API key

A API v2 exige que 3 cabeçalhos sejam definidos em cada requisição:

Header Value
x-api-public-key Sua chave pública obtida durante a criação da chave de API
x-api-timestamp Timestamp UNIX
x-api-signature Uma assinatura da requisição

O valor da assinatura é gerado usando hmac sha256. Os dados enviados são a concatenação em forma de string do timestamp, da representação em string do corpo da requisição e da chave pública, enquanto a chave privada é usada como chave para a função 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’ })

Sample integration code

i
Para a versão em Python, veja nosso

SDK no PyPi

const { createHmac } = require(‘crypto’);

const API_PREFIX = ‘https://quickex.io/api/’;
const PUBKEY = ‘public_key’; // changeme
const PRIVKEY = ‘private_key’; // changeme

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’;

// Step 1. Prepare createOrder request body using obtained rate data

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,
};

// Step 2. Prepare signature based on key pair and createOrder request data

const timestamp = new Date().getTime();
const signature = signRequest(createOrderRequestBody, timestamp);

// Step 3. Call API v2 create-order endpoint

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

Compartilhe este artigo: