APIs de WhatsApp cobram caro: dezenas a centenas de reais por mês, com limites de uso e taxas por conversa. O ZapUnlocked-API é uma alternativa gratuita e open-source.
Construída em Python com Neonize como motor de conexão, a API usa FastAPI para gerenciar sessões, enviar mídia e criar bots. Sem banco de dados pesado, sem mensalidade, sem servidor de terceiros.
Tip
Use para bots, notificações e sistemas de atendimento. 100% gratuito.
Important
🤖 Meta AI integrado. Use /ai/ask para conversar e /ai/imagine para gerar imagens dentro do WhatsApp. Ver rota.
mindmap
root((⚡💬 ZapUnlocked-API))
📨 Mensagens
Texto
Mídia
Reações
Localização
Contatos
Links
Editar
Deletar
Ler
🔘 Interativas
Botões
Listas
OTP
PIX
Enquetes
🔍 Consultas
Contatos
Histórico
Chats
Memória
Disco
Database
Cleanup
🔗 Conexão
Status
SSE
QR Code
PNG
Pairing
Logout
📡 Webhooks
Criar
Listar
Editar
Deletar
Ativar
Testar
40 Eventos
⚙️ Perfil
Nome
Foto
Privacidade
Visto
Bloqueios
🤖 Meta AI
Chat
Imagens
🤖 Bot
Auto Read
Rejeitar Calls
🛡️ IP Rules
Whitelist
Blacklist
📱 Instância
Conta
Dispositivo
Renomear
🖥️ Sistema
Env Vars
Media Cleanup
Auto Cleanup
| Funcionalidade | Descrição |
|---|---|
| 🤖 Meta AI Integrado | Converse e gere imagens com IA dentro do WhatsApp. |
| ⌨️ Recursos Universais | delay_message, delay_typing, reply/quoted_id e @menções funcionam em todos os endpoints de envio. |
| 🧩 Botões Stateless | Fluxos interativos sem banco de dados, com webhooks criptografados. |
| 🔢 Pareamento sem QR Code | Conecte via código numérico. Ideal para servidores sem GUI. |
| 🎵 Conversão Automática de Áudio | Envie áudios que aparecem como gravados na hora (PTT). |
| 📦 Fila de Mídias Inteligente | Gerencia memória automaticamente para evitar estouro. |
| 🏷️ Placeholders Dinâmicos | Personalize mensagens e webhooks com {{name}}, {{day}}, {{phone}}. |
| 🔐 Webhooks Assinados | Integridade via HMAC-SHA256. Seu webhook só aceita dados legítimos. |
| 🔄 Reconexão Automática | Reconecta sozinho em queda, logout remoto ou erro de stream. |
| 📁 File Upload + URL | Envie mídia por upload direto ou URL pública. |
Note
Todas as funcionalidades são 100% gratuitas e mantidas pela comunidade open-source.
📨 Envio de Mensagens · 15 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/send |
Enviar mensagem de texto / responder | phone, message |
POST |
/send_image |
Enviar imagem | phone, image_url |
POST |
/send_video |
Enviar vídeo (suporta GIF e PTV) | phone, video_url |
POST |
/send_gif |
Enviar GIF animado | phone, url |
POST |
/send_audio |
Enviar áudio (com conversão automática para PTT) | phone, audio_url |
POST |
/send_document |
Enviar documento | phone, document_url |
POST |
/send_sticker |
Enviar figurinha | phone, sticker_url |
POST |
/send_reaction |
Enviar reação com emoji | phone, messageId, emoji |
POST |
/send_location |
Enviar localização | phone, lat, lng |
POST |
/send_contact |
Enviar contato | phone, name, contactPhone |
POST |
/send_contacts |
Enviar múltiplos contatos | phone, contacts |
POST |
/send_link |
Enviar link com preview | phone, url |
POST |
/messages/delete |
Deletar mensagem | phone, messageId |
POST |
/messages/read |
Marcar como lida | phone, messageIds |
POST |
/messages/edit |
Editar mensagem enviada | phone, messageId, message |
Tip
Parâmetros universais. Disponíveis em todo endpoint de envio de mensagem (inclusive interativas):
| Parâmetro | O que faz |
|---|---|
delay_message |
Aguarda N segundos antes de enviar. Ex: "5.0" |
delay_typing |
Mostra "digitando..." por N segundos antes de enviar. |
reply / quoted_id |
ID da mensagem a ser respondida (citação). |
mentioned |
JSON array de números para @mencionar. Ex: '["5511999999999"]' |
🔘 Mensagens Interativas · 9 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/messages/send-button-list |
Botão de lista de opções | phone, buttons |
POST |
/messages/send-button-quick-reply |
Botão de resposta rápida | phone, title, buttons |
POST |
/messages/send-button-otp |
Botão de cópia (OTP) | phone, code |
POST |
/messages/send-button-pix |
Botão de PIX | phone, pixKey |
POST |
/messages/send-button-url |
Botão com link | phone, title, url |
POST |
/messages/send-button-call |
Botão de chamada | phone, title, phoneNumber |
POST |
/messages/send-option-list |
⛔ Temporariamente desabilitada (incompatível com iPhone, Android e Web) | phone, buttons |
POST |
/messages/send-poll |
Enviar enquete | phone, name, options |
POST |
/messages/send-poll-vote |
Votar em enquete | phone, options |
🔍 Consultas e Gestão · 12 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/management/fetch_messages |
Buscar histórico de mensagens | phone |
POST |
/management/recent_contacts |
Listar chats recentes | ❌ |
GET |
/management/chats |
Listar chats com histórico | ❌ |
GET |
/management/chats/{phone}/messages |
Mensagens de um chat específico | ❌ |
GET |
/management/contacts/{phone} |
Info detalhada do contato | ❌ |
GET |
/management/groups |
Listar grupos | ❌ |
DELETE |
/management/cleanup |
Limpar dados de chat | ❌ |
GET |
/management/export |
Exportar config (webhooks, settings, IP rules) | ❌ |
POST |
/management/import |
Importar config via file upload | file |
GET |
/management/database/status |
Status e estatísticas do banco | ❌ |
POST |
/management/database/config |
Atualizar configurações do banco | interval |
POST |
/management/database/cleanup |
Limpeza manual do banco | ❌ |
👤 Contatos · 1 endpoint
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/contacts/info |
Informações detalhadas do contato | phone |
🏠 Geral / Status · 9 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/ |
Página de boas-vindas (HTML) | ❌ |
GET |
/status |
Status completo (WhatsApp, CPU, memória, disco) | ❌ |
GET |
/status/stream |
Status em tempo real via SSE | ❌ |
GET |
/status/health |
Health check simples ({"ok":true}) |
❌ |
GET |
/status/readiness |
Readiness check (503 se WhatsApp desconectado) | ❌ |
GET |
/status/memory |
Status de memória (processo + sistema) | ❌ |
GET |
/status/volume |
Status de disco (tamanho, arquivos) | ❌ |
GET |
/collection.json |
Download da Collection Postman | ❌ |
POST |
/collection.json |
Atualizar Collection Postman | JSON body |
🔗 Conexão (QR) · 2 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/qr |
Visualizar QR Code interativo (HTML) | ❌ |
GET |
/qr/image |
Obter imagem do QR Code (PNG) | ❌ |
🔐 Sessão · 2 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/session/pair |
Gerar código de pareamento numérico | phone |
POST |
/session/logout |
Desconectar e resetar sessão | ❌ |
📡 Webhooks (CRUD) · 8 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/webhooks |
Criar webhook nomeado | name, url |
GET |
/webhooks |
Listar todos os webhooks | ❌ |
GET |
/webhooks/{name} |
Obter webhook por nome | ❌ |
PUT |
/webhooks/{name} |
Editar webhook | ❌ |
DELETE |
/webhooks/{name} |
Remover webhook | ❌ |
POST |
/webhooks/{name}/toggle |
Ativar / desativar | active |
POST |
/webhooks/{name}/test |
Testar webhook | ❌ |
GET |
/webhooks/events |
Listar tipos de eventos (40 tipos) | ❌ |
⚙️ Perfil e Privacidade · 13 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/settings/profile |
Alterar nome e foto do bot | name?, photo? (Form) |
POST |
/settings/block |
Bloquear / desbloquear contato | phone, action |
PUT |
/settings/privacy/last-seen |
Última vez visto | value |
PUT |
/settings/privacy/online |
Status online | value |
PUT |
/settings/privacy/profile |
Visibilidade da foto | value |
PUT |
/settings/privacy/status |
Visibilidade do status | value |
PUT |
/settings/privacy/read-receipts |
Confirmação de leitura | value |
PUT |
/settings/privacy/groups-add |
Quem pode adicionar a grupos | value |
PUT |
/settings/privacy/call-add |
Quem pode adicionar em chamada | value |
PUT |
/settings/privacy/about |
About/recado | value? |
PUT |
/settings/privacy/disappearing-timer |
Timer de mensagens temporárias | value? |
GET |
/settings/ip-control |
Ver status do IP control | ❌ |
PUT |
/settings/ip-control |
Ativar/desativar IP control | enabled |
🤖 Configurações do Bot · 4 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
PUT |
/settings/instance/call-reject-auto |
Rejeitar chamadas automaticamente | value |
PUT |
/settings/instance/call-reject-message |
Mensagem de chamada rejeitada | value |
PUT |
/settings/instance/auto-read-message |
Leitura automática de mensagens | value |
GET |
/settings/phone-code/{phone} |
Gerar código de pareamento por número | ❌ |
📱 Instância · 3 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/instance/me |
Dados da conta conectada | ❌ |
GET |
/instance/device |
Dados técnicos do dispositivo | ❌ |
PUT |
/instance/update-name |
Renomear instância | name |
🛡️ Regras de IP · 5 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/settings/ip-rules |
Listar regras de IP (whitelist/blacklist) | ❌ |
POST |
/settings/ip-rules/whitelist |
Adicionar IP à whitelist | ip |
POST |
/settings/ip-rules/blacklist |
Adicionar IP à blacklist | ip |
DELETE |
/settings/ip-rules/whitelist/{ip} |
Remover IP da whitelist | ❌ |
DELETE |
/settings/ip-rules/blacklist/{ip} |
Remover IP da blacklist | ❌ |
🖥️ Sistema · 5 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/system/env |
Ver variáveis de ambiente | ❌ |
PUT |
/system/env |
Atualizar variáveis de ambiente | ❌ |
POST |
/system/cleanup/force |
Limpeza forçada de mídia temporária | ❌ |
GET |
/system/cleanup/settings |
Ver configurações de limpeza automática | ❌ |
PUT |
/system/cleanup/settings |
Atualizar intervalo de limpeza automática | ❌ |
📊 Logs · 3 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/logs/files |
Listar arquivos de log | ❌ |
GET |
/logs |
Visualizar logs com filtros | ❌ |
POST |
/logs/cleanup |
Forçar compressão/limpeza de logs | ❌ |
📈 Stats · 6 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/stats |
Estatísticas (uptime, mensagens, webhooks) | ❌ |
DELETE |
/stats |
Resetar estatísticas | ❌ |
GET |
/stats/webhooks |
Stats de todos os webhooks | ❌ |
GET |
/stats/webhooks/{name} |
Stats de um webhook específico | ❌ |
DELETE |
/stats/webhooks |
Resetar stats de todos webhooks | ❌ |
DELETE |
/stats/webhooks/{name} |
Resetar stats de um webhook | ❌ |
🤖 Meta AI · 2 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
POST |
/ai/ask |
Perguntar ao Meta AI | message |
POST |
/ai/imagine |
Gerar imagem com Meta AI | prompt |
🔐 Multi-Session · 7 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/sessions |
Listar todas as sessões | ❌ |
POST |
/sessions |
Criar nova sessão | name? |
PUT |
/sessions/{id}/rename |
Renomear sessão | name |
DELETE |
/sessions/{id} |
Desativar sessão | ❌ |
POST |
/sessions/{id}/connect |
Conectar sessão | ❌ |
POST |
/sessions/{id}/disconnect |
Desconectar sessão | ❌ |
GET |
/sessions/{id}/status |
Status da sessão | ❌ |
📡 Webhooks (Logs) · 3 endpoints
| Método | Rota | Descrição | Body |
|---|---|---|---|
GET |
/webhooks/{name}/logs |
Logs de entrega do webhook | ❌ |
DELETE |
/webhooks/{name}/logs |
Limpar logs do webhook | ❌ |
DELETE |
/webhooks/logs/all |
Limpar logs de todos webhooks | ❌ |
Total: 108 endpoints
Todos os webhooks recebem um envelope padrão:
{
"event": "message.text",
"timestamp": "2025-01-01T12:00:00Z",
"data": { ... }
}Se o webhook tiver um body customizado com {{placeholders}}, esse body é enviado em vez do envelope padrão.
🏷️ Placeholders disponíveis no body customizado
| Placeholder | Valor |
|---|---|
{{from}} |
Número do remetente |
{{text}} |
Texto da mensagem |
{{phone}} |
Mesmo que {{from}} |
{{id}} |
ID da mensagem |
{{requested}} |
Quantidade solicitada (fetchMessages) |
{{found}} |
Quantidade encontrada (fetchMessages) |
{{timestamp}} |
Timestamp UTC atual |
📥 Mensagens Recebidas · 18 eventos
Media fields: Eventos de mídia (
message.image,message.video,message.audio,message.document,message.sticker) incluem campos extras quandoRECEIVE_MEDIA_ENABLED=true:mediaBase64(base64 do arquivo),fileName,mimeType,mediaTooLarge(bool, true se excedeRECEIVE_MEDIA_MAX_SIZE_MB).
Campos base presentes em eventos de mensagem recebida:
{
"messageId": "3EB0ABCDEF123456",
"from": "5511999999999",
"fromName": "João Silva",
"fromJid": "5511999999999@s.whatsapp.net",
"isGroup": false
}message.text - Texto simples / formatado
{
"event": "message.text",
"data": {
"...base": "...",
"text": "Olá! Como posso ajudar?",
"quoted": { "id": "3EB0...", "fromMe": true }
}
}message.image - Imagem recebida
{
"event": "message.image",
"data": {
"...base": "...",
"caption": "Foto do produto",
"mimetype": "image/jpeg",
"fileLength": 204800
}
}message.video - Vídeo recebido
{
"event": "message.video",
"data": {
"...base": "...",
"caption": "Veja esse vídeo!",
"mimetype": "video/mp4",
"fileLength": 5242880,
"isPTT": false,
"isGif": false
}
}message.audio - Áudio / nota de voz
{
"event": "message.audio",
"data": {
"...base": "...",
"mimetype": "audio/ogg; codecs=opus",
"fileLength": 30720,
"isPTT": true,
"durationSeconds": 8
}
}message.document - Documento / arquivo
{
"event": "message.document",
"data": {
"...base": "...",
"fileName": "contrato.pdf",
"caption": "Segue o contrato",
"mimetype": "application/pdf",
"fileLength": 102400
}
}message.sticker - Figurinha
{
"event": "message.sticker",
"data": {
"...base": "...",
"mimetype": "image/webp",
"isAnimated": false
}
}message.contact - Contato compartilhado
{
"event": "message.contact",
"data": {
"...base": "...",
"displayName": "Maria Souza",
"vcard": "BEGIN:VCARD\nVERSION:3.0\n..."
}
}message.contacts - Múltiplos contatos
{
"event": "message.contacts",
"data": {
"...base": "...",
"displayName": "2 contacts",
"count": 2,
"contacts": [
{ "displayName": "Maria Souza", "vcard": "BEGIN:VCARD\n..." },
{ "displayName": "João Silva", "vcard": "BEGIN:VCARD\n..." }
]
}
}message.location - Localização
{
"event": "message.location",
"data": {
"...base": "...",
"lat": -23.5505,
"lng": -46.6333,
"name": "Av. Paulista",
"address": "Av. Paulista, 1000 - São Paulo"
}
}message.reaction - Reação (emoji)
{
"event": "message.reaction",
"data": {
"...base": "...",
"emoji": "❤️",
"targetMessageId": "3EB0ABCDEF123456",
"isRemoved": false
}
}message.poll_created - Enquete recebida
{
"event": "message.poll_created",
"data": {
"...base": "...",
"pollName": "Qual o melhor sabor?",
"options": ["Chocolate", "Morango", "Baunilha"]
}
}message.poll_vote - Voto em enquete
{
"event": "message.poll_vote",
"data": {
"...base": "...",
"pollId": "3EB0ABCDEF123456",
"selectedOptions": ["Chocolate"]
}
}message.button_reply - Clique em botão
{
"event": "message.button_reply",
"data": {
"...base": "...",
"buttonId": "opcao_sim",
"displayText": "Sim",
"type": "quick_reply"
}
}message.list_reply - Seleção em lista interativa
{
"event": "message.list_reply",
"data": {
"...base": "...",
"rowId": "1",
"title": "X-Burguer",
"description": "R$ 18,90"
}
}message.deleted - Mensagem apagada pelo remetente
{
"event": "message.deleted",
"data": {
"...base": "..."
}
}message.unknown - Tipo não mapeado
{
"event": "message.unknown",
"data": {
"...base": "...",
"rawType": "senderKeyDistributionMessage"
}
}message.undecryptable - Mensagem não descriptografável
{
"event": "message.undecryptable",
"data": {
"...base": "..."
}
}📤 Mensagens Enviadas · 22 eventos
message.sent - Mensagem enviada (genérico)
{
"event": "message.sent",
"data": {
"to": "5511999999999",
"type": "text",
"messageId": "3EB0ABCDEF123456"
}
}message.sent.{type} - Evento específico por tipo
Mesmo payload do message.sent, com evento específico por tipo.
Tipos: text, image, audio, video, document, sticker, gif, interactive, list, poll, poll_vote, location, contact, contacts, link, reaction, edit, delete
{
"event": "message.sent.image",
"data": {
"to": "5511999999999",
"type": "image",
"messageId": "3EB0ABCDEF123456"
}
}message.delivered - Mensagem entregue ao destinatário (receipt type 1)
{
"event": "message.delivered",
"data": {
"from": "5511999999999",
"messageId": "3EB0ABCDEF123456"
}
}message.read - Mensagem lida pelo destinatário (receipt type 4)
{
"event": "message.read",
"data": {
"from": "5511999999999",
"messageId": "3EB0ABCDEF123456"
}
}message.receipt - Outros tipos de confirmação (receipt types 2, 3, 5+)
{
"event": "message.receipt",
"data": {
"from": "5511999999999",
"messageId": "3EB0ABCDEF123456",
"receiptType": 2
}
}🔗 Conexão · 11 eventos
connection.connected - WhatsApp conectado
{
"event": "connection.connected",
"data": {
"phone": "5511999999999"
}
}connection.disconnected - WhatsApp desconectado
{
"event": "connection.disconnected",
"data": {}
}connection.qr_ready - QR Code gerado
{
"event": "connection.qr_ready",
"data": {
"qr": "2@abc123..."
}
}connection.pair_code - Código de pareamento gerado
{
"event": "connection.pair_code",
"data": {
"code": "ABCD-1234",
"connected": false
}
}connected: true quando o pareamento for concluído.
connection.pair_status - Status do pareamento
{
"event": "connection.pair_status",
"data": {
"jid": "5511999999999@s.whatsapp.net",
"businessName": "My Business",
"platform": "WEB",
"status": "OK",
"error": ""
}
}connection.logged_out - Sessão encerrada remotamente
{
"event": "connection.logged_out",
"data": {
"reason": "User logout"
}
}connection.connect_failure - Falha na conexão
{
"event": "connection.connect_failure",
"data": {
"reason": "ERROR_CONNECT",
"message": "Connection timed out"
}
}connection.stream_error - Erro no stream
{
"event": "connection.stream_error",
"data": {
"code": "STREAM_ERR"
}
}connection.temporary_ban - Ban temporário
{
"event": "connection.temporary_ban",
"data": {
"code": "BAN_CODE",
"expire": 1704153600
}
}connection.client_outdated - Cliente desatualizado
{
"event": "connection.client_outdated",
"data": {}
}connection.stream_replaced - Stream substituído
{
"event": "connection.stream_replaced",
"data": {}
}👥 Grupo · 2 eventos
group.join - Bot entrou no grupo
{
"event": "group.join",
"data": {
"groupId": "123456789@g.us",
"groupName": "My Group",
"reason": "invite",
"type": ""
}
}group.update - Grupo atualizado
{
"event": "group.update",
"data": {
"groupId": "123456789@g.us",
"sender": "5511999999999@s.whatsapp.net",
"name": "New Group Name",
"topic": "New description",
"locked": false,
"announce": false,
"ephemeral": 604800,
"delete": false,
"link": null,
"unlink": null,
"newInviteLink": "https://chat.whatsapp.com/abc123"
}
}👤 Contato / Presença · 4 eventos
contact.presence - Status de presença do contato
{
"event": "contact.presence",
"data": {
"from": "5511999999999",
"fromJid": "5511999999999@s.whatsapp.net",
"status": "online",
"lastSeen": 0
}
}status: "online" ou "offline".
contact.chat_presence - Status de digitação
{
"event": "contact.chat_presence",
"data": {
"from": "5511999999999",
"fromJid": "5511999999999@s.whatsapp.net",
"state": "typing",
"media": null
}
}state: "typing", "recording" ou "paused".
contact.picture_change - Foto de perfil alterada
{
"event": "contact.picture_change",
"data": {
"from": "5511999999999",
"fromJid": "5511999999999@s.whatsapp.net",
"author": "5511999999999@s.whatsapp.net",
"action": "changed"
}
}action: "changed" ou "removed".
contact.identity_change - Chave de segurança alterada
{
"event": "contact.identity_change",
"data": {
"from": "5511999999999",
"fromJid": "5511999999999@s.whatsapp.net",
"implicit": false,
"timestamp": 1704067200
}
}📞 Chamada · 3 eventos
call.received - Chamada recebida
{
"event": "call.received",
"data": {
"from": "5511999999999",
"fromJid": "5511999999999@s.whatsapp.net",
"callId": "ABC123DEF456"
}
}call.accepted - Chamada aceita
{
"event": "call.accepted",
"data": {
"from": "5511999999999",
"callId": "ABC123DEF456"
}
}call.terminated - Chamada encerrada
{
"event": "call.terminated",
"data": {
"from": "5511999999999",
"callId": "ABC123DEF456",
"reason": "timeout"
}
}🧹 Media Cleanup · 1 evento
media.cleanup.completed - Limpeza automática de mídia executada
{
"event": "media.cleanup.completed",
"data": {
"filesRemoved": 12,
"remainingBytes": 52428800
}
}Executado a cada hora automaticamente. filesRemoved: 0 quando nada foi removido.
🤖 AI · 1 evento
ai.response - Resposta do Meta AI recebida
{
"event": "ai.response",
"data": {
"text": "Brasília!",
"hasImage": false,
"imageBase64": null,
"imageUrl": null,
"mimeType": null,
"messageId": "3EB0ABCDEF123456"
}
}Disparado quando o Meta AI responde. Use para capturar respostas assíncronas (o POST /ai/ask tem timeout de 30s).
API de WhatsApp no ar em menos de 5 minutos.
Ideal para desenvolvimento, testes ou rodar em servidor próprio.
flowchart LR
A[Clone] --> B[Install]
B --> C[Config .env]
C --> D[Run 🚀]
D --> E[Config Account 🔗]
E --> F[Production! ⚡]
1. Clone o Repositório
git clone https://github.com/kauafpssx/ZapUnlocked-API.git
cd ZapUnlocked-API2. Instale as Dependências
| Sistema | Comando |
|---|---|
| 🪟 Windows | scripts\install\install.bat |
| 🐧 Linux / macOS | bash scripts/install/install.sh |
3. Configure o Ambiente
| Sistema | Comando |
|---|---|
| 🪟 Windows | scripts\generate-env\generate-env.bat |
| 🐧 Linux / macOS | bash scripts/generate-env/generate-env.sh |
| Variável | Descrição |
|---|---|
API_KEY |
Senha para autenticação em todos os endpoints |
INTERNAL_SECRET |
Token para validar assinaturas de webhook |
PORT |
Porta da API (padrão: 8300) |
4. Execute a API
| Sistema | Comando |
|---|---|
| 🪟 Windows | scripts\run\run.bat |
| 🐧 Linux / macOS | bash scripts/run/run.sh |
Hospedagem gratuita na Alwaysdata. A API fica no ar 24/7 sem manter um servidor ligado.
📊 Ver Recursos e Passo a Passo
| Recurso | Disponível no Free |
|---|---|
| 💾 Armazenamento | 1 GB SSD |
| 🧠 RAM | 256 MB |
| ⚡ CPU | 1/4 vCPU |
| 🔄 Backup | 3 dias automático |
| 📡 Uptime | 24/7 via Services |
1. Crie sua conta em Alwaysdata.com · plano Free.
2. Acesse o SSH em https://ssh-[usuario].alwaysdata.net.
3. Clone e instale:
git clone https://github.com/kauafpssx/ZapUnlocked-API.git ~/ZapUnlocked-API
cd ~/ZapUnlocked-API
bash scripts/install/install.sh4. (Opcional) Gere o .env:
bash scripts/generate-env/generate-env.sh[!NOTE] O script de instalação já pergunta se quer configurar o
.env. Se respondeu sim, pule este passo.
5. Configure o Serviço (24/7) em Advanced › Services › Add a service:
| Campo | Valor |
|---|---|
| Command | bash scripts/run/run.sh |
| Working directory | ZapUnlocked-API |
| Environment variables | PORT=8300 |
6. Acesse via:
http://services-[usuario].alwaysdata.net:8300/
[!TIP] A URL já é acessível externamente. (Opcional) Para usar um domínio personalizado, configure um Reverse Proxy em Web › Sites › Add a site apontando para
http://[usuario].alwaysdata.net.
Após o deploy, conecte sua conta do WhatsApp acessando no navegador:
http://services-[usuario].alwaysdata.net:8300/qr?API_KEY=SUA_SENHA_SECRETA
📌 Outras Informações · Variáveis de ambiente, timezone, parâmetros de envio, bulk, receptor de mídia
Variáveis extras do .env além de API_KEY, INTERNAL_SECRET e PORT:
| Variável | Padrão | Descrição |
|---|---|---|
PUBLIC_URL |
auto | URL pública para link do dashboard /qr nos logs |
TZ |
UTC |
Fuso horário para timestamps (ex: America/Sao_Paulo) |
DRY_RUN |
false |
Modo teste, intercepta envios sem chamar WhatsApp |
RECEIVE_MEDIA_ENABLED |
false |
Baixa mídia recebida para temp_media/ |
RECEIVE_MEDIA_MAX_SIZE_MB |
15 |
Tamanho máximo de mídia recebida (MB) |
CORS_ORIGINS |
* |
Origens permitidas (separadas por vírgula) |
ENABLE_WHATSAPP |
1 |
Desliga o bot do WhatsApp (0 para testes) |
ENABLE_FFMPEG_WARMUP |
1 |
Desliga o aquecimento do FFmpeg (0) |
MAX_UPLOAD_SIZE_MB |
500 |
Tamanho máximo de upload por arquivo |
CLEANUP_MAX_AGE_DAYS |
7 |
Idade máxima de arquivos em temp_media/ |
CLEANUP_MAX_SIZE_MB |
500 |
Tamanho máximo total de temp_media/ |
LOG_MAX_AGE_DAYS |
30 |
Idade máxima de logs compactados |
LOG_MAX_SIZE_MB |
50 |
Tamanho máximo total de logs |
META_AI_PHONE |
auto | Sobrescreve o número do Meta AI |
META_AI_TIMEOUT |
30 |
Timeout de resposta do Meta AI (segundos) |
META_AI_KEEP_IMAGES |
false |
Salva imagens do Meta AI em disco |
ALWAYSDATA_ACCOUNT |
auto | Força ambiente Alwaysdata |
Todo endpoint de envio retorna timestamp no ISO 8601 com offset. Configuração por ordem de prioridade:
timezone.confna raiz do projeto (primeira linha não-comentada)TZno.envou environment- Padrão:
UTC
Valores comuns: America/Sao_Paulo, America/New_York, Europe/London, Asia/Tokyo.
{
"success": true,
"message": "Message sent.",
"messageId": "3EB0ABCDEF123456",
"timestamp": "2026-06-15T14:30:00-0300"
}Placeholders substituídos no momento do envio:
| Placeholder | Substituído por |
|---|---|
{{day}} |
Dia atual (01-31) |
{{mon}} |
Mês atual (01-12) |
{{yea}} |
Ano atual (2026) |
{{hou}} |
Hora atual (00-23) |
{{min}} |
Minuto atual (00-59) |
{{sec}} |
Segundo atual (00-59) |
{
"phone": "5511999999999",
"message": "Hoje é dia {{day}}/{{mon}}/{{yea}} e agora são {{hou}}:{{min}}:{{sec}}"
}Resultado: "Hoje é dia 15/06/2026 e agora são 14:30:00"
DRY_RUN=true no .env faz todos os endpoints de envio retornarem sucesso sem chamar o WhatsApp. Resposta inclui "dryRun": true, "messageId": null.
Usos: testar integração, CI/CD, validar payloads.
{
"success": true,
"dryRun": true,
"message": "Message sent.",
"messageId": null,
"timestamp": "2026-06-15T14:30:00-0300"
}Disponíveis em todos os endpoints /send/*, /send/media, /send/buttons/*:
| Parâmetro | Tipo | Descrição |
|---|---|---|
quoted_id |
string |
ID da mensagem para responder |
delay_message |
number |
Delay em segundos antes de enviar |
delay_typing |
number |
Simula digitação por X segundos |
mentioned |
string[] |
Números para marcar (@mention) |
{
"phone": "5511999999999",
"message": "Olá @5511888888888, tudo bem?",
"quoted_id": "3EB0ABC123",
"delay_message": 2,
"delay_typing": 3,
"mentioned": ["5511888888888"]
}[!NOTE]
quoted_idaceita ID da mensagem (type: "id") ou texto para busca (type: "text"). Se o ID não existir no histórico local, a API cria um placeholder e o WhatsApp renderiza a citação mesmo assim.
POST /send/bulk envia a mesma mensagem para vários números:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phones |
string[] |
✅ | Array de números |
message |
string |
✅ | Texto da mensagem |
delay_message |
number |
❌ | Delay antes de cada envio |
delay_typing |
number |
❌ | Simular digitação |
delay_between |
number |
❌ | Delay entre um número e outro |
mentioned |
string[] |
❌ | Menções |
{
"phones": ["5511999999999", "5511888888888", "5511777777777"],
"message": "Promoção relâmpago! 🔥",
"delay_between": 3,
"delay_typing": 2
}Com RECEIVE_MEDIA_ENABLED=true, a API baixa mídia recebida (imagem, vídeo, áudio, documento, sticker) e adiciona mediaUrl no webhook:
{
"event": "message.upsert",
"data": {
"key": { "remoteJid": "5511999999999@s.whatsapp.net" },
"message": { "imageMessage": {} },
"mediaUrl": "http://services-usuario.alwaysdata.net:8300/media/uuid-arquivo.jpg"
}
}Arquivos ficam em temp_media/ e são limpos pelo scheduler automático.
A limpeza de temp_media/ roda a cada hora. Dispara quando qualquer critério é atingido:
- Arquivos mais velhos que
CLEANUP_MAX_AGE_DAYS(padrão: 7 dias) - Tamanho total excede
CLEANUP_MAX_SIZE_MB(padrão: 500 MB)
Dispara o webhook media.cleanup.completed com filesRemoved e remainingBytes.
👉 zapunlocked-api.kauafpss.com.br
Documentação técnica, exemplos de código e playground interativo no site oficial.
Tip
Índice para IA: zapunlocked-api.kauafpss.com.br/llms.txt.
Este projeto é licenciado sob a Licença MIT.
Feito com 💜 por Kauã Ferreira

