Skip to main content
Pense nos webhooks como “mensagens enviadas pela Upay para o seu sistema”, sem que você precise ficar consultando a API o tempo todo.

Por que usar webhooks?

Sem webhooks, sua aplicação teria que perguntar para a API a cada segundo:
“Essa transação já foi confirmada?”
Isso é lento e ineficiente. Com webhooks, a Upay avisa você imediatamente:
“O pagamento foi confirmado. Aqui estão os dados.”
Assim você pode:
  • atualizar o status de um pedido
  • liberar acesso a um produto
  • enviar e-mails automáticos de confirmação
  • registrar movimentações financeiras
Tudo isso de forma automática, sem fazer seu cliente esperar.

Como funciona na prática?

  1. Você cria um endpoint no seu sistema Ex.: https://meusite.com/webhooks/upay
  2. Você cadastra esse endpoint criando uma assinatura de webhook via API
  3. Sempre que algo importante acontece, como um pagamento aprovado:
    • A Upay envia um POST para a sua URL
    • O body contém o evento (ex: transaction.paid, withdrawal.completed)
    • Seu sistema processa esse evento
É como receber uma notificação push — só que para servidores.

Ambientes (Desenvolvimento vs Produção)

Ambientes da Upay

  • Webhooks criados com chaves de Desenvolvimento recebem eventos simulados
  • Webhooks criados com chaves de Produção recebem eventos reais
Dessa forma, você pode testar tudo antes de ir para produção.

Segurança dos webhooks

Webhooks precisam ser seguros — afinal, qualquer pessoa poderia tentar enviar requisições falsas para sua aplicação. Por isso, recomendamos duas camadas de proteção:

🔐 1. Secret na URL

Cada assinatura de webhook tem um secret único, que pode ir na query string do seu endpoint. Ex.: https://meusite.com/webhook/upay?secret=SEU_SECRET Seu backend confere:

🛡️ 2. Assinatura HMAC (verificação do corpo)

Mesmo que alguém descubra sua URL, ainda não consegue falsificar o evento. Por quê? Porque cada webhook enviado pela Upay inclui uma assinatura no header X-Webhook-Signature. Essa assinatura é gerada usando HMAC-SHA256 e garante que:
  • o corpo da requisição não foi alterado
  • o evento realmente foi enviado pela Upay
Seu backend deve recalcular a assinatura e comparar:
  • Se for igual → ✅ evento é legítimo
  • Se for diferente → ❌ evento rejeitado
Esse é o mesmo método usado por Stripe, PayPal, Shopify, GitHub, etc.

🔧 Exemplo de validação HMAC (Node.js)

Este exemplo mostra como validar a assinatura HMAC enviada no header X-Webhook-Signature.

Criando uma assinatura de webhook

1

Defina seu endpoint

Crie um endpoint HTTPS público que receberá as notificações.

Requisitos do endpoint

  • Deve ser HTTPS (HTTP não é aceito)
  • Deve responder 200 OK dentro de 10 segundos
  • Deve aceitar requisições POST com body JSON
2

Crie a assinatura via API

Envie uma requisição POST /api/v1/webhooks/subscriptions:
3

Valide os eventos recebidos

Implemente a validação HMAC no seu endpoint para garantir que os eventos são legítimos.

Eventos suportados

Todos os webhooks compartilham o mesmo formato de payload:
Dados sensíveis: O campo taxId (CPF/CNPJ) é mascarado nos payloads (ex: 123.***.***-**). Para pagamentos com cartão, apenas os últimos 4 dígitos e a bandeira são enviados.

Eventos de Transação

Disparado quando o pagamento de uma transação é confirmado.


Eventos de Saque

Disparado quando um saque é concluído com sucesso.

Boas práticas

Recomendações importantes

  • Use HTTPS em todos os webhooks
  • Valide a assinatura HMAC em cada requisição recebida
  • Registre cada evento recebido e processe cada um uma única vez (idempotência)
  • Responda 200 OK somente após concluir o processamento
  • Implemente retentativas com idempotência caso o processamento falhe
  • Não valide o payload inteiro com schemas rígidos (como Zod) — novos campos podem ser adicionados sem aviso prévio

Precisa de ajuda?

Nossa equipe pode te ajudar. Contate-nos: suporte@upaybr.com