API PaySync
Integre pagamentos PIX na sua aplicação em minutos. Simples, segura e feita para desenvolvedores.
O que é a PaySync?
A PaySync é um gateway de pagamento que simplifica cobranças PIX. Nossa API foi construída com foco em simplicidade: endpoints intuitivos, respostas consistentes e zero burocracia.
Baseada em intenção
Cada endpoint faz exatamente o que o nome diz
Rápida
PIX gerado em milissegundos, callback instantâneo
Consistente
Respostas padronizadas com error/data em toda a API
Início rápido
- Crie uma API Key no painel
- Chame
POST /v1/paymentscom o valor ou produto - O cliente paga o PIX (brCode retornado)
- Receba o callback automático na sua URL
curl -X POST https://api.usepaysync.com/v1/payments \
-H "Authorization: Bearer ps_live_sua_chave" \
-H "Content-Type: application/json" \
-d '{
"productId": "665f1a2b3c4d5e6f7a8b9c0d",
"callbackUrl": "https://seu-site.com/webhook"
}'{
"paymentId": "psa_a1b2c3d4e5f6...",
"status": "pending",
"amountCents": 2990,
"pix": {
"brCode": "00020126580014br.gov.bcb.pix...",
"qrCodeImage": "https://api.openpix.com.br/..."
},
"expiresAt": "2026-03-18T12:30:00.000Z"
}Autenticação
Todas as requisições exigem uma API Key no header Authorization.
Authorization: Bearer ps_live_sua_chave_aqui
Crie e gerencie suas chaves em Dashboard → API. Cada conta pode ter até 10 chaves ativas.
Erros
A API retorna erros no formato JSON com o campo error:
{ "error": "Product not found or inactive" }400401404429502Produtos
Criar produto
/v1/productsCria um produto que pode ser referenciado em pagamentos e assinaturas. Limite: 500 produtos por conta/ambiente.
namereqdescriptionpriceCentsreqcurrencymetadatacurl -X POST https://api.usepaysync.com/v1/products \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Plano Premium",
"priceCents": 4990,
"description": "Acesso mensal"
}'{
"_id": "60f7b2a1c3e4d5f6a7b8c9d0",
"name": "Plano Premium",
"description": "Acesso mensal",
"priceCents": 4990,
"currency": "BRL",
"active": true,
"metadata": "{}",
"createdAt": "2026-03-18T10:00:00.000Z"
}Listar produtos
/v1/productsincludeInactive{
"products": [
{ "_id": "60f7...", "name": "Plano Premium", "priceCents": 4990, "currency": "BRL", "active": true, "createdAt": "..." }
]
}Obter produto
/v1/products/:idRetorna o produto individual com os mesmos campos da listagem.
Atualizar produto
/v1/products/:idTodos os campos são opcionais. Envie apenas o que deseja alterar.
namedescriptionpriceCentsactivemetadataDeletar produto
/v1/products/:id{ "deleted": true }Pagamentos PIX
Criar pagamento
/v1/paymentsCria um pagamento PIX. Vincule a um produto (productId) ou envie valor livre (valueCents).
productIdvalueCentsdescriptioncallbackUrlcustomer.namecustomer.emailcustomer.externalIdmetadataproductId OU valueCents. Se ambos forem enviados, o preço do produto prevalece.curl -X POST https://api.usepaysync.com/v1/payments \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"productId": "665f1a2b3c4d5e6f7a8b9c0d",
"callbackUrl": "https://seu-site.com/webhook",
"customer": {
"name": "João Silva",
"email": "joao@email.com"
}
}'{
"paymentId": "psa_a1b2c3d4e5f6...",
"status": "pending",
"amountCents": 4990,
"currency": "BRL",
"productName": "Produto Premium",
"pix": {
"brCode": "00020126580014br.gov.bcb.pix0136...",
"qrCodeImage": "https://api.openpix.com.br/..."
},
"expiresAt": "2026-03-18T12:30:00.000Z"
}brCode é o PIX Copia e Cola. O qrCodeImage é a URL da imagem do QR Code. Pagamento expira em 30 minutos.Consultar pagamento
/v1/payments/:paymentIdConsulta o status de um pagamento pelo paymentId.
{
"paymentId": "psa_a1b2c3d4...",
"status": "paid",
"amountCents": 4990,
"paidAt": "2026-03-18T12:05:00.000Z"
}Status: pending · paid · expired · refunded
Listar pagamentos
/v1/paymentslimitoffsetstatus{
"payments": [ ... ],
"total": 42,
"limit": 50,
"offset": 0
}Cobranças PIX avulsas
Criar cobrança
/v1/chargesCria uma cobrança PIX avulsa com valor customizado, sem necessidade de produto cadastrado.
valueCentsreqdescriptioncallbackUrlcustomer.namecustomer.emailcustomer.externalIdmetadatacurl -X POST https://api.usepaysync.com/v1/charges \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"valueCents": 1200,
"description": "Pagamento avulso",
"callbackUrl": "https://seu-site.com/webhook"
}'{
"paymentId": "psc_a1b2c3d4e5f6...",
"status": "pending",
"amountCents": 1200,
"currency": "BRL",
"environment": "live",
"pix": {
"brCode": "00020126580014br.gov.bcb.pix0136...",
"qrCodeImage": "https://api.openpix.com.br/..."
},
"expiresAt": "2026-03-18T12:30:00.000Z"
}psc_ indica cobrança avulsa. psa_ indica pagamento vinculado a produto.Consultar cobrança
/v1/charges/:paymentIdConsulta o status de uma cobrança avulsa pelo paymentId.
{
"paymentId": "psc_a1b2c3d4...",
"status": "paid",
"amountCents": 1200,
"currency": "BRL",
"description": "Pagamento avulso",
"customer": { "name": "", "email": "", "externalId": "" },
"metadata": "{}",
"paidAt": "2026-03-18T12:05:00.000Z",
"expiresAt": "2026-03-18T12:30:00.000Z",
"createdAt": "2026-03-18T12:00:00.000Z"
}PIX dividido entre N contas
Criar split charge
/v1/split-chargesCria uma cobrança PIX que, ao ser paga, é automaticamente dividida entre múltiplos beneficiários (contas paysync já cadastradas). Útil para marketplaces, comissionamento e gestão de royalties.
splits: 2 a 10 beneficiários- Cada
percentage: entre 0.01 e 99.99 (não aceita 0% nem 100% individual) - Soma das percentages: EXATAMENTE 100.00 (tolerância 0.01)
recipientEmailúnico por charge (sem duplicar)- Beneficiário deve ser conta paysync existente (validado por email)
- Beneficiário não pode ser o dono da API key
amountCents: integer entre 80 (R$ 0.80) e 500.000 (R$ 5.000)
amountCentsreqamountsplits[]reqsplits[].recipientEmailreqsplits[].percentagereqdescriptioncallbackUrlcustomer.namecustomer.emailcustomer.externalIdcurl -X POST https://api.usepaysync.com/v1/split-charges \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"amountCents": 10000,
"description": "Venda compartilhada",
"splits": [
{ "recipientEmail": "vendedor1@example.com", "percentage": 50 },
{ "recipientEmail": "vendedor2@example.com", "percentage": 50 }
],
"customer": { "name": "Cliente", "email": "cliente@example.com" }
}'{
"paymentId": "psplit_a1b2c3d4...",
"status": "pending",
"amountCents": 10000,
"currency": "BRL",
"environment": "live",
"pix": {
"brCode": "00020126360014BR.GOV.BCB.PIX...",
"qrCodeImage": null
},
"splits": [
{ "recipientEmail": "ve***@example.com", "percentage": 50 },
{ "recipientEmail": "ve***@example.com", "percentage": 50 }
],
"expiresAt": "2026-05-28T12:30:00.000Z"
}Fluxo de pagamento:
- Você cria a split charge → recebe
brCode(PIX copia-e-cola) - Cliente paga o valor cheio (10000 cents = R$ 100,00)
- Paysync deduz a taxa do gateway do total (ex: 2% + R$ 0,50 = R$ 2,50)
- Valor líquido (R$ 97,50) é dividido conforme as percentages
- Cada beneficiário recebe na própria carteira paysync
- O último beneficiário recebe
netCents - soma(outros)para garantir centavo exato
- A: floor(9750 × 0.3333) = 3249 cents (R$ 32,49)
- B: floor(9750 × 0.3333) = 3249 cents (R$ 32,49)
- C: 9750 − 3249 − 3249 = 3252 cents (R$ 32,52)
Consultar split charge
/v1/split-charges/:paymentIdRetorna o status atual + breakdown de cada split (valor creditado em centavos e timestamp).
{
"paymentId": "psplit_a1b2c3d4...",
"status": "paid",
"amountCents": 10000,
"gatewayFeeCents": 250,
"netAmountCents": 9750,
"currency": "BRL",
"environment": "live",
"pix": { "brCode": "..." },
"splits": [
{
"recipientEmail": "ve***@example.com",
"percentage": 50,
"amountCents": 4875,
"creditedAt": "2026-05-28T12:15:00.000Z"
},
{
"recipientEmail": "ve***@example.com",
"percentage": 50,
"amountCents": 4875,
"creditedAt": "2026-05-28T12:15:00.000Z"
}
],
"paidAt": "2026-05-28T12:15:00.000Z",
"expiresAt": "2026-05-28T12:30:00.000Z",
"createdAt": "2026-05-28T12:00:00.000Z"
}Status values: pending | paid | expired | refunded | cancelled.
Pagamentos por Cartão
Criar pagamento cartão
/v1/card-paymentsCria um pagamento por cartão de crédito via Stripe Checkout. O cliente é redirecionado para a página de checkout.
valueCentsreqdescriptioncallbackUrlcustomer.namecustomer.emailcustomer.externalIdmetadatasuccessUrlcancelUrl{
"orderCode": "JUE7Y9MPSX",
"status": "pending",
"amountCents": 4990,
"currency": "BRL",
"checkoutUrl": "https://checkout.stripe.com/...",
"expiresAt": "2026-03-18T12:30:00.000Z"
}checkoutUrl. Use successUrl e cancelUrl para controlar a experiência pós-pagamento.Consultar pagamento cartão
/v1/card-payments/:orderCodeConsulta o status de um pagamento por cartão pelo orderCode.
{
"orderCode": "JUE7Y9MPSX",
"status": "paid",
"amount": 49.90,
"amountCents": 4990,
"currency": "BRL",
"description": "Pagamento Cartao",
"checkoutUrl": null,
"paidAt": "2026-03-18T12:05:00.000Z",
"createdAt": "2026-03-18T12:00:00.000Z"
}Status: pending · paid · expired · canceled
Listar pagamentos cartão
/v1/card-paymentslimitoffsetstatus{
"payments": [
{ "orderCode": "JUE7Y9MPSX", "status": "paid", "amountCents": 4990, "paidAt": "...", "createdAt": "..." }
],
"total": 10,
"limit": 50,
"offset": 0
}Assinaturas
Criar assinatura
/v1/subscriptionsCria uma assinatura PIX recorrente vinculada a um produto. A cobrança é gerada automaticamente de acordo com a frequência escolhida.
productIdreqcustomer.namereqcustomer.externalIdfrequencydayGenerateChargecallbackUrlmetadatacurl -X POST https://api.usepaysync.com/v1/subscriptions \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"productId": "665f1a2b3c4d5e6f7a8b9c0d",
"customer": { "name": "João Silva" },
"frequency": "MONTHLY",
"dayGenerateCharge": 15,
"callbackUrl": "https://seu-site.com/webhook"
}'{
"paymentId": "psa_sub_a1b2c3d4...",
"status": "pending",
"type": "subscription",
"subscriptionId": "sub_xyz...",
"amountCents": 4990,
"currency": "BRL",
"productName": "Plano Premium",
"frequency": "MONTHLY",
"environment": "live",
"pix": {
"brCode": "00020126580014br.gov.bcb.pix...",
"paymentLinkUrl": "https://openpix.com.br/pay/..."
},
"dayGenerateCharge": 15
}WEEKLY (semanal), MONTHLY (mensal, padrão), SEMIANNUALLY (semestral) e ANNUALLY (anual).Listar assinaturas
/v1/subscriptionsRetorna as assinaturas criadas na sua conta com paginação e filtros.
limitoffsetstatuscurl -X GET "https://api.usepaysync.com/v1/subscriptions?limit=20&status=pending" \ -H "Authorization: Bearer ps_live_..."
{
"subscriptions": [
{
"paymentId": "psa_sub_a1b2c3d4...",
"subscriptionId": "sub_xyz...",
"status": "pending",
"amountCents": 4990,
"currency": "BRL",
"productName": "Plano Premium",
"customer": { "name": "João Silva", "email": "", "externalId": "user_123" },
"metadata": "{}",
"paidAt": null,
"createdAt": "2026-03-18T10:00:00.000Z"
}
],
"total": 5,
"limit": 20,
"offset": 0
}Sandbox
Ambiente de Teste
Use uma API key ps_test_... para operar em sandbox. Nesse modo, pagamentos e cobranças são criados sem gateway real e você pode simular confirmação.
Simular pagamento realizado
/v1/sandbox/payments/:paymentId/simulate-paidMarca um pagamento sandbox como pago e dispara callback payment.paid (se callbackUrl foi configurado).
curl -X POST https://api.usepaysync.com/v1/sandbox/payments/psa_abc123/simulate-paid \ -H "Authorization: Bearer ps_test_..."
POST /v1/sandbox/charges/:paymentId/simulate-paid.Sandbox carteira
/v1/sandbox/walletRetorna saldo disponível e pendente apenas das transações sandbox.
{
"sandbox": true,
"availableCents": 12990,
"pendingCents": 4990,
"available": 129.9,
"pending": 49.9
}Sandbox transações
/v1/sandbox/transactionslimitoffset{
"sandbox": true,
"transactions": [
{
"paymentId": "psa_abc123",
"source": "payment",
"type": "one_time",
"status": "paid",
"amountCents": 4990
}
],
"total": 1,
"limit": 50,
"offset": 0
}Disputas
Listar disputas
/v1/disputesRetorna as disputas (MEDs) abertas contra sua conta. Use para monitorar contestações e enviar evidências.
limitoffsetstatuscurl -X GET "https://api.usepaysync.com/v1/disputes?limit=20&status=aberta" \ -H "Authorization: Bearer ps_live_..."
{
"disputes": [
{
"id": "665f1a2b3c4d5e6f7a8b9c0d",
"code": "MED-2024-001",
"wooviDisputeId": "abc123...",
"endToEndId": "E123456782024...",
"orderCode": "JUE7Y9MPSX",
"buyer": "João Silva",
"product": "Produto Premium",
"amount": 23.07,
"reason": "Produto não recebido",
"status": "aberta",
"evidences": [],
"resolvedAt": null,
"createdAt": "2026-03-18T10:00:00.000Z"
}
],
"total": 3,
"limit": 50,
"offset": 0
}Status: aberta · resolvida · perdida
Obter disputa
/v1/disputes/:idRetorna detalhes de uma disputa pelo ID. Use o id retornado em listar disputas.
idreqcurl -X GET https://api.usepaysync.com/v1/disputes/665f1a2b3c4d5e6f7a8b9c0d \ -H "Authorization: Bearer ps_live_..."
{
"id": "665f1a2b3c4d5e6f7a8b9c0d",
"code": "MED-2024-001",
"wooviDisputeId": "abc123...",
"endToEndId": "E123456782024...",
"orderCode": "JUE7Y9MPSX",
"buyer": "João Silva",
"buyerDiscordId": "",
"product": "Produto Premium",
"amount": 23.07,
"reason": "Produto não recebido",
"status": "aberta",
"evidences": [
{ "url": "https://...", "description": "Comprovante", "correlationID": "MED-2024-001-EV1" }
],
"resolvedAt": null,
"createdAt": "2026-03-18T10:00:00.000Z"
}404 Dispute not found.Enviar evidências
/v1/disputes/:id/evidenceEnvia documentos como evidência para contestar uma disputa aberta. Apenas disputas com status aberta aceitam evidências.
idreqdocumentstextForPdfcurl -X POST https://api.usepaysync.com/v1/disputes/665f1a2b3c4d5e6f7a8b9c0d/evidence \
-H "Authorization: Bearer ps_live_..." \
-H "Content-Type: application/json" \
-d '{
"documents": [
{
"url": "https://seu-site.com/comprovante.pdf",
"description": "Comprovante de entrega",
"correlationID": "MED-2024-001-EV1"
}
],
"textForPdf": "O cliente recebeu o produto em 15/03. Rastreio: BR123456789."
}'{
"success": true,
"uploaded": 2
}Pague-se via API
Solicitar saque
Solicita uma transferência do saldo disponível da loja. PIX cai pendente de aprovação admin; LTC envia direto após aprovação.
/v1/payoutsPIX: a chave PIX deve estar pré-verificada no dashboard.
methodreqamountreqwalletAddressreqcryptoAmountcurl -X POST https://api.usepaysync.com/v1/payouts \
-H "Authorization: Bearer ps_live_<key>" \
-H "Content-Type: application/json" \
-d '{
"method": "pix",
"amount": 100.00,
"walletAddress": "loja@email.com"
}'{
"id": "SAQ-API-A1B2C3D4",
"code": "SAQ-API-A1B2C3D4",
"method": "pix",
"amount": 100.00,
"status": "pending",
"sandbox": false
}curl -X POST https://api.usepaysync.com/v1/payouts \
-H "Authorization: Bearer ps_live_<key>" \
-H "Content-Type: application/json" \
-d '{
"method": "ltc",
"amount": 100.00,
"cryptoAmount": 0.5,
"walletAddress": "ltc1q..."
}'pending— aguardando aprovação admincompleted— pagodenied— negado
400— Saldo insuficiente / valor fora do range / endereço LTC inválido403— PIX não verificado (faça verificação no painel primeiro)429— Rate limit excedido (10/hr)
walletAddress é mascarado em logs e respostas (12345***).Listar saques
/v1/payoutslimitstatus{
"payouts": [
{
"id": "SAQ-API-A1B2C3D4",
"code": "SAQ-API-A1B2C3D4",
"method": "pix",
"amount": 100.00,
"cryptoAmount": null,
"walletAddress": "12345***",
"status": "pendente",
"createdAt": "2026-04-27T12:00:00.000Z"
}
]
}walletAddress sempre vem mascarado (primeiros 6 chars + ***).Webhooks
Segurança & Assinatura HMAC
Todo webhook que a gente envia (pagamento, cartão, pedido de loja, saque) vem assinado com HMAC-SHA256. A assinatura fica no header X-Webhook-Signature e é mandada sempre, sem flag de opt-in.
Onde fica meu webhook secret?
Cada loja tem um secret próprio. Você pega (ou regenera) em Dashboard → API & Desenvolvedores → Webhooks, ou via API:
GET https://api.usepaysync.com/api/developer/webhook-secret
Authorization: Bearer <seu_token_dashboard>
→ { "secret": "whk_a1b2c3d4..." }Como validar a assinatura
Calcule o HMAC-SHA256 do corpo cru da requisição (a string exata do JSON recebido, antes de qualquer parse) usando seu secret como chave. Compare com o valor do header. Use comparação timing-safe pra evitar timing attacks.
import crypto from "node:crypto";
import express from "express";
const app = express();
// Importante: precisa do body cru. O JSON.parse vem depois da validação.
app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
const signature = req.header("X-Webhook-Signature");
const expected = crypto
.createHmac("sha256", process.env.PAYSYNC_WEBHOOK_SECRET)
.update(req.body)
.digest("hex");
// timing-safe compare
const valid =
signature &&
signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
if (!valid) return res.status(401).send("invalid signature");
const event = JSON.parse(req.body.toString());
// ... processa event.event, event.paymentId, etc.
res.json({ ok: true });
});<?php
$payload = file_get_contents('php://input'); // body cru
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$secret = getenv('PAYSYNC_WEBHOOK_SECRET');
$expected = hash_hmac('sha256', $payload, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('invalid signature');
}
$event = json_decode($payload, true);
// ... processa $event['event'], $event['paymentId'], etc.
http_response_code(200);
echo json_encode(['ok' => true]);userId com uma chave global. Recomendamos chamar o endpoint acima pra gerar o seu próprio.Callback PIX (payment.paid / charge.paid)
Quando o PIX é confirmado, a gente faz um POST pro callbackUrl que você passou na criação. O nome do evento depende do recurso: payment.paid pros Payment Links (/v1/payments) e charge.paid pras cobranças PIX diretas (/v1/charges).
POST https://seu-site.com/webhook
Content-Type: application/json
X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
{
"event": "payment.paid",
"paymentId": "psa_a1b2c3d4...",
"amountCents": 4990,
"status": "paid",
"paidAt": "2026-03-18T12:05:00.000Z",
"customer": {
"name": "João Silva",
"email": "joao@email.com",
"externalId": "user_123"
},
"metadata": "{\"orderId\": \"abc-123\"}"
}{
"event": "charge.paid",
"paymentId": "psa_a1b2c3d4...",
"amountCents": 4990,
"status": "paid",
"paidAt": "2026-03-18T12:05:00.000Z",
"customer": { "name": "João Silva", "email": "joao@email.com" },
"metadata": "{\"orderId\": \"abc-123\"}",
"payer": "João Silva",
"cpfCensored": "123.***.**1-23",
"bank": "077 - Banco Inter",
"endToEndId": "E1818773820260318120500abc12345"
}GET /v1/payments/:paymentId pra conferir o status. O header X-Webhook-Signature está presente em todo callback; veja Segurança & HMAC pra validar.eventreqpaymentIdreqamountCentsreqstatusreqpaidAtreqcustomermetadatapayercpfCensoredbankendToEndIdCallback Cartão (card_payment.paid)
Quando uma cobrança no cartão é confirmada (via Stripe), a gente faz POST pro callbackUrl da cobrança. Evento card_payment.paid. A shape difere um pouco do PIX: o valor vem em amount (reais, decimal), não em amountCents.
POST https://seu-site.com/webhook
Content-Type: application/json
X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
{
"event": "card_payment.paid",
"orderCode": "ORD-7K3B9X",
"amount": 49.90,
"status": "paid",
"paidAt": "2026-03-18T12:05:00.000Z",
"customer": { "name": "João Silva", "email": "joao@email.com" },
"metadata": "{\"orderId\": \"abc-123\"}"
}eventreqorderCodereqamountreqstatusreqpaidAtreqcustomermetadataWebhook Pedido (order.paid)
Específico pra lojas no Discord (bot PaySync). Quando um pedido feito pelo bot é pago, a gente faz POST pra URL configurada na setting order_webhook_url. Útil pra sincronizar estoque ou CRM externo.
POST https://seu-site.com/webhook
Content-Type: application/json
X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
{
"event": "order.paid",
"orderId": "665f1a2b3c4d5e6f7a8b9c0d",
"orderCode": "ORD-7K3B9X",
"total": 49.90,
"paidAt": "2026-03-18T12:05:00.000Z",
"acquirer": "cartwave"
}eventreqorderIdreqorderCodereqtotalreqpaidAtreqacquirerreqWebhook de Saques
Quando um saque é solicitado, aprovado ou negado, enviamos um POST para a URL configurada na setting withdrawal_webhook_url.
Saque solicitado
POST https://seu-site.com/webhook
Content-Type: application/json
X-Webhook-Signature: hmac_sha256_...
{
"event": "withdrawal.requested",
"withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
"code": "SAQ-A1B2C3",
"amount": 150.00,
"method": "pix",
"walletAddress": "email@exemplo.com",
"status": "pendente",
"requestedAt": "2026-03-18T14:00:00.000Z"
}Saque aprovado
{
"event": "withdrawal.completed",
"withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
"code": "SAQ-A1B2C3",
"amount": 150.00,
"method": "pix",
"walletAddress": "email@exemplo.com",
"status": "concluido",
"processedAt": "2026-03-18T15:30:00.000Z"
}Saque negado
{
"event": "withdrawal.denied",
"withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
"code": "SAQ-A1B2C3",
"amount": 150.00,
"method": "pix",
"walletAddress": "email@exemplo.com",
"status": "negado",
"processedAt": "2026-03-18T15:30:00.000Z"
}eventreqwithdrawalIdreqcodereqamountreqmethodreqwalletAddressreqstatusreqrequestedAt / processedAtreqX-Webhook-Signature com HMAC-SHA256. Veja Segurança & HMAC pra exemplos de validação.