1 Introdução
O ServidorWhats é uma API REST multi-instância para WhatsApp que suporta três providers sob a mesma interface HTTP. Escolha o provider ideal para cada caso de uso sem mudar a integração.
Baileys (padrão)
Protocolo reverso do WhatsApp Web. Leve, rápido, recurso completo. Ideal para automações e chatbots de alto volume.
whatsapp-web.js
Baseado em Puppeteer + Chromium. Maior compatibilidade com recursos visuais. Use provider: "wwebjs".
Meta Cloud API
API oficial do WhatsApp Business. Sem ban, sem QR Code. Requer conta Business verificada. Use provider: "meta".
MongoDB + Arquivos
Mensagens, agentes, pools e clientes em MongoDB. Sessões e dados em sessions/ e data/ localmente.
Anti-ban automático
Fila com delay aleatório entre envios (800–2500ms padrão), aquecimento progressivo e monitoramento de status.
Agentes IA
Chatbots com OpenAI, Vercel AI Gateway ou endpoint externo. Function calling, histórico de conversa e pausas.
{ success: true, ... } em caso de sucesso ou { success: false, error: "..." } em caso de erro. Códigos HTTP padrão são usados (200, 201, 400, 401, 403, 404, 500).
2 Autenticação
O servidor suporta dois níveis de acesso via chave de API e um terceiro via token de sessão para o portal do cliente.
POST /apikeys. Dá acesso a instâncias, pools, agentes e métricas.MASTER_KEY — definida na variável de ambiente
MASTER_KEY. Acesso total, incluindo gestão de clientes (/admin/*), criação/revogação de API keys e logs internos.Authorization: Bearer <token> — obtido em
POST /portal/login. Restringe o acesso às instâncias e pools atribuídos ao cliente.
Passe a chave no header ou via query string:
curl -H "x-api-key: SUA_API_KEY" BASE_URL/instances
curl BASE_URL/instances?api_key=SUA_API_KEY
Retorna o nível da chave enviada: master, apikey ou none. Útil para validar a chave antes de integrações.
curl -H "x-api-key: SUA_API_KEY" \ http://localhost:3000/auth/info
Identifica a marca e o conjunto de instâncias/pools visíveis para o domínio (host) de onde a requisição parte. Essencial em ambientes multi-tenant com domínios personalizados por cliente.
curl -H "x-api-key: SUA_API_KEY" \ http://localhost:3000/tenant
3 Instâncias (multi-provider)
Gerencie conexões WhatsApp individuais. Cada instância tem um instanceId único, um provider (baileys, wwebjs ou meta) e um ciclo de vida independente.
Retorna todas as instâncias ativas (Baileys + wwebjs + Meta). Filtro opcional por provider via query string.
| Parâmetro | Tipo | Descrição |
|---|---|---|
?provider | string | opcional — filtra por baileys, wwebjs ou meta |
curl -H "x-api-key: SUA_API_KEY" \ "http://localhost:3000/instances?provider=baileys"
Cria uma instância. O campo provider define qual engine usar. Para Baileys e wwebjs, após criar aguarde o QR Code em GET /instances/:id/qr.
| Campo | Tipo | Descrição |
|---|---|---|
instanceId | string | obrigatório — identificador único (letras, números, _ e -) |
provider | string | opcional — baileys (padrão) | wwebjs | meta |
label | string | opcional — nome amigável para exibição |
webhook | string | opcional — URL para receber eventos |
webhookSecret | string | opcional — segredo HMAC para assinar o webhook |
ignoreGroups | boolean | opcional — ignora mensagens de grupos |
phoneNumberId | string | Meta only — ID do número no Meta Business |
accessToken | string | Meta only — token de acesso permanente da Meta |
verifyToken | string | Meta only — token de verificação do webhook Meta |
curl -s -X POST http://localhost:3000/instances \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "instanceId": "bot1", "label": "Bot Principal", "webhook": "https://meuapp.com/webhook" }'
curl -s -X POST http://localhost:3000/instances \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "instanceId": "meta1", "provider": "meta", "phoneNumberId": "123456789", "accessToken": "EAABsb...", "verifyToken": "meu-verify-token" }'
Retorna status, telefone, pushName, webhook configurado, QR Code (se disponível) e configurações da instância.
curl -H "x-api-key: SUA_API_KEY" \ http://localhost:3000/instances/bot1
Retorna o QR Code como base64 (campo qrCode) e como texto (campo qrText). Use GET /instances/:id/qr/image para obter diretamente como imagem PNG — útil em <img src="">.
curl -H "x-api-key: SUA_API_KEY" \ http://localhost:3000/instances/bot1/qr
Encerra o socket atual e inicia nova tentativa de conexão. Funciona para Baileys e wwebjs. Após reconectar pode ser necessário escanear o QR novamente se a sessão expirou.
Endpoints relacionados (sem body): POST /instances/:id/disconnect — desconecta sem remover. DELETE /instances/:id — remove completamente (sessão + estado).
curl -s -X POST http://localhost:3000/instances/bot1/reconnect \ -H "x-api-key: SUA_API_KEY"
Envia uma mensagem de texto. Funciona para qualquer provider (Baileys, wwebjs e Meta) sem mudar a chamada. O número to deve incluir DDI (ex.: 5511999990000).
| Campo | Tipo | Descrição |
|---|---|---|
to | string | obrigatório — número com DDI, sem + |
text | string | obrigatório — conteúdo da mensagem |
quotedMessageId | string | opcional — ID de mensagem a responder (Baileys) |
curl -s -X POST http://localhost:3000/instances/bot1/send/text \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"to":"5511999990000","text":"Olá, tudo bem?"}'
Envia imagem, vídeo, áudio ou documento via URL pública. Funciona para todos os providers.
| Campo | Tipo | Descrição |
|---|---|---|
to | string | obrigatório |
type | string | obrigatório — image | video | audio | document |
url | string | obrigatório — URL pública acessível |
caption | string | opcional — legenda |
filename | string | opcional — nome do arquivo (documentos) |
curl -s -X POST http://localhost:3000/instances/bot1/send/media \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "5511999990000", "type": "image", "url": "https://exemplo.com/imagem.jpg", "caption": "Confira nossa promoção!" }'
4 Mensagens Avançadas (Baileys)
Endpoints avançados exclusivos do provider Baileys. Todos sob /instances/:id/messages/. Aceita ?queue=true para enfileirar com delay anti-spam.
{to, text, quotedMessageId?}{messages:[{to,text}]}{to, url, caption?}{to, url, filename?, mimetype?, caption?}{to, url}{to, url, caption?}{to, latitude, longitude, name?, address?}{to, messageId, emoji}{to, presence} — valores: composing, recording, available, paused{keys: [...]}{phone}{message, recipients, googleSheet?} — máx. 1000Enfileira até 200 mensagens de texto com delay anti-spam automático. Retorna um jobId por mensagem para acompanhamento.
curl -s -X POST http://localhost:3000/instances/bot1/messages/text/batch \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "messages": [ {"to": "5511999990001", "text": "Olá, João!"}, {"to": "5511999990002", "text": "Olá, Maria!"} ] }'
5 Grupos (Baileys)
Gerencie grupos do WhatsApp via instâncias Baileys. Todos os endpoints sob /instances/:id/groups/.
{subject, participants: ["551199..."]}{subject}{description}{participants:[]}{participants:[]}{participants:[]}{participants:[]}{inviteCode}6 Inbox Interno
Leia e responda conversas diretamente pela API, sem webhook. Requer SAVE_MESSAGES=true no .env para que as mensagens sejam persistidas no MongoDB.
SAVE_MESSAGES=true no arquivo .env. Sem isso, os endpoints retornam listas vazias.
Retorna a lista de chats com a última mensagem de cada conversa. Use ?limit=50 (padrão 100, máx 500).
curl -H "x-api-key: SUA_API_KEY" \ "http://localhost:3000/instances/bot1/inbox?limit=50"
Retorna as mensagens de um contato ou grupo específico. :peer é o JID do contato (ex.: 5511999990000@s.whatsapp.net ou 123456@g.us).
curl -H "x-api-key: SUA_API_KEY" \ "http://localhost:3000/instances/bot1/inbox/5511999990000@s.whatsapp.net"
Envia uma resposta de texto para o peer informado. Body: { text }.
curl -s -X POST \ http://localhost:3000/instances/bot1/inbox/5511999990000@s.whatsapp.net/reply \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text":"Olá! Como posso ajudar?"}'
7 Pools (multi-número + failover)
Agrupe múltiplas instâncias em um pool para distribuição de carga e failover automático. Se uma instância estiver desconectada ou banida, o pool redireciona automaticamente para a próxima disponível.
failover — sempre usa a primeira instância saudável.round-robin — distribui entre as instâncias em rotação.least-used — sempre escolhe a que enviou menos mensagens.
| Campo | Tipo | Descrição |
|---|---|---|
label | string | obrigatório |
strategy | string | opcional — failover (padrão) | round-robin | least-used |
members | string[] | opcional — lista de instanceIds iniciais |
curl -s -X POST http://localhost:3000/pools \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "label": "Pool Marketing", "strategy": "round-robin", "members": ["bot1", "bot2", "bot3"] }'
{instanceId}O pool seleciona automaticamente a melhor instância disponível conforme a estratégia configurada. Se a instância escolhida falhar, tenta a próxima.
curl -s -X POST http://localhost:3000/pools/pool-mktg/send/text \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"to":"5511999990000","text":"Olá do pool!"}'
{to, type, url, caption?}8 Agentes IA
Configure um chatbot com IA por instância. Suporta dois modos: interno (LLM gerenciado pelo servidor) e externo (seu próprio endpoint recebe a mensagem e devolve a resposta).
provider: "openai" (compatível com qualquer API OpenAI) ou provider: "vercel-ai-gateway". Configure apiKey, model e systemPrompt. O servidor gerencia histórico de conversa, delay de digitação e pausas.Modo externo: use
provider: "external" e informe externalEndpoint. O servidor faz POST para seu endpoint com o corpo { instanceId, from, text, history } e espera { reply: "texto da resposta" }.
| Campo | Tipo | Descrição |
|---|---|---|
provider | string | obrigatório — openai | vercel-ai-gateway | external |
apiKey | string | openai/vercel — chave da OpenAI ou gateway |
model | string | opcional — ex.: gpt-4o-mini |
systemPrompt | string | opcional — personalidade / instrução do bot |
externalEndpoint | string | external — URL do endpoint externo |
enabled | boolean | opcional — ativa/desativa (padrão: true) |
historySize | number | opcional — mensagens no contexto (padrão: 10) |
ignoreGroups | boolean | opcional — ignora mensagens de grupo (padrão: true) |
typingIndicator | boolean | opcional — simula "digitando…" (padrão: true) |
curl -s -X POST http://localhost:3000/instances/bot1/agent \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provider": "openai", "apiKey": "sk-proj-...", "model": "gpt-4o-mini", "systemPrompt": "Você é um atendente simpático da Loja XYZ.", "historySize": 15 }'
curl -s -X POST http://localhost:3000/instances/bot1/agent \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "provider": "external", "externalEndpoint": "https://meubot.com/whatsapp", "enabled": true }'
?purge=true para apagar definitivamente{message, from?}{durationMs?} (padrão 24h)9 Métricas / Monitoramento
Endpoints para monitorar a saúde do servidor, uso de recursos e performance de cada instância.
Retorna contadores de instâncias, volume de mensagens enviadas/recebidas, taxa de erros e recursos do sistema em um único payload.
curl -H "x-api-key: SUA_API_KEY" \ http://localhost:3000/metrics/overview
10 Multi-tenant (Admin)
Gerencie clientes em ambientes multi-tenant. Todos os endpoints /admin/* exigem a MASTER_KEY no header x-api-key.
MASTER_KEY no .env do servidor.
Cria um cliente com login próprio. Atribua instâncias, pools e domínios para que o cliente veja apenas seus recursos.
| Campo | Tipo | Descrição |
|---|---|---|
name | string | obrigatório |
email | string | obrigatório — usado no login do portal |
password | string | obrigatório |
domains | string[] | opcional — domínios autorizados (ex.: ["bot.cliente.com"]) |
instanceIds | string[] | opcional — instâncias atribuídas |
poolIds | string[] | opcional — pools atribuídos |
curl -s -X POST http://localhost:3000/admin/clients \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Empresa ABC", "email": "admin@abc.com", "password": "senha123", "domains": ["bot.abc.com"], "instanceIds": ["bot1", "bot2"], "poolIds": [] }'
{password}11 Portal do Cliente
Interface de self-service para clientes. O cliente faz login com email e senha, obtém um token JWT de sessão e usa esse token para acessar apenas suas instâncias e pools atribuídos.
Authorization: Bearer <token> obtido em POST /portal/login. O token não é a mesma coisa que a x-api-key.
Autentica um cliente e retorna um token de sessão. O login é restrito ao domínio configurado para o cliente — tentar logar em outro domínio retorna 403.
curl -s -X POST http://localhost:3000/portal/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@abc.com","password":"senha123"}' # Use o token retornado nas próximas chamadas: curl http://localhost:3000/portal/me \ -H "Authorization: Bearer TOKEN_AQUI"
{text}{to, text}{to, type, url, caption?}{to, text}12 Webhooks
Configure uma URL de webhook ao criar ou atualizar uma instância para receber eventos em tempo real. O servidor faz POST para a URL configurada com o payload do evento.
Eventos emitidos
Assinatura HMAC
Se a instância tiver webhookSecret configurado, cada requisição de webhook incluirá o header X-ServidorWhats-Signature com o HMAC-SHA256 do corpo em hexadecimal. Valide esse header no seu servidor para garantir a autenticidade dos eventos.
Payload de exemplo para o evento message.received:
{
"event": "message.received",
"instanceId": "bot1",
"timestamp": "2025-01-15T10:30:00.000Z",
"data": {
"messageId": "3EB0123456ABCDEF",
"from": "5511999990000@s.whatsapp.net",
"fromName": "João Silva",
"text": "Olá, preciso de ajuda!",
"type": "text",
"isGroup": false,
"timestamp": 1736940600
}
}
// Express middleware para validar X-ServidorWhats-Signature const crypto = require('crypto'); function verifyWebhook(secret) { return (req, res, next) => { const sig = req.headers['x-servidorwhats-signature']; const body = JSON.stringify(req.body); const expected = crypto .createHmac('sha256', secret) .update(body) .digest('hex'); if (sig !== expected) { return res.status(401).json({ error: 'Assinatura inválida' }); } next(); }; }
Configurar webhook numa instância
curl -s -X PUT http://localhost:3000/instances/bot1/webhook \ -H "x-api-key: SUA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "webhook": "https://meuapp.com/whatsapp/events", "webhookSecret": "meu-segredo-hmac" }'
13 Painéis
Além da API, o servidor inclui painéis web integrados acessíveis pelo navegador.
Painel Admin
Gestão completa de instâncias, QR Codes, agentes IA, pools e clientes.
/
Monitor
Monitoramento em tempo real: status das instâncias, filas, métricas e logs SSE.
/monitor.html
Portal do Cliente
Acesso self-service para clientes multi-tenant verem suas instâncias e inbox.
/client.html
Documentação
Esta página. Referência completa da API com exemplos interativos.
/docs.html
GET /health como healthcheck do seu load balancer ou orquestrador (Docker, PM2). O endpoint retorna {"status":"ok"} com código 200 quando tudo está funcionando.