API Reference

Base URL: http://localhost:8080 Dashboard

Visao Geral

WPP Gateway e uma API de WhatsApp com foco em disparo em massa e alta disponibilidade. O diferencial e o conceito de Instance Group - uma camada de orquestracao que gerencia multiplos numeros de WhatsApp como um pool unificado, com estrategias configuraveis de rotacao e failover.

Instance Groups

Agrupe multiplos numeros com estrategias de failover, rotacao ou hibrido. O sistema escolhe automaticamente o melhor numero.

Anti-Ban

Budget diario/horario, delays humanizados, warmup progressivo, cooldown automatico e deteccao de degradacao.

Broadcast

Disparo em massa com spintax, variaveis, shuffle, agendamento e monitoramento em tempo real.

Autenticacao

Todas as requisicoes autenticadas devem incluir o header X-API-Key.

Exemplo de Header
GET /v1/groups HTTP/1.1
Host: localhost:8080
X-API-Key: wpp_7d0e60e402b57c375571d4d390a0ddeef86c154103c76a26...
Content-Type: application/json
Formato de Resposta
{
  "success": true,
  "data": { ... },
  "meta": {
    "total": 10,
    "limit": 20,
    "offset": 0
  }
}

// Erro
{
  "success": false,
  "error": {
    "code": "not_found",
    "message": "Group not found"
  }
}

Arquitetura

                    +-------------------------+
                    |      API Gateway         |
                    |   (Auth + Rate Limit)    |
                    +-----------+-------------+
                                |
                    +-----------v-------------+
                    |    Group Orchestrator    |
                    |  (Strategy Engine)       |
                    +-----------+-------------+
                                |
              +-----------------+-----------------+
              |                 |                  |
     +--------v-------+ +------v--------+ +------v--------+
     |  Instance A     | |  Instance B    | |  Instance C    |
     |  +55 11 9xxxx   | |  +55 11 8xxxx  | |  +55 21 9xxxx  |
     |  status: active | |  status: rest  | |  status: warm  |
     +--------+-------+ +------+--------+ +------+--------+
              |                 |                  |
              +-----------------+-----------------+
                                |
                    +-----------v-------------+
                    |   WhatsApp Servers       |
                    +-------------------------+

Stack

LinguagemGo 1.22+
WhatsAppwhatsmeow
HTTPFiber v2
BancoPostgreSQL 16+
CacheRedis 7+
MonitoramentoPrometheus + Grafana

Componentes

Group Orchestrator - estrategias de routing
Instance Manager - conexao/QR/sessao
Dispatcher - fila de mensagens
Health Monitor - heartbeat e degradacao
Webhook Emitter - eventos para o cliente

Registro / Conta

POST /register Sem autenticacao

Cria um novo tenant e retorna a API key.

Request Body
{
  "name": "Minha Empresa"
}
Response 201
{
  "success": true,
  "data": {
    "api_key": "wpp_7d0e60e402b57c375571...",
    "tenant": {
      "id": "uuid",
      "name": "Minha Empresa",
      "plan": "basic",
      "max_groups": 5,
      "max_instances": 20,
      "is_active": true
    }
  }
}
GET /v1/account

Retorna os dados do tenant autenticado.

PATCH /v1/account

Atualiza dados da conta (nome).

GET /v1/account/usage

Retorna contagem de grupos e instancias.

GET /v1/account/audit-log

Log de auditoria. Query params: action, limit, offset

Grupos

Instance Groups sao pools de numeros WhatsApp com estrategias de routing configuravel.

POST /v1/groups

Cria um novo grupo.

{
  "name": "campanha-marketing",
  "strategy": "rotation",
  "config": {
    "daily_budget_per_instance": 200,
    "hourly_budget_per_instance": 30,
    "min_delay_ms": 2000,
    "max_delay_ms": 7000
  },
  "webhook_url": "https://meusite.com/webhook",
  "webhook_events": ["message.sent", "message.delivered", "instance.banned"]
}
GET /v1/groups

Lista todos os grupos do tenant.

GET /v1/groups/:groupId

Detalhes do grupo.

PATCH /v1/groups/:groupId

Atualiza configuracao/estrategia do grupo.

DELETE /v1/groups/:groupId

Deleta o grupo e desconecta todas as instancias.

GET /v1/groups/:groupId/status

Status consolidado com contagem de instancias por estado.

POST /v1/groups/:groupId/pause

Pausa todos os disparos do grupo.

POST /v1/groups/:groupId/resume

Retoma os disparos do grupo.

Instancias

Uma instancia = uma sessao WhatsApp = um numero. Gerenciadas dentro de um grupo.

POST /v1/groups/:groupId/instances

Adiciona uma instancia ao grupo.

{
  "display_name": "Celular 01",
  "priority": 1,
  "daily_budget": 200,
  "hourly_budget": 30
}
GET /v1/groups/:groupId/instances

Lista instancias do grupo.

GET /v1/instances/:instanceId

Detalhes da instancia (status, budget, delivery rate).

GET /v1/instances/:instanceId/qrcode

Retorna QR code para conectar o WhatsApp.

Response
{
  "success": true,
  "data": {
    "qr_code": "2@ABC123...",
    "qr_base64": "iVBORw0KGgo...",
    "expires_in": 60
  }
}
POST /v1/instances/:instanceId/pair

Conecta via pairing code (alternativa ao QR).

{ "phone": "5511999999999" }
POST /v1/instances/:instanceId/connect

Reconecta sessao existente.

POST /v1/instances/:instanceId/disconnect

Desconecta (mantem credenciais salvas).

POST /v1/instances/:instanceId/restart

Desconecta e reconecta a instancia.

GET /v1/instances/:instanceId/status

Status de conexao (WebSocket state).

Mensagens

Envie mensagens via grupo (recomendado) - o orchestrator escolhe a melhor instancia automaticamente.

POST /v1/groups/:groupId/messages/send

Envia uma mensagem via grupo.

{
  "to": "5511999999999",
  "type": "text",
  "content": {
    "body": "Ola, tudo bem?"
  }
}
GET /v1/groups/:groupId/messages

Lista mensagens. Query: status, limit, offset

GET /v1/groups/:groupId/messages/:messageId/status

Status de entrega da mensagem (queued, sent, delivered, read, failed).

Texto

{ "to": "5511999999999", "type": "text", "content": { "body": "Ola!", "preview_url": true } }

Imagem

{
  "to": "5511999999999", "type": "image",
  "content": { "url": "https://exemplo.com/foto.jpg", "caption": "Veja!", "mime_type": "image/jpeg" }
}

Video

{
  "to": "5511999999999", "type": "video",
  "content": { "url": "https://exemplo.com/video.mp4", "caption": "Assista!", "mime_type": "video/mp4" }
}

Audio

{
  "to": "5511999999999", "type": "audio",
  "content": { "url": "https://exemplo.com/audio.ogg", "mime_type": "audio/ogg; codecs=opus", "ptt": true }
}

ptt: true = mensagem de voz. ptt: false = arquivo de audio.

Documento

{
  "to": "5511999999999", "type": "document",
  "content": { "url": "https://exemplo.com/doc.pdf", "mime_type": "application/pdf", "filename": "Contrato.pdf" }
}

Localizacao

{
  "to": "5511999999999", "type": "location",
  "content": { "latitude": -23.5505, "longitude": -46.6333, "name": "Escritorio SP", "address": "Av. Paulista, 1000" }
}

Contato (vCard)

{
  "to": "5511999999999", "type": "contact",
  "content": {
    "contacts": [{
      "name": { "formatted_name": "Joao Silva", "first_name": "Joao" },
      "phones": [{ "phone": "+5511999999999", "type": "CELL" }]
    }]
  }
}

Reacao

{ "to": "5511999999999", "type": "reaction", "content": { "message_id": "ABCDEF123", "emoji": "👍" } }

Envie emoji: "" para remover a reacao.

Enquete

{
  "to": "5511999999999", "type": "poll",
  "content": { "title": "Qual horario?", "options": ["Manha", "Tarde", "Noite"], "max_selections": 1 }
}

Botoes (ate 3)

{
  "to": "5511999999999", "type": "button",
  "content": {
    "body": "Escolha uma opcao:",
    "footer": "Responda clicando",
    "buttons": [
      { "id": "btn_sim", "text": "Sim" },
      { "id": "btn_nao", "text": "Nao" },
      { "id": "btn_info", "text": "Mais info" }
    ]
  }
}

Lista (ate 10 itens)

{
  "to": "5511999999999", "type": "list",
  "content": {
    "body": "Nosso cardapio:", "button_text": "Ver opcoes",
    "sections": [{
      "title": "Pizzas",
      "items": [
        { "id": "pizza_1", "title": "Margherita", "description": "R$ 39,90" },
        { "id": "pizza_2", "title": "Pepperoni", "description": "R$ 44,90" }
      ]
    }]
  }
}

Broadcasts

POST /v1/groups/:groupId/messages/broadcast

Cria um disparo em massa.

{
  "recipients": ["5511999999999", "5511888888888"],
  "type": "text",
  "content": { "body": "Ola {nome}!" },
  "variables": { "5511999999999": { "nome": "Joao" } },
  "options": { "shuffle_recipients": true, "spintax": true }
}
GET /v1/groups/:groupId/messages/broadcast

Lista broadcasts do grupo.

GET /v1/groups/:groupId/messages/broadcast/:broadcastId

Progresso do broadcast (total, sent, delivered, failed).

POST .../pause

Pausa o broadcast.

POST .../resume

Retoma o broadcast.

POST .../cancel

Cancela o broadcast.

Metricas

GET /v1/groups/:groupId/metrics

Resumo: enviadas, entregues, falharam, taxa de entrega.

GET /v1/groups/:groupId/metrics/daily

Metricas diarias. Query: from, to (YYYY-MM-DD)

GET /v1/groups/:groupId/metrics/instances

Metricas por instancia do grupo.

GET /metrics Sem autenticacao

Prometheus metrics endpoint (formato texto).

Blacklist

GET /v1/groups/:groupId/blacklist

Lista numeros bloqueados.

POST /v1/groups/:groupId/blacklist
{ "numbers": ["5511999999999", "5511888888888"], "reason": "opt_out" }
DELETE /v1/groups/:groupId/blacklist/:number

Remove numero da blacklist.

Webhooks

PUT /v1/groups/:groupId/webhook
{
  "url": "https://meusite.com/webhook",
  "events": ["message.sent", "message.delivered", "message.failed", "instance.status_changed"]
}
GET /v1/groups/:groupId/webhook

Configuracao atual do webhook.

POST /v1/groups/:groupId/webhook/test

Envia um evento de teste para o webhook configurado.

Schemas

Tenant

id uuid
name string
plan string
max_groups int
max_instances int
is_active boolean
created_at datetime

Group

id uuid
tenant_id uuid
name string
strategy failover | rotation | hybrid
config object
webhook_url string
webhook_events string[]
is_active boolean

Instance

id uuid
group_id uuid
phone_number string
display_name string
status enum (ver abaixo)
priority int
daily_budget int
hourly_budget int
messages_today int
delivery_rate float

Broadcast

id uuid
group_id uuid
status enum (ver abaixo)
total int
sent int
delivered int
failed int

Status & Estrategias

Instance Status

disconnected- Desconectado
connecting- Conectando
available- Pronto para envio
resting- Cooldown ativo
warming- Aquecimento progressivo
suspect- Sinais de degradacao
banned- Numero banido

Estrategias de Grupo

failover

Usa instancia primaria. Se falhar, promove a proxima por prioridade. Ideal para atendimento.

rotation

Distribui mensagens entre instancias respeitando budget. Ideal para marketing.

hybrid

Rotacao com failover automatico. Combina alta vazao com resiliencia.

Broadcast Status

pending - Aguardando
processing - Em andamento
paused - Pausado
completed - Finalizado
cancelled - Cancelado
failed - Falhou