Documentação completa da API
🌐 Produção:
https://wpp.pixel12digital.com.br
🔧 Desenvolvimento Local:
http://localhost:3000
IMPORTANTE - Rotas Públicas da API:
/api/*/v1/* nem /api/v1/* - use apenas /api/*https://wpp.pixel12digital.com.brhttp://localhost:3000/api/status) requerem o header X-Gateway-Secret
POST /api/channels para criar uma nova sessão
GET /api/channels/:channel/qr e escaneie com WhatsApp
POST /api/messages para enviar mensagens
POST /api/webhooks para receber eventos em tempo real
| Parâmetro | Tipo | Descrição |
|---|---|---|
channel obrigatório |
string | ID da sessão/canal |
to obrigatório |
string | Número do destinatário (ex: 5511999999999) |
text obrigatório |
string | Texto da mensagem |
curl -X POST https://wpp.pixel12digital.com.br/api/messages \
-H "Content-Type: application/json" \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-d '{
"channel": "Pixel12 Digital",
"to": "5511999999999",
"text": "Olá! Teste do gateway."
}'
curl -X POST http://localhost:3000/api/messages \
-H "Content-Type: application/json" \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-d '{
"channel": "Pixel12 Digital",
"to": "5511999999999",
"text": "Olá! Teste do gateway."
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
success |
boolean | ✓ | Sempre true em caso de sucesso |
message_id |
string | null | - | Pode ser null - ID da mensagem (assíncrono via driver) |
channel |
string | ✓ | ID do canal usado |
to |
string | ✓ | Número de destino |
status |
string | ✓ | Status do envio (sent, queued) |
timestamp |
string (ISO 8601) | ✓ | Data/hora do envio |
correlationId |
string (UUID) | ✓ | Chave de rastreamento - use para cruzar logs, eventos e webhooks |
{
"success": true,
"message_id": "msg_123ABC",
"channel": "Pixel12 Digital",
"to": "5511999999999",
"status": "sent",
"timestamp": "2026-01-08T15:00:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": true,
"message_id": null,
"channel": "Pixel12 Digital",
"to": "5511999999999",
"status": "sent",
"timestamp": "2026-01-08T15:00:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
⚠️ Por que message_id pode ser null?
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. Use correlationId para rastrear o status real da mensagem.
correlationId para cruzar logs + eventos de webhook + logs do sistemamessage.ack também inclui o correlationId para correlaçãomessage_id pode chegar assincronamente via webhook message.ackcorrelationId{
"success": false,
"error": "channel (session_id) is required",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ https://wpp.pixel12digital.com.br/api/channels
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ http://localhost:3000/api/channels
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
success |
boolean | ✓ | Sempre true em caso de sucesso |
channels |
array | ✓ | Array de objetos de canal (pode ser vazio []) |
channels[].id |
string | ✓ | NUNCA null/vazio - ID do canal (usar como Channel ID) |
channels[].name |
string | ✓ | NUNCA null/vazio - Nome do canal |
channels[].status |
string | ✓ | Status: connected, disconnected, qr_required, connecting |
total |
number | ✓ | Total de canais (equivalente a channels.length) |
correlationId |
string (UUID) | ✓ | ID de correlação para rastreamento |
{
"success": true,
"channels": [
{
"id": "ImobSites",
"name": "ImobSites",
"status": "connected"
},
{
"id": "Pixel12 Digital",
"name": "Pixel12 Digital",
"status": "connected"
}
],
"total": 2,
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
id é a chave oficial para "Channel ID" nas integraçõesid e name NUNCA são null ou vazios - sempre retornam valores válidoschannels[].id como Channel ID para fazer requisições subsequentes (enviar mensagens, obter QR code, etc.)[] e total será 0curl -H "X-Gateway-Secret: <SEU_SECRET>" \ https://wpp.pixel12digital.com.br/api/channels/Pixel12%20Digital
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ http://localhost:3000/api/channels/Pixel12%20Digital
{
"success": true,
"channel": {
"id": "Pixel12 Digital",
"name": "Pixel12 Digital",
"status": "connected"
},
"created_at": "2024-01-15T10:00:00.000Z",
"updated_at": "2024-01-15T10:30:00.000Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": false,
"error": "Channel not found",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
channel retorna um objeto com id, name e status. O id deve ser usado como Channel ID nas integrações.
curl -X POST https://wpp.pixel12digital.com.br/api/channels \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"channel": "session-id"
}'
curl -X POST http://localhost:3000/api/channels \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"channel": "session-id"
}'
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ https://wpp.pixel12digital.com.br/api/channels/session-id/qr
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ http://localhost:3000/api/channels/session-id/qr
curl -X POST https://wpp.pixel12digital.com.br/api/webhooks \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-servidor.com/webhook",
"secret": "optional-secret"
}'
curl -X POST http://localhost:3000/api/webhooks \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-servidor.com/webhook",
"secret": "optional-secret"
}'
curl -X POST https://wpp.pixel12digital.com.br/api/channels/session-id/webhook \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-servidor.com/webhook"
}'
curl -X POST http://localhost:3000/api/channels/session-id/webhook \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-servidor.com/webhook"
}'
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
X-Webhook-Secret antes de processar o evento, comparando com o secret configurado no webhook.
Disparado quando uma mensagem é recebida no WhatsApp
{
"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"
}
}
Disparado quando há confirmação de envio/entrega/leitura
{
"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 típicos 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.
Disparado quando o status da sessão muda
{
"event": "connection.update",
"channel": "Pixel12 Digital",
"timestamp": "2026-01-08T23:45:30Z",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"connection": {
"status": "connected"
}
}
Valores possíveis: connected, disconnected, connecting, qr_required
correlationId ou eventId se disponível)X-Webhook-Secret antes de processarcorrelationId para identificar eventos duplicados e evitar processamento duplocorrelationId para rastreamento.
{
"success": false,
"error": "Mensagem de erro descritiva",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
correlationId para cruzar logs do gateway e identificar a requisição que causou o errocorrelationId mesmo quando não há autenticaçãocorrelationId ao reportar problemas para facilitar o diagnóstico{
"success": false,
"error": "Missing X-Gateway-Secret header",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
X-Gateway-Secret na requisição com uma secret key válida.
{
"success": false,
"error": "Invalid X-Gateway-Secret",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": false,
"error": "channel (session_id) is required",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": false,
"error": "Channel not found",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": false,
"error": "Route not found: /api/v1/messages",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
/api/*. NÃO existe /v1/* nem /api/v1/*.
Se você receber 404 em rotas com /v1/, verifique se está usando a rota correta /api/*.
GET /api/channels. Para rotas, use apenas /api/* (sem /v1/).
{
"success": false,
"error": "Too many requests. Please try again later.",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": false,
"error": "Internal server error",
"correlationId": "550e8400-e29b-41d4-a716-446655440000"
}
correlationId e reporte o problema ao suporte. Tente novamente após alguns segundos.
curl -H "X-Gateway-Secret: <SEU_SECRET>" \ https://wpp.pixel12digital.com.br/api/channels
channels com objetos {id, name, status}id e name não são null ou vaziosid do canal que deseja usar (ex: "Pixel12 Digital")curl -H "X-Gateway-Secret: <SEU_SECRET>" \ https://wpp.pixel12digital.com.br/api/channels/Pixel12%20Digital
"connected" antes de enviar mensagens.
status: "qr_required" - obtenha o QR code e escaneie com WhatsAppstatus: "disconnected" - reconecte o canalstatus: "connected" permite enviar mensagenscurl -X POST https://wpp.pixel12digital.com.br/api/messages \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"channel": "Pixel12 Digital",
"to": "5511999999999",
"text": "Mensagem de teste da integração"
}'
"success": truemessage_id pode ser null - isso é normal!correlationId está presente - guarde-o para rastreamentocurl -X POST https://wpp.pixel12digital.com.br/api/channels/Pixel12%20Digital/webhook \
-H "X-Gateway-Secret: <SEU_SECRET>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://seu-servidor.com/api/whatsapp/webhook"
}'
messageX-Webhook-Secret se configuradocorrelationId da respostamessage.ack inclui o mesmo correlationIdcorrelationId para cruzar logs e eventosmessage_id - ele pode ser null na resposta inicial{"success": false, "error": "Route not found: /api/v1/messages"}
/api/*, não em /api/v1/* ou /v1/*.
POST /api/v1/messagesPOST /api/messages
{"success": false, "error": "Missing X-Gateway-Secret header"}
X-Gateway-Secret em todas as requisições (exceto /api/status).
-H "X-Gateway-Secret: sua-secret-key"
{"success": false, "error": "Invalid X-Gateway-Secret"}
{"success": true, "message_id": null, ...}
message_id não é retornado de forma síncrona.
correlationId para rastrear a mensagemmessage_id pode chegar via webhook message.ackmessage_id - use correlationId para rastreamento confiável"connected"{"channels": [{"id": null, "name": null, ...}]}
id e name devem sempre ter valores válidos.
correlationId e reporte o problema ao suporte. Isso pode indicar um bug no gateway.
import requests
BASE_URL = "https://wpp.pixel12digital.com.br" # Use http://localhost:3000 para desenvolvimento
SECRET = "seu-secret-key"
headers = {
"X-Gateway-Secret": SECRET,
"Content-Type": "application/json"
}
# Enviar mensagem
response = requests.post(
f"{BASE_URL}/api/messages",
json={
"channel": "session-id",
"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 = 'seu-secret-key';
const headers = {
'X-Gateway-Secret': SECRET,
'Content-Type': 'application/json'
};
// Enviar mensagem
axios.post(`${BASE_URL}/api/messages`, {
channel: 'session-id',
to: '5511999999999',
text: 'Olá!'
}, { headers })
.then(response => console.log(response.data))
.catch(error => console.error(error));
$baseUrl = 'https://wpp.pixel12digital.com.br'; // Use 'http://localhost:3000' para desenvolvimento
$secret = 'seu-secret-key';
$headers = [
'X-Gateway-Secret: ' . $secret,
'Content-Type: application/json'
];
$data = [
'channel' => 'session-id',
'to' => '5511999999999',
'text' => 'Olá!'
];
$ch = curl_init($baseUrl . '/api/messages');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
echo $response;