Webhook: o que é, como funciona e diferença para polling

Polling e Webhook

Toda integração entre sistemas esbarra na mesma pergunta: como saber que algo aconteceu do outro lado? Existem duas respostas clássicas. Na primeira, sua aplicação pergunta repetidamente se há novidade: é o polling. Na segunda, o outro sistema avisa na hora em que o evento ocorre: é o webhook. Este guia explica como cada modelo funciona, compara os dois com long polling, SSE e WebSocket, e mostra como implementar um webhook receiver seguro em Node.js, PHP e Python.

O que é um webhook?

Webhook é um mecanismo em que um sistema envia uma requisição HTTP (geralmente POST com JSON) para a URL da sua aplicação assim que um evento acontece: pagamento aprovado, pedido enviado, commit no repositório. Em vez de você consultar a API repetidamente, é a API que notifica seu sistema, por isso o modelo é chamado de push.

Na prática, você cadastra uma URL pública no serviço (Stripe, GitHub, Mercado Pago) e implementa um endpoint que recebe e processa esses eventos. O webhook é a forma padrão de receber confirmações de pagamento, atualizações de entrega e eventos de CI/CD em tempo quase real.

O que é Polling?

Polling é a técnica em que sua aplicação consulta a API em intervalos regulares pra verificar se há dados novos: a cada 30 segundos, a cada 5 minutos, conforme a necessidade. É o modelo pull — quem puxa a informação é o cliente.

Tipos de Polling disponíveis

  • Short polling: requisições em intervalo fixo. Simples de implementar, mas a maioria das chamadas volta vazia.
  • Long polling: o servidor segura a conexão aberta até ter dados ou estourar o timeout, e o cliente reconecta em seguida. Reduz requisições vazias ao custo de conexões mais longas.

Quando o Polling faz sentido?

  • A API não oferece webhooks — sobra consultar
  • Sua aplicação roda atrás de firewall e não pode expor URL pública
  • O dado muda em ritmo previsível (cotação diária, relatório por hora)
  • Você precisa de garantia de consistência: o polling sempre traz o estado atual, mesmo que uma notificação se perca

Webhook: A abordagem Push para integrações modernas

O fluxo de um webhook tem três participantes: o provedor (sistema onde o evento acontece), o evento (mudança de estado que dispara a notificação) e o receiver (endpoint HTTP da sua aplicação que recebe o POST).

Diagrama de sequência de um webhook: provedor, receiver com validação HMAC e fila de processamento
O fluxo completo: assinatura validada, resposta rápida e processamento em fila

Anatomia de um Webhook

Uma notificação típica carrega o tipo do evento, o payload com os dados e headers de verificação:

POST /webhooks/pagamentos HTTP/1.1
Host: api.seusite.com.br
Content-Type: application/json
X-Signature: sha256=5d61605c3feea9799210ddcb71307d4ba264225f...

{
  "event": "payment.approved",
  "id": "evt_8a72f0c",
  "created_at": "2026-06-12T09:41:00Z",
  "data": { "payment_id": "pay_193124", "amount": 14990, "status": "approved" }
}

O header de assinatura (nomes variam: X-Hub-Signature-256 no GitHub, Stripe-Signature na Stripe) permite verificar que a notificação veio mesmo do provedor. É o tema da seção de segurança, adiante.

Comparativo técnico: Polling vs Webhook em diferentes cenários

Critério Webhook Short polling Long polling SSE WebSocket
Latência segundos = intervalo baixa baixa mínima
Direção servidor → você você → servidor você → servidor servidor → cliente bidirecional
Requisições vazias nenhuma muitas poucas n/a n/a
Precisa de URL pública sim não não não não
Complexidade média baixa média média alta
Uso típico integrações server-to-server scripts e jobs chat simples, filas feed no navegador jogos, colaboração ao vivo

Cenários ideais para cada abordagem

Webhook vence quando o evento é imprevisível e a latência importa: confirmação de pagamento, status de entrega, alertas. Polling vence quando você não controla a infraestrutura de recepção ou quando consistência vale mais que velocidade. SSE e WebSocket resolvem outro problema (atualizar o navegador do usuário em tempo real) e não competem com webhooks, que são server-to-server.

Webhook vs API: qual a diferença?

A pergunta engana: webhook é um recurso dentro de uma API, não uma alternativa a ela. Numa API REST tradicional, sua aplicação inicia a conversa e pede dados. No webhook, o fluxo se inverte: o provedor inicia a conversa e entrega os dados. Integrações maduras usam os dois: a API pra ações e consultas, o webhook pra reagir a eventos.

Como criar um webhook receiver (exemplos de código)

O receiver é só um endpoint HTTP que aceita POST. O essencial: responder rápido com 2xx e processar o evento depois.

Node.js (Express)

app.post('/webhooks/pagamentos', express.json(), (req, res) => {
  const evento = req.body;
  res.sendStatus(200); // confirme o recebimento antes de processar
  fila.add('processar-evento', evento); // processe de forma assíncrona
});

PHP

$payload = file_get_contents('php://input');
$evento = json_decode($payload, true);

http_response_code(200);
fastcgi_finish_request(); // libera a resposta pro provedor

processarEvento($evento); // continua o trabalho depois da resposta

Python (Flask)

@app.route('/webhooks/pagamentos', methods=['POST'])
def receber_webhook():
    evento = request.get_json()
    fila.enqueue(processar_evento, evento)  # Redis Queue, Celery etc.
    return '', 200

Configurando Webhooks robustos e seguros

Qualquer pessoa que descubra a URL do seu receiver pode enviar um POST forjado. Por isso todo webhook em produção precisa de verificação de origem.

Validação de assinatura HMAC

O provedor assina o corpo da requisição com um segredo compartilhado e envia o resultado num header. Seu receiver recalcula e compara:

const crypto = require('crypto');

function assinaturaValida(req, segredo) {
  const recebida = req.get('X-Signature') || '';
  const esperada = 'sha256=' + crypto
    .createHmac('sha256', segredo)
    .update(req.rawBody)            // corpo bruto, antes do parse
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(recebida), Buffer.from(esperada)
  );
}

Dois cuidados: calcule o HMAC sobre o corpo bruto (o JSON re-serializado pode mudar a ordem das chaves) e use comparação de tempo constante (timingSafeEqual) pra evitar timing attacks.

Garantindo idempotência

Provedores reenviam eventos quando não recebem 2xx a tempo (e às vezes mesmo recebendo). Seu receiver vai processar o mesmo evento duas vezes em algum momento. Guarde o ID do evento processado (Redis com TTL resolve) e ignore repetições. O conceito merece atenção própria: veja o guia de idempotência em APIs.

Tratamento de falhas

Se o seu endpoint ficar fora do ar, o provedor tenta de novo em intervalos crescentes. A Stripe insiste por até 3 dias; o GitHub desiste antes. Não conte com retry infinito: tenha um job de reconciliação que consulta a API periodicamente e recupera eventos perdidos.

Resposta rápida ao Webhook

Provedores aplicam timeout curto (5 a 10 segundos). Se o processamento for além disso, responda 200 imediatamente e jogue o trabalho pesado numa fila. Receiver que processa de forma síncrona acumula timeouts e recebe o mesmo evento em dose dupla.

Como testar webhooks em desenvolvimento

O desafio do desenvolvimento local é que o provedor precisa alcançar sua máquina. Duas ferramentas resolvem:

  • webhook.site: gera uma URL descartável que exibe cada requisição recebida. Útil pra inspecionar o payload real de um provedor antes de escrever código.
  • ngrok (ou Cloudflare Tunnel): cria um túnel público pro seu localhost, permitindo receber webhooks de verdade na máquina de desenvolvimento.

Serviços maiores ajudam: a Stripe tem CLI que encaminha eventos pro localhost (stripe listen), e o GitHub permite reenviar entregas antigas pelo painel de configuração do webhook.

Implementando Polling de Forma Eficiente

Quando o polling for o caminho, três práticas evitam desperdício:

  • Use cursores ou updated_since: peça só o que mudou desde a última consulta, em vez da lista inteira.
  • Respeite ETag e 304 Not Modified: quando a API suporta, a resposta vazia custa quase nada.
  • Backoff adaptativo: sem novidade, aumente o intervalo gradualmente; com novidade, encurte. O exemplo abaixo dobra o intervalo até um teto de 5 minutos.
let intervalo = 15_000; // 15s
async function poll() {
  const novidades = await consultarAPI();
  intervalo = novidades.length
    ? 15_000
    : Math.min(intervalo * 2, 300_000);
  setTimeout(poll, intervalo);
}
poll();

Estratégias híbridas e arquiteturas modernas

Sistemas críticos combinam os dois modelos numa arquitetura orientada a eventos: webhook como canal principal e polling de reconciliação rodando a cada hora pra capturar o que se perdeu. Provedores de pagamento recomendam exatamente isso. A notificação dá velocidade; a consulta garante que nenhum pagamento aprovado fique sem processar. Pra decidir o que usar na sua API, o critério resume bem: webhook pra eventos, polling pra estado.

Perguntas frequentes

Para que serve um webhook?

Pra receber notificações automáticas de eventos em outro sistema sem ficar consultando a API: confirmação de pagamento, mudança de status de pedido, push em repositório, mensagem recebida. O provedor envia um POST pra sua URL no momento em que o evento acontece.

Qual a diferença entre webhook e API?

API é a interface completa de um serviço; webhook é um recurso da API em que o fluxo se inverte. Na chamada de API tradicional, sua aplicação pede dados. No webhook, o serviço envia dados pra você quando algo acontece.

Como criar um webhook?

Implemente um endpoint HTTP POST público na sua aplicação, cadastre essa URL no painel do serviço que vai notificar e valide a assinatura HMAC de cada requisição recebida. Responda 200 rápido e processe o evento em background.

Webhook é pago?

O mecanismo em si é gratuito — é só uma requisição HTTP. O que pode ter custo é o serviço que envia (alguns planos limitam webhooks) e a sua infraestrutura pra receber, que em geral é mínima.

Webhook é seguro?

É, desde que o receiver valide a assinatura HMAC, use HTTPS e trate eventos duplicados com idempotência. Sem validação de assinatura, qualquer um que conheça a URL consegue forjar notificações.

Conclusão

Webhook e polling resolvem problemas diferentes. Use webhook quando precisar reagir a eventos com baixa latência e puder expor uma URL pública. Use polling quando a consistência importar mais que a velocidade, ou quando o provedor não oferecer notificações. E nos fluxos críticos, combine os dois — webhook pra agilidade, polling de reconciliação pra garantia. Com assinatura HMAC, resposta rápida e idempotência no receiver, a integração aguenta produção sem sustos.

Leituras relacionadas

Compartilhe nas mídias: