O KiraGo é uma implementação da biblioteca whatsmeow como um serviço de API REST simples, com suporte a múltiplos dispositivos e sessões simultâneas.
A biblioteca whatsmeow não usa Puppeteer no Chrome headless e nem emulador Android. Ela se comunica diretamente com os servidores websocket do WhatsApp, sendo bem rápida e usando menos memória e CPU do que outras soluções. A desvantagem é que mudanças no protocolo do WhatsApp podem quebrar conexões e exigir atualização da biblioteca.
Autenticação
O KiraGo oferece dois métodos de autenticação:
- Para usuários comuns: use o header
token, que será comparado com a tabelausersno banco de dados. - Para administradores: use o header
Authorizationcom o token administrativo para acessar rotas protegidas de administração.
Exemplo de requisição com token de usuário:
curl -X POST https://seu-dominio.com/webhook \
-H "token: seu_token_aqui" \
-H "Content-Type: application/json" \
-d '{
"webhook": "https://seu-webhook.com/callback",
"events": ["Message", "ReadReceipt"]
}'
Primeiros passos
Para começar a usar a API do KiraGo, siga estes passos:
-
Criar um usuário:
Você precisa criar um usuário no banco de dados. O administrador pode criar um novo usuário pela rota
/admin/users. -
Conectar ao WhatsApp:
Use o endpoint
/session/connectpara iniciar a conexão com os servidores do WhatsApp. -
Escanear o QR code:
Obtenha o QR code pelo endpoint
/session/qre escaneie com o app do WhatsApp. -
Configurar seu webhook:
Use o endpoint
/webhookpara configurar a URL do webhook e os tipos de eventos que você quer receber. -
Enviar mensagens:
Agora você já pode enviar mensagens usando os endpoints disponíveis em
/chat/send/*.
Sessão
Endpoints para gerenciar a conexão com os servidores do WhatsApp.
POST /session/connect
Conecta aos servidores do WhatsApp. Se não houver sessão anterior, será necessário escanear um QR code.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| Subscribe | Array[string] | Lista de tipos de evento para assinar. Valores possíveis: "Message", "ReadReceipt", "Presence", "HistorySync", "ChatPresence", "All" |
| Immediate | boolean | Se true, retorna imediatamente sem aguardar a confirmação da conexão |
Exemplo de requisição:
{
"Subscribe": ["Message", "ReadReceipt"],
"Immediate": true
}
Resposta:
{
"code": 200,
"data": {
"details": "Connected!",
"events": "Message,ReadReceipt",
"jid": "5491155555555.0:53@s.whatsapp.net",
"webhook": "https://some.site/webhook?request=parameter"
},
"success": true
}
POST /session/disconnect
Desconecta dos servidores do WhatsApp sem encerrar a sessão.
Resposta:
{
"code": 200,
"data": {
"Details": "Disconnected"
},
"success": true
}
POST /session/logout
Encerra a conexão e termina a sessão, exigindo novo scan do QR na próxima conexão.
Resposta:
{
"code": 200,
"data": {
"Details": "Logged out"
},
"success": true
}
GET /session/status
Obtém o status atual da conexão e da sessão.
Resposta:
{
"code": 200,
"data": {
"Connected": true,
"LoggedIn": true
},
"success": true
}
GET /session/qr
Obtém o QR code para escanear no app do WhatsApp.
Resposta:
{
"code": 200,
"data": {
"QRCode": "data:image/png;base64,iVBORw0KGgoA..."
},
"success": true
}
Webhook
Endpoints para configurar webhooks que receberão notificações de eventos.
GET /webhook
Obtém o webhook configurado e os eventos assinados.
Resposta:
{
"code": 200,
"data": {
"subscribe": ["Message", "ReadReceipt"],
"webhook": "https://example.net/webhook"
},
"success": true
}
POST /webhook
Configura um webhook para receber eventos.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| webhook | string | URL do webhook que receberá as chamadas |
| events | Array[string] | Lista de tipos de evento para assinar. Veja a seção "Tipos de eventos disponíveis" abaixo para a lista completa. |
| active | boolean | Define se o webhook está ativo ou não. Padrão: true |
Exemplo de requisição:
{
"webhook": "https://example.net/webhook",
"events": ["Message", "ReadReceipt"]
}
Resposta:
{
"code": 200,
"data": {
"webhook": "https://example.net/webhook",
"events": ["Message", "ReadReceipt"]
},
"success": true
}
PUT /webhook
Atualiza a configuração do webhook. Dá para atualizar apenas a URL, apenas os eventos, ou ambos.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| webhook | string | Nova URL do webhook (opcional se for atualizar apenas eventos) |
| events | Array[string] | Nova lista de eventos (opcional se for atualizar apenas a URL) |
| active | boolean | Ativar ou desativar o webhook |
Exemplos de requisição:
// Atualizar apenas eventos
{
"events": ["Message", "Receipt", "GroupInfo"],
"active": true
}
// Atualizar apenas URL
{
"webhook": "https://novo-endpoint.com/webhook",
"active": true
}
// Desativar webhook
{
"active": false
}
DELETE /webhook
Remove o webhook e limpa a configuração de eventos.
Resposta:
{
"code": 200,
"data": {
"message": "Webhook removed successfully"
},
"success": true
}
Tipos de eventos disponíveis
Abaixo está a lista completa de eventos que você pode assinar:
Mensagens e comunicação
Message- Mensagem recebida ou enviadaUndecryptableMessage- Mensagem que não pôde ser descriptografadaReceipt- Confirmação de entrega/leituraMediaRetry- Tentativa de reenvio de mídia
Grupos e contatos
GroupInfo- Informações do grupo atualizadasJoinedGroup- Entrou em um grupoPicture- Foto de perfil atualizadaBlocklistChange- Alteração na lista de bloqueioBlocklist- Lista de bloqueio
Conexão e sessão
Connected- Conectado ao WhatsAppDisconnected- Desconectado do WhatsAppConnectFailure- Falha na conexãoKeepAliveRestored- Conexão restauradaKeepAliveTimeout- Timeout de conexãoLoggedOut- Sessão encerradaClientOutdated- Cliente desatualizadoTemporaryBan- Banimento temporárioStreamError- Erro de streamStreamReplaced- Stream substituídoPairSuccess- Pareamento bem-sucedidoPairError- Erro ao parearQR- QR code geradoQRTimeout- Timeout do QR codeQRScannedWithoutMultidevice- QR escaneado sem multi-dispositivo
Privacidade e configurações
PrivacySettings- Configurações de privacidadePushNameSetting- Nome de exibição alteradoUserAbout- Status/Sobre atualizado
Sincronização e estado
AppState- Estado do aplicativoAppStateSyncComplete- Sincronização concluídaHistorySync- Sincronização de históricoOfflineSyncCompleted- Sincronização offline concluídaOfflineSyncPreview- Prévia da sincronização offline
Chamadas
CallOffer- Oferta de chamadaCallAccept- Chamada aceitaCallTerminate- Chamada encerradaCallOfferNotice- Aviso de oferta de chamadaCallRelayLatency- Latência do relay da chamada
Presença e atividade
Presence- Status de presençaChatPresence- Presença no chat (digitando)
Outros
IdentityChange- Mudança de identidadeCATRefreshError- Erro de atualização do CATNewsletterJoin- Entrou na newsletterNewsletterLeave- Saiu da newsletterNewsletterMuteChange- Alteração de silenciar newsletterNewsletterLiveUpdate- Atualização ao vivo da newsletterFBMessage- Mensagem da ponte do FacebookAll- Receber todos os eventos
Estrutura do webhook
Quando um evento ocorre, o KiraGo envia uma requisição POST para o webhook configurado com os dados do evento. Abaixo estão os formatos dos principais tipos de evento:
Mensagem recebida
{
"event": "Message",
"instance": "5491155553934.0:53@s.whatsapp.net",
"data": {
"id": "3EB0ABCD123456789",
"pushName": "Nome do Contato",
"fromMe": false,
"timestamp": 1647878528,
"chat": "5491199999999@s.whatsapp.net",
"sender": "5491199999999@s.whatsapp.net",
"message": {
"conversation": "Olá, como vai?"
}
}
}
Confirmação de leitura
{
"event": "ReadReceipt",
"instance": "5491155553934.0:53@s.whatsapp.net",
"data": {
"sender": "5491199999999@s.whatsapp.net",
"chat": "5491199999999@s.whatsapp.net",
"ids": ["3EB0ABCD123456789"],
"timestamp": 1647878650
}
}
Presence
{
"event": "Presence",
"instance": "5491155553934.0:53@s.whatsapp.net",
"data": {
"sender": "5491199999999@s.whatsapp.net",
"status": "available",
"timestamp": 1647878750
}
}
Chat
Endpoints para enviar mensagens e gerenciar interações de chat.
POST /chat/send/text
Envia uma mensagem de texto para um contato ou grupo.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| Phone | string | Número do destinatário (com DDI, sem "+" ou outros caracteres especiais) |
| Body | string | Conteúdo da mensagem de texto |
| Id | string | ID customizado da mensagem. Se não informado, um ID aleatório será gerado |
| ContextInfo | object | Informações de contexto para responder a uma mensagem específica |
Exemplo de requisição:
{
"Phone": "5491155553935",
"Body": "Olá, como você está?",
"Id": "ABCDABCD1234",
"ContextInfo": {
"StanzaId": "3EB06F9067F80BAB89FF",
"Participant": "5491155553935@s.whatsapp.net"
}
}
Resposta:
{
"code": 200,
"data": {
"Details": "Sent",
"Id": "ABCDABCD1234",
"Timestamp": "2023-03-24T15:49:08-03:00"
},
"success": true
}
POST /chat/send/image
Envia uma imagem para um contato ou grupo.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| Phone | string | Número do destinatário |
| Image | string | Imagem em base64 (deve começar com "data:image/jpeg;base64," ou "data:image/png;base64,") |
| Caption | string | Legenda opcional para a imagem |
| Id | string | ID customizado da mensagem |
GET /chat/history
Recupera o histórico de mensagens de um chat específico. Retorna em ordem cronológica reversa (mais recentes primeiro).
Parâmetros de Query:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| chat_jid | string | JID (ID do WhatsApp) do chat para recuperar o histórico |
| limit | integer | Número máximo de mensagens para recuperar (padrão: 50; máximo: 1000) |
Exemplo de requisição:
GET /chat/history?chat_jid=5491155553935@s.whatsapp.net&limit=10
Resposta de Sucesso:
{
"code": 200,
"success": true,
"data": [
{
"id": 1,
"user_id": "abc123def456",
"chat_jid": "5491155553935@s.whatsapp.net",
"sender_jid": "5491155554444@s.whatsapp.net",
"message_id": "3EB0C767D26A1B5F7C83",
"timestamp": "2023-12-01T15:30:00Z",
"message_type": "text",
"text_content": "Olá, como você está?",
"media_link": ""
},
{
"id": 2,
"user_id": "abc123def456",
"chat_jid": "5491155553935@s.whatsapp.net",
"sender_jid": "5491155553935@s.whatsapp.net",
"message_id": "4FB1D878E37B2C6G8D94",
"timestamp": "2023-12-01T15:25:00Z",
"message_type": "image",
"text_content": "Veja esta foto!",
"media_link": "https://example.com/media/image123.jpg"
}
]
}
Erros possíveis:
| Código | Descrição |
|---|---|
| 400 | Requisição inválida - parâmetro chat_jid é obrigatório |
| 501 | Não implementado - histórico de mensagens está desativado |
| 500 | Erro interno do servidor |
Usuário
Endpoints para obter informações de usuários e gerenciar presença.
POST /user/check
Verifica se números de telefone têm WhatsApp.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| Phone | Array[string] | Lista de números de telefone para verificar |
Exemplo de requisição:
{
"Phone": ["5491155553934", "5491155553935"]
}
Resposta:
{
"code": 200,
"data": {
"Users": [
{
"IsInWhatsapp": true,
"JID": "5491155553934@s.whatsapp.net",
"Query": "5491155553934",
"VerifiedName": "Company Name"
},
{
"IsInWhatsapp": false,
"JID": "5491155553935@s.whatsapp.net",
"Query": "5491155553935",
"VerifiedName": ""
}
]
},
"success": true
}
Grupo
Endpoints para gerenciar grupos e suas propriedades.
GET /group/list
Lista todos os grupos aos quais a conta está vinculada.
Resposta:
{
"code": 200,
"data": {
"Groups": [
{
"AnnounceVersionID": "1650572126123738",
"DisappearingTimer": 0,
"GroupCreated": "2022-04-21T17:15:26-03:00",
"IsAnnounce": false,
"IsEphemeral": false,
"IsLocked": false,
"JID": "120362023605733675@g.us",
"Name": "Super Group",
"NameSetAt": "2022-04-21T17:15:26-03:00",
"NameSetBy": "5491155554444@s.whatsapp.net",
"OwnerJID": "5491155554444@s.whatsapp.net",
"ParticipantVersionID": "1650234126145738",
"Participants": [
{
"IsAdmin": true,
"IsSuperAdmin": true,
"JID": "5491155554444@s.whatsapp.net"
},
{
"IsAdmin": false,
"IsSuperAdmin": false,
"JID": "5491155553333@s.whatsapp.net"
}
],
"Topic": "",
"TopicID": "",
"TopicSetAt": "0001-01-01T00:00:00Z",
"TopicSetBy": ""
}
]
},
"success": true
}
Admin
Endpoints administrativos para gerenciar usuários e instâncias.
GET /admin/users
Lista todos os usuários cadastrados no sistema.
Cabeçalhos:
| Header | Valor | Descrição |
|---|---|---|
| Authorization | string | Token administrativo para autenticação |
Resposta:
{
"code": 200,
"data": [
{
"id": 1,
"name": "John",
"token": "1234ABCD",
"webhook": "https://example.com/webhook",
"jid": "5491155553934@s.whatsapp.net",
"qrcode": "",
"connected": true,
"expiration": 0,
"events": "Message,ReadReceipt"
}
],
"success": true
}
Armazenamento S3
Configure armazenamento compatível com S3 para guardar arquivos de mídia do WhatsApp. Suporta AWS S3, MinIO, DigitalOcean Spaces e outros provedores compatíveis.
GET /s3/config
Obtém a configuração atual do S3.
Resposta:
{
"code": 200,
"data": {
"endpoint": "https://s3.amazonaws.com",
"bucket": "meu-bucket",
"region": "us-east-1",
"path_prefix": "uploads/whatsapp/",
"force_path_style": false
},
"success": true
}
PUT /s3/config
Configura o armazenamento S3 para esta instância.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| endpoint | string | URL do endpoint S3 (padrão: https://s3.amazonaws.com) |
| access_key | string | Access key do S3 |
| secret_key | string | Secret key do S3 |
| bucket | string | Nome do bucket S3 |
| region | string | Região do S3 (obrigatória para AWS S3) |
| path_prefix | string | Prefixo de caminho para organizar arquivos |
| force_path_style | boolean | Forçar path style (obrigatório para MinIO) |
Exemplo de requisição:
{
"endpoint": "https://s3.amazonaws.com",
"access_key": "AKIAIOSFODNN7EXAMPLE",
"secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"bucket": "meu-bucket-whatsapp",
"region": "us-east-1",
"path_prefix": "uploads/",
"force_path_style": false
}
Resposta:
{
"code": 200,
"data": {
"message": "S3 configuration saved successfully"
},
"success": true
}
POST /s3/test
Testa a conexão com o S3 usando a configuração informada.
Parâmetros do corpo:
Os mesmos parâmetros do endpoint PUT /s3/config
Resposta:
{
"code": 200,
"data": {
"message": "S3 connection test successful"
},
"success": true
}
- AWS S3: Use o endpoint padrão e informe a região
- MinIO: Use seu endpoint customizado (ex: http://localhost:9000) e habilite force_path_style
- DigitalOcean Spaces: Use https://nyc3.digitaloceanspaces.com como endpoint
Proxy
Configure um proxy HTTP/HTTPS ou SOCKS5 para as conexões do WhatsApp. Útil para restrições de rede ou para aumentar a privacidade.
GET /proxy/config
Obtém a configuração atual do proxy.
Resposta:
{
"code": 200,
"data": {
"proxy_url": "socks5://proxy.example.com:1080",
"username": "user",
"bypass_list": ["localhost", "127.0.0.1", "*.local"]
},
"success": true
}
PUT /proxy/config
Configura o proxy para esta instância.
Parâmetros do corpo:
| Parâmetro | Tipo | Descrição |
|---|---|---|
| proxy_url | string | URL completa do proxy, incluindo protocolo e porta |
| username | string | Usuário para autenticação no proxy |
| password | string | Senha para autenticação no proxy |
| bypass_list | Array[string] | Lista de domínios/IPs que devem ignorar o proxy |
Exemplo de requisição:
{
"proxy_url": "socks5://proxy.example.com:1080",
"username": "usuario",
"password": "senha123",
"bypass_list": ["localhost", "127.0.0.1", "*.local", "192.168.*"]
}
Resposta:
{
"code": 200,
"data": {
"message": "Proxy configuration saved successfully"
},
"success": true
}
POST /proxy/test
Testa a conexão através do proxy configurado.
Parâmetros do corpo:
Os mesmos parâmetros do endpoint PUT /proxy/config (exceto bypass_list)
Resposta:
{
"code": 200,
"data": {
"message": "Proxy connection test successful",
"response_time": "245ms"
},
"success": true
}
- HTTP/HTTPS:
http://proxy.example.com:8080 - SOCKS5:
socks5://proxy.example.com:1080 - Com autenticação:
socks5://user:pass@proxy.example.com:1080
Melhores práticas
Para usar a API do KiraGo com eficiência e evitar problemas, considere estas melhores práticas:
Segurança
- Mantenha seus tokens de autenticação em segurança e não os exponha publicamente.
- Use HTTPS em toda comunicação com a API e com seus webhooks.
- Implemente validação adequada dos webhooks recebidos para evitar processar dados maliciosos.
Limites de uso
- Evite enviar muitas mensagens em pouco tempo para reduzir risco de bloqueio pelo WhatsApp.
- Implemente tentativas (retry) com backoff exponencial para lidar com falhas temporárias.
- Monitore o status da conexão e reconecte quando necessário.
Webhooks
- Garanta que seu endpoint de webhook processe requisições rapidamente (menos de 5 segundos).
- Se o processamento for demorado, use uma fila para processar eventos de forma assíncrona.
- Prepare seu servidor para picos de tráfego, especialmente se você gerenciar vários números.
FAQ
/session/connect e escanear o QR novamente. O KiraGo não reconecta automaticamente em caso de logout forçado.
Para reduzir o risco de bloqueio:
- Não envie mensagens em massa para pessoas que não conhecem você
- Não envie a mesma mensagem para muitos contatos em sequência
- Respeite limites de envio (aprox. 50–100 mensagens/dia para números novos)
- Use um número que já tenha histórico de uso no WhatsApp
- Não use a API para spam ou conteúdo inadequado