Margen de la API

Author profile photo
Equipo Quickex
26 de noviembre de 2025
~6 lectura mínima

Precálculo del tipo de cambio

Algoritmo

Quickex utiliza un sistema de tipos dinámicos para generar predicciones de tipos de cambio, utilizando el análisis de la profundidad de mercado de los proveedores de liquidez. Mientras que el flujo por defecto analizará la profundidad del mercado y devolverá un resultado calculado de forma realista, el parámetro markup puede influir en el tipo devuelto por el algoritmo de predicción de tipos.

El parámetro markup influirá en el precálculo del tipo devuelto por nuestro sistema de la siguiente manera:

A_final = A_calculated × (1 − (K_markup / 100))
Parámetro Descripción
A_final Importe final a recibir (previsto)
A_calculated Importe antes de aplicar markup
K_markup Porcentaje de recargo

Basándose en la fórmula indicada, un valor de markup de 0.3, establecido para un intercambio de 1 BTC → USDT, dará el siguiente resultado, aumentando el precio final previsto en un 0,3%:

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

API

Los datos de tipos pueden obtenerse mediante una llamada a la API v1 al endpoint /api/v1/rates/public/one. La API v1 no requiere autorización mediante clave de API ni lista blanca de IP.

Parámetro Descripción Ejemplo
instrumentFromCurrencyTitle Moneda de origen BTC
instrumentFromNetworkTitle Red de la moneda de origen BTC
instrumentToCurrencyTitle Moneda de destino USDT
instrumentToNetworkTitle Red de la moneda de destino TRC20
rateMode FLOATING / FIXED FLOATING
claimedDepositAmount Importe del depósito 1
markup Porcentaje de recargo 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 en el flujo de órdenes

Algoritmo

El parámetro markup también debe enviarse durante la creación de la orden para garantizar una comisión de orden válida. Cuando se envía el parámetro markup, Quickex aplicará la siguiente fórmula al algoritmo de cálculo de la comisión:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {(C_{platform\ (\%)} + K_{markup})}{100})
Awithdrawal Cantidad de moneda enviada al cliente como resultado del intercambio
Aexchange Cantidad de moneda que Quickex tenía disponible después de ejecutar nuestra estrategia de trading
Cplatform (%) Porcentaje de comisión definido por Quickex
Kmarkup Markup valor del parámetro

Basándose en la fórmula indicada, un valor de markup de 0.3, proporcionado durante la creación de la orden, aumentará el porcentaje de comisión de Quickex en 0.3. En el siguiente ejemplo, la comisión de Quickex se establece en 1 por ciento:

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

Usando el ejemplo anterior, un intercambio de 1 BTC a USDT basado en el precio de mercado de 50243.798064469251204 BTC: USDT dará como resultado la siguiente cantidad de retirada por el cliente:

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

Basándose en la fórmula indicada, un valor de markup de 0.3, proporcionado durante la creación de la orden, aumentará el porcentaje de comisión de Quickex en 0.3.

Después de que un intercambio con el parámetro markup entre en el estado COMPLETED, el parámetro markup se utilizará en la fórmula de cálculo del margen del afiliado:

C_{affiliate} = (C_{platform} * \dfrac{C_{affiliate\ (\%)}}{100}) + (C_{platform} * \dfrac{K_{markup}}{100})
Caffiliate Cantidad de moneda enviada al monedero del afiliado por intercambio (margen del afiliado)
Cplatform Cantidad de moneda que Quickex obtuvo del intercambio (margen de la plataforma)
Caffiliate (%) Porcentaje de comisión definido para el afiliado
Kmarkup Markup valor del parámetro

Envío del parámetro markup

Durante la creación de la orden, la API de Quickex acepta el parámetro markup junto con otros parámetros de creación de la orden:

{
“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” // <— aquí
}

El valor del multiplicador markup se envía junto con los demás parámetros.

Uso de la API v2

El uso de los endpoints de la API v2 requiere una configuración adicional de autorización. Sin los parámetros de autorización necesarios, los endpoints de v2 devolverán errores 403 Forbidden.

La integración se compone de dos pasos: crear una clave de API e integrar su uso en las solicitudes a la API. Al crear una clave de API, nuestros clientes b2b reciben un par de claves para firmar sus solicitudes, junto con una lista de direcciones IP en lista blanca que pueden acceder a los endpoints de la API.

!
Nota:
debe tener una cookie de autorización activa para realizar solicitudes a
/api/v1/users/*
.

Creación de una clave de API

Al crear la clave de API, se debe enviar un array de IPs en lista blanca:

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

La respuesta contendrá el par de claves que es necesario utilizar durante la autorización de la API v2 .

!
Nota:
El campo
secretKey
se mostrará solo una vez, durante la creación de la clave de API. Recomendamos guardarlo inmediatamente después de crear la clave de API. 

Listado de tus claves de API

Si tu integración requiere utilizar más de una clave de API, puedes listarlas fácilmente a través del endpoint list:

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’ })

Gestión de tus claves de API

La gestión de las claves de API existentes se realiza a través de nuestra línea de soporte para clientes b2b. Esto incluye:

  • Eliminación de claves de API
  • Adición de nuevas IPs en lista blanca a una clave de API existente
  • Actualización y adición de ajustes para una clave de API (por ejemplo: valores mínimo/máximo para el valor de markup)
  • Desactivación de claves de API

Uso de la clave de API

La API v2 requiere establecer 3 cabeceras en cada solicitud:

Cabecera Valor
x-api-public-key Tu clave pública obtenida durante la creación de la clave de API
x-api-timestamp Marca de tiempo UNIX
x-api-signature Una firma de la solicitud

El valor de la firma se genera utilizando hmac sha256. Los datos que se pasan son la concatenación en una cadena de la marca de tiempo, la representación en cadena del cuerpo de la solicitud y la clave pública, mientras que la clave privada se utiliza como clave para la función 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” })

Ejemplo de código de integración

i
Para la versión en Python, consulta nuestro

SDK en PyPi

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

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

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

// Paso 1. Prepara el cuerpo de la solicitud createOrder usando los datos de tipo obtenidos

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

// Paso 2. Prepara la firma basada en el par de claves y en los datos de la solicitud createOrder

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

// Paso 3. Llama al endpoint create-order de la 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(); 

Comparte este artículo: