Instâncias
Cada instância representa uma conexão de mensageria.
Conecta múltiplas contas, dispara campanhas com tracking, mede conversões — tudo numa stack Go enxuta com webhooks em tempo real.
Use a MASTER_API_KEY definida no servidor.
Cada instância representa uma conexão de mensageria.
3 passos pra fechar o setup da instância e disparar a primeira campanha.
Aparência e comportamentos automáticos da instância.
Nome e avatar exibidos no painel.
PNG, JPG, WebP ou SVG. Até ~1.5 MB.
Endpoints HTTP que recebem os eventos desta instância.
Guia rápido para integrar o Ignitecore GO com seu backend, n8n ou qualquer cliente HTTP. Todas as rotas retornam JSON. Autenticação por header apikey.
Duas camadas de chave. Envie em apikey: <chave> ou Authorization: Bearer <chave>.
Criar, listar e deletar instâncias. Vem do .env do servidor.
Operar uma instância (mensagens, conexão, webhooks). Devolvido no POST /instance.
curl https://sua-api.com/instance \ -H "apikey: SUA_MASTER_KEY"
Cria uma nova instância e retorna o token.
{ "name": "minha-loja" }
{
"id": "ba6bd24e-3870-42a9-b13e-...",
"name": "minha-loja",
"token": "7cf1cebce83c1208...",
"status": "disconnected",
"settings": { ... }
}
Lista todas as instâncias.
Detalhes (settings + status).
Desconecta e apaga a instância. Irreversível.
Renomeia a instância.
{ "name": "loja-sp" }
Aceita URL, data:…;base64,… ou preset:ignitecore. Vazio volta pras iniciais.
{ "avatar": "preset:ignitecore" }
Comportamentos automáticos.
{
"reject_calls": true,
"ignore_groups": false,
"always_online": true,
"auto_read_messages": true,
"auto_read_status": false
}
Pareie por QR (chama /connect) ou por código de 8 dígitos (alternativa pra quem não consegue ler QR).
{
"status": "qr",
"qr_code": "2@abc...",
"qr_image": "data:image/png;base64,iVBORw0KG..."
}
Status possíveis: qr, connecting, connected, disconnected, logged_out.
Devolve o QR direto como image/png (útil pra <img src>).
Pareamento sem QR. Devolve um código de 8 dígitos. No celular: Aparelhos conectados → Conectar com número de telefone e digite o código.
{ "phone": "5511999999999" }
→
{ "code": "ABCD-WXYZ" }
Fecha a conexão WS preservando o pareamento. /connect reconecta sem QR.
Desfaz o pareamento (apaga sessão). Diferente de /disconnect.
Campo to aceita só o número (5511999999999) ou o JID completo (…@s.whatsapp.net / …@g.us pra grupos).
{
"to": "5511999999999",
"message": "Olá do n8n!",
"reply_to": "MSG_ID_OPCIONAL"
}
Texto com preview de link (Title/Description aparece no balão).
{
"to": "5511999999999",
"text": "Olha esse artigo: https://exemplo.com/post",
"title": "Título exibido",
"description": "Descrição exibida (opcional)",
"thumbnail_url": "https://...image.jpg (opcional)"
}
Mesmo padrão para sendVideo, sendAudio, sendDocument, sendSticker.
{
"to": "5511999999999",
"url": "https://exemplo.com/foto.jpg",
"base64": "(alternativa a url)",
"caption": "texto opcional",
"filename": "arquivo.pdf", // só no sendDocument
"mime_type": "image/jpeg" // opcional
}
{
"to": "5511999999999",
"latitude": -23.550,
"longitude": -46.633,
"name": "Paulista",
"address": "Av. Paulista, São Paulo"
}
{
"to": "5511999999999",
"display_name": "Fulano",
"vcard": "BEGIN:VCARD\nVERSION:3.0\nFN:Fulano\nTEL:+5511...\nEND:VCARD"
}
{ "to": "5511…", "message_id": "ABC…", "emoji": "👍" }
Emoji vazio remove a reação.
{
"to": "5511999999999",
"name": "Qual horário?",
"options": ["Manhã","Tarde","Noite"],
"selectable_count": 1
}
Histórico persistido. Default limit=100, máx 500.
Baixa e descriptografa a mídia. Devolve bytes com o Content-Type correto. Aceita apikey via query (?apikey=…) pra usar em <img>/<video>.
Edita o texto. WhatsApp permite só dentro de ~15 min do envio.
{ "to": "5511999999999", "text": "novo texto" }
Apaga pra todos (revoke).
{ "to": "5511999999999" }
Marca mensagens como lidas (manual). Em grupos, sender é o JID do remetente.
{
"chat": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"message_ids": ["ABC123","DEF456"]
}
Detalhe de uma mensagem persistida.
Cria um grupo. Nome até 25 chars.
{
"subject": "Time vendas",
"participants": ["5511999999999","5511888888888"]
}
Lista todos os grupos da conta.
Detalhes do grupo, com lista de participantes (is_admin, is_super_admin).
Link de convite. Use ?reset=true para revogar e gerar um novo.
→ { "link": "https://chat.whatsapp.com/ABCD..." }
Entra num grupo via link/código de convite.
{ "code": "https://chat.whatsapp.com/ABCD..." }
{ "name": "novo nome" }{ "topic": "descrição do grupo" }{ "url": "https://…" } // ou { "base64": "..." }action: add · remove · promote · demote
{
"action": "promote",
"participants": ["5511999999999"]
}
Confere em batch quais números têm conta no WhatsApp. Útil pra validar antes de mandar.
{ "phones": ["5511999999999","5511888888888"] }
→
[
{ "phone": "+5511999999999", "exists": true, "jid": "...@s.whatsapp.net" },
{ "phone": "+5511888888888", "exists": false }
]
{ "jid": "5511999999999@s.whatsapp.net" }{ "jid": "5511999999999@s.whatsapp.net" }→ { "jids": ["...@s.whatsapp.net", ...] }{ "jid": "...@s.whatsapp.net", "value": true }{ "jid": "...@s.whatsapp.net", "value": true }duration_seconds=0 = mudo permanente, negativo = desmuta.
{ "jid": "...@s.whatsapp.net", "duration_seconds": 3600 }
Disponível em contas WhatsApp Business. color = índice 0–19 da paleta.
Cria, edita ou apaga uma label. Use deleted:true pra remover.
{ "label_id":"1", "name":"Cliente VIP", "color":5 }
{ "label_id":"1", "deleted":true }
{ "jid":"...@s.whatsapp.net", "label_id":"1", "labeled":true }
{ "jid":"...@s.whatsapp.net", "label_id":"1", "message_id":"ABC...", "labeled":true }
URL da foto de perfil de qualquer JID (contato ou grupo).
→ { "url": "https://pps.whatsapp.net/..." }
Atualiza o "recado" (about) da conta.
{ "text": "Disponível 24h" }
{ "state": "available" } // ou "unavailable"
Sinaliza "digitando" ou "gravando áudio" num chat.
{
"to": "5511999999999",
"state": "composing", // composing | paused
"media": "audio" // text | audio
}
Lista todos os contatos que o WhatsApp conhece (push name + business name).
{
"messages": 1024,
"messages_sent": 400,
"messages_received": 624,
"chats": 42,
"groups": 3,
"contacts": 1200,
"connected": true,
"status": "connected",
"last_message_at": "2026-04-24T21:00:00Z"
}
Lista conversas com preview da última mensagem e total.
[{
"chat_jid": "5511999…@s.whatsapp.net",
"last_content": "Valeu!",
"last_type": "text",
"last_from_me": false,
"last_timestamp": "2026-04-24T20:00:00Z",
"total": 17
}]
Cada webhook é um endpoint HTTP seu que recebe POSTs com os eventos da instância. Suporta múltiplos por instância, com escolha granular de eventos e assinatura HMAC opcional.
{
"url": "https://n8n.seu-dominio.com/webhook/abc",
"events": ["message.received", "connection.state"],
"secret": "opcional-para-hmac-sha256"
}
Atualiza URL, eventos, secret ou enabled. Envie só os campos que deseja alterar.
Corpo enviado ao webhook. Estrutura flat — o campo type indica qual evento foi disparado e timestamp vem em milissegundos.
Toda msg que chega da instância. Pode trazer blocos extras opcionais: ad (lead vindo de CTWA — ver abaixo), image/video/audio/document/sticker/location/contact conforme messageType, media base64 se webhook_base64 ligado.
{
"type": "message.received",
"instanceId": "ba6bd24e-…",
"instanceName": "minha-loja",
"connectedPhone": "5511950448963",
"messageId": "ACEDD27D…",
"phone": "5512981713261",
"chatLid": "5512981713261@s.whatsapp.net",
"chatName": "Fulano",
"senderName": "Fulano",
"fromMe": false,
"timestamp": 1775604007000,
"status": "RECEIVED",
"isGroup": false,
"isNewsletter": false,
"isStatusReply": false,
"isEdit": false,
"messageType": "text",
"text": { "message": "Olá!" }
}
Quando o lead inicia conversa clicando num Click-To-WhatsApp Ad do Meta (Facebook/Instagram), a primeira mensagem chega como message.received normal com um bloco extra ad contendo os metadados do anúncio. Esse bloco só aparece nessa primeira msg — mensagens subsequentes do mesmo lead vêm sem ele. Use ad.ctwaClid (Click ID único por clique) como chave de atribuição lead → campanha; combine com ad.sourceId (ID do anúncio no Meta) e ad.ref (parâmetro custom do Ads Manager) pra rastrear campanha → criativo.
{
"type": "message.received",
"instanceId": "ba6bd24e-…",
"messageId": "ACEDD27D…",
"phone": "5512981713261",
"chatLid": "5512981713261@s.whatsapp.net",
"fromMe": false,
"timestamp": 1775604007000,
"messageType": "text",
"text": { "message": "Oi, vim do anúncio!" },
"ad": {
"title": "Plano Premium 50% OFF",
"body": "Aproveite enquanto durar",
"mediaType": "IMAGE", // IMAGE | VIDEO | NONE
"thumbnailUrl": "https://scontent…/img.jpg",
"mediaUrl": "https://scontent…/img.jpg",
"sourceType": "ad",
"sourceId": "123456789012345", // ID do anúncio no Meta
"sourceUrl": "https://fb.me/…",
"sourceApp": "facebook", // facebook | instagram | whatsapp
"ctwaClid": "ARBxYz…", // 🔑 chave de atribuição
"ref": "campanha-black-friday", // parâmetro custom do Ads Manager
"ctaPayload": "", // payload do CTA se configurado
"clickToWhatsappCall": false,
"containsAutoReply": true, // a msg foi o auto-reply do CTA?
"greetingMessageBody": "Olá! Como posso ajudar?",
"adType": "AD_TYPE_UNSPECIFIED",
"adPreviewUrl": "",
"websiteUrl": ""
}
}
{
"type": "message.status",
"instanceId": "ba6bd24e-…",
"messageId": "ABC…",
"chatLid": "5511…@s.whatsapp.net",
"phone": "5511…",
"status": "READ", // ou DELIVERED
"timestamp": 1775604007000
}
messageId aponta pra mensagem original editada. O texto/caption novo vem em newContent e (pra mídia) no campo específico do tipo (text, image, etc.).
{
"type": "message.edited",
"instanceId": "ba6bd24e-…",
"instanceName": "minha-loja",
"messageId": "ABC123", // ID da msg ORIGINAL
"editStanzaId": "EDIT456", // ID da stanza da edição
"phone": "5512981713261",
"chatLid": "5512981713261@s.whatsapp.net",
"fromMe": false,
"isGroup": false,
"isEdit": true,
"messageType": "text",
"newContent": "Texto novo da mensagem",
"text": { "message": "Texto novo da mensagem" },
"timestamp": 1775604007000
}
messageId é o alvo (a msg que recebeu a reação). targetFromMe: true indica que a msg reagida era nossa — sinal de engagement do lead. removed: true + reaction: "" = cliente removeu uma reação anterior.
{
"type": "message.reaction",
"instanceId": "ba6bd24e-…",
"messageId": "ABC123", // msg que RECEBEU a reação
"reactionId": "RCT456", // ID da stanza desta reação (dedupe)
"phone": "5512981713261", // quem reagiu
"chatLid": "5512981713261@s.whatsapp.net",
"fromMe": false, // a reação foi feita por nós?
"targetFromMe": true, // a msg reagida era nossa?
"isGroup": false,
"reaction": "👍",
"removed": false,
"timestamp": 1775604007000
}
{
"type": "connection.connected",
"instanceId": "ba6bd24e-…",
"instanceName": "minha-loja",
"connectedPhone": "5511950448963",
"status": "connected",
"timestamp": 1775604007000
}
{
"type": "connection.qr",
"instanceId": "…",
"instanceName": "minha-loja",
"qrCode": "2@abc…",
"timestamp": 1775604007000
}
{
"type": "call.rejected",
"instanceId": "…",
"callId": "XYZ",
"phone": "5511999999999",
"rejected": true,
"timestamp": 1775604007000
}
Se o webhook tiver secret, cada POST chega com:
X-Webhook-Signature: sha256=<hex>
Onde hex é HMAC-SHA256(secret, body_bytes).
const crypto = require('crypto');
const sig = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
// comparar com req.headers['x-webhook-signature']
const sig = $request.headers['x-webhook-signature'];
const expect = 'sha256=' + require('crypto')
.createHmac('sha256', 'SEU_SECRET')
.update($request.rawBody)
.digest('hex');
if (sig !== expect) throw new Error('invalid signature');
Catálogo persistente de números. Use tags pra agrupar (cliente-vip, lead-quente) e disparar campanhas pra audiences reusáveis.
lead-quente, cliente-vip) e disparar campanhas direto pelo grupo, em vez de colar lista de números.Broadcasts nomeados com auto-rewrite de URLs e funnel completo.
Encurta URLs e mede cliques. Compartilhe o short URL (não o destino) — quando alguém clica, a API redireciona e grava o evento. Use em campanhas, bio do WhatsApp Business ou mensagens manuais.
Score 0-100 por contato. Use pra filtrar leads quentes antes de campanha, identificar quem precisa de reativação, ou priorizar atendimento.
Score = read_rate (40%) + response_rate (40%) + recência (20%). Se o destinatário tem confirmação de leitura desligada (read_count=0), o peso é redistribuído pra response_rate (80%) + recência (20%).
Eventos que sua aplicação registrou via POST /events/{instance}/conversion. Cada conversão é atribuída à última campanha enviada pro contato (janela padrão 7d).
POST /events/{instance}/conversion quando concluir uma venda — a conversão aparece aqui e é atribuída à última campanha que enviou pro contato.Comece de um modelo pronto. Cada um tem 3 variantes de tom — você ajusta como quiser depois.
{{primeiro_nome}}. Pra que apareça o nome certo, cadastre os contatos com Nome em Contatos antes do disparo.
Cada destinatário recebe a mensagem com suas variáveis (cadastradas em Contatos). URLs viram short links se "Rastrear cliques" estiver ligado.
1 = enquete única, 2+ = múltipla escolha.
Mínimo 2, máximo 12 opções. Variáveis {{...}} não são suportadas em enquete.
Cole o message_id de uma mensagem que todos os destinatários têm na conversa (ex: msg de transmissão anterior). Cita ela como reply na nova mensagem.
20-30/min pra disparos grandes. 60+ só pra listas pequenas (≤50 contatos).
Randomiza intervalos e faz pausas pra evitar padrão robótico que o WhatsApp detecta.
0 em "a cada" desativa.
Formato E.164. Exemplo: 5511999990001 (Brasil + 11 + 9 9999-0001). Não pode mudar depois.
Use em campanhas como {{empresa}}, {{plano}}, etc.
Nenhuma variável — clique em "Nova" pra adicionar.
contatos
Nenhuma tag cadastrada — vá na aba Tags pra criar.
contatos selecionados receberárão a mensagem da campanha escolhida.
draft e volte aqui.
Atalhos só funcionam fora de campos de texto (exceto Ctrl+K, que funciona em qualquer lugar).