ZAP-API
PreçosCasos de UsoBlogDocsLogin
Começar grátis
  1. Blog
  2. Como integrar Webhook do WhatsApp em Node.js
Tutorial

Como integrar Webhook do WhatsApp em Node.js

Guia completo para integrar webhooks WhatsApp em Node.js. Passo a passo com código pronto. Comece grátis na ZAP API.

29 de junho de 2026·8 min de leitura·Equipe Editorial ZAP-API
Como integrar Webhook do WhatsApp em Node.js

Como integrar Webhook do WhatsApp em Node.js: Guia Completo

Integrar webhook do WhatsApp em Node.js permite receber mensagens em tempo real através de requisições HTTP POST automáticas enviadas pela API do WhatsApp para seu servidor. Esta integração é fundamental para criar chatbots, sistemas de atendimento automatizado e notificações bidirecionais. Neste guia completo, você aprenderá a configurar um servidor Node.js seguro, processar eventos de mensagens e implementar respostas automáticas com código pronto para produção.

O que é Webhook do WhatsApp e por que usar em Node.js

Um webhook do WhatsApp é um endpoint HTTP que recebe notificações em tempo real sempre que eventos ocorrem na sua conta WhatsApp Business — como mensagens recebidas, status de entrega, leituras confirmadas ou mudanças de status de contatos. Diferente do polling (consulta periódica), webhooks são event-driven: a API do WhatsApp envia dados instantaneamente para seu servidor quando algo acontece.

Node.js é a escolha ideal para webhooks WhatsApp por três razões técnicas:

  • Arquitetura assíncrona não-bloqueante: processa múltiplas requisições simultâneas sem degradação de performance
  • Ecossistema npm robusto: bibliotecas como Express.js, Fastify e Koa simplificam criação de servidores HTTP
  • Baixa latência: essencial para responder dentro do timeout de 20 segundos exigido pela entrega de webhook

Segundo dados da Meta, aplicações que utilizam webhooks têm redução de 78% na latência comparado a polling a cada 5 segundos, além de economia significativa em requisições API e custos de infraestrutura.

Pré-requisitos para integrar Webhook WhatsApp em Node.js

Antes de começar a implementação, certifique-se de ter:

  • Node.js 16.x ou superior instalado (verifique com node --version)
  • npm ou yarn para gerenciamento de pacotes
  • Uma conta na ZAP-API (7 dias grátis, sem cartão)
  • Servidor com IP público ou túnel ngrok para receber requisições externas
  • Certificado SSL/TLS válido (obrigatório — WhatsApp só envia webhooks para HTTPS)
  • Editor de código (VS Code, Sublime, WebStorm)

Conhecimentos técnicos recomendados:

  • JavaScript ES6+ (async/await, arrow functions, destructuring)
  • Conceitos de REST API e requisições HTTP
  • Noções básicas de segurança web (validação de assinaturas, HMAC)

⚡ Comece agora sem complicação

A ZAP-API oferece webhooks pré-configurados, documentação completa em português e suporte técnico especializado. Teste 7 dias grátis, sem cartão de crédito.

Criar conta gratuita →

Passo a passo: Configurar servidor Node.js para receber webhooks

Vamos criar um servidor Express.js básico para receber webhooks do WhatsApp. Primeiro, inicialize o projeto:

mkdir whatsapp-webhook
cd whatsapp-webhook
npm init -y
npm install express body-parser dotenv

Crie o arquivo server.js com a estrutura fundamental:

const express = require('express');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

// IMPORTANTE: guarde o corpo CRU. Se voce validar a assinatura sobre o JSON
// re-serializado, o HMAC nao bate (a ordem/espacos mudam).
app.use(express.json({
  verify: (req, _res, buf) => { req.rawBody = buf.toString('utf8'); }
}));

// A ZAP-API entrega tudo por POST. Nao existe etapa de verificacao por GET:
// basta a sua URL responder 200 rapido.
app.post('/webhook', (req, res) => {
  // Responda PRIMEIRO, processe depois. A entrega tem timeout curto e e
  // re-tentada (1min, 5min, 15min, 1h, 6h) se voce demorar ou falhar.
  res.sendStatus(200);

  const { event, instanceId, timestamp } = req.body;
  console.log(`Evento ${event} da instancia ${instanceId} em ${timestamp}`);
  processarEvento(req.body);
});

app.listen(PORT, () => console.log(`Webhook ouvindo na porta ${PORT}`));

Crie um arquivo .env na raiz do projeto:

PORT=3000
ZAP_WEBHOOK_SECRET=o_secret_da_sua_instancia
ZAP_TOKEN=tk_seu_token_da_zap_api

Execute o servidor com node server.js. Seu endpoint estará disponível em http://localhost:3000/webhook.

Implementar autenticação e segurança no webhook

A segurança é crítica para webhooks públicos. A ZAP-API envia o header X-ZapAPI-Signature-256 com o HMAC-SHA256 do corpo cru da requisição. Vamos validar essa assinatura:

const crypto = require('crypto');

// A ZAP-API assina cada entrega com HMAC-SHA256 do corpo cru, usando o
// webhook secret da sua instancia (painel > Webhooks).
// Header: X-ZapAPI-Signature-256: sha256=
function validarAssinatura(req) {
  const recebido = req.headers['x-zapapi-signature-256'];
  if (!recebido || !req.rawBody) return false;

  const esperado = 'sha256=' + crypto
    .createHmac('sha256', process.env.ZAP_WEBHOOK_SECRET)
    .update(req.rawBody)   // corpo CRU, nao o JSON re-serializado
    .digest('hex');

  const a = Buffer.from(recebido);
  const b = Buffer.from(esperado);
  // timingSafeEqual lanca RangeError se os tamanhos diferirem.
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
}

app.post('/webhook', (req, res) => {
  if (!validarAssinatura(req)) {
    console.log('Assinatura invalida - descartando');
    return res.sendStatus(403);
  }
  res.sendStatus(200);
  processarEvento(req.body);
});

Adicione ZAP_WEBHOOK_SECRET ao arquivo .env. Esse valor é o webhook secret que você mesmo define no painel da ZAP-API, em Webhooks: é com ele que a assinatura é calculada.

Boas práticas de segurança adicionais:

  • Use helmet para headers de segurança: npm install helmet
  • Implemente rate limiting com express-rate-limit
  • Valide estrutura do payload com bibliotecas como joi ou zod
  • Registre tentativas de acesso suspeitas em logs estruturados

Processar eventos de mensagens recebidas

O payload do webhook contém diferentes tipos de eventos. Vamos implementar processamento robusto para mensagens de texto, imagens, áudio e documentos:

// Payload da ZAP-API:
// { "event": "message.received", "instanceId": "inst_abc123",
//   "timestamp": "2026-02-26T12:00:00.000Z", "data": { ... } }
function processarEvento(body) {
  const { event, instanceId, data } = body;

  switch (event) {
    case 'message.received':
      // data: phone, name, type, body, mediaUrl, mimeType, messageId,
      //       fromMe, timestamp, isGroup, groupId (e lid, quando o
      //       WhatsApp oculta o numero do contato)
      processarMensagem(data, instanceId);
      break;

    case 'message.status':
      // data.status: 'sent' | 'delivered' | 'read' | 'failed'
      console.log(`Status de ${data.messageId}: ${data.status}`);
      break;

    case 'instance.connected':
      console.log(`Instancia ${instanceId} conectada`);
      break;

    case 'instance.disconnected':
      console.log(`Instancia ${instanceId} caiu - gere o QR de novo`);
      break;

    default:
      console.log(`Evento sem tratamento: ${event}`);
  }
}

function processarMensagem(data, instanceId) {
  if (data.fromMe) return;                 // ignore o que voce mesmo enviou
  if (data.type === 'text') {
    console.log(`${data.name || data.phone}: ${data.body}`);
  }
  // Midia (image/audio/video/document) chega em data.mediaUrl,
  // uma URL assinada e temporaria - baixe se precisar guardar.
}

Enviar respostas automáticas via webhook

Para enviar mensagens de volta, você precisa fazer requisições POST para a API do WhatsApp. Com a ZAP-API, isso é extremamente simplificado:

const axios = require('axios');

const INSTANCE_ID = process.env.ZAP_INSTANCE_ID; // ex: 'inst_abc123'

async function responderMensagem(phone, texto) {
  try {
    const response = await axios.post(
      `https://api.zap-api.tech/v1/instances/${INSTANCE_ID}/send`,
      {
        phone: phone,   // só dígitos, com DDI: '5511999998888'
        type: 'text',   // type é sempre obrigatório
        body: texto     // o texto vai em "body"
      },
      {
        headers: {
          'Authorization': `Bearer ${process.env.ZAP_API_TOKEN}`,
          'Content-Type': 'application/json'
        }
      }
    );
    
    console.log('✅ Mensagem enviada:', response.data.id);
    return response.data;
  } catch (error) {
    console.error('❌ Erro ao enviar mensagem:', error.response?.data || error.message);
    throw error;
  }
}

// Exemplo de bot simples
function processarMensagem(message, metadata) {
  const { from, text } = message;
  
  if (text) {
    const mensagemLower = text.body.toLowerCase();
    
    if (mensagemLower.includes('oi') || mensagemLower.includes('olá')) {
      responderMensagem(from, '👋 Olá! Como posso ajudar você hoje?');
    } else if (mensagemLower.includes('preço')) {
      responderMensagem(from, '💰 Nossos planos começam em R$29/mês. Acesse zap-api.tech para mais detalhes!');
    } else if (mensagemLower.includes('suporte')) {
      responderMensagem(from, '🆘 Nossa equipe de suporte está disponível 24/7. Digite sua dúvida que já te ajudamos!');
    } else {
      responderMensagem(from, 'Recebi sua mensagem! Em breve um atendente responderá.');
    }
  }
}

Instale o axios: npm install axios

Testar webhook localmente com ngrok

Para testar webhooks em desenvolvimento local, use o ngrok para criar um túnel HTTPS público:

# Instalar ngrok
npm install -g ngrok

# Criar túnel para porta 3000
ngrok http 3000

O ngrok fornecerá uma URL como https://abc123.ngrok.io. Use essa URL para configurar o webhook no painel da ZAP-API:

  • Webhook URL: https://abc123.ngrok.io/webhook
  • Secret: o mesmo valor que você pôs em ZAP_WEBHOOK_SECRET no .env
  • Eventos: marque só os que você vai tratar (ex.: message.received, message.status)

Dicas para testes eficientes:

  • Use o painel web do ngrok (http://localhost:4040) para inspecionar requisições
  • Teste diferentes tipos de mensagens (texto, imagem, áudio, localização)
  • Simule falhas desconectando o servidor para verificar retentativas
  • Monitore logs em tempo real com tail -f logs/webhook.log

Deploy em produção: Melhores práticas

Para ambiente de produção, siga estas recomendações baseadas em experiência com milhares de webhooks processados diariamente:

1. Infraestrutura e hospedagem:

  • Use serviços com auto-scaling: AWS Lambda, Google Cloud Run, Heroku, Railway
  • Configure health checks em /health para monitoramento
  • Implemente load balancer para distribuir carga entre múltiplas instâncias

2. Performance e confiabilidade:

  • Responda webhooks em menos de 5 segundos (timeout oficial é 20s)
  • Use filas (Redis, RabbitMQ, AWS SQS) para processamento assíncrono pesado
  • Implemente circuit breaker para dependências externas
  • Configure retry exponencial com backoff para falhas temporárias

3. Monitoramento e observabilidade:

// Exemplo com Winston para logs estruturados
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

app.post('/webhook', (req, res) => {
  const startTime = Date.now();
  
  logger.info('webhook_received', {
    timestamp: new Date().toISOString(),
    headers: req.headers,
    bodySize: JSON.stringify(req.body).length
  });
  
  res.sendStatus(200);
  
  processarEvento(req.body).then(() => {
    logger.info('webhook_processed', {
      duration: Date.now() - startTime
    });
  }).catch(error => {
    logger.error('webhook_error', {
      error: error.message,
      stack: error.stack
    });
  });
});

4. Segurança em produção:

  • Rotacione tokens e secrets regularmente
  • Use variáveis de ambiente (nunca hardcode credenciais)
  • Implemente WAF (Web Application Firewall) para proteção DDoS
  • Configure alertas para padrões anômalos de tráfego

Erros comuns ao integrar webhook WhatsApp em Node.js

1. Assinatura inválida (403 Forbidden)

Causa: o HMAC foi calculado sobre o JSON re-serializado, e não sobre o corpo cru. Solução: guarde o rawBody via express.json({ verify }) e confirme que o ZAP_WEBHOOK_SECRET é o mesmo do painel.

2. Webhook não recebe eventos após configuração

Causa: Certificado SSL inválido ou URL não acessível publicamente. Solução: Teste a URL com curl -I https://sua-url.com/webhook e verifique se retorna 200 OK.

3. Mensagens duplicadas processadas múltiplas vezes

Causa: Webhook não respondeu em até 20 segundos, causando retentativas. Solução: Responda res.sendStatus(200) imediatamente e processe de forma assíncrona.

4. Perda de mensagens em alto volume

Causa: Processamento síncrono bloqueando event loop do Node.js. Solução: Implemente fila de mensagens com Redis ou RabbitMQ:

const Queue = require('bull');
const messageQueue = new Queue('whatsapp-messages', process.env.REDIS_URL);

app.post('/webhook', (req, res) => {
  res.sendStatus(200);
  messageQueue.add(req.body); // Adiciona à fila
});

messageQueue.process(async (job) => {
  await processarEvento(job.data);
});

5. Erro "Invalid signature" mesmo com código correto

Causa: Middleware body-parser modificando o body antes da validação. Solução: Valide assinatura antes de parsear JSON ou use express.raw() para rota específica.

🚀 Evite todos esses problemas

A ZAP-API já resolve autenticação, validação, retry e processamento assíncrono. Você foca apenas na lógica de negócio. Teste 7 dias grátis.

Começar agora →

Alternativa: Use ZAP-API para simplificar integração

Implementar webhooks do WhatsApp do zero exige lidar com autenticação complexa, infraestrutura escalável, validação de payloads, gerenciamento de rate limits e manutenção contínua. A ZAP-API elimina essa complexidade oferecendo:

  • Webhooks pré-configurados: basta informar sua URL e começar a receber eventos
  • SDK Node.js oficial: biblioteca otimizada com TypeScript, retry automático e tratamento de erros
  • Documentação em português: exemplos práticos, guias passo a passo e referência completa da API
  • Painel de gerenciamento: monitore mensagens, webhooks, logs e métricas em tempo real
  • Suporte técnico especializado: equipe brasileira disponível para ajudar na integração

Exemplo de integração com a ZAP-API em poucas linhas:

const express = require('express');
const axios = require('axios');

const INSTANCE_ID = process.env.ZAP_INSTANCE_ID; // ex: 'inst_abc123'

const zap = axios.create({
  baseURL: 'https://api.zap-api.tech/v1',
  headers: { Authorization: `Bearer ${process.env.ZAP_API_TOKEN}` }
});

const enviarTexto = (phone, body) =>
  zap.post(`/instances/${INSTANCE_ID}/send`, { phone, type: 'text', body });

const app = express();
app.use(express.json());

// Configure esta URL em Webhooks no painel da ZAP-API
app.post('/webhook', async (req, res) => {
  res.sendStatus(200); // responda primeiro, processe depois

  const { event, data } = req.body;

  if (event === 'message.received') {
    await enviarTexto(data.phone, `Você disse: ${data.body}`);
  }

  if (event === 'message.status') {
    console.log(`Mensagem ${data.messageId}: ${data.status}`);
  }
});

app.listen(3000);

Com apenas R$29/mês por instância, você economiza centenas de horas de desenvolvimento e tem garantia de uptime de 99.9%. Teste 7 dias grátis sem cartão de crédito em zap-api.tech/register.

Perguntas frequentes sobre webhook WhatsApp em Node.js

Qual é a diferença entre webhook e polling para WhatsApp?

Webhook é um modelo push onde a API do WhatsApp envia dados automaticamente para seu servidor quando eventos ocorrem, com latência de milissegundos. Polling é um modelo pull onde sua aplicação consulta periodicamente a API para verificar novos eventos, gerando latência de segundos/minutos e consumindo mais recursos. Webhooks são 78% mais eficientes segundo dados da Meta e recomendados para aplicações em tempo real.

Como validar se o webhook do WhatsApp é legítimo?

Valide o header X-ZapAPI-Signature-256 com HMAC-SHA256 do corpo cru da requisição, usando o webhook secret da sua instância. Compare o hash recebido com o calculado usando crypto.timingSafeEqual() — confira o tamanho antes, senão ele lança RangeError. Nunca confie apenas no IP de origem, pois pode ser falsificado. A ZAP-API também envia X-Zap-Event-Id, estável entre as retentativas: use para descartar duplicata.

Qual hospedagem recomenda para webhook WhatsApp em Node.js?

Para produção, recomendamos serviços serverless com auto-scaling: AWS Lambda (com API Gateway), Google Cloud Run, Vercel (para Next.js) ou Railway. Para VPS tradicional, use DigitalOcean ou Linode com PM2 para gerenciamento de processos. Requisitos mínimos: 1GB RAM, SSL/TLS válido, uptime >99.5%. Evite hospedagens compartilhadas que não garantem IP dedicado.

Como processar múltiplas mensagens simultâneas sem perder dados?

Implemente uma arquitetura de filas (queue) usando Redis com Bull, RabbitMQ ou AWS SQS. O webhook recebe a mensagem, responde 200 OK imediatamente e adiciona o payload à fila. Workers separados processam a fila de forma assíncrona e paralela. Configure workers baseado em CPU disponível: require('os').cpus().length. Isso garante zero perda mesmo com picos de 1000+ mensagens/segundo.

Quanto tempo leva para integrar webhook WhatsApp em Node.js do zero?

Para desenvolvedores experientes: 4-8 horas para implementação básica funcional. Para integração completa em produção com segurança, filas, monitoramento e testes: 40-80 horas. Usando a ZAP-API, você reduz isso para menos de 1 hora, pois toda infraestrutura já está pronta — basta configurar sua URL de webhook e implementar a lógica de negócio.

Conclusão: Integrar webhooks do WhatsApp em Node.js oferece controle total sobre sua aplicação, mas exige conhecimento técnico avançado e manutenção contínua. Se você busca agilidade e confiabilidade, a ZAP-API oferece solução enterprise por apenas R$29/mês, com 7 dias de teste grátis. Comece agora em zap-api.tech/register e tenha sua integração funcionando em minutos.

Experimente a ZAP-API gratuitamente

7 dias de trial sem precisar de cartão. A partir de R$29/mês*.

Criar instância grátis
EE
Equipe Editorial ZAP-APIRevisão técnica

Desenvolvedores e especialistas em integrações WhatsApp. Todo conteúdo passa por revisão técnica para garantir precisão e aplicabilidade.

Ver perfil completoDocumentaçãoTrial grátis

Leia também

Tutorial · 05 de mar. de 2026 · 12 min

Como Integrar WhatsApp com CRM usando Node.js

Descubra como integrar WhatsApp ao seu CRM com Node.js e otimize sua comunicação. Cadastre-se na ZAP-API agora!

Tutorial · 07 de mar. de 2026 · 9 min

Como integrar WhatsApp com Google Sheets via API

Envie mensagens WhatsApp direto do Google Sheets usando Apps Script. Script pronto para cobranças, campanhas e notificações.

Tutorial · 30 de abr. de 2026 · 11 min

Webhook WhatsApp seguro: HMAC, retry exponencial e DLQ

Como usar webhook WhatsApp em produção com assinatura HMAC-SHA256, retry com backoff exponencial e Dead Letter Queue. Exemplos em Node.js.

Tutorial · 05 de mar. de 2026 · 10 min

Webhook WhatsApp: Integração e Configuração Fácil

Descubra como configurar webhook WhatsApp e receba mensagens em tempo real. Integre agora com ZAP-API! Cadastre-se grátis.

Tópicos:Chatbots com IAE-commerceAPI WhatsApp

Explore também

API WhatsApp grátisTeste 7 dias, sem cartãoAutomação WhatsAppAutomatize via REST APIAPI não oficialSem aprovação da MetaCasos de usoWhatsApp API por segmentoComparativoZAP-API vs alternativasPreçosPlanos e o que está inclusoGlossárioTermos técnicos de WhatsApp API
ZAP-API

API REST para WhatsApp com webhooks assinados, Meta Pixel/CAPI e compliance LGPD. Sem aprovação da Meta.

Status operacional🇧🇷 Feito no Brasil

Produto

  • Preços
  • Casos de uso
  • Automação WhatsApp
  • API não oficial
  • Comparativo
  • API WhatsApp grátis
  • Dashboard

Recursos

  • Documentação
  • Blog
  • Glossário
  • RSS Feed

Empresa

  • Sobre
  • Imprensa
  • Termos de uso
  • Privacidade
  • Criar conta
  • Login

Contato

  • [email protected]
  • [email protected]
  • Resposta em até 24h úteis
© 2026 ZAP-API — Todos os direitos reservados·CNPJ 42.130.949/0001-56·Termos·Privacidade

Desenvolvido por PreviusIA