“Webhook vs API” é uma pergunta sobre direção de comunicação. Em uma API REST comum, seu sistema chama o provedor quando precisa de dados ou quer executar uma ação. Em um webhook, o provedor chama o seu endpoint quando um evento acontece. Ou seja: webhook não é o oposto de API; é uma API usada no sentido inverso.
Este guia mostra como diferenciar os dois modelos, quando usar cada um e como implementar um receptor de webhook com segurança. Se você constrói ou testa integrações, o Apidog permite projetar, simular e testar endpoints REST e receptores de webhook no mesmo fluxo.
A resposta curta
- API regular: você envia uma requisição HTTP e recebe uma resposta. Você controla quando a chamada acontece.
- Webhook: o provedor envia uma requisição HTTP para o seu servidor quando um evento ocorre. O provedor controla quando a chamada acontece.
- Ambos usam HTTP e normalmente trafegam JSON.
- A comparação correta não é “webhook vs API”, mas pull vs push.
Exemplo:
API REST:
Seu app ---> GET /orders/123 ---> Provedor
Seu app <--- JSON de resposta <--- Provedor
Webhook:
Seu app <--- POST /webhooks/payment <--- Provedor
O que as pessoas querem dizer com “API”
Quando alguém diz “chamar a API”, geralmente está falando de uma API REST no modelo requisição-resposta.
Exemplo:
GET /orders/123 HTTP/1.1
Host: api.exemplo.com
Authorization: Bearer token
Resposta:
{
"id": "123",
"status": "paid",
"total": 4990
}
Esse é o modelo pull: seu sistema busca os dados quando precisa deles.
Use esse modelo quando você quer:
- carregar dados sob demanda;
- executar uma ação iniciada pelo seu sistema;
- consultar o estado atual de um recurso;
- controlar exatamente quando a requisição acontece.
A desvantagem aparece quando você precisa detectar mudanças. Para saber se algo mudou, seu sistema precisa chamar a API repetidamente. Se quiser revisar como uma requisição HTTP é estruturada, veja compreendendo a estrutura de requisição de API.
O que é um webhook
Um webhook é um callback HTTP configurado por você.
Você registra uma URL no provedor, por exemplo:
https://sua-api.com/webhooks/stripe
Quando um evento acontece, o provedor envia um POST para essa URL.
Exemplo de payload:
{
"event": "payment.succeeded",
"id": "evt_123",
"data": {
"payment_id": "pay_456",
"amount": 4990,
"currency": "BRL"
}
}
Nesse modelo, seu servidor não pergunta. Ele apenas recebe a notificação. Esse é o modelo push.
Webhooks são usados, por exemplo, quando:
- o Stripe informa que um pagamento foi aprovado;
- o GitHub informa que houve um push no repositório;
- o Slack informa que alguém executou um comando no seu app.
Para entender melhor o lado receptor, veja o que é uma API de webhooks.
Webhook vs API: diferença principal
| API Regular REST | Webhook | |
|---|---|---|
| Quem inicia a troca | Você, como cliente | O provedor |
| Modelo | Requisição-resposta | Evento |
| Fluxo | Pull | Push |
| Momento da chamada | Quando seu código decide chamar | Quando o evento acontece |
| Direção | Seu sistema chama o provedor | O provedor chama seu sistema |
| Melhor uso | Dados sob demanda e ações iniciadas por você | Reação automática a eventos externos |
| Custo operacional | Polling pode gerar chamadas desnecessárias | Você precisa expor e proteger um endpoint público |
A diferença mais importante é quem inicia a chamada. Todo o resto deriva disso.
“Um webhook não é apenas uma API?”
Sim, mas com uma direção específica.
Um webhook usa os mesmos elementos básicos de uma API:
- HTTP;
- URL;
- headers;
- método
POST; - corpo JSON;
- códigos de status HTTP.
A diferença é que, no webhook, o provedor atua como cliente e seu endpoint atua como servidor.
Por isso, um webhook pode ser descrito como uma “API reversa” ou uma “API de push”.
O OpenAPI 3.1 inclui um campo webhooks para documentar esse tipo de contrato. O Apidog também pode trabalhar com esse modelo; veja callbacks e webhooks do OpenAPI.
Formulação prática:
Webhook é um padrão de comunicação de API orientado a eventos, não uma tecnologia separada.
Quando usar uma API regular
Use uma chamada de API REST quando você precisa iniciar a operação.
Casos comuns:
- buscar dados para renderizar uma tela;
- criar um pagamento;
- atualizar um usuário;
- enviar uma mensagem;
- gerar um relatório;
- consultar o estado atual de um pedido.
Exemplo em JavaScript:
const response = await fetch("https://api.exemplo.com/orders/123", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
"Content-Type": "application/json"
}
});
const order = await response.json();
console.log(order.status);
Esse modelo é ideal quando o seu sistema decide quando a informação é necessária.
Quando usar um webhook
Use webhook quando você precisa reagir a algo que acontece fora do seu controle.
Casos comuns:
- pagamento aprovado;
- pagamento recusado;
- build finalizado;
- upload processado;
- pull request aberto;
- mensagem recebida;
- assinatura cancelada.
Exemplo de endpoint com Node.js e Express:
import express from "express";
const app = express();
app.use(express.json());
app.post("/webhooks/payment", async (req, res) => {
const event = req.body;
if (event.event === "payment.succeeded") {
const payment = event.data;
// Atualize seu banco, libere acesso, envie e-mail etc.
console.log("Pagamento aprovado:", payment.payment_id);
}
res.status(200).send("ok");
});
app.listen(3000, () => {
console.log("Webhook receiver rodando na porta 3000");
});
Ponto importante: responda rápido. O webhook deve confirmar recebimento e delegar processamento pesado para uma fila ou worker quando necessário.
Webhook vs polling
Se a alternativa ao webhook for verificar a API a cada poucos segundos, você está comparando webhook com polling.
Polling:
setInterval(async () => {
const response = await fetch("https://api.exemplo.com/orders/123");
const order = await response.json();
if (order.status === "paid") {
console.log("Pedido pago");
}
}, 5000);
Esse padrão funciona, mas pode desperdiçar recursos:
- muitas chamadas retornam o mesmo estado;
- você pode demorar até o próximo intervalo para detectar mudanças;
- o provedor pode aplicar rate limits;
- seu sistema processa requisições desnecessárias.
Webhook evita isso porque o provedor envia o evento quando ele acontece.
Para uma comparação específica, veja webhooks vs polling.
APIs e webhooks normalmente trabalham juntos
Em integrações reais, você raramente escolhe apenas um.
Exemplo com pagamento:
- Seu app chama a API do provedor para criar uma cobrança.
- O provedor processa o pagamento de forma assíncrona.
- O provedor chama seu webhook quando o pagamento é aprovado ou falha.
- Seu sistema atualiza o pedido internamente.
Fluxo:
1. Seu app ---> POST /payments ---> Provedor
2. Provedor processa o pagamento
3. Seu app <--- POST /webhooks/payment <--- Provedor
4. Seu app atualiza o pedido
A API inicia a ação. O webhook informa o resultado.
Esse padrão é comum em sistemas orientados a eventos. Para o design mais amplo, veja como construir APIs orientadas a eventos.
Webhooks vs WebSockets vs polling
Esses termos costumam aparecer juntos, mas resolvem problemas diferentes.
- Webhook vs polling: polling pergunta repetidamente; webhook recebe uma notificação quando o evento acontece.
-
Webhook vs WebSocket: webhook é um
POSTHTTP por evento; WebSocket é uma conexão persistente e bidirecional para comunicação contínua. - Webhook vs API: a diferença principal é a direção da chamada.
Leia também webhook vs WebSocket.
Como implementar um receptor de webhook
Um receptor de webhook precisa fazer mais do que aceitar um POST.
Checklist mínimo:
- Criar um endpoint público.
- Validar o método HTTP.
- Verificar assinatura ou segredo do provedor.
- Validar o payload.
- Garantir idempotência.
- Responder rapidamente com
2xx. - Registrar logs para depuração.
- Reprocessar eventos quando necessário.
Exemplo simplificado:
app.post("/webhooks/provider", async (req, res) => {
const event = req.body;
if (!event.id || !event.type) {
return res.status(400).json({ error: "Payload inválido" });
}
const alreadyProcessed = await wasEventProcessed(event.id);
if (alreadyProcessed) {
return res.status(200).json({ received: true });
}
await enqueueWebhookJob(event);
await markEventAsReceived(event.id);
return res.status(200).json({ received: true });
});
A regra prática é: receba, valide, persista ou enfileire, responda.
Como proteger webhooks
Um webhook expõe um endpoint público. Portanto, você não deve confiar em qualquer requisição recebida.
Medidas comuns:
- validar assinatura enviada pelo provedor;
- usar timestamp para evitar replay attacks;
- rejeitar payloads inválidos;
- limitar tamanho do corpo da requisição;
- registrar o
event_idpara evitar processamento duplicado; - usar HTTPS;
- aplicar rate limiting quando fizer sentido.
Exemplo conceitual de verificação com HMAC:
import crypto from "crypto";
function verifySignature(rawBody, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Cada provedor tem seu próprio formato de assinatura. Siga a documentação oficial do serviço que envia o webhook.
Veja também verificação de assinatura de webhook.
Como projetar e testar ambos com Apidog
Webhooks podem ser mais difíceis de testar do que APIs REST porque dependem de eventos externos. Você precisa receber um POST real antes de confiar no handler.
Com o Apidog, você pode trabalhar nos dois lados:
- projetar endpoints REST;
- testar chamadas requisição-resposta;
- criar payloads de teste para webhooks;
- enviar
POSTpara seu receptor; - validar respostas e contratos;
- documentar webhooks junto com endpoints REST usando OpenAPI.
Um fluxo prático:
- Defina o contrato do webhook: URL, headers e payload.
- Crie um exemplo de evento realista.
- Envie um
POSTpara seu endpoint local ou ambiente de teste. - Verifique se o handler valida, persiste e responde corretamente.
- Documente o contrato para consumidores e mantenedores.
Como design, simulação, teste e documentação ficam no mesmo workspace, você pode tratar o receptor de webhook como qualquer outro contrato de API.
Baixe o Apidog para construir e testar APIs e webhooks em um só lugar.
FAQ
Um webhook é uma API?
Sim, no sentido de que usa HTTP, URL, headers e payload como qualquer chamada de API. A diferença é a direção: o provedor chama o seu endpoint.
Posso usar webhook sem API?
Em alguns casos, sim, mas é raro em integrações completas. Normalmente você chama a API do provedor para iniciar algo e recebe o resultado via webhook. Veja o que é uma API de webhooks.
Webhooks são mais rápidos que APIs?
Para reagir a eventos, geralmente sim, porque você recebe a notificação quando o evento acontece. Para buscar dados sob demanda, uma chamada direta à API continua sendo o modelo correto.
Webhooks substituem APIs REST?
Não. Eles resolvem problemas diferentes. APIs REST são boas para requisições sob demanda e ações iniciadas pelo cliente. Webhooks são bons para notificações de eventos.
Um webhook é seguro?
Pode ser, desde que você valide a origem da requisição. O padrão mais comum é verificar uma assinatura enviada pelo provedor. Veja verificação de assinatura de webhook.
Conclusão
“Webhook vs API” não é uma escolha entre tecnologias opostas. É uma escolha entre modelos de comunicação.
Use API REST quando seu sistema controla o momento da chamada. Use webhook quando o provedor controla o momento do evento.
Na prática, integrações robustas usam os dois: APIs para iniciar ações e webhooks para receber resultados assíncronos.
Quando estiver pronto para projetar e testar ambos, use o Apidog para documentar, simular e validar seus endpoints e receptores de webhook no mesmo lugar.
Top comments (0)