Comprar Cripto
Toda compra de criptoativos na XGate é realizada exclusivamente com o saldo em Reais (BRL) da própria empresa. A XGate debita o valor em BRL do saldo corporativo e transfere os tokens adquiridos diretamente para a carteira de destino da empresa informada na chamada, sem intermediação de custódia.
Endpoint
- Método: POST
https://api.xgateglobal.com/crypto/purchases
Requisição
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer <seu_token> | O token JWT obtido no login. |
Como Comprar Cripto
A compra com o saldo BRL da empresa pode ser solicitada de forma avulsa (diretamente nesta rota) ou programada como uma instrução adicional vinculada à confirmação de um depósito Pix via POST /deposit:
- Com Cotação (Saldo BRL)
- A Mercado (Saldo BRL)
- Instrução Adicional no Pix (POST /deposit)
Compra utilizando o preço garantido por 30 segundos obtido através de uma cotação prévia (quoteId). O ativo, a rede e o valor são derivados da cotação.
{
"externalId": "pedido-7781",
"quoteId": "l3m8Qm1n0pV2cXk5dY9sTg4hWz7aB6eR1uJ0****",
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5Kc****"
}
Compra instantânea debitando o saldo disponível em BRL pelo preço do momento da execução. Os campos asset, network e amount são obrigatórios.
{
"externalId": "pedido-7782",
"asset": "USDT",
"network": "TRON",
"amount": "1500.00",
"addressId": "66f1a2b3c4d5e6f70819****"
}
Você pode criar uma cobrança Pix em POST /deposit e anexar o objeto purchase como uma instrução adicional.
Assim que o Pix for pago e compensado no saldo da empresa, a sua empresa compra o criptoativo diretamente da tesouraria da XGate com o saldo disponível:
{
"amount": 1500.0,
"customerId": "6a1a379e1fe9bfd92d2f****",
"currency": {
"_id": "6728f0a2cba3ac9ea300****",
"name": "BRL",
"type": "PIX",
"symbol": "R$"
},
"purchase": {
"asset": "USDT",
"network": "POLYGON",
"address": "0xf73345519993edc1006388b5596100d2dd51****"
},
"externalId": "pedido-7783"
}
Body da Chamada Direta (POST /crypto/purchases)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
externalId | string | Sim | Identificador da compra no seu sistema. 1 a 128 caracteres ASCII imprimíveis, sem / e sem começar com $. Único por empresa. |
address | string | Um dos dois | Endereço da carteira externa de destino da empresa, compatível com a rede (sem memo/tag). |
addressId | string | Um dos dois | ID de endereço pré-cadastrado no painel (buy.addresses[].addressId de Opções). |
quoteId | string | Forma com cotação | ID da cotação obtida previamente. Não pode ser enviado em conjunto com asset, network ou amount. |
asset, network, amount | string | Forma a mercado | Ativo (USDT/USDC), rede e valor em BRL a ser debitado do saldo (string com 2 casas decimais). |
- Mesmo
externalId+ mesmo corpo → 200 OK retornando o registro da compra já processada. - Mesmo
externalId+ corpo diferente →409 EXTERNAL_ID_CONFLICT.
Respostas (Responses)
Sucesso (201 Created)
Retornado após o valor ser debitado do saldo corporativo e a execução ser iniciada (status EXECUTING):
{
"id": "6710c2f4a1b2c3d4e5f6****",
"externalId": "pedido-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: Status inicial apenas quando a ordem foi programada como instrução adicional vinculada a um depósito Pix (channel = "DEPOSIT"), enquanto o Pix ainda aguarda pagamento.- Sem aprovação automática (
buy.autoApproval = false): a compra aguarda liberação na fila de compliance da XGate (PENDING_APPROVAL). O valor e a cotação permanecem congelados. - Com aprovação automática: a ordem prossegue imediatamente para despacho on-chain até
DELIVERED. - Em
DELIVERED, o hash da transação pública na blockchain é disponibilizado emdelivery.txHash. - Em
REJECTED, caso a compra não possa ser finalizada, o valor em BRL é estornado integralmente para o saldo da empresa (rejection.refunded = true).
Acompanhe as atualizações de status em Consultar Compra ou por meio dos Webhooks de Compra (purchase.*).
Objeto da compra
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID da compra na XGate. |
externalId | string | ID da compra no seu sistema. |
status | string | PENDING_PAYMENT · EXECUTING · PENDING_APPROVAL · DELIVERED · REJECTED · EXPIRED. |
channel | string | Origem da instrução: API (POST direto), DASHBOARD (painel) ou DEPOSIT (compra disparada após confirmação de Pix). |
asset, network, address | string | Destino dos ativos cripto na rede. |
amount | string | null | Total em BRL debitado do saldo corporativo da empresa. |
rate | string | null | Preço de 1 unidade do ativo em BRL (8 casas decimais), fixado na execução, com a margem já embutida. |
cryptoAmount | string | null | Quantidade bruta de cripto adquirida (amount ÷ rate, 6 casas decimais). |
networkFee | string | null | Custo do gás de rede deduzido da quantidade final enviada. |
deliveredAmount | string | null | Total efetivamente entregue na carteira externa: cryptoAmount − networkFee. |
quoteId | string | null | Cotação garantida utilizada (retorna null na compra a mercado). |
depositId | string | null | ID do depósito de origem, quando a compra foi disparada após confirmação do Pix (channel = "DEPOSIT"). |
approval | object | required (boolean), decision (APPROVED | REJECTED | AUTO | null), decidedAt. |
delivery | object | status (WAITING_APPROVAL · QUEUED · SUBMITTED · CONFIRMING · CONFIRMED · null), txHash, confirmedAt. |
rejection | object | null | Detalhes em caso de recusa: reason, message e refunded. |
executedAt, createdAt | string | Registros de data e hora em padrão ISO 8601 (UTC). |
Erros Comuns
| Status | Reason |
|---|---|
| 400 | VALIDATION_FAILED, AMOUNT_MUST_BE_STRING, CONFLICTING_FIELDS |
| 401 | UNAUTHORIZED |
| 403 | PERMISSION_DENIED, COMPANY_BLOCKED, ALLOWED_IPS_REQUIRED, CLIENT_IP_NOT_ALLOWED, BUY_DISABLED |
| 404 | SAVED_ADDRESS_NOT_FOUND, QUOTE_NOT_FOUND |
| 409 | EXTERNAL_ID_CONFLICT, QUOTE_EXPIRED, QUOTE_ALREADY_USED |
| 422 | ASSET_NOT_SUPPORTED, NETWORK_NOT_SUPPORTED, AMOUNT_BELOW_MIN, AMOUNT_ABOVE_MAX, ADDRESS_INVALID_FOR_NETWORK, INSUFFICIENT_BALANCE, PRICE_UNSTABLE |
| 429 | RATE_LIMITED, DAILY_CAP_EXCEEDED, OUTFLOW_HOURLY_CAP_EXCEEDED |
| 503 | PRICE_STALE, NETWORK_FEE_UNAVAILABLE, CRYPTO_TEMPORARILY_UNAVAILABLE, SERVICE_OVERLOADED |
Integração
- Node.js
const axios = require("axios");
(async () => {
const email = "seu_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. Obter cotação com preço garantido por 30s
const quote = await axios.post(`${url_api}/crypto/quotes`, {
asset: "USDT",
network: "TRON",
amount: "1500.00"
}, { headers });
// 2. Executar compra debitando do saldo BRL da empresa
const { data } = await axios.post(`${url_api}/crypto/purchases`, {
externalId: "pedido-7781",
quoteId: quote.data.quoteId,
address: "TQn9Y2khEsLJW1ChVWFMSMeRDow5Kc****"
}, { headers });
console.log("ID da Compra:", data.id, "Status:", data.status);
} catch (error) {
console.log(error.response?.data?.reason, error.response?.data?.message);
}
})();