Siga este guia passo a passo para integrar WhatsApp em seu sistema.
Para usar a API, você precisa de uma Secret Key.
.env na raiz do projetoenv.example.txtopenssl rand -hex 32)GATEWAY_SECRET=sua-chave-geradaEntre em contato com o administrador do sistema para obter a secret key de produção.
GATEWAY_SECRET=sua-chave-secreta-aqui
X-Gateway-Secret em todas as requisições. Mantenha-a segura e nunca a compartilhe publicamente.
Crie uma sessão (canal) para conectar um número do WhatsApp:
http://localhost:3000https://wpp.pixel12digital.com.br
/api/*. NÃO existe /v1/* nem /api/v1/*. Use apenas /api/*.
curl -X POST "https://wpp.pixel12digital.com.br/api/channels" \
-H "X-Gateway-Secret: sua-secret-key" \
-H "Content-Type: application/json" \
-d '{"channel": "meu-canal"}'
Acesse Sessões e crie uma nova sessão.
Obtenha o QR code e escaneie com seu WhatsApp:
curl -X GET "https://wpp.pixel12digital.com.br/api/channels/meu-canal/qr" \
-H "X-Gateway-Secret: sua-secret-key"
Abra o WhatsApp no celular > Configurações > Aparelhos conectados > Conectar um aparelho
A resposta contém um campo qr (data URI) que pode ser usado diretamente em uma tag <img> ou convertido para imagem.
Envie sua primeira mensagem via API:
5511999999999, 5511987654321+55 11 99999-9999, 11999999999, 5511999999999@c.us
curl -X POST "https://wpp.pixel12digital.com.br/api/messages" \
-H "X-Gateway-Secret: sua-secret-key" \
-H "Content-Type: application/json" \
-d '{
"channel": "meu-canal",
"to": "5511999999999",
"text": "Olá! Esta é minha primeira mensagem."
}'
Certifique-se de que a sessão está "connected" antes de enviar mensagens.
curl -H "X-Gateway-Secret: sua-secret-key" \
https://wpp.pixel12digital.com.br/api/channels/meu-canal
{
"success": true,
"message_id": "msg_123ABC",
"channel": "meu-canal",
"to": "5511999999999",
"status": "sent",
"timestamp": "2026-01-08T15:00:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
message_id pode ser null na resposta. Isso é normal! Dependendo do driver (WPPConnect/Baileys),
o message_id não é retornado de forma síncrona. O rastreamento confiável é feito via correlationId que
permite cruzar logs, eventos de webhook (message.ack) e logs do sistema.
{
"success": true,
"message_id": null,
"channel": "meu-canal",
"to": "5511999999999",
"status": "sent",
"timestamp": "2026-01-08T15:00:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
correlationId para cruzar logs + eventos de webhook + logs do sistema. O webhook message.ack
também inclui o correlationId para correlação. Para rastreamento confiável, não dependa apenas de message_id - use correlationId.
{
"success": true,
"channel": {
"id": "meu-canal",
"name": "meu-canal",
"status": "connected"
},
"created_at": "2024-01-15T10:00:00.000Z",
"updated_at": "2024-01-15T10:30:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
GET /api/channels. A resposta retorna um array de objetos com id, name e status.
Os campos id e name NUNCA são null ou vazios - sempre retornam valores válidos. Use o campo id como Channel ID nas requisições.
Configure webhooks para receber mensagens em tempo real:
curl -X POST "https://wpp.pixel12digital.com.br/api/channels/meu-canal/webhook" \
-H "X-Gateway-Secret: sua-secret-key" \
-H "Content-Type: application/json" \
-d '{"url": "https://seu-servidor.com/api/whatsapp/webhook"}'
Quando uma mensagem for recebida, o gateway enviará um POST para sua URL com o evento.
message - Nova mensagem recebidamessage.ack - Confirmação de leituraconnection.update - Mudança de status da conexão{
"event": "message",
"channel": "Pixel12 Digital",
"timestamp": "2026-01-08T23:45:12Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"message": {
"id": "msg_123",
"from": "5511999999999",
"to": "SEU_NUMERO",
"text": "Oi, tudo bem?",
"type": "text"
}
}
{
"event": "message.ack",
"channel": "Pixel12 Digital",
"timestamp": "2026-01-08T23:45:20Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"ack": {
"messageId": "msg_123",
"status": "sent"
}
}
Valores de status: queued, sent, delivered, read, failed
correlationId permite correlacionar este ACK com a requisição original de envio de mensagem. Use-o para cruzar logs e eventos.
{
"event": "connection.update",
"channel": "Pixel12 Digital",
"timestamp": "2026-01-08T23:45:30Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"connection": {
"status": "connected"
}
}
Valores: connected, disconnected, connecting, qr_required
Content-Type: application/json
X-Correlation-ID: 550e8400-e29b-41d4-a716-446655440000
X-Webhook-Secret: <SEU_WEBHOOK_SECRET> (se configurado)
User-Agent: WhatsApp-Gateway-Wrapper/1.0
correlationId ou eventId se disponível)X-Webhook-Secret antes de processarcorrelationId para identificar eventos duplicados e evitar processamento duploimport requests
BASE_URL = "https://wpp.pixel12digital.com.br" # Use http://localhost:3000 para desenvolvimento
SECRET = "sua-secret-key"
headers = {
"X-Gateway-Secret": SECRET,
"Content-Type": "application/json"
}
response = requests.post(
f"{BASE_URL}/api/messages",
json={"channel": "meu-canal", "to": "5511999999999", "text": "Olá!"},
headers=headers
)
print(response.json())
const axios = require('axios');
const BASE_URL = 'https://wpp.pixel12digital.com.br'; // Use http://localhost:3000 para desenvolvimento
const SECRET = 'sua-secret-key';
const headers = {
'X-Gateway-Secret': SECRET,
'Content-Type': 'application/json'
};
axios.post(`${BASE_URL}/api/messages`, {
channel: 'meu-canal',
to: '5511999999999',
text: 'Olá!'
}, { headers })
.then(response => console.log(response.data))
.catch(error => console.error(error));
{
"success": false,
"error": "Missing X-Gateway-Secret header",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
Solução: Adicione o header X-Gateway-Secret na requisição.
{
"success": false,
"error": "Invalid X-Gateway-Secret",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
Solução: Verifique se a secret key está correta.
{
"success": false,
"error": "channel (session_id) is required",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
Solução: Verifique se todos os campos obrigatórios foram enviados.
{
"success": false,
"error": "Channel not found",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
Solução: Verifique se o canal existe usando GET /api/channels. Se receber 404 em rotas com /v1/, verifique se está usando /api/* (sem /v1/).