Saltar al contenido principal

Comprar Cripto

Toda compra de criptoactivos en XGate se realiza exclusivamente con el saldo en Reales (BRL) de la propia empresa directamente de la tesorería de XGate. XGate debita el valor en BRL del saldo corporativo y transfiere los tokens adquiridos directamente a la billetera de destino de la empresa indicada en la llamada, sin intermediación de custodia.


Endpoint​

  • Método: POST
URL del Endpoint
https://api.xgateglobal.com/crypto/purchases

Solicitud (Request)​

Headers Obligatorios​

HeaderValorDescripción
AuthorizationBearer <su_token>El token JWT obtenido al inicio de sesión.

Modalidades de Compra​

La compra con el saldo BRL de la empresa puede solicitarse de manera puntual (directamente en este endpoint) o programarse como una instrucción adicional vinculada a la confirmación de un depósito Pix vía POST /deposit:

Compra utilizando el precio garantizado por 30 segundos obtenido mediante una cotización previa (quoteId). El activo, la red y el monto se derivan de la cotización.

{
"externalId": "orden-7781",
"quoteId": "l3m8Qm1n0pV2cXk5dY9sTg4hWz7aB6eR1uJ0****",
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5Kc****"
}

Body de la Solicitud Directa (POST /crypto/purchases)​

CampoTipoObligatorioDescripción
externalIdstringSíIdentificador de la compra en su sistema. 1 a 128 caracteres ASCII imprimibles, sin / y sin iniciar con $. Único por empresa.
addressstringUno de ambosDirección de la billetera externa de destino de la empresa, compatible con la red (sin memo/tag).
addressIdstringUno de ambosID de dirección preregistrada en el panel (buy.addresses[].addressId de Opciones).
quoteIdstringModo con cotiz.ID de la cotización obtenida previamente. No puede enviarse junto con asset, network o amount.
asset, network, amountstringModo a mercadoActivo (USDT/USDC), red y total en BRL debitado del saldo corporativo (cadena con 2 decimales).
Idempotencia mediante externalId
  • Mismo externalId + mismo cuerpo → 200 OK devolviendo el registro de la compra ya procesada.
  • Mismo externalId + cuerpo diferente → 409 EXTERNAL_ID_CONFLICT.

Respuestas (Responses)​

Éxito (201 Created)​

Se devuelve una vez que el monto ha sido debitado del saldo corporativo y comienza la ejecución (estado EXECUTING):

{
"id": "6710c2f4a1b2c3d4e5f6****",
"externalId": "orden-7781",
"status": "EXECUTING",
"channel": "API",
"asset": "USDT",
"network": "TRON",
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5Kc****",
"amount": "1500.00",
"rate": "5.45400000",
"cryptoAmount": "275.027502",
"networkFee": "0.012000",
"deliveredAmount": "275.015502",
"quoteId": "l3m8Qm1n0pV2cXk5dY9sTg4hWz7aB6eR1uJ0****",
"depositId": null,
"approval": { "required": true, "decision": null, "decidedAt": null },
"delivery": { "status": "WAITING_APPROVAL", "txHash": null, "confirmedAt": null },
"rejection": null,
"executedAt": "2026-10-13T14:03:40.512Z",
"createdAt": "2026-10-13T14:03:40.204Z",
"updatedAt": "2026-10-13T14:03:40.512Z"
}

Ciclo de vida​

(PENDING_PAYMENT)* ──► EXECUTING ──► PENDING_APPROVAL ──► DELIVERED
│ │
└────────────────┴──────────► REJECTED
  • *PENDING_PAYMENT: Estado inicial únicamente cuando se programa como instrucción adicional asociada a un depósito Pix (channel = "DEPOSIT"), mientras el Pix aguarda pago.
  • Sin aprobación automática (buy.autoApproval = false): la compra entra a la cola de aprobación de XGate (PENDING_APPROVAL). El precio y el monto se mantienen fijos.
  • Con aprobación automática: la orden avanza directamente al despacho on-chain hasta DELIVERED.
  • En DELIVERED, el hash de la transacción pública en la blockchain se entrega en delivery.txHash.
  • En REJECTED, en caso de no concretarse la compra, el valor en BRL se reembolsa íntegramente al saldo corporativo (rejection.refunded = true).

Realice seguimiento mediante Consultar Compra o a través de los Webhooks de Compra (purchase.*).

Objeto de la compra​

CampoTipoDescripción
idstringID de la compra en XGate.
externalIdstringID de la compra en su sistema.
statusstringPENDING_PAYMENT · EXECUTING · PENDING_APPROVAL · DELIVERED · REJECTED · EXPIRED.
channelstringOrigen de la instrucción: API (POST directo), DASHBOARD (panel) o DEPOSIT (compra tras confirmación de Pix).
asset, network, addressstringDestino de los activos cripto en la red.
amountstring | nullTotal en BRL debitado del saldo corporativo de la empresa.
ratestring | nullPrecio de 1 unidad del activo en BRL (8 decimales), fijado en la ejecución, con el margen incluido.
cryptoAmountstring | nullCantidad bruta de cripto adquirida (amount ÷ rate, 6 decimales).
networkFeestring | nullCosto del gas de red deducido del envío final.
deliveredAmountstring | nullTotal efectivamente entregado en la billetera externa: cryptoAmount − networkFee.
quoteIdstring | nullCotización garantizada utilizada (devuelve null en compras a mercado).
depositIdstring | nullID del depósito de origen, cuando se originó tras confirmación de Pix (channel = "DEPOSIT").
approvalobjectrequired (boolean), decision (APPROVED | REJECTED | AUTO | null), decidedAt.
deliveryobjectstatus (WAITING_APPROVAL · QUEUED · SUBMITTED · CONFIRMING · CONFIRMED · null), txHash, confirmedAt.
rejectionobject | nullDetalles de rechazo: reason, message y refunded.
executedAt, createdAtstringRegistros de fecha y hora en formato ISO 8601 (UTC).

Erros Comunes​

StatusReason
400VALIDATION_FAILED, AMOUNT_MUST_BE_STRING, CONFLICTING_FIELDS
401UNAUTHORIZED
403PERMISSION_DENIED, COMPANY_BLOCKED, ALLOWED_IPS_REQUIRED, CLIENT_IP_NOT_ALLOWED, BUY_DISABLED
404SAVED_ADDRESS_NOT_FOUND, QUOTE_NOT_FOUND
409EXTERNAL_ID_CONFLICT, QUOTE_EXPIRED, QUOTE_ALREADY_USED
422ASSET_NOT_SUPPORTED, NETWORK_NOT_SUPPORTED, AMOUNT_BELOW_MIN, AMOUNT_ABOVE_MAX, ADDRESS_INVALID_FOR_NETWORK, INSUFFICIENT_BALANCE, PRICE_UNSTABLE
429RATE_LIMITED, DAILY_CAP_EXCEEDED, OUTFLOW_HOURLY_CAP_EXCEEDED
503PRICE_STALE, NETWORK_FEE_UNAVAILABLE, CRYPTO_TEMPORARILY_UNAVAILABLE, SERVICE_OVERLOADED

Integración​

const axios = require("axios");

(async () => {
const email = "su_email@dominio.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}` };

// 1. Obtener cotización garantizada por 30s
const quote = await axios.post(`${url_api}/crypto/quotes`, {
asset: "USDT",
network: "TRON",
amount: "1500.00"
}, { headers });

// 2. Ejecutar compra de cripto directamente de la tesorería de XGate con el saldo BRL de la empresa
const { data } = await axios.post(`${url_api}/crypto/purchases`, {
externalId: "orden-7781",
quoteId: quote.data.quoteId,
address: "TQn9Y2khEsLJW1ChVWFMSMeRDow5Kc****"
}, { headers });

console.log("ID de Compra:", data.id, "Estado:", data.status);
} catch (error) {
console.log(error.response?.data?.reason, error.response?.data?.message);
}
})();