Skip to main content

Visão Geral

Para receber mensagens, você precisa configurar um webhook. Quando alguém envia uma mensagem para sua instância, o EnviaAI faz um POST para sua URL.
Cliente → WhatsApp → EnviaAI → Seu Servidor

1. Criar o Endpoint

Seu servidor precisa de um endpoint para receber webhooks:
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhook/enviaai', (req, res) => {
  const { event, data } = req.body;

  console.log('Evento recebido:', event);
  console.log('Dados:', data);

  // Responda rápido!
  res.status(200).send('OK');

  // Processe em background
  processEvent(event, data);
});

app.listen(3000);

2. Expor na Internet

Seu endpoint precisa ser acessível publicamente. Para desenvolvimento:

ngrok (Recomendado para dev)

# Instalar
npm install -g ngrok

# Expor porta 3000
ngrok http 3000
Você receberá uma URL como https://abc123.ngrok.io

Outras opções

  • localtunnel: npx localtunnel --port 3000
  • Cloudflare Tunnel: gratuito, mais estável
  • Deploy em produção: Vercel, Railway, Render

3. Configurar o Webhook

Via API ou Developer Portal:
await client.webhooks.create({
  url: 'https://abc123.ngrok.io/webhook/enviaai',
  instanceId: 'inst_abc123',
  events: ['message.received'],
  secret: 'seu-secret-seguro'
});

4. Processar Mensagens

Exemplo de handler completo:
async function processEvent(event, data) {
  switch (event) {
    case 'message.received':
      await handleIncomingMessage(data);
      break;
    case 'message.delivered':
      console.log(`Mensagem ${data.messageId} entregue`);
      break;
    case 'message.read':
      console.log(`Mensagem ${data.messageId} lida`);
      break;
  }
}

async function handleIncomingMessage(data) {
  const { instanceId, from, type, content, contactName } = data;

  console.log(`Mensagem de ${contactName} (${from}): ${content}`);

  // Resposta automática
  if (content.toLowerCase().includes('preço')) {
    await client.messages.send({
      instanceId,
      to: from,
      message: 'Nossos preços começam em R$ 99. Quer saber mais?'
    });
  }
}

Estrutura do Payload

message.received

{
  "event": "message.received",
  "timestamp": "2026-02-03T12:00:00.000Z",
  "data": {
    "messageId": "msg_abc123",
    "instanceId": "inst_xyz789",
    "chatId": "chat_def456",
    "from": "5511999999999",
    "type": "text",
    "content": "Olá, qual o preço?",
    "timestamp": "2026-02-03T12:00:00.000Z",
    "contactName": "João Silva",
    "profilePicUrl": "https://...",
    "isGroup": false,
    "quotedMessage": null
  }
}

Tipos de mensagem

typecontent
textTexto da mensagem
imageURL da imagem
videoURL do vídeo
audioURL do áudio
documentURL do documento
location{ latitude, longitude }
contact{ name, phone }
stickerURL do sticker

Verificar Assinatura

Em produção, sempre verifique a assinatura:
const crypto = require('crypto');

function verifyWebhook(req) {
  const signature = req.headers['x-enviaai-signature'];
  const payload = JSON.stringify(req.body);

  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET)
    .update(payload)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

app.post('/webhook/enviaai', (req, res) => {
  if (!verifyWebhook(req)) {
    return res.status(401).send('Invalid signature');
  }

  // Processar...
  res.status(200).send('OK');
});

Processamento Assíncrono

Para alta performance, use filas:
const Queue = require('bull');
const webhookQueue = new Queue('webhooks', process.env.REDIS_URL);

app.post('/webhook/enviaai', async (req, res) => {
  // Adiciona na fila e responde imediatamente
  await webhookQueue.add(req.body);
  res.status(200).send('OK');
});

// Worker processa em paralelo
webhookQueue.process(async (job) => {
  const { event, data } = job.data;
  await processEvent(event, data);
});

Chatbot Simples

Exemplo de chatbot FAQ:
const faqs = {
  'preço': 'Nossos planos começam em R$ 49/mês',
  'horário': 'Atendemos de segunda a sexta, das 9h às 18h',
  'contato': 'Email: [email protected] | Tel: (11) 1234-5678',
};

async function handleIncomingMessage(data) {
  const { instanceId, from, content } = data;
  const lowerContent = content.toLowerCase();

  for (const [keyword, response] of Object.entries(faqs)) {
    if (lowerContent.includes(keyword)) {
      await client.messages.send({
        instanceId,
        to: from,
        message: response
      });
      return;
    }
  }

  // Mensagem padrão
  await client.messages.send({
    instanceId,
    to: from,
    message: 'Obrigado pelo contato! Em breve um atendente responderá.'
  });
}

Próximos Passos