Saltar al contenido principal

Cotización y Estimación

Dos rutas con el mismo cuerpo:

RutaUso
POST /crypto/quotesGenera una cotización con quoteId y precio garantizado por quoteTtlSeconds (30 s), para usar en la compra. Solicitarla y no usarla no tiene costo.
POST /crypto/quotes/estimateSolo una estimación: no genera quoteId y nada queda reservado. Sirve para mostrar el valor aproximado ("≈") antes de comprar.

Endpoint​

  • Método: POST
Cotización
https://api.xgateglobal.com/crypto/quotes
Estimación
https://api.xgateglobal.com/crypto/quotes/estimate

Solicitud​

Headers Obligatorios​

HeaderValorDescripción
AuthorizationBearer <su_token>El token JWT obtenido en el login.

Body (Cuerpo de la Solicitud)​

CampoTipoObligatorioDescripción
assetstringSíUSDT o USDC.
networkstringSíPOLYGON, ETHEREUM, TRON o SOLANA (según el activo).
amountstringSíTotal en BRL que se debitará del saldo, string con 2 decimales (ej: "1500.00").
{
"asset": "USDT",
"network": "TRON",
"amount": "1500.00"
}
Precio con margen incorporado

El amount es el total en BRL debitado del saldo. El precio unitario (rate) ya incluye el margen comercial. No hay cobro de comisiones adicionales; únicamente se descuenta el gas de la red (networkFee) en la entrega de la criptomoneda[cite: 17].


Respuestas (Responses)​

Éxito​

POST /crypto/quotes responde 201 Created:

{
"quoteId": "l3m8Qm1n0pV2cXk5dY9sTg4hWz7aB6eR1uJ0oK2qF3i",
"expiresAt": "2026-10-13T14:03:52.114Z",
"asset": "USDT",
"network": "TRON",
"amount": "1500.00",
"rate": "5.45400000",
"cryptoAmount": "275.027502",
"networkFee": "0.012000",
"deliveredAmount": "275.015502"
}

POST /crypto/quotes/estimate responde 200 OK con los mismos campos, sin quoteId ni expiresAt, y con estimatedAt (fecha de la estimación).

Descripción de los Campos​

CampoTipoDescripción
quoteIdstring(Solo cotización) Identificador para usar en POST /crypto/purchases.
expiresAtstring(Solo cotización) Hasta cuándo está garantizado el precio.
estimatedAtstring(Solo estimación) Momento de la estimación.
asset, networkstringActivo y red cotizados.
amountstringTotal en BRL a debitar.
ratestringPrecio de 1 unidad del activo en BRL (8 decimales), ya con el margen incluido.[cite: 17]
cryptoAmountstringCantidad bruta comprada (6 decimales): amount ÷ rate.[cite: 17]
networkFeestringGas de la red, descontado de la entrega.[cite: 17]
deliveredAmountstringCantidad final entregada en la billetera: cryptoAmount − networkFee.[cite: 17]

Cómo se calcula el valor​

cryptoAmount    = amount ÷ rate        (hacia abajo, 6 decimales)
deliveredAmount = cryptoAmount − networkFee

Erros Comunes​

StatusReason
400VALIDATION_FAILED, AMOUNT_MUST_BE_STRING
401UNAUTHORIZED
403PERMISSION_DENIED, COMPANY_MISMATCH, COMPANY_BLOCKED, ALLOWED_IPS_REQUIRED, CLIENT_IP_NOT_ALLOWED, CRYPTO_DISABLED, CRYPTO_API_DISABLED, BUY_DISABLED
422ASSET_NOT_SUPPORTED, NETWORK_NOT_SUPPORTED, AMOUNT_BELOW_MIN, AMOUNT_ABOVE_MAX, AMOUNT_TOO_LOW_FOR_NETWORK_FEE, PRICE_UNSTABLE
429RATE_LIMITED
503PRICE_STALE, NETWORK_FEE_UNAVAILABLE, CONFIGURATION_UNAVAILABLE, SERVICE_OVERLOADED

Vea el significado de cada código en Códigos de Error.


Integración​

const axios = require("axios");

(async () => {
const email = "your_email@domain.com";
const password = "**********";

try {
const url_api = "https://api.xgateglobal.com";
const login = await axios.post(`${url_api}/auth/token`, { email, password });
const headers = { "Authorization": `Bearer ${login.data.token}` };
const body = { asset: "USDT", network: "TRON", amount: "1500.00" };

// Estimación (nada queda reservado)
const estimate = await axios.post(`${url_api}/crypto/quotes/estimate`, body, { headers });
console.log("≈", estimate.data.deliveredAmount, estimate.data.asset);

// Cotización con precio garantizado por 30 segundos
const quote = await axios.post(`${url_api}/crypto/quotes`, body, { headers });
console.log(quote.data.quoteId, quote.data.expiresAt);
} catch (error) {
console.log(error.response.data.reason, error.response.data.message); // Error
}
})()