Quando usar
Use webhooks para tudo que depende de um pagamento ou de uma movimentação: liberar acesso, marcar o pedido como pago, enviar um e-mail, registrar no seu financeiro. Libere o pedido pelo evento, e não pelo retorno do cliente à sua página, que pode nunca acontecer.Como funciona
Cada entrega é umPOST com corpo JSON (Content-Type: application/json) e User-Agent começando com AbacatePay/. Ela traz o secret que você cadastrou, na URL (?webhookSecret=) e no header X-Webhook-Secret, e a assinatura do corpo no header X-Webhook-Signature. Como conferir os dois está em Segurança dos webhooks.
Formato do evento
Todo evento chega no mesmo envelope:Cliente, CPF e cartão
- Os eventos de checkout, checkout transparente e assinatura sempre trazem
data.customer. Quando a cobrança não tem cliente, ele chega assim:{ "id": "", "name": null, "email": null, "taxId": null }. - O CPF ou CNPJ (
taxId) chega mascarado:123.***.789-**no CPF e12.***.678/0001-**no CNPJ. O documento completo depende de liberação para a sua conta; fale com o suporte. - Do cartão, só chegam os 4 últimos dígitos e a bandeira.
- Não valide o payload inteiro com um schema rígido (como Zod): campos novos podem ser adicionados, e o seu endpoint não deve quebrar por isso.
Eventos de webhook
Escolha os eventos ao criar o webhook. Cada um tem uma página com exemplos de payload.Como criar um webhook pelo dashboard
- Vá em Integração → Webhooks e clique em Criar webhook.
- Em Versão do Webhook, escolha Webhook v2. A v1 cobre só eventos de cobrança e saque, não recebe nenhum evento desta página e vai ficar indisponível em breve.
- Preencha o Nome, a URL (HTTPS e pública) e o Secret, com 32 caracteres ou mais.
- Em Eventos, marque os eventos que esse webhook deve receber. Os de Pix por chave só aparecem para contas com o recurso liberado.
- Clique em Salvar.
O que é o secret
O secret é um valor que você cria e guarda no seu servidor. A AbacatePay o envia em cada entrega, e o seu sistema confere se ele bate antes de processar o evento. A assinatura do corpo usa outra chave, a da AbacatePay. Gere um valor aleatório, por exemplo comopenssl rand -hex 32 (64 caracteres).
Um webhook não pode ser editado. Para mudar a URL, os eventos ou o secret, crie outro e exclua o antigo.
Como criar um webhook pela API
Chame Criar um webhook com uma chave que tenha a permissãoWEBHOOK:CREATE. O webhook criado pela API é sempre v2 e fica no ambiente da chave.
Requisitos da URL
- HTTPS em qualquer ambiente, inclusive no Modo Teste. Uma URL
http://é recusada. - Endereço público.
localhoste IPs privados ou reservados são recusados na criação. Se o domínio passar a apontar para um IP privado depois, a entrega é bloqueada e não é tentada de novo. - URL final. Redirecionamentos (
3xx) não são seguidos. - Resposta rápida. Grave o evento (numa fila ou no banco) e responda
2xxlogo em seguida. Processar tudo antes de responder arrisca passar dos 30 segundos.
abacatepay listen da CLI ou um túnel HTTPS.
Modo Teste e produção
Os webhooks do Modo Teste e os de produção são separados. Um webhook criado no Modo Teste (ou com uma chaveabc_dev_) recebe só eventos de teste, e o de produção recebe só os reais. O id do webhook mostra o ambiente: webh_dev_... ou webh_prod_....
No Modo Teste, os eventos de pagamento, de reembolso e de contratação de assinatura saem normalmente: simule o pagamento e, se quiser, reembolse a cobrança. Disputas, saques, envios de Pix e Pix por chave não têm simulação.
Ao ir para produção, crie os webhooks de novo com o Modo Teste desligado.
Entrega e retentativas
A entrega conta como feita quando o seu endpoint responde qualquer status2xx em até 30 segundos. O corpo da resposta é ignorado.
Uma resposta
4xx costuma indicar URL errada ou secret recusado, e repetir o envio não resolveria.
As novas tentativas seguem estes intervalos, contados a partir da falha anterior:
São até 7 tentativas em cerca de 18 horas. Quando uma recebe
2xx, as seguintes não acontecem. Se você excluir o webhook ou ele for desativado, as tentativas pendentes são descartadas. As regras são as mesmas no Modo Teste e em produção.
Como evitar processar o mesmo evento duas vezes
O mesmo evento pode chegar mais de uma vez: numa retentativa, quando a sua resposta se perde no caminho ou num reenvio manual. Por isso:- Guarde o
idde cada evento processado. As retentativas automáticas repetem o mesmoid. Se ele já foi processado, responda2xxsem processar de novo. - Deixe a ação idempotente também pela entidade. O reenvio manual pelo dashboard chega com um
idnovo. Antes de liberar um pedido, confira se ele já não foi liberado, peloidda cobrança ou da assinatura.
- O mesmo
checkout.idpode ter mais de umcheckout.completedlegítimo: o do upsell (isUpSell: true) e o de cada venda de um link de pagamento. Não descarte esses eventos só porque ocheckout.idse repete. - Cada cobrança paga de assinatura dispara dois eventos: o de assinatura (
subscription.completedousubscription.renewed) e umcheckout.completedcomfrequency: "SUBSCRIPTION". Libere o acesso por um deles só.
Ordem de chegada
Os eventos não chegam necessariamente na ordem em que aconteceram. Uma retentativa pode chegar depois de um evento mais novo, e dois eventos da mesma compra podem chegar em qualquer ordem. Decida o estado pelostatus que vem no payload, e consulte a API quando precisar do estado atual.
Logs, reenvio e desativação
No dashboard, vá em Integração → Webhooks, abra o menu do webhook e clique em Ver Logs.- Cada tentativa aparece com o status, o evento, o ID da mensagem e a hora de envio. Clique numa linha para ver o Payload enviado e a Resposta da API, com o status HTTP e o tempo de resposta.
- Numa entrega que falhou, clique em Reenviar. O reenvio faz uma tentativa só, sem retentativas automáticas, e chega com um
idnovo. - Para parar de receber, abra o menu do webhook e clique em Excluir. Não há opção para pausar.
- Um webhook é desativado automaticamente quando o seu endpoint responde
410 Gone. Para voltar a receber, crie um webhook novo.
Perguntas frequentes
Meu endpoint não recebe os eventos. O que conferir?
Meu endpoint não recebe os eventos. O que conferir?
Veja se o webhook é v2, se ele está no mesmo ambiente da cobrança (Modo Teste ou produção) e se o evento está marcado nele. Depois, abra os logs: eles mostram o status HTTP que o seu endpoint respondeu. Se ele respondeu
410, o webhook foi desativado e precisa ser criado de novo.Posso ter mais de um webhook?
Posso ter mais de um webhook?
Sim. Cada webhook recebe os eventos marcados nele, então você pode separar, por exemplo, um webhook para pagamentos e outro para saques.
Como mudo a URL ou o secret de um webhook?
Como mudo a URL ou o secret de um webhook?
Não dá para editar. Crie um webhook novo com a URL ou o secret certos e exclua o antigo.
Por quanto tempo a AbacatePay tenta entregar um evento?
Por quanto tempo a AbacatePay tenta entregar um evento?
Até 7 tentativas em cerca de 18 horas, quando o endpoint não responde, demora mais de 30 segundos ou responde
5xx, 408 ou 429. Veja Entrega e retentativas.O secret assina o corpo do evento?
O secret assina o corpo do evento?
Não. O secret serve para você conferir que a requisição veio da AbacatePay, e a assinatura
X-Webhook-Signature usa a chave da AbacatePay. Veja Segurança dos webhooks.Precisa de ajuda?
Fale com a gente em ajuda@abacatepay.com.