Migrar do WAHA para a API oficial do WhatsApp
Em resumo: para levar um bot ou uma automação do WAHA para a API Cloud oficial da Meta, conecte o número ao ZapClaw pela Coexistência, envie pela API REST do ZapClaw em vez de /api/sendText e leia o webhook do ZapClaw em vez do evento message do WAHA. O número continua funcionando no app WhatsApp Business no seu celular. Abaixo: os passos, os campos de envio de texto e de mídia e os principais campos de webhook lado a lado, e o que não tem equivalente na API oficial.
O ZapClaw é um gateway hospedado na API Cloud da Meta: nenhum servidor ou sessão do WAHA para manter no ar e nenhum app próprio na Meta.
Plano Business: R$ 99 por mês, com números ilimitados
Comece grátis Ver o mapeamento dos camposPor que migrar para a API oficial
- Os termos do WhatsApp. Os engines do WAHA rodam o WhatsApp Web num navegador ou conversam com o WhatsApp Web por WebSocket, e a própria introdução do WAHA diz que o WhatsApp não permite bots nem clientes não oficiais, por isso o método não deve ser considerado totalmente seguro. Os Termos de Serviço do WhatsApp proíbem usar o serviço por meios automatizados de um jeito que o WhatsApp não autorizou, e citam o envio automático de mensagens entre as comunicações que não permitem. A API Cloud da Meta é a API que a Meta oferece às empresas para isso.
- O app continua no celular. Com a Coexistência, a sua equipe continua respondendo no app WhatsApp Business enquanto o seu sistema usa a API no mesmo número, e as conversas ficam sincronizadas.
- Nenhum servidor para manter. O WAHA é um software que você instala no seu próprio servidor. O ZapClaw roda o gateway; você fica só com o sistema que recebe o seu webhook.
- Webhooks assinados sem configurar nada. O WAHA assina os webhooks com HMAC SHA-512 quando você dá uma chave à sessão. O ZapClaw assina cada corpo com HMAC-SHA256 desde o início e guarda cada evento para reenvio pelo painel.
As políticas da Meta continuam valendo na API oficial: a Meta pode restringir ou desativar uma conta que as descumpre, e a API do ZapClaw passa a responder 403 com o motivo (erros, em inglês).
O que você precisa para conectar
- O app WhatsApp Business no número, na versão 2.24.17 ou mais recente, em uso normal.
- Autenticação em dois fatores ativa na conta pessoal do Facebook que autoriza a conexão.
- O número fora de outro provedor. Se ele estiver conectado a outra plataforma, desconecte lá primeiro.
- Um computador para fazer a conexão, com o celular em mãos para confirmá-la no app.
Não precisa de CNPJ nem de empresa verificada para conectar. A lista completa.
A migração, passo a passo
- Mapeie o código primeiro. Troque as chamadas de envio e o tratamento do webhook com as tabelas abaixo, ou coloque o shim na frente do seu fluxo para ele manter as chamadas do WAHA enquanto você reescreve.
- Confira o número. A Coexistência conecta números que rodam no app WhatsApp Business, não no WhatsApp comum. Faça backup das conversas no app e confira os requisitos acima.
- Conecte o número. Crie a sua conta no ZapClaw e conecte o número na janela da Meta, pelo painel. A Meta então desconecta todos os dispositivos vinculados à conta, inclusive a sessão do WAHA. Pare ou apague a sessão no WAHA depois, para ninguém escanear o QR code dela de novo e dois sistemas responderem ao mesmo cliente.
- Configure o webhook. No painel, em Webhook, cole a sua URL HTTPS pública, escolha os eventos e copie a chave de assinatura. Marque Mensagens enviadas pelo app WhatsApp Business se o seu fluxo escutava
message.anypara as suas próprias mensagens. - Crie uma chave de API e envie com ela no cabeçalho
X-API-Keyparahttps://api.zapclaw.app. O campofromindica o número, então uma chave envia por todos os números da conta. - Crie os seus templates. Fora da janela de 24 horas, e para escrever primeiro, a Meta só aceita um template aprovado. Crie pelo painel ou com
POST /api/v1/send/templates, e passelanguageao enviar um: o padrão da API épt_BR. - Teste. Clique em Enviar evento de teste na página Webhook do painel, depois escreva para o seu número de outro celular e confira se o seu fluxo recebe a mensagem e responde.
Envio: as chamadas do WAHA e o equivalente no ZapClaw
Os caminhos do WAHA são relativos ao seu servidor do WAHA, e os do ZapClaw a https://api.zapclaw.app.
| WAHA | ZapClaw | |
|---|---|---|
| Enviar texto | POST /api/sendText |
POST /api/v1/send/text |
| Enviar mídia | /api/sendImage, /api/sendVideo, /api/sendVoice, /api/sendSticker, /api/sendFile |
POST /api/v1/send/media com type image, video, audio, sticker ou document |
| Autenticação | Cabeçalho X-Api-Key |
Cabeçalho X-API-Key, com uma chave do ZapClaw |
| O seu número | session, no corpo |
from, no corpo |
| Destinatário | chatId: o número mais @c.us |
to: o número, só dígitos |
| Texto | text |
text, até 4.096 caracteres |
| Prévia de link | linkPreview |
previewUrl |
| Responder a uma mensagem | reply_to |
replyTo: o wamid da mensagem |
| Arquivo de mídia | file.url, ou file.data em base64, com file.mimetype |
link, uma URL https pública, ou mediaId de POST /api/v1/media |
| Nome do arquivo | file.filename |
filename (documento) |
| Legenda | caption |
caption (imagem, vídeo, documento) |
| Conversão de formato | convert, asNote |
Sem equivalente: envie um formato que o WhatsApp aceita |
| Menções | mentions |
Sem equivalente |
Localização, cartões de contato e reações vão por POST /api/v1/send/location, /send/contacts e /send/reaction (referência da API, em inglês). O shim mais abaixo ainda não converte essas chamadas: envie direto ao ZapClaw.
Recebimento: o evento message e o equivalente no ZapClaw
O WAHA envia um envelope com event, session, me e payload; os caminhos de payload abaixo são os de um evento message. O ZapClaw envia event, timestamp, data e account para uma URL só, para todos os seus números.
| WAHA | ZapClaw | |
|---|---|---|
| Evento | message; message.any inclui também as suas |
message.received; as suas mensagens enviadas pelo app chegam como message.echo (opcional) |
| Qual dos seus números | session, me.id |
account.phone_number_id, account.display_phone_number |
| Remetente | payload.from: o número mais @c.us |
data.from, só dígitos, e data.user_id, o id permanente do contato |
| Enviada por você | payload.fromMe |
O evento message.echo, com data.to |
| Id da mensagem | payload.id |
data.message_id, um wamid |
| Nome do contato | Fora do payload documentado; fica no _data próprio do engine |
data.contact_name |
| Horário | payload.timestamp: segundos nos exemplos da documentação |
data.timestamp: segundos, como string |
| Texto | payload.body, que traz a legenda nas mídias |
data.text.body, ou data.<type>.caption nas mídias |
| Tem mídia | payload.hasMedia |
data.type é image, audio, video, document ou sticker |
| Arquivo de mídia | payload.media.url, baixada com a sua X-Api-Key |
data.<type>.media_url, baixada com a sua X-API-Key |
| Tipo MIME e nome do arquivo | payload.media.mimetype, payload.media.filename |
data.<type>.mime_type, data.document.filename |
| Mensagem citada | payload.replyTo.id |
data.context.id |
| Status de entrega | message.ack, com payload.ackName igual a ERROR, PENDING, SERVER, DEVICE, READ ou PLAYED |
message.status, com data.status igual a failed, sent, delivered ou read |
| Autenticação da requisição | Opcional: X-Webhook-Hmac, um HMAC SHA-512 do corpo, quando a sessão tem uma chave |
Sempre: X-ZapClaw-Signature, um HMAC-SHA256 do corpo bruto, feito com a sua chave de assinatura (como verificar, em inglês) |
Um link de mídia do ZapClaw precisa da sua chave de API, e a Meta guarda a mídia recebida por cerca de 30 dias, então baixe o que quiser manter. As entregas podem chegar fora de ordem: quando a ordem importa, ordene pelo sequence do nível superior.
O que não tem equivalente, e o que fazer no lugar
- Grupos. Os grupos continuam funcionando no app WhatsApp Business, mas a API Cloud da Meta não os suporta num número em Coexistência: enviar para um chat
@g.use receber mensagens de grupo pela API deixam de funcionar. Mantenha as automações de grupo fora do número que você migrar. - Texto livre a qualquer hora. Uma mensagem de texto ou de mídia só sai dentro de 24 horas desde a última mensagem do contato para você. Fora dessa janela, o ZapClaw responde
422commeta_code: 131047: envie um template aprovado no lugar. - Escrever primeiro. A primeira mensagem para alguém que não escreveu para você nas últimas 24 horas precisa ser um template aprovado. A Meta cobra os templates direto de você, à parte do seu plano do ZapClaw.
- Status, canais e listas de transmissão. O ZapClaw não tem endpoint para chats
status@broadcastnem@newsletter, e a Meta lista as listas de transmissão entre o que a Coexistência não suporta. - Visualização única, mensagens temporárias e chamadas. A Meta desativa a visualização única e as mensagens temporárias nas conversas individuais. As chamadas de voz e de vídeo continuam funcionando no app, mas a API Cloud não as suporta num número em Coexistência.
- Enquetes, menções, presença, editar ou apagar uma mensagem enviada. O ZapClaw não tem endpoint para eles. Botões e listas vão por
POST /api/v1/send/interactive. - Base64 e conversão de formato. Suba o arquivo com
POST /api/v1/mediae envie omediaIdque ele devolve, ou envie umlinkhttps público, num formato que o WhatsApp aceita. - Ids antigos de mensagem. Os ids do WAHA não são ids da API Cloud, então uma resposta não consegue citar uma mensagem de antes da migração. Os ids novos começam com
wamid. - Ids de contato. Um
@lidé um id oculto do WhatsApp, não um número de telefone. Trate os contatos pelo número de telefone e guardedata.user_idcomo chave permanente: um contato que adota um nome de usuário no WhatsApp pode chegar comdata.fromigual anull. - Volume. Um número em Coexistência fica fixo em 20 mensagens por segundo, um limite da Meta que não pode ser aumentado, e disparo em massa não cabe.
- WhatsApp para Windows e WearOS. A Meta não deixa vinculá-los de novo depois da migração, e mensagens enviadas por eles não geram webhook.
Continue usando o app WhatsApp Business no celular: a Meta desconecta um número em Coexistência cujo app fica cerca de 14 dias sem uso, e o ZapClaw avisa o seu webhook com um evento account.account_update (detalhes, em inglês).
Um adaptador curto
Duas funções para Node.js 18 ou mais novo, sem dependências: a primeira envia onde o seu código chamava /api/sendText, a segunda transforma um message.received do ZapClaw nos campos de payload que o seu fluxo já lê. Confira o cabeçalho X-ZapClaw-Signature antes de confiar num corpo.
// Sending: what was POST /api/sendText with an X-Api-Key header
const sendText = async ({ chatId, text }) => {
const res = await fetch('https://api.zapclaw.app/api/v1/send/text', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.ZAPCLAW_API_KEY,
},
body: JSON.stringify({
from: process.env.ZAPCLAW_FROM,
to: chatId.replace(/@c\.us$/, ''),
text,
}),
});
if (!res.ok) throw new Error(`ZapClaw answered ${res.status}`);
return (await res.json()).message; // message.wamid is the new message id
};
// Receiving: the payload of a WAHA message event, taken from a message.received body
const MEDIA = ['image', 'audio', 'video', 'document', 'sticker'];
const fromZapClaw = (body) => {
const d = body.data;
const media = MEDIA.includes(d.type) ? d[d.type] : null;
return {
from: `${d.from}@c.us`,
fromMe: false,
id: d.message_id,
timestamp: Number(d.timestamp),
body: d.text ? d.text.body : (media ? media.caption || '' : ''),
hasMedia: Boolean(media),
media: media ? { url: media.media_url, mimetype: media.mime_type } : null,
};
};
A versão completa está no GitHub: zapclaw/migrate-to-whatsapp-official-api converte texto, mídia, status de entrega e webhooks, e traz um pequeno shim. Uma chamada que não é convertida, como uma localização, um cartão de contato ou uma reação, é recusada com um código de erro claro: envie essas chamadas direto pela API do ZapClaw. Aponte para o shim a URL base do WAHA que o seu fluxo usa: ele repassa ao ZapClaw as chamadas que converte e transforma os webhooks assinados do ZapClaw de volta em eventos message, message.any e message.ack, para você migrar primeiro e reescrever depois. Licença MIT.
Se o seu cenário é diferente
- Várias sessões. Se você usava uma sessão do WAHA por número, uma conta do ZapClaw comporta todas:
account.phone_number_idsepara os números numa URL de webhook só, efromescolhe o número no envio. - n8n ou Make. Use um gatilho de webhook que recebe os eventos do ZapClaw e uma requisição HTTP que chama a API de envio: n8n e Make.
- Chatwoot. O canal WhatsApp Cloud do próprio Chatwoot conversa com o ZapClaw em vez da Meta: Chatwoot na API oficial do WhatsApp.
- Um agente de IA por trás do WAHA. Dify, Flowise e Typebot têm cada um um guia para o ZapClaw: Dify, Flowise e Typebot.
Quanto custa
- Grátis: 500 mensagens por mês e 1 número, sem cartão e sem prazo para acabar. No limite, o envio pausa e as mensagens novas ficam retidas até você assinar.
- Business: R$ 99 por mês, com 20.000 mensagens incluídas e números ilimitados.
- Agency: R$ 149 por mês para agências, com 3 clientes e 60.000 mensagens incluídos e números ilimitados.
A Meta cobra as tarifas de mensagem do WhatsApp direto de você, sem margem do ZapClaw. Todos os planos e preços.
Veja também
- APIs de WhatsApp não oficiais e a API oficial da Meta, comparadas: Baileys, whatsapp-web.js e WAHA frente à API Cloud da Meta, com fontes.
- A API oficial do WhatsApp com o ZapClaw: o que você recebe e os requisitos.
- O que você precisa para conectar um número pela Coexistência.
- A referência do webhook (em inglês), com cada evento e campo.
- Migrando de outra ferramenta: Evolution API ou Z-API.
Fontes
Conferido em 15 de outubro de 2026. Os campos do WAHA podem variar conforme o engine, então confira a documentação do engine que você usa.
- WAHA, introdução (em inglês): instalação no seu próprio servidor, e o aviso sobre bots e clientes não oficiais.
- WAHA, engines (em inglês): WEBJS, WPP, NOWEB e GOWS, e como cada um chega ao WhatsApp Web.
- WAHA, enviar mensagens (em inglês): endpoints, o cabeçalho
X-Api-Keye os campos do corpo. - WAHA, receber mensagens (em inglês): links de mídia, respostas e tipos de id de chat.
- WAHA, eventos (em inglês): o envelope,
message,message.any,message.acke a opção de HMAC. - Termos de Serviço do WhatsApp: acesso automatizado e envio automático de mensagens.
- Meta, integração de usuários do app WhatsApp Business (em inglês): a Coexistência, os dispositivos vinculados, a velocidade de envio e o que ela não suporta.
- ZapClaw: referência do webhook, erros, arquivo OpenAPI (em inglês) e preços.
- zapclaw/migrate-to-whatsapp-official-api: o mapeamento completo, com uma fonte para cada linha.
Leve os seus fluxos do WAHA para a API oficial
Comece no plano grátis: um número, sem cartão. Passe para o plano Business quando precisar de mais números ou de mais mensagens.
Comece grátis Ler a documentação do webhook