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 comCLIENT-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
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.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éricotransaction.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:
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 eventossubscription.* estão em Recorrência. Inclua cada evento no events do create ou do update.
Boleto no payload
SepaymentMethod 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 campoevent, 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.
hmac_secret cadastrado, a entrega inclui os cabeçalhos:
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:
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
2xxo 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, verifiqueX-UvviPay-TimestampeX-UvviPay-Signature(materialtimestamp.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.

