Pular para o conteúdo principal

Cotação e Estimativa

Duas rotas com o mesmo corpo:

RotaUso
POST /crypto/quotesGera uma cotação com quoteId e preço garantido por quoteTtlSeconds (30 s), para usar na compra. Pedir e não usar não custa nada.
POST /crypto/quotes/estimateSó uma estimativa: não gera quoteId e nada é reservado. Serve para mostrar o valor aproximado ("≈") antes de comprar.

Endpoint​

  • Método: POST
Cotação
https://api.xgateglobal.com/crypto/quotes
Estimativa
https://api.xgateglobal.com/crypto/quotes/estimate

Requisição​

Headers Obrigatórios​

HeaderValorDescrição
AuthorizationBearer <seu_token>O token JWT obtido no login.

Body (Corpo da Requisição)​

CampoTipoObrigatórioDescrição
assetstringSimUSDT ou USDC.
networkstringSimPOLYGON, ETHEREUM, TRON ou SOLANA (conforme o ativo).
amountstringSimTotal em BRL que será debitado do saldo, string com 2 casas (ex: "1500.00").
{
"asset": "USDT",
"network": "TRON",
"amount": "1500.00"
}
Preço com margem embutida

O amount é o total em BRL debitado do saldo. O preço unitário (rate) já embute a margem comercial. Não há cobrança de taxa adicional — apenas o desconto do gás da rede (networkFee) na entrega da cripto.


Respostas (Responses)​

Sucesso​

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 com os mesmos campos, sem quoteId e expiresAt, e com estimatedAt (data da estimativa).

Descrição dos Campos​

CampoTipoDescrição
quoteIdstring(Só cotação) Identificador para usar em POST /crypto/purchases.
expiresAtstring(Só cotação) Até quando o preço está garantido.
estimatedAtstring(Só estimativa) Momento da estimativa.
asset, networkstringAtivo e rede cotados.
amountstringTotal em BRL a debitar.
ratestringPreço de 1 unidade do ativo em BRL (8 casas), já com a margem embutida.
cryptoAmountstringQuantidade bruta comprada (6 casas): amount ÷ rate.
networkFeestringGás da rede, descontado da entrega.
deliveredAmountstringQuantidade final que chega na carteira: cryptoAmount − networkFee.

Como o valor é calculado​

cryptoAmount    = amount ÷ rate        (para baixo, 6 casas)
deliveredAmount = cryptoAmount − networkFee

Erros Comuns​

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

Veja o significado de cada código em Códigos de Erro.


Integração​

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

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

// Cotação com preço garantido 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
}
})()