Migração

Migrar do WAHA para a ZapZap: guia de migração (inclui n8n)

Migrar do WAHA para a ZapZap troca um contêiner que você mantém por um serviço gerenciado. No código, muda o endereço de envio (de /api/sendText para /api/v1/{instanceId}/send/text), a autenticação (de X-Api-Key para x-api-key e x-api-secret) e o formato do webhook. Os fatos sobre o WAHA vêm da documentação oficial, lida em 27/10/2026.

Publicado em · 4 min de leitura

Este artigo também está disponível em: English · Español

O que muda ao sair do WAHA

O WAHA é uma API HTTP não oficial que você roda em Docker; o site do projeto o descreve como gratuito e de código aberto. Você escolhe o motor de conexão (WEBJS, NOWEB, GOWS), o servidor e a hora de atualizar. A documentação do próprio WAHA avisa que o WhatsApp não permite bots ou clientes não oficiais e que isso pode levar a bloqueio.

Na ZapZap, hospedagem, atualização e monitoramento ficam conosco, a cobrança é de R$15 por número ativo ao mês e o risco do número continua existindo, porque também é uma solução não oficial. Em troca, você perde o controle do servidor e do motor.

Mapa de endpoints: WAHA para ZapZap

A coluna do WAHA vem da documentação oficial (waha.devlike.pro, 27/10/2026). O WAHA usa session e chatId com sufixo (@c.us); a ZapZap usa o ID da instância na URL e o número só com dígitos.

AçãoWAHAZapZap
Autenticaçãocabeçalho X-Api-Keyx-api-key e x-api-secret
Enviar textoPOST /api/sendText com session, chatId (por exemplo 5511999999999@c.us) e textPOST /api/v1/{instanceId}/send/text com number (5511999999999) e text
Enviar arquivoendpoints por tipo de mídiaPOST /api/v1/{instanceId}/send/media com type, file, text e docName
Sessãosession (por exemplo default)instância, com ID próprio
Receber mensagemevento message com payload.from, payload.body, payload.fromMeevento messages com data.message.chatid, data.message.text, data.message.fromMe
ConectarQR code da sessãoQR code em QR da instância

Como trocar o nó do WAHA no n8n

Se o seu fluxo usa o nó do WAHA ou um HTTP Request apontando para o WAHA, a troca é direta. Instale o nó da comunidade n8n-nodes-zapzap em Settings, Community Nodes (nós da comunidade não verificados só funcionam no n8n self-hosted, segundo a documentação do n8n) ou use um HTTP Request com os cabeçalhos x-api-key e x-api-secret. Passo a passo na integração com n8n.

No gatilho de recebimento, troque o Webhook do WAHA pelo Webhook do n8n com a URL de produção (não a de teste) e configure essa URL em configurar webhook. Nos nós seguintes, ajuste as expressões: onde havia payload.from e payload.body, passe a usar data.message.chatid e data.message.text. Os 12 templates de n8n já vêm no formato da ZapZap.

n8n: Code node para normalizar o evento

// Entrada: evento da ZapZap. Saída: o formato que seus nós já esperavam do WAHA.
const e = $input.first().json.body ?? $input.first().json;
const m = e?.data?.message;
if (e?.event !== "messages" || !m || m.fromMe) return [];
return [{
  json: {
    payload: {
      from: String(m.chatid || "").replace(/\D/g, "") + "@c.us",
      body: m.text || "",
      fromMe: false,
    },
  },
}];

Como mudar o envio no código

O envio é uma troca de URL, cabeçalhos e campos: session e chatId com @c.us viram o ID da instância na URL e number só com dígitos. Isole o envio numa função e troque o conteúdo dela.

Node.js

// ANTES: WAHA
// POST {WAHA_URL}/api/sendText   header: X-Api-Key
// body: { session: "default", chatId: "5511999999999@c.us", text: "Olá!" }

// DEPOIS: ZapZap
export async function enviarWhatsApp(numero, texto) {
  const r = await fetch(
    "https://api.zapzapapi.com/api/v1/" + process.env.ZAPZAP_INSTANCE_ID + "/send/text",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-api-key": process.env.ZAPZAP_API_KEY,
        "x-api-secret": process.env.ZAPZAP_API_SECRET,
      },
      body: JSON.stringify({ number: numero.replace(/@.*/, ""), text: texto }),
      signal: AbortSignal.timeout(15000),
    }
  );
  if (!r.ok) throw new Error("ZapZap " + r.status + " " + (await r.text()));
  return r.json();
}

Checklist de virada e quando continuar no WAHA

Checklist: 1) criar a conta e testar com um número seu; 2) trocar a função de envio ou o nó do n8n; 3) apontar o webhook e validar a assinatura (guia); 4) exportar o que quiser guardar do WAHA; 5) conectar o número de produção por QR code na hora da virada, sem mantê-lo ativo nos dois; 6) desligar o contêiner antigo depois de alguns dias estáveis.

Continue no WAHA se você tem DevOps, quer o código e os dados no seu ambiente e prefere escolher o motor de conexão. Veja o comparativo WAHA x ZapZap e a conta de custo em Evolution e WAHA hospedados x gerenciada. Se você precisa de canal homologado pela Meta, a opção é a API oficial.

Resumo rápido

  • No código muda a URL, a autenticação e o formato do webhook; session e chatId viram instância e número.
  • No n8n, troque o nó e ajuste as expressões de payload.from e payload.body para data.message.
  • Os dois são não oficiais: o risco de bloqueio do número existe nos dois lados.
  • Use a URL de produção do webhook do n8n, não a de teste.

Perguntas frequentes

Meus templates de n8n do WAHA funcionam na ZapZap?

Com ajustes. Troque o nó de envio e as expressões do evento recebido (payload.from e payload.body viram data.message.chatid e data.message.text). Os templates da ZapZap já vêm prontos.

O WAHA Plus muda alguma coisa?

Segundo a documentação do WAHA lida em 27/10/2026, recursos que eram do WAHA Plus passaram a fazer parte do Core desde a versão 2026.6.1. Reconfira na documentação, porque isso pode mudar.

Preciso manter o servidor do WAHA?

Só durante a transição. Depois de alguns dias estáveis na ZapZap, você pode desligar o contêiner. Exporte antes o que quiser guardar.

A ZapZap garante que o número não será bloqueado?

Não. Nenhuma API não oficial pode garantir isso. Atraso e digitando automáticos reduzem o risco, mas opt-in, ritmo e lista limpa continuam sendo seus.

Teste a ZapZap com o seu fluxo

Crie a conta, conecte um número de teste e troque o nó. R$15 por número ativo ao mês, sem cobrança por mensagem.