Docs/Webhooks
Webhooks
Receba notificações em tempo real sobre depósitos, saques, infrações/MED e conversões.
Entrega e retentativas
- - O envio é feito via HTTP POST com payload JSON.
- - Respostas fora da faixa 2xx acionam novas tentativas automáticas.
- - Recomenda-se validar a assinatura sobre o corpo bruto do POST e registrar idempotência por
data.id+event.
Assinatura do payload
- - A assinatura do payload é opcional, mas recomendada.
- - Header enviado:
X-Webhook-Signature(valor em hexadecimal, sem prefixo). - - Algoritmo:
HMAC-SHA256sobre o corpo bruto da requisição (a mesma sequência de bytes do JSON enviado no POST), interpretada como UTF-8. - - Não valide com
JSON.stringify(JSON.parse(rawBody)): a ordem das chaves e espaços podem divergir e a assinatura deixa de bater. - - Segredo: chave de assinatura exibida ao criar ou consultar o webhook no painel.
- - Em frameworks que fazem
parseautomático do body, use middleware de leitura bruta (raw) antes do parser para obter a string exata.
import { createHmac, timingSafeEqual } from 'node:crypto'
/**
* rawBody: string ou Buffer exatamente como recebido no POST (antes de JSON.parse).
* Depois de retornar true, faça JSON.parse(rawBody) para processar o evento.
*/
export const verifyWebhookSignature = (
rawBody: string | Buffer,
headerSignature: string,
secret: string
) => {
const bodyString = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8')
const expected = createHmac('sha256', secret).update(bodyString, 'utf8').digest('hex')
const providedBuffer = Buffer.from(String(headerSignature || ''), 'utf8')
const expectedBuffer = Buffer.from(expected, 'utf8')
if (providedBuffer.length !== expectedBuffer.length) {
return false
}
return timingSafeEqual(providedBuffer, expectedBuffer)
}Eventos de depósito USDT
| Evento | Status | Descrição |
|---|---|---|
| DEPOSIT_PENDING | pending | Depósito criado, QR Code disponível, aguardando pagamento. |
| DEPOSIT_PAID | paid | Depósito USDT confirmado e creditado na conta. |
| DEPOSIT_EXPIRED | expired | QR Code expirou sem pagamento. |
| DEPOSIT_CANCELED | canceled | Depósito cancelado antes da liquidação. |
{
"data": {
"id": "01KFAKEDEPOSIT000000000000",
"amount": 99.97,
"feeAmount": 1.25,
"netAmount": 97.37,
"type": "deposit",
"method": "usdt",
"currency": "usdt",
"network": "trx",
"address": "TJq2t8gHmwgymsJy447pqx5kTfKFW5wcsp",
"customer": {
"id": "01KFAKECUSTOMER000000000000",
"name": "João Silva Santos",
"email": "[email protected]",
"phone": "+5511987654321",
"document": "12345678909"
},
"metadata": {
"number": 1,
"string": "yes",
"boolean": true
},
"reference": "5b7f08f2-1f2f-4d59-a03f-6c6ca0f9fca2",
"expiresAt": "2026-03-30T13:15:00.000Z",
"createdAt": "2026-03-30T13:00:00.000Z",
"updatedAt": "2026-03-30T13:00:00.000Z",
"invoiceUrl": "https://checkout.aurepay.com.br/payment/01KFAKEDEPOSIT000000000000",
"status": "pending",
"qrCode": {
"payload": "TJq2t8gHmwgymsJy447pqx5kTfKFW5wcsp",
"imageEncoded": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOQAAADkCAYAAAB...[TRUNCATED]"
}
},
"event": "DEPOSIT_PENDING"
}Eventos de saque USDT
| Evento | Status | Descrição |
|---|---|---|
| WITHDRAW_PENDING | pending | Saque solicitado, aguardando processamento. |
| WITHDRAW_PROCESSING | processing | Saque em processamento pela instituição financeira. |
| WITHDRAW_PAID | paid | Saque pago ao destinatário. |
| WITHDRAW_FAILED | failed | Saque USDT falhou por dados inválidos da carteira ou indisponibilidade operacional. |
| WITHDRAW_CANCELED | canceled | Saque cancelado pelo administrador. |
{
"data": {
"id": "01KFAKEWITHDRAW00000000000",
"amount": 99.97,
"feeAmount": 1.25,
"totalAmount": 104.36,
"type": "withdraw",
"method": "usdt",
"currency": "usdt",
"network": "trx",
"address": "TJq2t8gHmwgymsJy447pqx5kTfKFW5wcsp",
"networkFee": 1.8,
"customer": {
"id": "01KFAKECUSTOMER000000000000",
"name": "João Silva Santos",
"email": "[email protected]",
"phone": "+5511987654321",
"document": "12345678909"
},
"metadata": {
"number": 1,
"string": "yes",
"boolean": true
},
"reference": "bb0fb995-9fd9-4f8e-bec9-6389b9a4f8d7",
"createdAt": "2026-03-30T13:10:00.000Z",
"updatedAt": "2026-03-30T13:10:00.000Z",
"status": "pending"
},
"event": "WITHDRAW_PENDING"
}Eventos de conversão
| Evento | Status | Descrição |
|---|---|---|
| CONVERSION_PENDING | pending | Conversão criada e aguardando evolução do fluxo. |
| CONVERSION_PROCESSING | processing | Conversão em processamento. |
| CONVERSION_PAID | paid | Conversão finalizada com sucesso. |
| CONVERSION_FAILED | failed | Conversão falhou durante o processamento. |
| CONVERSION_EXPIRED | expired | Conversão expirada por timeout do fluxo. |
| CONVERSION_CANCELED | canceled | Conversão cancelada manualmente. |
{
"data": {
"id": "01KFAKECONVERSION000000000",
"type": "conversion",
"source": {
"type": "balance",
"asset": "usdt",
"amount": 35,
"feeAmount": 1.75,
"netAmount": 33.25
},
"target": {
"type": "balance",
"asset": "brl",
"amount": 177.06,
"price": 5.325
},
"reference": "17bfaf35-cf64-438b-89d8-f6e78f9ad15a",
"createdAt": "2026-03-30T13:15:00.000Z",
"updatedAt": "2026-03-30T13:15:00.000Z",
"status": "pending"
},
"event": "CONVERSION_PENDING"
}