API WhatsApp UniZap
Envie e receba mensagens de WhatsApp por HTTP. Integre com qualquer plataforma — n8n, Make, CRM, ERP ou sistema próprio.
Formato da URL base:
# troque {ID} e {TOKEN} pelos valores da sua instância https://SEU_HOST/instances/{ID}/token/{TOKEN}
Autenticação
Além do ID e TOKEN na URL, envie o Client-Token no header de todas as chamadas:
Client-Token: SEU_CLIENT_TOKEN
Sem ele, a API responde 401. Cada instância tem tokens próprios — se precisar revogar o acesso de um cliente, é só Regenerar tokens no painel.
Conexão
{ "status": "connected", "connected": true, "phone": "5547999998888" }
data:image/png…).{ "connected": false, "qrcode": "data:image/png;base64,…" }
{ "pairingCode": "XXXX-XXXX" }
Enviar texto
# body { "phone": "5547999998888", "message": "Olá!" }
curl -X POST https://SEU_HOST/instances/{ID}/token/{TOKEN}/send-text \
-H "Client-Token: SEU_CLIENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone":"5547999998888","message":"Olá!"}'
Resposta: { "messageId": "…" }
chatId completo (ex.: 1203…@g.us).Enviar imagem
image aceita URL pública ou base64.{ "phone": "5547999998888", "image": "https://…/foto.jpg", "caption": "Legenda opcional" }
Enviar vídeo
{ "phone": "5547999998888", "video": "https://…/video.mp4", "caption": "opcional" }
Enviar áudio
ptt: true envia como áudio de voz (padrão).{ "phone": "5547999998888", "audio": "https://…/audio.mp3", "ptt": true }
Enviar documento
{ "phone": "5547999998888", "document": "https://…/nota.pdf",
"fileName": "nota-fiscal.pdf", "mimetype": "application/pdf" }
Enviar localização
{ "phone": "5547999998888", "latitude": -26.9194, "longitude": -49.0661,
"name": "União CERT", "address": "Blumenau/SC" }
Enviar contato
{ "phone": "5547999998888", "contactName": "Suporte", "contactPhone": "5547988887777" }
Reagir a uma mensagem
reaction é o emoji. String vazia remove a reação. Use o messageId recebido no webhook.{ "phone": "5547999998888", "messageId": "ABCD…", "reaction": "👍" }
"Digitando…" / "Gravando áudio…"
presence: composing (digitando), recording (gravando) ou paused. durationMs volta pra "paused" sozinho.{ "phone": "5547999998888", "presence": "composing", "durationMs": 3000 }
Checar se o número tem WhatsApp
{ "phone": "5547999998888", "exists": true, "jid": "5547999998888@s.whatsapp.net" }
Foto de perfil
{ "url": "https://…jpg" } // url = null quando não há foto ou privacidade bloqueia
Marcar mensagem como lida
{ "phone": "5547999998888", "messageId": "ABCD…" }
Apagar mensagem (para todos)
{ "phone": "5547999998888", "messageId": "ABCD…" }
Grupos · listar & informações
[ { "groupId": "1203…@g.us", "subject": "Clientes VIP", "size": 42, "owner": "5547…" } ]
{
"groupId": "1203…@g.us", "subject": "Clientes VIP", "description": "…",
"inviteLink": "https://chat.whatsapp.com/XXXX",
"participants": [ { "phone": "5547…", "admin": "superadmin" } ]
}
Criar grupo
{ "subject": "Novo Grupo", "participants": ["5547999998888", "5547988887777"] }
Participantes & admin
action: add (adicionar), remove (remover), promote (tornar admin), demote (rebaixar).{ "participants": ["5547999998888"], "action": "add" }
Editar & configurar
{ "subject": "Novo nome do grupo" }
{ "description": "Descrição do grupo" }
setting: announcement (só admin envia), not_announcement (todos enviam), locked (só admin edita infos), unlocked (todos editam).{ "setting": "announcement" }
Convite · entrar & sair
{ "inviteLink": "https://chat.whatsapp.com/XXXX" }
{ "inviteCode": "https://chat.whatsapp.com/XXXX" }
messageId (usa o áudio guardado), audio (base64) ou url. Requer o serviço de transcrição configurado.{ "messageId": "ABCD…" }
// ou { "audio": "base64…" } ou { "url": "https://…/audio.ogg" }
{ "text": "texto transcrito completo", "language": "pt", "duration": 12.4 }
Webhooks · eventos & payloads
Configure as URLs no painel (ou via API). Quando um evento acontece, a UniZap faz um POST JSON na sua URL. Se você definir um secret, ele vem no header X-Webhook-Secret — valide pra ter certeza de que o disparo é seu.
| Evento | Quando dispara |
|---|---|
| message.received | Chega uma mensagem |
| message.sent | A instância envia uma mensagem |
| message.status | Muda o status (enviada, entregue, lida, reproduzida) |
| chat.presence | O outro lado está digitando/gravando |
| call.received | Chegou uma ligação (traz rejected se foi recusada) |
| instance.connected | Instância conecta |
| instance.disconnected | Instância cai ou desconecta |
message.received (texto):
{
"event": "message.received",
"instanceId": "…", "instanceName": "Cliente X", "momment": 1720000000000,
"messageId": "ABCD…", "fromMe": false,
"phone": "5547999998888", "chatId": "5547999998888@s.whatsapp.net",
"isGroup": false, "senderName": "Fulano", "timestamp": 1720000000000,
"messageType": "text", "text": "Oi"
}
Para mídia (image, video, audio, document, sticker) vêm mimetype e caption/fileName. Até 8MB vai em base64 no webhook. Acima disso, é guardada 7 dias e o webhook traz mediaStored: true + mediaUrl (link direto pra baixar) + mediaId.
?base64=true pra receber em JSON. O mediaUrl do webhook aponta pra um link público equivalente (/media/{id}, id não-adivinhável).message.status:
{ "event": "message.status", "messageId": "…", "phone": "…", "status": "delivered" }
// status: sent | delivered | read | played | error
instance.disconnected:
{ "event": "instance.disconnected", "connected": false, "reason": "connection_lost", "reconnecting": true }
Configurar webhooks via API
{
"wh_on_receive": "https://seusite.com/hook",
"ignore_on_receive": false,
"notify_sent_by_me": true,
"f_ignore_groups": true,
"webhook_secret": "um-segredo-forte",
"reject_calls": true,
"reject_call_message": "Não atendemos ligações, envie mensagem."
}
Campos de URL: wh_on_send, wh_on_receive, wh_on_connect, wh_on_disconnect, wh_message_status, wh_chat_presence.
Toggles de ignorar (mesmo nome com prefixo ignore_) e filtros de recebimento Chamadas: reject_calls (rejeita ligações automaticamente) e reject_call_message (aviso enviado a quem liga). (f_ignore_groups, f_ignore_private, f_ignore_text, f_ignore_image, f_ignore_video, f_ignore_audio, f_ignore_document).
UniZap API · UniController Sistemas — powered by Blumenau/SC 🇧🇷