O que o WAHA oferece hoje
Pela documentação oficial, o WAHA roda em Docker e expõe uma API REST com Swagger. Cada conta de WhatsApp é uma sessão, criada com um nome, e a autenticação é feita pelo header X-Api-Key. Ele trabalha com motores de conexão diferentes:
- WEBJS e WPP: rodam uma instância real do WhatsApp Web num navegador controlado pelo Puppeteer.
- NOWEB e GOWS: falam com o WhatsApp Web direto por WebSocket, sem navegador, o que economiza CPU e memória. O GOWS é escrito em Go.
Sobre as versões: por muito tempo existiram o WAHA Core, gratuito, e o WAHA Plus, com recursos extras liberados por doação. A documentação informa que, desde a versão 2026.6.1, os recursos do Plus foram incorporados ao Core. Se você usa uma versão anterior, vale checar em qual das duas está antes de planejar qualquer mudança.
A própria documentação é transparente sobre o risco: o WhatsApp não permite clientes não oficiais, então o uso não deve ser considerado totalmente seguro. Esse aviso vale para qualquer API não oficial, incluindo a D-API, e é por isso que isolamento e boas práticas de envio pesam tanto.
Quando faz sentido procurar uma alternativa ao WAHA
O projeto resolve bem o "conectar e enviar". As dores aparecem em outra camada:
- Muitas sessões num mesmo host. Um container com dezenas de números concentra risco: se ele reinicia, todos caem juntos, e sem proxy configurado todos saem pelo mesmo IP.
- Consumo de recursos. Engines com navegador pesam em memória; escalar significa mais máquinas e distribuir sessões entre elas.
- Cliente pedindo a API oficial. Os motores do WAHA descritos na documentação se conectam ao WhatsApp Web; quem precisa também da Cloud API da Meta quer as duas atrás da mesma integração.
- Ninguém quer ser o plantão do WhatsApp. Atualizar imagem, acompanhar mudanças do protocolo e recuperar sessões presas consome horas que não viram produto.
WAHA e D-API em critérios objetivos
| Critério | WAHA | D-API |
|---|---|---|
| Onde roda | Seu servidor, via Docker | Infraestrutura da D-API |
| Custo | Software gratuito; você paga servidor e operação | Por conexão, com valor menor conforme o volume |
| Conexão oficial (Cloud API) | Verifique com o projeto | Sim, na mesma API da não oficial |
| Isolamento entre números | Depende de como você distribui sessões e containers | Ambiente isolado por instância |
| IP por número | Depende da sua configuração de rede | Proxy com IP único por conexão |
| Autenticação | Header X-Api-Key | Header Authorization |
| Suporte | Comunidade e tier de apoio | Time da D-API, em português |
Uma comparação mais ampla entre hospedar e contratar está em self-hosted vs gerenciada, e o funcionamento da conexão por QR Code está em API de WhatsApp com QR Code.
Mapeamento de rotas do WAHA para a D-API
Como as duas são REST e organizadas em torno de sessões, a tradução é quase mecânica. As principais diferenças estão no formato do destinatário e no nome dos campos:
| WAHA | D-API |
|---|---|
POST /api/sessions com name | POST /api/v1/sessions com sessionId |
POST /api/sendText com session, chatId e text | POST /api/v1/messages/send/text com sessionId, to e text |
chatId no formato [email protected] | to só com o número: 5511999999999 |
Header X-Api-Key | Header Authorization com a API Key, sem Bearer |
| Webhooks configurados na sessão | webhookUrl na criação da sessão ou webhook-config com URL por evento |
Se o seu código chama o WAHA a partir de uma função própria, a troca pode ficar restrita a ela. Um adaptador de envio de texto em JavaScript fica assim:
// antes: fetch('http://seu-waha:3000/api/sendText', ...)
async function sendText(session, chatId, text) {
const to = chatId.replace('@c.us', '')
const res = await fetch('https://api.d-api.cloud/api/v1/messages/send/text', {
method: 'POST',
headers: {
Authorization: process.env.DAPI_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ sessionId: session, to, text }),
})
if (!res.ok) {
const { error, statusCode } = await res.json()
throw new Error(`D-API ${statusCode}: ${error}`)
}
}Manter a assinatura antiga da função (session, chatId, text) evita mexer em quem a chama. Em Node.js, o SDK d-api-sdk substitui o fetch manual por dapi.messages.sendText.
Roteiro de migração em cinco passos
- Liste as rotas do WAHA que o seu sistema chama e os eventos de webhook que ele consome.
- Escreva o adaptador para a D-API e um receptor para o envelope de evento, que traz
event,sessionIdedata. - Crie na D-API uma sessão por número, com o mesmo nome que você usava no WAHA para facilitar o rastreio.
- Conecte cada número pelo QR Code (
GET /api/v1/sessions/SEU_ID/qr) e aguarde o eventoconnection.statuscomconnected. - Pare a sessão correspondente no WAHA e, quando não restar nenhuma, desligue o container.
A D-API é uma API de WhatsApp pensada para quem precisa de muitas conexões estáveis, e a API não oficial é o ponto de partida natural para quem vem do WAHA. O teste de 3 dias basta para validar o adaptador com um número real. Se estiver avaliando outras opções, veja também a alternativa à Twilio.
