O que e um Webhook?

Um callback HTTP automático: quando algo acontece em um sistema, ele avisa outro imediatamente.

Webhook e um mecanismo de comunicação entre sistemas onde o servidor envia automaticamente uma notificação HTTP para um URL predefinido quando um evento específico ocorre. E o oposto do polling, que e quando o cliente fica consultando o servidor repetidamente perguntando "tem alguma coisa nova?". Com webhook, o servidor avisa o cliente quando algo acontece, sem ser perguntado. Na prática, você registra um URL no sistema externo (GitHub, Stripe, PayPal, etc.) e quando o evento ocorre, ele faz uma requisição POST para esse URL com os dados do evento no corpo. Seu sistema recebe, processa e confirma. A analogia clássica e que polling e como ligar para o correio toda hora para perguntar se chegou carta. Webhook e o carteiro tocando a campainha quando a carta chega.

Como funciona tecnicamente

O produtor faz um POST HTTP para o URL do consumidor com o payload do evento.

O fluxo técnico de um webhook e direto: o serviço externo (GitHub, Stripe, etc.) possui um sistema de registro de webhooks onde você informa a URL do seu servidor e os tipos de eventos que quer receber. Quando o evento ocorre (push de código, pagamento confirmado, etc.), o serviço externo faz uma requisição HTTP POST para a URL configurada, enviando no corpo um JSON com todos os detalhes do evento. Seu servidor recebe essa requisição, valida a assinatura (para confirmar que veio de quem diz ser), processa o evento e retorna um status 200 OK. Se o servidor não retornar 200 rapidamente, o serviço externo considera que a entrega falhou e pode tentar novamente depois. Por isso e importante responder rápido (menos de 5 segundos) e processar a lógica pesada de forma assíncrona.

Exemplo prático: pagamento com Stripe

O Stripe notifica quando um pagamento e confirmado, sem precisar de polling.

Em um e-commerce integrado ao Stripe, o fluxo sem webhook seria: após o usuário pagar, o frontend chama o backend, o backend chama a API do Stripe para verificar o status, recebe a confirmação e libera o pedido. Com webhook, o fluxo e: após o pagamento, o Stripe envia automaticamente um evento "payment_intent.succeeded" para o endpoint /webhooks/stripe do seu sistema. O backend recebe, valida a assinatura HMAC do Stripe para garantir autenticidade, e libera o pedido. Não e necessário polling. A liberação acontece em segundos, com muito menos requisições. O Stripe envia os eventos mesmo se o seu servidor estiver momentaneamente fora do ar, tentando novamente por até 3 dias, garantindo que nenhum pagamento seja perdido.

Exemplo prático: CI/CD com GitHub Webhooks

Push de código dispara automaticamente o pipeline de build e deploy.

GitHub webhooks são um dos casos de uso mais populares. Quando um desenvolvedor faz push para o repositório, o GitHub envia um evento "push" para o URL configurado no webhook. O servidor de CI/CD (Jenkins, GitHub Actions, CircleCI) recebe o evento, identifica a branch afetada e dispara o pipeline de build e deploy correspondente. Não e necessário polling do GitHub. O pipeline começa em segundos após o push. Esse mecanismo e o coração de qualquer fluxo de CI/CD moderno: código enviado ao repositório desencadeia automaticamente a cadeia de testes, build e deploy sem intervenção humana. Webhooks de pull request também acionam revisões automáticas de código, análise de qualidade e notificações no Slack.

Validação e segurança em webhooks

Validar a assinatura do payload e obrigatório para evitar spoofing.

Todo webhook de produção deve validar a autenticidade do remetente. A forma mais comum e o HMAC (Hash-based Message Authentication Code): o serviço externo inclui um header com a assinatura do payload usando uma chave secreta compartilhada. Seu servidor recalcula a assinatura com a mesma chave e compara. Se não baterem, o payload foi adulterado ou não veio de quem alega. Por exemplo, o Stripe envia o header Stripe-Signature com timestamp e assinatura. O GitHub envia X-Hub-Signature-256. Nunca processe um webhook sem validar a assinatura. Além disso, use HTTPS obrigatoriamente, implemente idempotência (o mesmo evento pode ser entregue mais de uma vez), e responda rapidamente com 200 antes de processar.

Webhook vs Polling vs SSE

Cada modelo tem seu lugar dependendo do controle que você tem sobre o sistema.

Polling e quando o cliente consulta periodicamente o servidor. E simples de implementar mas ineficiente: gera muitas requisições desnecessárias e introduz latência até o próximo poll. Webhook e quando o servidor avisa o cliente. E eficiente e de baixa latência, mas exige que você tenha um servidor publicamente acessível para receber as notificações. Server-Sent Events (SSE) e quando o servidor empurra atualizações por uma conexão HTTP persistente. E unidirecional (servidor -> cliente) e excelente para atualizações em tempo real no browser sem WebSocket. WebSocket e bidirecional e ideal para comunicação em tempo real como chats. Webhooks são a escolha natural para integração entre sistemas de backend onde você controla o servidor receptor.

Quando usar Webhooks

Integrações com serviços externos, notificações de pagamento, CI/CD e sincronização de dados.

Webhooks são a escolha ideal para: receber notificações de serviços externos como gateways de pagamento, plataformas de e-commerce, repositórios de código e serviços de email; disparar pipelines de CI/CD quando código e enviado ao repositório; sincronizar dados entre sistemas quando algo muda em um deles; acionar fluxos de automação em resposta a eventos de terceiros. Em geral, qualquer cenário onde você precisa reagir a eventos em sistemas que você não controla e um caso de uso para webhooks. A alternativa de polling seria tecnicamente possível na maioria dos casos, mas muito menos eficiente e mais cara em termos de requisições e latência.

Boas práticas e cuidados

Idempotência, retry robusto, fila interna e monitoramento são essenciais em produção.

Para webhooks de produção, siga estas boas práticas: responda sempre com 200 OK rapidamente (em menos de 5 segundos) e processe de forma assíncrona usando uma fila interna (como RabbitMQ ou SQS). Implemente idempotência com um campo de identificador único no evento para não processar o mesmo evento duas vezes (o serviço pode reenviar em caso de timeout). Persista todos os eventos recebidos antes de processar, para poder reprocessar em caso de falha. Monitore a taxa de sucesso e falha dos webhooks. Implemente um mecanismo de retry com exponential backoff para eventos que falharam no processamento. Logue todos os eventos recebidos para auditoria e debug. Use filas de dead-letter para eventos que falharam múltiplas vezes.

Debugging e testes de webhooks

Ferramentas como ngrok e webhook.site facilitam o desenvolvimento e teste local.

Um dos desafios do desenvolvimento com webhooks e testar localmente: o serviço externo não consegue acessar o localhost. O ngrok e a solução mais popular: cria um tunnel público para o seu localhost, fornecendo uma URL pública que você registra no webhook. O webhook.site e uma ferramenta que fornece uma URL temporária para inspecionar webhooks recebidos sem precisar de servidor. Muitos serviços, como Stripe e GitHub, permitem disparar eventos de teste pelo seu painel de administração. Para testes automatizados, simule as requests POST do webhook diretamente nos seus testes, incluindo os headers de assinatura. Logue todos os eventos recebidos em desenvolvimento para facilitar o debug de fluxos completos.

Resumo final

Webhooks transformam integrações reativas em eventos: o sistema avisa em vez de ser consultado.

Webhooks são um dos mecanismos mais elegantes de integração entre sistemas. Em vez de polling ineficiente, o sistema que tem a informação avisa imediatamente quem precisa dela. Isso resulta em menor latência, menos requisições desnecessárias e integração mais resiliente. O modelo e adotado pelos principais serviços do mercado, de gateways de pagamento a plataformas de código a serviços de email. Implementar um endpoint de webhook corretamente, com validação de assinatura, processamento assíncrono e idempotência, e uma habilidade fundamental para qualquer desenvolvedor que trabalha com integração de sistemas. O esforco de implementação e pequeno comparado aos beneficios em eficiência e confiabilidade.

Tutoriais em Video

Conceitos-chave

Webhook

Callback HTTP automático, o servidor avisa o cliente quando um evento ocorre, sem ser consultado

Payload

Corpo JSON enviado pelo webhook com os detalhes do evento (tipo, dados, timestamp)

HMAC Signature

Assinatura criptografica no header que permite validar a autenticidade do webhook

Idempotência

Processar o mesmo evento duas vezes tem o mesmo resultado, necessária pois webhooks podem ser reenviados

Retry

Reenvio automático em caso de falha, serviços robustos tentam por horas ou dias

Polling

Alternativa ao webhook: o cliente consulta o servidor periodicamente, menos eficiente

Webhooks no Instagram

@bytebytego

Reels, Webhooks

@bytebytego

Webhooks no Facebook

Webhooks no X (Twitter)

@bytebytego

Webhooks vs polling: por que o push e melhor

Ver post completo no X →
@bytebytego

Como validar webhooks com HMAC em produção

Ver post completo no X →
@bytebytego

Idempotência em webhooks: o que e e por que importa

Ver post completo no X →
@bytebytego

Webhook retry strategy para sistemas críticos

Ver post completo no X →
@bytebytego

Testando webhooks localmente com ngrok

Ver post completo no X →
@bytebytego

Webhook best practices para 2024

Ver post completo no X →

O que devs dizem

Paulo H. ★★★★★

Implementamos webhooks do Stripe para confirmar pagamentos. O fluxo ficou muito mais simples: o Stripe nos avisa, processamos e liberamos o pedido em menos de 1 segundo. Antes ficavamos fazendo polling e as vezes o pedido demorava 30 segundos para ser confirmado.

Isabel M. ★★★★☆

O maior aprendizado foi implementar idempotência desde o primeiro dia. O Stripe reenvio o mesmo evento duas vezes durante um teste e sem idempotência teriamos cobrado o cliente em dobro. Agora verificamos o Stripe-Signature e o ID do evento antes de qualquer processamento.

Henrique B. ★★★★★

Usamos webhooks do GitHub para acionar nosso pipeline de CI/CD. Cada push na main dispara automaticamente build, testes e deploy. O tempo entre o push e o sistema em produção caiu de 20 minutos (processo manual) para 8 minutos (totalmente automático).