Webhook
Cadastro de webhooks e formato das notificações de pagamento e devolução Pix
Um webhook é uma URL sua que a API chama via POST quando um evento assinado acontece
— pagamento de cobrança Pix, devolução concluída ou pagamento de link de pagamento.
Assim não é preciso consultar os recursos periodicamente (polling).
Os endpoints de cadastro exigem autenticação mTLS. Veja Autenticação.
Modelo
Diferente de "uma URL por tipo", aqui cada webhook é um registro independente com sua
própria URL, sua própria lista de eventos assinados e seu próprio secret de
assinatura. Um mesmo cliente pode cadastrar quantos webhooks quiser — por exemplo, uma
URL só para pix_charge.paid e outra para todos os eventos.
Eventos disponíveis
| Evento | Disparado quando |
|---|---|
pix_charge.paid | Uma cobrança Pix é paga |
pix_refund.returned | Uma devolução Pix é liquidada |
link_payment.paid | Um link de pagamento é confirmado |
Esta página descreve o payload dos eventos Pix (pix_charge.paid e
pix_refund.returned).
Cadastrar webhook
POST /api/v1/webhooksO secret usado para validar a assinatura das entregas (ver Verificando a
assinatura) só é devolvido nesta resposta. Guarde-o
agora — não há como recuperá-lo depois.
Body
{
"url": "https://meusistema.com.br/webhooks/pix",
"events": ["pix_charge.paid", "pix_refund.returned"]
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | sim | URL absoluta (http ou https) que recebe o POST dos eventos. Máximo 500 caracteres |
events | array de string | sim | Ao menos um dos eventos em Eventos disponíveis |
201 Created
{
"id": "5bf69d18-c1d7-4348-adfe-6a4b28f2d4a1",
"url": "https://meusistema.com.br/webhooks/pix",
"events": ["pix_charge.paid", "pix_refund.returned"],
"active": true,
"createdAt": "2026-09-15T14:30:00Z",
"secret": "2RMC_VPwUQ3nGQ5ywwpvIQPRkif3KWCIbCScJOP3nzY"
}Erros: 400 URL inválida ou evento fora da lista · 401 certificado de cliente
ausente ou inválido.
Atualizar webhook
PUT /api/v1/webhooks/{id}Substitui URL, eventos assinados e o ativo/inativo de um webhook existente. O secret
não muda e não é devolvido aqui.
| Parâmetro | Tipo | Exemplo |
|---|---|---|
id | string (uuid) | 5bf69d18-c1d7-4348-adfe-6a4b28f2d4a1 |
Body
{
"url": "https://meusistema.com.br/webhooks/pix",
"events": ["pix_charge.paid"],
"active": true
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | sim | URL absoluta (http ou https). Máximo 500 caracteres |
events | array de string | sim | Ao menos um dos eventos em Eventos disponíveis |
active | boolean | sim | Se false, nenhum evento é enfileirado para este webhook até ser reativado |
200 OK
{
"id": "5bf69d18-c1d7-4348-adfe-6a4b28f2d4a1",
"url": "https://meusistema.com.br/webhooks/pix",
"events": ["pix_charge.paid"],
"active": true,
"createdAt": "2026-09-15T14:30:00Z"
}Erros: 400 URL inválida ou evento fora da lista · 401 certificado de cliente
ausente ou inválido · 404 webhook não encontrado para o cliente autenticado.
Listar webhooks
GET /api/v1/webhooksRetorna todos os webhooks cadastrados para o cliente autenticado. O secret nunca
aparece aqui — só na resposta de cadastro.
200 OK
[
{
"id": "5bf69d18-c1d7-4348-adfe-6a4b28f2d4a1",
"url": "https://meusistema.com.br/webhooks/pix",
"events": ["pix_charge.paid", "pix_refund.returned"],
"active": true,
"createdAt": "2026-09-15T14:30:00Z"
}
]Esta lista não é paginada — vem como um array simples, diferente das listagens de cobrança e devolução.
Erros: 401 certificado de cliente ausente ou inválido.
Entrega do evento
Quando um evento assinado ocorre, a API enfileira uma entrega para cada webhook que o
assina e um job de despacho tenta o POST em segundos — a requisição que gerou o
evento (criar cobrança, solicitar devolução) não espera a entrega acontecer.
Corpo da entrega
{
"event": "pix_charge.paid",
"occurredAt": "2026-09-15T14:32:10.832351Z",
"data": { }
}| Campo | Tipo | Descrição |
|---|---|---|
event | string | O evento assinado — ver Eventos disponíveis |
occurredAt | string (date-time) | Momento em que o evento foi enfileirado |
data | object | O recurso relacionado ao evento, no mesmo formato devolvido pela API — ver abaixo |
Em pix_charge.paid, data é a cobrança no formato de
Consultar cobrança. Em
pix_refund.returned, data é a devolução no formato de
Consultar devolução.
Headers enviados
| Header | Descrição |
|---|---|
Content-Type | application/json |
X-Webhook-Event | O mesmo valor do campo event do corpo |
X-Webhook-Delivery | Identificador único desta tentativa de entrega |
X-Webhook-Timestamp | Momento do envio, em segundos desde epoch |
X-Webhook-Signature | Assinatura HMAC-SHA256 do corpo — ver abaixo |
Verificando a assinatura
X-Webhook-Signature é o HMAC-SHA256 do corpo cru da requisição (os bytes exatos
recebidos, antes de qualquer parse), calculado com o secret devolvido no
cadastro, em hexadecimal minúsculo.
signature = hex(HMAC_SHA256(secret, corpo_cru))Recalcule esse valor no seu servidor e compare com o header antes de confiar no conteúdo da requisição.
Retentativas
Uma entrega só é considerada bem-sucedida com resposta 2xx. Qualquer outro status,
erro de conexão ou timeout conta como falha e é reagendada com backoff:
| Tentativa | Espera até a próxima |
|---|---|
| 1ª falha | 10 segundos |
| 2ª falha | 30 segundos |
| 3ª falha | 2 minutos |
| 4ª falha | 5 minutos |
| 5ª falha | descartada — não há mais retentativas |
Boas práticas
- Responda rápido com
2xx. Processe o evento de forma assíncrona no seu lado. Qualquer resposta fora da faixa2xxé tratada como falha e entra no ciclo de retentativas acima. - Valide a assinatura. Nunca processe o corpo sem antes conferir
X-Webhook-Signature— ver Verificando a assinatura. - Seja idempotente. O mesmo evento pode chegar mais de uma vez (retentativa após um
2xxque não chegou a tempo, por exemplo). UseX-Webhook-Deliverycomo chave para não processar em duplicidade. - Confirme antes de liberar. Antes de entregar o produto ou serviço, confirme o status em Consultar cobrança.
- Use HTTPS na URL do webhook e não exponha dados sensíveis na query string.