Skip to main content
Os webhooks permitem que a UvviPay notifique o seu sistema automaticamente quando algo relevante acontece na sua operação. Em vez de ficar consultando a API repetidamente, você registra uma URL e passa a receber uma requisição POST a cada notificação.

Como funciona

1

Você registra um endpoint

Informe webhook_url e events (ao menos um) em POST /v1/webhooks. O endpoint fica vinculado à organização das credenciais CLIENT-ID / CLIENT-SECRET. O endpoint recebe só os eventos do array events.
2

A UvviPay envia as notificações

Quando algo relevante ocorre, enviamos uma requisição POST com o corpo em JSON para a sua URL. O cabeçalho User-Agent das nossas chamadas é UVVIPay-Webhook/1.0.
3

Seu sistema confirma o recebimento

Responda com um status HTTP 2xx para confirmar. Qualquer outra resposta, ou um tempo de resposta acima de 30 segundos, é tratada como falha.

Limites

POST /v1/webhooks exige events. Evento novo entra no create ou no PUT /v1/webhooks/{id}. Endpoint já cadastrado não passa a receber evento novo sozinho.
Na entrega, cada event segue regras de audiência. O POST vai para a organização do merchant, para a subconta envolvida, ou para ambas.

Gerenciando webhooks

A gestão é feita pelos endpoints autenticados com CLIENT-ID / CLIENT-SECRET:

Criar

Registre uma nova URL de webhook

Atualizar

Altere a URL e os eventos de um webhook existente

Listar

Consulte os webhooks ativos e seus ids

Criando um webhook

POST /v1/webhooks
O campo hmac_secret é opcional. Quando informado (de 16 a 256 caracteres), a UvviPay armazena o valor de forma cifrada e assina cada entrega com HMAC-SHA256. A resposta retorna o endpoint criado (id, endpoint, status, created_at, events, hmac_configured). O secret nunca é devolvido nas respostas.
O status da resposta (active, failed, inactive, suspended) é do endpoint. Não é status de subconta.
Para atualizar, use o id retornado na listagem em PUT /v1/webhooks/{id}:
  • enviar hmac_secret (string): cadastra ou substitui o secret
  • omitir hmac_secret: mantém o secret atual
  • enviar hmac_secret: null: desliga a assinatura HMAC (limpa o secret; próximas entregas não enviam os headers)

Eventos de transação

Prefira assinar os eventos por status. O evento genérico transaction.status.updated continua disponível por retrocompatibilidade e é disparado junto com o evento específico em cada mudança de status.

Eventos de subconta

O campo status do corpo é o status da subconta. Não é o status do onboarding (processing, approved, rejected, action_required). Exemplo:
O campo id é o internalId da subconta. Inclua submerchant.status.updated no events do create ou do PUT /v1/webhooks/{id}. Endpoint já cadastrado não passa a receber esse evento sozinho.
suspended é status do endpoint de webhook (active, failed, inactive, suspended). Não é status de subconta.

Eventos de assinatura

Os eventos subscription.* estão em Recorrência. Inclua cada evento no events do create ou do update.

Boleto no payload

Se paymentMethod for boleto, o payload inclui boleto.digitableLine. O webhook não envia url nem barcode. Consulte o PDF em GET /v1/payments/{id}/boleto.
Se o mesmo endpoint assinar o genérico e um evento específico, receberá duas requisições HTTP com o mesmo conteúdo; a diferença fica no campo event. Endpoints já cadastrados não passam a receber eventos novos automaticamente; inclua-os no create/update.

Formato das notificações

Todo payload enviado para o seu endpoint inclui o campo event, que identifica o tipo da notificação. O restante do corpo varia conforme o contexto. Trate cada event no seu sistema e ignore tipos que você ainda não processa.
Quando o endpoint tiver hmac_secret cadastrado, a entrega inclui os cabeçalhos:
A assinatura é o HMAC-SHA256 de timestamp + "." + body (body JSON bruto), usando o secret informado no cadastro. Rejeite a requisição se |now - timestamp| for maior que 300 segundos (5 minutos) ou se a assinatura não bater. Exemplo de verificação no seu backend:
Use o body exatamente como chegou (sem reformatar o JSON).
Novos tipos de notificação podem ser adicionados ao longo do tempo. Projete sua integração para ser extensível: valide o campo event e processe apenas o que for relevante para o seu caso de uso.

Boas práticas

  • Responda rápido: confirme com 2xx o quanto antes e processe a notificação de forma assíncrona no seu lado.
  • Seja idempotente: a mesma notificação pode ser reentregue em caso de falha. Use identificadores estáveis do payload para evitar processamento duplicado.
  • Valide a assinatura: quando cadastrar hmac_secret, verifique X-UvviPay-Timestamp e X-UvviPay-Signature (material timestamp.body) e rejeite timestamps fora da janela de 300s.
  • Valide a origem: aceite apenas requisições da UvviPay no endpoint de webhook e trate a URL e o secret como segredos operacionais.