📚 Documentação da API

WhatsApp Multi-Sessão API

📸 Guia Completo de Mídias

API completa para gerenciar múltiplas sessões do WhatsApp simultaneamente. Permite envio e recebimento de mensagens, gerenciamento de sessões e muito mais.

🌐 URL Base da API:

https://app.autowhats.com.br/api

📑 Índice

🔐 Autenticação

Todas as requisições à API requerem autenticação através do header X-API-Key.

X-API-Key: sua_api_key_aqui

Você pode usar a API key master fornecida pelo administrador ou criar suas próprias API keys através do sistema de gerenciamento.

🔑 Gerenciamento de API Keys

GET /api/keys

Lista todas as API keys cadastradas (requer API key master).

GET https://app.autowhats.com.br/api/keys
Headers: X-API-Key: sua_api_key_master
Resposta:
{
  "total": 2,
  "keys": [
    {
      "id": "abc123...",
      "name": "Minha API Key",
      "active": true,
      "createdAt": "2024-11-27T19:00:00.000Z",
      "lastUsed": null,
      "key": "aw_1234567..."
    }
  ]
}

POST /api/keys

Cria uma nova API key (requer API key master).

POST https://app.autowhats.com.br/api/keys
Headers: X-API-Key: sua_api_key_master
Content-Type: application/json
Body:
{
  "name": "Nome da API Key"
}
Resposta:
{
  "success": true,
  "id": "abc123...",
  "name": "Nome da API Key",
  "key": "aw_abcdef1234567890...",
  "message": "API key criada com sucesso"
}

PUT /api/keys/:id

Atualiza uma API key (ativar/desativar ou renomear).

PUT https://app.autowhats.com.br/api/keys/abc123
Headers: X-API-Key: sua_api_key_master
Body:
{
  "active": false,
  "name": "Novo Nome"
}

DELETE /api/keys/:id

Deleta uma API key permanentemente.

DELETE https://app.autowhats.com.br/api/keys/abc123
Headers: X-API-Key: sua_api_key_master

📱 Gerenciamento de Sessões

🔄 Reutilização Inteligente de Sessões:

A API garante que sempre a mesma sessão seja mantida para cada sessionId. Isso significa:

  • Se você criar uma sessão com sessionId: "minha-sessao", ela será criada
  • Se você criar novamente com o mesmo sessionId, a API reutiliza a sessão existente
  • Se você buscar o QR code, a API restaura a sessão do banco de dados se necessário
  • Não há criação de sessões duplicadas - sempre a mesma sessão é mantida

💡 Dica: Use sempre o mesmo sessionId para manter a mesma sessão. A API gerencia automaticamente a persistência e restauração.

✨ Novidades: A API agora possui validações robustas, exclusão automática de contas excluídas, limpeza automática de sessões antigas e reutilização inteligente de sessões.

  • Reutilização de Sessões: A API verifica se a sessão já existe antes de criar nova, mantendo sempre a mesma sessão do usuário
  • Restauração Automática: Sessões são restauradas automaticamente do banco de dados quando necessário
  • Exclusão Automática: Quando uma conta do WhatsApp é excluída pelo usuário, a sessão é removida automaticamente após 3-5 segundos
  • Validações Robustas: Todos os endpoints validam sessão, status e isolamento antes de processar
  • Limpeza Automática: Sessões desconectadas há mais de 30 dias são removidas automaticamente (diariamente às 3h)
  • Isolamento Garantido: Mensagens não podem ser enviadas para sessões erradas

POST /api/sessions

Cria uma nova sessão do WhatsApp ou reutiliza uma sessão existente.

POST https://app.autowhats.com.br/api/sessions
Headers: X-API-Key: sua_api_key
Content-Type: application/json
Body:
{
  "sessionId": "minha-sessao-001",
  "webhookUrl": "https://meusite.com/webhook" // opcional
}
Resposta (Nova Sessão):
{
  "success": true,
  "sessionId": "minha-sessao-001",
  "status": "pending",
  "message": "Sessão criada com sucesso. Busque o QR Code em GET /api/sessions/:id/qr"
}
Resposta (Sessão Existente):
{
  "success": true,
  "sessionId": "minha-sessao-001",
  "status": "connected",
  "message": "Sessão já existe e foi reutilizada. Busque o QR Code em GET /api/sessions/:id/qr",
  "existing": true
}

✅ Reutilização Inteligente:

  • A API verifica automaticamente se a sessão já existe no banco de dados
  • Se existir, reutiliza a sessão existente ao invés de criar uma nova
  • Atualiza apenas o webhook se fornecido
  • Garante que sempre a mesma sessão seja mantida para cada sessionId

📝 Exemplo Prático:

// 1. Criar sessão pela primeira vez
POST /api/sessions
{ "sessionId": "cliente-001" }
// Resposta: "Sessão criada com sucesso"

// 2. Criar novamente com o mesmo sessionId
POST /api/sessions
{ "sessionId": "cliente-001" }
// Resposta: "Sessão já existe e foi reutilizada" + "existing": true

// 3. Buscar QR code (usa a mesma sessão)
GET /api/sessions/cliente-001/qr
// Retorna QR da mesma sessão criada anteriormente

// ✅ Resultado: Sempre a mesma sessão, sem duplicações!

⚠️ Importante: O sessionId deve ser único e não pode conter caracteres especiais. Use apenas letras, números, hífens e underscores.

GET /api/sessions

Lista todas as sessões cadastradas.

GET https://app.autowhats.com.br/api/sessions
Headers: X-API-Key: sua_api_key
Resposta:
{
  "total": 3,
  "sessions": [
    {
      "sessionId": "minha-sessao-001",
      "status": "connected",
      "hasWebhook": true,
      "lastUpdate": "2024-11-28T10:30:00.000Z"
    }
  ]
}

GET /api/sessions/:id/status

Verifica o status detalhado de uma sessão.

GET https://app.autowhats.com.br/api/sessions/minha-sessao-001/status
Headers: X-API-Key: sua_api_key
Resposta:
{
  "sessionId": "minha-sessao-001",
  "status": "connected", // "pending", "connected", "disconnected", "not_found"
  "lastUpdate": "2024-11-28T10:30:00.000Z",
  "hasWebhook": true
}

📊 Status Possíveis:

  • pending: Aguardando conexão (QR Code gerado)
  • connected: Conectada e pronta para uso
  • disconnected: Desconectada (será removida automaticamente após 30 dias)
  • not_found: Sessão não encontrada

GET /api/sessions/:id/qr

Obtém o QR Code para conectar o WhatsApp. Restaura automaticamente sessões do banco de dados se necessário.

GET https://app.autowhats.com.br/api/sessions/minha-sessao-001/qr
Headers: X-API-Key: sua_api_key
Resposta:
{
  "sessionId": "minha-sessao-001",
  "qr": "data:image/png;base64,iVBORw0KGgoAAAANS...",
  "status": "pending",
  "hasQr": true
}

💡 Use o campo qr (data URL) diretamente em uma tag <img> para exibir o QR Code.

🔄 Restauração Automática:

  • Se a sessão não estiver na memória, a API verifica automaticamente no banco de dados
  • Se encontrar no banco, restaura a sessão automaticamente na memória
  • Retorna o QR code da sessão restaurada
  • Garante que sempre a mesma sessão seja usada, mesmo após reinicialização do servidor

⚠️ Nota: O QR Code expira após alguns minutos. Faça polling neste endpoint até que status seja connected.

GET /api/sessions/:id/resolve-lid/:lid

Resolve um LID (Linked ID) para número de telefone real.

GET https://app.autowhats.com.br/api/sessions/minha-sessao-001/resolve-lid/260614521942021@lid
Headers: X-API-Key: sua_api_key
Resposta (Sucesso):
{
  "success": true,
  "lid": "260614521942021@lid",
  "number": "5531991441439@c.us",
  "resolved": true
}
Resposta (Não Resolvido):
{
  "success": false,
  "lid": "260614521942021@lid",
  "number": null,
  "resolved": false,
  "message": "Não foi possível resolver o LID para um número de telefone."
}

POST /api/sessions/:id/logout

Desconecta uma sessão do WhatsApp (mantém dados no servidor).

POST https://app.autowhats.com.br/api/sessions/minha-sessao-001/logout
Headers: X-API-Key: sua_api_key
Resposta:
{
  "success": true,
  "sessionId": "minha-sessao-001",
  "message": "Sessão desconectada com sucesso"
}

💡 Dica: Use DELETE /api/sessions/:id se quiser remover completamente a sessão (incluindo arquivos e banco de dados).

DELETE /api/sessions/:id

Exclui completamente uma sessão (remove da memória, disco e banco de dados).

DELETE https://app.autowhats.com.br/api/sessions/minha-sessao-001
Headers: X-API-Key: sua_api_key
Resposta:
{
  "success": true,
  "sessionId": "minha-sessao-001",
  "message": "Sessão excluída com sucesso (incluindo arquivos do servidor)"
}

✅ O que é removido:

  • Cliente da memória
  • Arquivos de sessão do disco
  • Cache do WhatsApp Web.js
  • Registro do banco de dados
  • Histórico de mensagens recebidas (memória)

🔄 Exclusão Automática: Se uma conta do WhatsApp for excluída pelo usuário, a sessão será removida automaticamente após 3-5 segundos, sem necessidade de chamar este endpoint.

📞 Formatos de Números de Telefone

✅ Formato Correto: A API aceita números em formato internacional sem espaços, parênteses ou hífens.

🇧🇷 Números Brasileiros

Para números brasileiros, use o formato: 55 + DDD + Número (sem o 0 inicial do DDD).

Formato Original Formato Correto Exemplo
(71) 99146-0801 5571991460801 ✅ Correto
071 99146-0801 5571991460801 ✅ Correto (0 removido automaticamente)
+55 71 99146-0801 5571991460801 ✅ Correto (+ removido automaticamente)
71991460801 5571991460801 ✅ Correto (55 adicionado automaticamente)

🌍 Números Internacionais

Para números de outros países, use o formato: Código do País + Número (sem espaços ou caracteres especiais).

País Código Exemplo
Estados Unidos 1 15551234567
Portugal 351 351912345678
Argentina 54 5491123456789
México 52 5215512345678

⚠️ Regras Importantes:

  • Não use espaços, parênteses, hífens ou outros caracteres especiais
  • Para números brasileiros, não inclua o 0 inicial do DDD (a API remove automaticamente)
  • O código do país é obrigatório (55 para Brasil, 1 para EUA, etc.)
  • A API normaliza automaticamente números mal formatados quando possível
  • Números de grupos devem incluir @g.us no final (ex: 120363123456789012@g.us)
Exemplos de Uso:
// ✅ Correto - Número brasileiro
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801",
  "message": "Olá!"
}

// ✅ Correto - Número com @c.us (também aceito)
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801@c.us",
  "message": "Olá!"
}

// ❌ Incorreto - Com caracteres especiais
{
  "to": "(71) 99146-0801"  // ERRO: não aceita parênteses e hífens
}

// ❌ Incorreto - Sem código do país
{
  "to": "71991460801"  // ERRO: falta o código 55
}

// ✅ Correto - A API normaliza automaticamente
{
  "to": "071991460801"  // ✅ Será normalizado para 5571991460801
}

💬 Envio de Mensagens

POST /api/messages/text

Envia uma mensagem de texto.

POST https://app.autowhats.com.br/api/messages/text
Headers: X-API-Key: sua_api_key
Content-Type: application/json
Body:
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801", // Número com DDD e código do país (55 para Brasil)
  "message": "Olá! Esta é uma mensagem de teste."
}
Resposta:
{
  "success": true,
  "messageId": "true_5571991460801@c.us_3EB0...",
  "to": "5571991460801@c.us",
  "timestamp": "2024-11-27T19:00:00.000Z"
}

💡 Formato do número: Veja a seção Formatos de Números de Telefone para informações detalhadas sobre formatação correta.

POST /api/sessions/:id/open-chat

Abre/prepara um chat com um número (opcional, mas recomendado antes de enviar mensagens).

POST https://app.autowhats.com.br/api/sessions/minha-sessao-001/open-chat
Headers: X-API-Key: sua_api_key
Body:
{
  "to": "5571991460801"
}

GET /api/sessions/:id/messages

Obtém mensagens recebidas para uma sessão.

GET https://app.autowhats.com.br/api/sessions/minha-sessao-001/messages
Headers: X-API-Key: sua_api_key
Query Parameters (opcionais):
  • limit: Número máximo de mensagens (padrão: 50)
  • since: Timestamp para buscar apenas mensagens após essa data
Resposta:
{
  "success": true,
  "sessionId": "minha-sessao-001",
  "total": 10,
  "count": 2,
  "messages": [
    {
      "id": "true_5571991460801@c.us_3EB0...",
      "from": "5531991441439@c.us",
      "fromOriginal": "260614521942021@lid",
      "to": "5531991441439@c.us",
      "body": "Olá! Esta é uma mensagem recebida",
      "type": "chat",
      "timestamp": 1701123456789,
      "isGroup": false,
  
            

🔄 Normalização Automática de LIDs:

O sistema normaliza automaticamente LIDs (Linked IDs) para números reais. Quando você recebe uma mensagem de um LID (ex: 260614521942021@lid), o campo from será automaticamente convertido para o número real (ex: 5531991441439@c.us), mantendo as conversas unificadas.

  • from: Número normalizado (use este para manter conversas unificadas)
  • fromOriginal: ID original do WhatsApp (LID ou número) - mantido para referência
  • O mapeamento é feito automaticamente usando histórico de envios e API do WhatsApp
"mediaUrl": null, "mediaMimetype": null, "mediaFilename": null } ] }

Campos:
from: Número normalizado (ex: 5531991441439@c.us) - use este para manter conversas unificadas
fromOriginal: ID original do WhatsApp (pode ser LID como 260614521942021@lid) - mantido para referência
total: Total de mensagens armazenadas para esta sessão
count: Quantidade de mensagens retornadas nesta requisição
timestamp: Timestamp em milissegundos (use para o parâmetro since)
mediaUrl: Base64 da mídia (se houver)

💡 Dica: Use o parâmetro since para fazer polling e buscar apenas mensagens novas. Armazene o timestamp da última mensagem e use-o na próxima requisição.

📸 POST /api/messages/media

Envia mídia (imagens, vídeos, áudios ou documentos). Suporta envio via URL ou Base64.

POST https://app.autowhats.com.br/api/messages/media
Headers: X-API-Key: sua_api_key
Content-Type: application/json
Opção 1: Enviar via URL (Recomendado)
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801",
  "mediaUrl": "https://exemplo.com/imagem.jpg",
  "caption": "Legenda opcional",
  "mimetype": "image/jpeg",  // opcional
  "filename": "imagem.jpg"   // opcional
}
Opção 2: Enviar via Base64
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801",
  "mediaBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
  "caption": "Legenda opcional",
  "mimetype": "image/jpeg",
  "filename": "imagem.jpg"
}
Resposta:
{
  "success": true,
  "messageId": "true_5571991460801@c.us_ABC123",
  "to": "5571991460801@c.us",
  "type": "media",
  "timestamp": "2024-11-27T19:00:00.000Z"
}

📋 Tipos de Mídia Suportados:

  • Imagens: image/jpeg, image/png, image/gif, image/webp
  • Vídeos: video/mp4, video/avi, video/quicktime
  • Áudios: audio/mpeg (MP3), audio/ogg, audio/mp4 (M4A), audio/wav
  • Documentos: application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document (DOCX), etc.

⚠️ Limitações do WhatsApp:

  • Imagens: máximo ~16 MB
  • Vídeos: máximo ~64 MB
  • Áudios: máximo ~16 MB
  • Documentos: máximo ~100 MB
Exemplos Práticos:

Enviar Imagem (JavaScript):

const response = await fetch('https://app.autowhats.com.br/api/messages/media', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sua_api_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    sessionId: 'minha-sessao-001',
    to: '5571991460801',
    mediaUrl: 'https://exemplo.com/foto.jpg',
    caption: 'Olha essa foto!',
    mimetype: 'image/jpeg'
  })
});
const data = await response.json();

Enviar Vídeo (cURL):

curl -X POST https://app.autowhats.com.br/api/messages/media \
  -H "X-API-Key: sua_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "sessionId": "minha-sessao-001",
    "to": "5571991460801",
    "mediaUrl": "https://exemplo.com/video.mp4",
    "caption": "Assista este vídeo!",
    "mimetype": "video/mp4"
  }'

Enviar Áudio via Base64 (Python):

import requests
import base64

# Ler arquivo e converter para base64
with open('audio.mp3', 'rb') as f:
    audio_base64 = base64.b64encode(f.read()).decode('utf-8')
    data_uri = f"data:audio/mpeg;base64,{audio_base64}"

response = requests.post(
    'https://app.autowhats.com.br/api/messages/media',
    headers={'X-API-Key': 'sua_api_key'},
    json={
        'sessionId': 'minha-sessao-001',
        'to': '5571991460801',
        'mediaBase64': data_uri,
        'caption': 'Escute isso!',
        'mimetype': 'audio/mpeg',
        'filename': 'audio.mp3'
    }
)
print(response.json())

Enviar Documento (PHP):

 'minha-sessao-001',
    'to' => '5571991460801',
    'mediaUrl' => 'https://exemplo.com/documento.pdf',
    'caption' => 'Veja este documento',
    'mimetype' => 'application/pdf',
    'filename' => 'documento.pdf'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

📸 Envio e Recebimento de Mídia

📖 Ver Documentação Completa

A API suporta completamente o envio e recebimento de imagens, vídeos, áudios e documentos.

📚 Documentação Completa: Para um guia detalhado com exemplos completos, acesse a documentação completa de mídias.

✅ Tipos de Mídia Suportados:

  • Imagens: JPG, PNG, GIF, WebP
  • Vídeos: MP4, AVI, MOV
  • Áudios: MP3, OGG, WAV, M4A
  • Documentos: PDF, DOC, DOCX, XLS, XLSX, etc.

📤 Enviar Mídia

Use o endpoint POST /api/messages/media para enviar mídia. Você pode enviar via URL (recomendado) ou Base64.

POST /api/messages/media
POST https://app.autowhats.com.br/api/messages/media
Headers: X-API-Key: sua_api_key
Content-Type: application/json
Opção 1: Via URL (Recomendado para arquivos grandes)
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801",
  "mediaUrl": "https://exemplo.com/imagem.jpg",
  "caption": "Legenda opcional",
  "mimetype": "image/jpeg",  // opcional, será detectado automaticamente
  "filename": "imagem.jpg"   // opcional
}
Opção 2: Via Base64 (Para arquivos pequenos)
{
  "sessionId": "minha-sessao-001",
  "to": "5571991460801",
  "mediaBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
  "caption": "Legenda opcional",
  "mimetype": "image/jpeg",
  "filename": "imagem.jpg"
}
Resposta de Sucesso:
{
  "success": true,
  "messageId": "true_5571991460801@c.us_ABC123",
  "to": "5571991460801@c.us",
  "type": "media",
  "timestamp": "2024-11-27T19:00:00.000Z"
}

⚠️ Limitações do WhatsApp:

  • Imagens: máximo ~16 MB
  • Vídeos: máximo ~64 MB
  • Áudios: máximo ~16 MB
  • Documentos: máximo ~100 MB

📥 Receber Mídia

Mídias recebidas são enviadas automaticamente via webhook (se configurado) ou podem ser consultadas via GET /api/sessions/:id/messages.

📋 Campos de Mídia no Webhook/Mensagens:

  • mediaUrl: URL do arquivo de mídia (ex: /api/media/session-001_ABC123.jpg) - NOVO: Mídias são armazenadas em disco, não mais em Base64
  • mediaMimetype: Tipo MIME (ex: image/jpeg, video/mp4)
  • mediaFilename: Nome do arquivo original (se disponível)
  • type: Tipo da mensagem (image, video, audio, document)
Exemplo: Mensagem com Mídia Recebida
{
  "sessionId": "minha-sessao-001",
  "from": "5571991460801@c.us",
  "to": "5571991460801@c.us",
  "body": "Legenda da imagem (se houver)",
  "type": "image",
  "timestamp": 1234567890,
  "mediaUrl": "/api/media/session-001_ABC123.jpg",
  "mediaMimetype": "image/jpeg",
  "mediaFilename": "foto.jpg",
  "isGroup": false
}

📥 Como Acessar a Mídia:

O campo mediaUrl agora contém uma URL relativa. Para baixar a mídia, faça uma requisição GET:

GET https://app.autowhats.com.br/api/media/session-001_ABC123.jpg

✅ Vantagens: Mídias são armazenadas em disco, reduzindo uso de memória em 99% e melhorando performance.

📁 Endpoint de Mídias

Mídias recebidas são armazenadas em disco e podem ser acessadas através deste endpoint público.

GET /api/media/:filename

Serve mídias armazenadas em disco. Este endpoint é público (não requer API Key).

GET https://app.autowhats.com.br/api/media/session-001_ABC123.jpg
Parâmetros:
  • :filename - Nome do arquivo de mídia (ex: session-001_ABC123.jpg)
Resposta:

Retorna o arquivo binário com os headers apropriados:

  • Content-Type: Tipo MIME detectado automaticamente
  • Content-Length: Tamanho do arquivo
  • Cache-Control: Cache por 1 ano
  • Content-Disposition: inline (exibe no navegador)
Exemplo de Uso:
// JavaScript
const mediaUrl = '/api/media/session-001_ABC123.jpg';
const fullUrl = `https://app.autowhats.com.br${mediaUrl}`;
const response = await fetch(fullUrl);
const blob = await response.blob();
const imageUrl = URL.createObjectURL(blob);
document.getElementById('image').src = imageUrl;

// cURL
curl https://app.autowhats.com.br/api/media/session-001_ABC123.jpg -o imagem.jpg

// HTML
<img src="https://app.autowhats.com.br/api/media/session-001_ABC123.jpg" alt="Mídia">

✅ Vantagens do Novo Sistema:

  • Redução de 99% no uso de memória (mídias em disco, não em memória)
  • Download único (elimina download duplo)
  • Cache automático (mídias não são baixadas repetidamente)
  • Acesso direto via URL (mais rápido que Base64)
  • Headers de cache configurados (melhor performance)

⚠️ Nota: Este endpoint é público. Nomes de arquivo são validados para prevenir path traversal.

📥 Recebimento de Mensagens

Existem duas formas de receber mensagens:

1️⃣ Webhook (Recomendado para Produção)

Configure um webhook ao criar a sessão. Quando uma mensagem chegar, a API enviará automaticamente um POST para sua URL. Ideal para receber mensagens em tempo real.

Vantagens: Tempo real, não precisa fazer requisições constantes, mais eficiente

2️⃣ Polling (Buscar Mensagens)

Use GET /api/sessions/:id/messages para buscar mensagens manualmente. Faça requisições periódicas (ex: a cada 5-10 segundos) para verificar novas mensagens.

⚠️ Limitações: Requer requisições constantes, pode ter delay, menos eficiente

Exemplo de Polling:

// Fazer polling a cada 5 segundos
setInterval(async () => {
  const response = await fetch(
    `https://app.autowhats.com.br/api/sessions/minha-sessao/messages?since=${lastTimestamp}`,
    { headers: { 'X-API-Key': 'sua_api_key' } }
  );
  const data = await response.json();
  
  if (data.messages && data.messages.length > 0) {
    data.messages.forEach(msg => {
      console.log('Nova mensagem:', msg.body);
      lastTimestamp = msg.timestamp; // Atualizar timestamp
    });
  }
}, 5000);

🔔 Webhooks

Você pode configurar um webhook ao criar uma sessão. Quando uma mensagem for recebida, a API enviará automaticamente um POST para a URL configurada.

POST https://seu-servidor.com/webhook
Content-Type: application/json
Payload do Webhook (Mensagem de Texto):
{
  "sessionId": "minha-sessao-001",
  "from": "5571991460801@c.us",
  "to": "5571991460801@c.us",
  "body": "Mensagem recebida",
  "type": "chat",
  "timestamp": 1234567890,
  "mediaUrl": null,
  "mediaMimetype": null,
  "mediaFilename": null,
  "isGroup": false
}
Payload do Webhook (Mensagem com Mídia):
{
  "sessionId": "minha-sessao-001",
  "from": "5571991460801@c.us",
  "to": "5571991460801@c.us",
  "body": "Legenda da imagem (se houver)",
  "type": "image",  // ou "video", "audio", "document"
  "timestamp": 1234567890,
  "mediaUrl": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
  "mediaMimetype": "image/jpeg",
  "mediaFilename": "foto.jpg",
  "isGroup": false
}

📥 Como Processar Mídia Recebida:

Quando uma mídia é recebida, o campo mediaUrl contém uma URL relativa (ex: /api/media/session-001_ABC123.jpg). Faça uma requisição GET para https://app.autowhats.com.br{mediaUrl} para baixar o arquivo.

Exemplo: Processar Mídia Recebida (PHP):
 true]);
?>
Exemplo: Processar Mídia Recebida (Node.js):
const express = require('express');
const fs = require('fs');
const fetch = require('node-fetch');
const app = express();

app.use(express.json({ limit: '50mb' }));

app.post('/webhook', async (req, res) => {
  const { mediaUrl, mediaMimetype, mediaFilename, from, body } = req.body;
  
  if (mediaUrl) {
    // NOVO: mediaUrl agora é uma URL, não Base64
    // Baixar arquivo da API
    const fullUrl = 'https://app.autowhats.com.br' + mediaUrl;
    const response = await fetch(fullUrl);
    const buffer = await response.buffer();
    
    // Determinar extensão
    const ext = mediaMimetype.split('/')[1];
    const filename = mediaFilename || `midia_${Date.now()}.${ext}`;
    
    // Salvar arquivo
    fs.writeFileSync(`uploads/${filename}`, buffer);
    
    console.log(`Mídia recebida de ${from}: ${filename}`);
  }
  
  res.status(200).send('OK');
});

app.listen(3001);
Exemplo: Processar Mídia Recebida (Python):
from flask import Flask, request, jsonify
import requests
import os

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    
    if data.get('mediaUrl'):
        # NOVO: mediaUrl agora é uma URL, não Base64
        # Baixar arquivo da API
        media_url = data['mediaUrl']  # Ex: /api/media/session-001_ABC123.jpg
        full_url = f'https://app.autowhats.com.br{media_url}'
        response = requests.get(full_url)
        binary_data = response.content
        
        # Determinar extensão
        mimetype = data.get('mediaMimetype', '')
        ext = mimetype.split('/')[1] if '/' in mimetype else 'bin'
        filename = data.get('mediaFilename') or f"midia_{int(time.time())}.{ext}"
        
        # Salvar arquivo
        with open(f"uploads/{filename}", 'wb') as f:
            f.write(binary_data)
        
        print(f"Mídia recebida: {filename}")
    
    return jsonify({'success': True}), 200

if __name__ == '__main__':
    os.makedirs('uploads', exist_ok=True)
    app.run(port=3001)

📋 Informações importantes:

  • timestamp: Timestamp em segundos (não milissegundos)
  • mediaUrl: URL do arquivo de mídia (ex: /api/media/session-001_ABC123.jpg) - acesse via GET https://app.autowhats.com.br{mediaUrl}
  • mediaMimetype: Tipo MIME da mídia (ex: "image/jpeg", "video/mp4")
  • isGroup: true se a mensagem veio de um grupo
  • Sua URL deve retornar status HTTP 200 para confirmar recebimento
Exemplo de Webhook (PHP):
 true]);
} else {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid payload']);
}
?>

🔧 Endpoints de Manutenção

Endpoints administrativos para gerenciar e manter a API. Requerem API key master.

⚠️ Atenção: Estes endpoints requerem a API key master. Use com cuidado, pois podem afetar todas as sessões.

POST /api/maintenance/cleanup

Executa limpeza manual de sessões desconectadas há mais de X dias. Remove completamente sessões antigas (memória, disco, banco de dados).

POST https://app.autowhats.com.br/api/maintenance/cleanup
Headers: X-API-Key: sua_api_key_master
Content-Type: application/json
Body (opcional):
{
  "daysOld": 30  // Padrão: 30 dias
}
Resposta:
{
  "success": true,
  "message": "Limpeza concluída",
  "cleaned": 5,      // Número de sessões removidas
  "errors": 0,        // Número de erros
  "total": 5          // Total de sessões encontradas
}

ℹ️ Limpeza Automática: A API executa limpeza automática diariamente às 3h da manhã, removendo sessões desconectadas há mais de 30 dias. Este endpoint permite executar limpeza manual quando necessário.

GET /api/maintenance/sessions/status

Retorna status detalhado de todas as sessões cadastradas, incluindo informações sobre memória, arquivos e mensagens.

GET https://app.autowhats.com.br/api/maintenance/sessions/status
Headers: X-API-Key: sua_api_key_master
Resposta:
{
  "success": true,
  "total": 3,
  "sessions": [
    {
      "sessionId": "minha-sessao-001",
      "status": "connected",
      "inMemory": true,
      "hasFiles": true,
      "hasData": true,
      "messageCount": 150,
      "created_at": "2024-11-27T10:00:00.000Z",
      "last_activity": "2024-11-28T10:30:00.000Z",
      "disconnected_at": null,
      "webhook_url": "https://meusite.com/webhook"
    }
  ]
}

📊 Campos Retornados:

  • inMemory: Se a sessão está ativa na memória
  • hasFiles: Se existem arquivos de sessão no disco
  • hasData: Se existem dados da sessão
  • messageCount: Total de mensagens armazenadas para esta sessão
  • last_activity: Última atividade registrada
  • disconnected_at: Data de desconexão (se desconectada)

POST /api/maintenance/sync-orphan-sessions

Sincroniza sessões órfãs (que existem no disco mas não no banco de dados) com o banco de dados.

POST https://app.autowhats.com.br/api/maintenance/sync-orphan-sessions
Headers: X-API-Key: sua_api_key_master
Resposta:
{
  "success": true,
  "message": "Sincronização concluída",
  "synced": 2  // Número de sessões sincronizadas
}

ℹ️ Comportamento:

  • Apenas sincroniza sessões que estão ativas na memória
  • Não cria sessões no banco apenas por existir no disco
  • Executa automaticamente ao iniciar a API e ao listar sessões
  • Use POST /api/maintenance/clean-orphan-sessions para remover sessões órfãs inválidas

POST /api/maintenance/clean-orphan-sessions

Remove sessões órfãs inválidas do disco (que não estão na memória nem no banco de dados). Útil para limpar sessões criadas incorretamente.

POST https://app.autowhats.com.br/api/maintenance/clean-orphan-sessions
Headers: X-API-Key: sua_api_key_master
Resposta:
{
  "success": true,
  "message": "Limpeza concluída",
  "cleaned": 1  // Número de sessões removidas
}

⚠️ Atenção:

  • Esta operação remove permanentemente sessões órfãs do disco
  • Apenas remove sessões que não estão na memória nem no banco de dados
  • Execute com cuidado - a ação não pode ser desfeita
  • Executa automaticamente ao iniciar a API (após 10 segundos)

✅ Funcionalidades Automáticas da API:

  • Sincronização Automática: Sessões ativas na memória são sincronizadas automaticamente com o banco ao iniciar e ao listar sessões
  • Limpeza Automática de Órfãs: Sessões órfãs inválidas (disco sem memória nem banco) são removidas automaticamente ao iniciar a API
  • Exclusão Automática: Quando uma conta do WhatsApp é excluída pelo usuário, a sessão é removida automaticamente após 3-5 segundos
  • Limpeza Diária: Sessões desconectadas há mais de 30 dias são removidas automaticamente às 3h da manhã
  • Validações Robustas: Todos os endpoints validam sessão, status e isolamento antes de processar
  • Isolamento Garantido: Mensagens não podem ser enviadas para sessões erradas
  • Prevenção de Órfãs: A API não cria sessões no banco apenas por existir no disco - apenas sincroniza sessões ativas

💻 Exemplos de Uso

JavaScript (Fetch API)

// Criar uma sessão (ou reutilizar se já existir)
const response = await fetch('https://app.autowhats.com.br/api/sessions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'sua_api_key_aqui'
  },
  body: JSON.stringify({
    sessionId: 'minha-sessao-001',
    webhookUrl: 'https://meusite.com/webhook'
  })
});

const data = await response.json();
console.log(data);
// Se data.existing === true, a sessão foi reutilizada
// Se não, uma nova sessão foi criada

// Obter QR Code
const qrResponse = await fetch('https://app.autowhats.com.br/api/sessions/minha-sessao-001/qr', {
  headers: {
    'X-API-Key': 'sua_api_key_aqui'
  }
});

const qrData = await qrResponse.json();
// Use qrData.qr em uma tag <img>
document.getElementById('qrcode').src = qrData.qr;

// Enviar mensagem
const messageResponse = await fetch('https://app.autowhats.com.br/api/messages/text', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'sua_api_key_aqui'
  },
  body: JSON.stringify({
    sessionId: 'minha-sessao-001',
    to: '5571991460801',
    message: 'Olá! Esta é uma mensagem de teste.'
  })
});

const messageData = await messageResponse.json();
console.log('Mensagem enviada:', messageData);

cURL

# Criar sessão
curl -X POST https://app.autowhats.com.br/api/sessions \
  -H "X-API-Key: sua_api_key_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "sessionId": "minha-sessao-001",
    "webhookUrl": "https://meusite.com/webhook"
  }'

# Obter QR Code
curl -X GET https://app.autowhats.com.br/api/sessions/minha-sessao-001/qr \
  -H "X-API-Key: sua_api_key_aqui"

# Enviar mensagem
curl -X POST https://app.autowhats.com.br/api/messages/text \
  -H "X-API-Key: sua_api_key_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "sessionId": "minha-sessao-001",
    "to": "5571991460801",
    "message": "Olá! Esta é uma mensagem de teste."
  }'

Python (requests)

import requests

API_BASE = "https://app.autowhats.com.br/api"
API_KEY = "sua_api_key_aqui"
headers = {"X-API-Key": API_KEY}

# Criar sessão
response = requests.post(
    f"{API_BASE}/sessions",
    headers=headers,
    json={
        "sessionId": "minha-sessao-001",
        "webhookUrl": "https://meusite.com/webhook"
    }
)
print(response.json())

# Obter QR Code
qr_response = requests.get(
    f"{API_BASE}/sessions/minha-sessao-001/qr",
    headers=headers
)
qr_data = qr_response.json()
print("QR Code:", qr_data["qr"])

# Enviar mensagem
message_response = requests.post(
    f"{API_BASE}/messages/text",
    headers=headers,
    json={
        "sessionId": "minha-sessao-001",
        "to": "5571991460801",
        "message": "Olá! Esta é uma mensagem de teste."
    }
)
print(message_response.json())

PHP

$apiBase = "https://app.autowhats.com.br/api";
$apiKey = "sua_api_key_aqui";

$headers = [
    "X-API-Key: " . $apiKey,
    "Content-Type: application/json"
];

// Criar sessão
$ch = curl_init($apiBase . "/sessions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "sessionId" => "minha-sessao-001",
    "webhookUrl" => "https://meusite.com/webhook"
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;

// Enviar mensagem
$ch = curl_init($apiBase . "/messages/text");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "sessionId" => "minha-sessao-001",
    "to" => "5571991460801",
    "message" => "Olá! Esta é uma mensagem de teste."
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;

📊 Códigos de Status HTTP

Código Descrição
200Sucesso
400Requisição inválida
401Não autenticado (API key inválida)
403Acesso negado
404Recurso não encontrado
500Erro interno do servidor

💡 Dicas e Suporte