RAYO
Webhook

Webhook CashOut (Saques)

Receba notificações sobre solicitações de saque. O webhook é disparado quando um saque é processado com sucesso ou falha.

Eventos

EventoDescrição
withdrawal.completedSaque realizado com sucesso
withdrawal.failedFalha no processamento do saque

Payload - Saque Concluído

webhook-cashout-completed.json
json
{
"event": "withdrawal.completed",
"timestamp": "2025-01-15T15:05:00Z",
"data": {
"id": 15,
"companyId": 1,
"idempotencyKey": "dc2b11dc8007409dbd421ed9014ac18c",
"value": 10.00,
"pixKey": "50651470862",
"pixKeyType": "CPF",
"creditorDocument": "11111111111111",
"description": "Saque via chave custom",
"currency": "BRL",
"enTransaction": "Successful",
"providerEndToEndId": "E48756121202501151505XYZ",
"providerTid": "wld-00000015",
"metadata": "{\"origem\":\"api\",\"pedidoId\":123}",
"createdAt": "2025-01-15T15:00:00Z",
"completedAt": "2025-01-15T15:05:00Z"
}
}

Payload - Saque com Falha

webhook-cashout-failed.json
json
{
"event": "withdrawal.failed",
"timestamp": "2025-01-15T15:05:00Z",
"data": {
"id": 16,
"companyId": 1,
"idempotencyKey": "wd_test_failed",
"value": 5000.00,
"pixKey": "99999999999",
"pixKeyType": "CPF",
"description": "Saque teste",
"currency": "BRL",
"enTransaction": "Failed",
"failReason": "Chave PIX não encontrada no DICT",
"metadata": null,
"createdAt": "2025-01-15T15:00:00Z"
}
}

Headers da Requisição

ParametroTipoDescricao
Content-Type
stringapplication/json
X-Webhook-Signature
stringAssinatura HMAC-SHA256 do payload
X-Webhook-Timestamp
stringTimestamp da requisição (Unix epoch)
X-Webhook-Id
stringID único da notificação (para idempotência)

Exemplo de Handler

webhook-cashout-handler.js
javascript
app.post('/webhook/rayo/cashout', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const timestamp = req.headers['x-webhook-timestamp'];
// Validar assinatura (ver Webhook PixIn para implementação completa)
if (!validateWebhookSignature(req.body, signature, timestamp, process.env.WEBHOOK_SECRET)) {
return res.status(401).json({ error: 'Invalid signature' });
}
const { event, data } = req.body;
switch (event) {
case 'withdrawal.completed':
console.log('Saque concluído:', data.id);
console.log('EndToEnd:', data.providerEndToEndId);
// Atualizar status no seu sistema
break;
case 'withdrawal.failed':
console.log('Saque falhou:', data.id);
console.log('Motivo:', data.failReason);
// Notificar e agendar retry se necessário
break;
}
res.status(200).json({ received: true });
});

Campos Principais

ParametroTipoDescricao
id
numberID interno do saque
idempotencyKey
stringChave de idempotência enviada na criação
value
numberValor do saque em reais
enTransaction
stringStatus: Successful ou Failed
providerEndToEndId
stringEndToEnd ID do PIX (quando sucesso)
providerTid
stringTID do provedor
failReason
stringMotivo da falha (quando falhou)
metadata
stringMetadados enviados na criação do saque

Metadata

O campo metadata que você enviou ao solicitar o saque será retornado exatamente como foi salvo. Se enviou um objeto JSON, ele virá como string JSON.