curl -X POST http://sua_url/api/instalacao \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"nomeSistema": "Whaticket Produção",
"host": "192.168.1.100",
"porta": 5432,
"nomeBanco": "whaticket_db",
"usuario": "postgres",
"senha": "senha123"
}'
Resposta:
{
"id": 1
}
curl -X GET http://sua_url/api/instalacao \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"nomeSistema": "Whaticket Produção",
"host": "192.168.1.100",
"porta": 5432,
"nomeBanco": "whaticket_db",
"createdAt": "2025-01-20T10:00:00.000Z"
}
]
curl -X GET http://sua_url/api/instalacao/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 1,
"nomeSistema": "Whaticket Produção",
"host": "192.168.1.100",
"porta": 5432,
"nomeBanco": "whaticket_db",
"usuario": "postgres",
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
Nota: A senha não é retornada por segurança.
curl -X PUT http://sua_url/api/instalacao/1 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"nomeSistema": "Whaticket Produção",
"host": "192.168.1.100",
"porta": 5432,
"nomeBanco": "whaticket_db",
"usuario": "postgres",
"senha": "senha123"
}'
Resposta:
{
"message": "Instalação atualizada com sucesso"
}
Nota: Todos os campos são obrigatórios na atualização, assim como no cadastro. Você deve enviar todos os dados completos.
curl -X DELETE http://sua_url/api/instalacao/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Instalação excluída com sucesso"
}
Atenção: Esta ação é irreversível. A instalação será removida do banco do RUB, mas os dados no banco do Whaticket não serão afetados.
Importante:
instalacaoId = ID da instalação cadastrada no RUB (ex: 1)companyId = ID da empresa dentro do banco do Whaticket (ex: 3)Exemplo: Se você cadastrou uma instalação com ID 1 no RUB, e quer acessar a empresa 3 do Whaticket:
/api/1/contatos?companyId=3 (instalacaoId=1, companyId=3)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/contatos \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "João Silva",
"number": "5548999999999",
"email": "joao@example.com",
"birthDate": "1990-05-15"
}'
Campos disponíveis:
companyId - ID da empresa (obrigatório)name - Nome do contato (obrigatório)number - Número do contato (obrigatório)email - Email do contato (opcional)profilePicUrl - URL da foto de perfil (opcional)isGroup - Se é grupo (boolean, padrão: false)disableBot - Desabilitar bot (boolean, padrão: false)acceptAudioMessage - Aceitar mensagens de áudio (boolean, padrão: true)active - Se está ativo (boolean, padrão: true)channel - Canal de comunicação (padrão: "whatsapp")birthDate - Data de aniversário no formato YYYY-MM-DD (opcional)Resposta:
{
"id": 123,
"name": "João Silva",
"number": "5548999999999",
"email": "joao@example.com",
"birthDate": "1990-05-15",
"companyId": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket) o / apos a api vem o numero da instalacao
curl -X GET "http://sua_url/api/1/contatos?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
curl -X GET http://sua_url/api/1/contatos/123 \
-H "Authorization: Bearer seu_token"
curl -X PUT http://sua_url/api/1/contatos/123 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "João Silva Atualizado",
"email": "joao.novo@example.com"
}'
# Adicionar ou atualizar a data de aniversário
curl -X PUT http://sua_url/api/1/contatos/123 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"birthDate": "1990-05-15"
}'
Resposta:
{
"id": 123,
"name": "João Silva",
"number": "5548999999999",
"email": "joao@example.com",
"birthDate": "1990-05-15",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
# Remover a data de aniversário (definir como null)
curl -X PUT http://sua_url/api/1/contatos/123 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"birthDate": null
}'
Nota:
YYYY-MM-DD (exemplo: "1990-05-15")birthDate ou combiná-lo com outros campos"birthDate": null ou "birthDate": ""curl -X DELETE http://sua_url/api/1/contatos/123 \
-H "Authorization: Bearer seu_token"
curl -X GET http://sua_url/api/usuarios \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 5,
"name": "Sérgio Costa",
"email": "sergio@empresa.com",
"profile": "admin",
"profileImage": "https://...",
"online": true,
"lastSeen": "2025-01-20T10:00:00.000Z",
"companyId": 1,
"companyName": "Empresa ABC",
"instalacaoId": 1,
"instalacaoNome": "Whaticket Produção"
},
{
"id": 10,
"name": "Maria Silva",
"email": "maria@empresa.com",
"profile": "user",
"online": false,
"companyId": 3,
"companyName": "Empresa XYZ",
"instalacaoId": 2,
"instalacaoNome": "Whaticket Teste"
}
]
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/usuarios?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 5,
"name": "Sérgio Costa",
"email": "sergio@empresa.com",
"profile": "admin",
"profileImage": "https://...",
"birthDate": "1990-01-15",
"super": false,
"online": true,
"lastSeen": "2025-01-20T10:00:00.000Z",
"startWork": "08:00",
"endWork": "18:00",
"color": "#00A884",
"allTicket": "enabled",
"allowGroup": true,
"defaultTheme": "light",
"defaultMenu": "closed",
"showDashboard": "enabled",
"showCampaign": "enabled",
"showContacts": "enabled",
"showFlow": "enabled",
"allowConnections": "enabled",
"allowRealTime": "enabled",
"finalizacaoComValorVendaAtiva": true,
"companyId": 3,
"companyName": "Empresa ABC",
"filas": [
{
"id": 1,
"name": "Suporte",
"color": "#00A884"
},
{
"id": 2,
"name": "Vendas",
"color": "#FF5733"
}
],
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
Nota: A resposta inclui todas as permissões do usuário e as filas associadas.
# instalacaoId=1 (instalação no RUB), id=5 (ID do usuário), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X GET "http://sua_url/api/1/usuarios/5?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 5,
"name": "Sérgio Costa",
"email": "sergio@empresa.com",
"profile": "admin",
"profileImage": "https://...",
"companyId": 3,
"companyName": "Empresa Exemplo",
"super": false,
"online": true,
"lastSeen": "2025-01-20T12:00:00.000Z",
"startWork": "08:00",
"endWork": "18:00",
"color": "#FF5733",
"allTicket": "enabled",
"allowGroup": true,
"showDashboard": "enabled",
"showCampaign": "enabled",
"showContacts": "enabled",
"showFlow": "enabled",
"allowConnections": "enabled",
"allowRealTime": "enabled",
"finalizacaoComValorVendaAtiva": true,
"filas": [
{
"id": 1,
"name": "Suporte",
"color": "#00A884"
},
{
"id": 2,
"name": "Vendas",
"color": "#FF5733"
}
],
"conexoes": [
{
"id": 1,
"name": "WhatsApp Principal",
"number": "5548999999999",
"status": "CONNECTED",
"channel": "whatsapp"
}
],
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o usuário pertence à empresa especificada.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/usuarios \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name":"usuario",
"email":"contato@example.com",
"password":"123456",
"birthDate":null,
"profile":"user",
"startWork":"00:00",
"endWork":"23:59",
"farewellMessage":"mensagem de despedida",
"allTicket":"enable",
"allowGroup":true,
"defaultTheme":"light",
"defaultMenu":"open",
"allHistoric":"enabled",
"allUserChat":"enabled",
"userClosePendingTicket":"enabled",
"showDashboard":"enabled",
"allowRealTime":"enabled",
"allowConnections":"enabled",
"showContacts":"enabled",
"showCampaign":"enabled",
"showFlow":"enabled",
"finalizacaoComValorVendaAtiva":true,
"allowSeeMessagesInPendingTickets":"enabled",
"showReturnQueueButton":true,
"showTransferTicketButton":true,
"whatsappId":false,
"queueIds":[],
"companyId":1
}'
Campos obrigatórios:
companyId - ID da empresaname - Nome do usuárioemail - Email do usuárioCampos opcionais:
password - Senha do usuário (será criptografada automaticamente)profile - Perfil do usuário (padrão: "admin")startWork - Horário de início do trabalho (padrão: "00:00")endWork - Horário de fim do trabalho (padrão: "23:59")color - Cor do usuáriosuper - Se é super usuário (boolean, padrão: false)allTicket - Ver todos os tickets (padrão: "disable")allowGroup - Permitir grupos (boolean, padrão: false)defaultTheme - Tema padrão (padrão: "light")defaultMenu - Menu padrão (padrão: "closed")farewellMessage - Mensagem de despedidabirthDate - Data de nascimento (formato: YYYY-MM-DD)Permissões (opcionais):
showDashboard - Mostrar dashboard (padrão: "disabled")showCampaign - Mostrar campanhas (padrão: "disabled")showContacts - Mostrar contatos (padrão: "enabled")showFlow - Mostrar fluxos (padrão: "enabled")allowConnections - Permitir conexões (padrão: "disabled")allowRealTime - Permitir tempo real (padrão: "disabled")allHistoric - Ver todo histórico (padrão: "disabled")allUserChat - Ver todos os chats (padrão: "disabled")userClosePendingTicket - Fechar tickets pendentes (padrão: "enabled")showReturnQueueButton - Mostrar botão retornar fila (boolean, padrão: true)showTransferTicketButton - Mostrar botão transferir ticket (boolean, padrão: true)allowSeeMessagesInPendingTickets - Ver mensagens em tickets pendentes (padrão: "enabled")finalizacaoComValorVendaAtiva - Finalização com valor de venda ativa (boolean, padrão: false)Relacionamentos (opcionais):
filas - Array de IDs das filas (ex: [1, 2, 3])conexoes - Array de IDs das conexões (ex: [1, 2]) - apenas a primeira será associada ao whatsappIdResposta:
{
"id": 15,
"name": "Novo Usuário",
"email": "novo@empresa.com",
"profile": "user",
"companyId": 3,
"filas": [
{ "id": 1, "name": "Suporte", "color": "#00A884" },
{ "id": 2, "name": "Vendas", "color": "#FF5733" }
],
"conexoes": [
{ "id": 1, "name": "WhatsApp Principal", "number": "5548999999999", "status": "CONNECTED", "channel": "whatsapp" }
],
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Nota: A senha será automaticamente criptografada pelo sistema. O campo passwordHash não é retornado na resposta.
# instalacaoId=1 (instalação no RUB), id=5 (ID do usuário), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X PUT "http://sua_url/api/1/usuarios/5?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Sérgio Costa Atualizado",
"email": "sergio.novo@empresa.com",
"profile": "admin",
"online": true,
"showCampaign": "enabled",
"filas": [1, 3],
"conexoes": [2]
}'
Campos opcionais:
filas - Array de IDs das filas (substitui todas as filas atuais)conexoes - Array de IDs das conexões (apenas a primeira será associada ao whatsappId)"filas": []"conexoes": []Resposta:
{
"id": 5,
"name": "Sérgio Costa Atualizado",
"email": "sergio.novo@empresa.com",
"profile": "admin",
"online": true,
"showCampaign": "enabled",
"filas": [
{ "id": 1, "name": "Suporte", "color": "#00A884" },
{ "id": 3, "name": "Atendimento", "color": "#FF5733" }
],
"conexoes": [
{ "id": 2, "name": "WhatsApp Secundário", "number": "5548888888888", "status": "CONNECTED", "channel": "whatsapp" }
],
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota:
companyId é opcional, mas recomendado para garantir que o usuário pertence à empresa especificada.filas, todas as filas atuais serão substituídas pelas novas.# instalacaoId=1 (instalação no RUB), id=5 (ID do usuário), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X DELETE "http://sua_url/api/1/usuarios/5?companyId=3" \
-H "Authorization: Bearer seu_token"
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o usuário pertence à empresa especificada.
Resposta:
{
"message": "Usuário excluído com sucesso"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/quick-messages?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 10,
"shortcode": "saudacao",
"message": "Olá! Como posso ajudá-lo hoje?",
"companyId": 3,
"userId": 5,
"user": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
# Filtrar mensagens rápidas por ID do usuário
curl -X GET "http://sua_url/api/1/quick-messages?companyId=3&userId=5" \
-H "Authorization: Bearer seu_token"
# O número 10 é o ID da mensagem rápida (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X GET "http://sua_url/api/1/quick-messages/10?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 10,
"shortcode": "saudacao",
"message": "Olá! Como posso ajudá-lo hoje?",
"companyId": 3,
"userId": 5,
"user": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/quick-messages \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"userId": 5,
"shortcode": "despedida",
"message": "Obrigado por entrar em contato! Tenha um ótimo dia!",
"geral": false,
"visao": true,
"isOficial": false,
"language": "pt-BR",
"status": "active",
"category": "geral"
}'
Resposta:
{
"id": 15,
"shortcode": "despedida",
"message": "Obrigado por entrar em contato! Tenha um ótimo dia!",
"companyId": 3,
"userId": 5,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Campos disponíveis:
companyId - ID da empresa (obrigatório)userId - ID do usuário (opcional)shortcode - Código curto para identificar a mensagem (obrigatório)message - Texto da mensagem (obrigatório)geral - Se a mensagem é geral (boolean, opcional)visao - Se a mensagem está visível (boolean, opcional)isOficial - Se é mensagem oficial (boolean, opcional)language - Idioma da mensagem (string, opcional)status - Status da mensagem (string, opcional)category - Categoria da mensagem (string, opcional)mediaPath - Caminho da mídia (string, opcional)mediaName - Nome da mídia (string, opcional)mediaType - Tipo de mídia: 'image', 'audio', 'video', 'document' (string, opcional)whatsappId - ID do WhatsApp (number, opcional)metaID - ID do Meta (string, opcional)# O número 10 é o ID da mensagem rápida (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X PUT "http://sua_url/api/1/quick-messages/10?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"message": "Olá! Como posso ajudá-lo hoje? Atualizado!",
"status": "active"
}'
Resposta:
{
"id": 10,
"shortcode": "saudacao",
"message": "Olá! Como posso ajudá-lo hoje? Atualizado!",
"status": "active",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
# O número 10 é o ID da mensagem rápida (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X DELETE "http://sua_url/api/1/quick-messages/10?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Mensagem rápida excluída com sucesso"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/tickets?companyId=3&limit=100" \
-H "Authorization: Bearer seu_token"
# Filtrar por data de início e data final
# Formato de data: YYYY-MM-DD ou YYYY-MM-DDTHH:mm:ss
curl -X GET "http://sua_url/api/1/tickets?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
# Buscar tickets pelo número do telefone do contato
curl -X GET "http://sua_url/api/1/tickets?companyId=3&telefone=5548999999999" \
-H "Authorization: Bearer seu_token"
# Filtrar tickets por ID do usuário
curl -X GET "http://sua_url/api/1/tickets?companyId=3&userId=5" \
-H "Authorization: Bearer seu_token"
# Combinar filtros: data, telefone e usuário
curl -X GET "http://sua_url/api/1/tickets?companyId=3&userId=5&telefone=5548999999999&dataInicio=2025-01-01&dataFim=2025-01-31&limit=50&offset=0" \
-H "Authorization: Bearer seu_token"
Resposta (com dados relacionados):
[
{
"id": 123,
"status": "closed",
"unreadMessages": 0,
"lastMessage": "Obrigado!",
"isGroup": false,
"channel": "whatsapp",
"valorVenda": 150.50,
"finalizadoComVenda": true,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T11:30:00.000Z",
"contact": {
"id": 5,
"name": "João Silva",
"number": "5548999999999",
"profilePicUrl": "https://..."
},
"user": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"queue": {
"id": 10,
"name": "Suporte",
"color": "#00A884"
}
}
]
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X GET "http://sua_url/api/1/tickets/123?companyId=3" \
-H "Authorization: Bearer seu_token"
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada. Se fornecido, a API valida que o ticket pertence àquela empresa, retornando erro 404 caso contrário.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/tickets \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"contactId": 5,
"status": "pending",
"userId": null
}'
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X PUT "http://sua_url/api/1/tickets/123?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"status": "closed",
"valorVenda": 150.50,
"finalizadoComVenda": true
}'
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X DELETE "http://sua_url/api/1/tickets/123?companyId=3" \
-H "Authorization: Bearer seu_token"
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado), whatsappId=5 (nova conexão)
curl -X POST "http://sua_url/api/1/tickets/123/transferir-conexao?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"whatsappId": 5
}'
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.
Resposta:
{
"message": "Ticket transferido para nova conexão com sucesso",
"ticket": {
"id": 123,
"whatsappId": 5,
"status": "pending",
"updatedAt": "2025-01-20T12:30:00.000Z"
},
"novaConexao": {
"id": 5,
"name": "WhatsApp - Loja 2",
"number": "5548888888888",
"status": "CONNECTED"
}
}
Nota: A conexão WhatsApp deve pertencer à mesma empresa do ticket.
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado), userId=10 (novo atendente)
curl -X POST "http://sua_url/api/1/tickets/123/transferir-atendente?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"userId": 10,
"mensagem": "Ticket transferido para atendimento",
"mensagem_privada": "Este cliente precisa de atenção especial"
}'
Campos do Body:
userId - ID do novo atendente (obrigatório)mensagem - Mensagem normal visível para todos (opcional)mensagem_privada - Mensagem privada visível apenas para o atendente (opcional)Nota:
companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.mensagem será visível para todos (cliente e atendente) e terá isPrivate = false.mensagem_privada será visível apenas para o atendente e terá isPrivate = true no banco de dados.Resposta:
{
"message": "Ticket transferido para novo atendente com sucesso",
"ticket": {
"id": 123,
"userId": 10,
"status": "pending",
"updatedAt": "2025-01-20T12:30:00.000Z"
},
"novoAtendente": {
"id": 10,
"name": "Maria Silva",
"email": "maria@empresa.com",
"profile": "user",
"profileImage": "https://..."
},
"mensagensCriadas": {
"mensagem": "Mensagem normal criada",
"mensagem_privada": "Mensagem privada criada"
}
}
Nota:
isPrivate = true na tabela Messages para identificação.# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X GET "http://sua_url/api/1/tickets/123/messages?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"body": "Olá, como posso ajudar?",
"fromMe": true,
"mediaType": null,
"mediaUrl": null,
"createdAt": "2025-01-20T10:00:00.000Z",
"read": true,
"ack": 2,
"user": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
}
},
{
"id": 2,
"body": "Preciso de ajuda com meu pedido",
"fromMe": false,
"mediaType": null,
"mediaUrl": null,
"createdAt": "2025-01-20T10:05:00.000Z",
"read": true,
"ack": 2,
"user": null
}
]
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.
# instalacaoId=1 (instalação no RUB), ticketId=123, companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X POST "http://sua_url/api/1/tickets/123/messages?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"body": "Olá! Como posso ajudar você hoje?",
"mediaType": null,
"mediaUrl": null
}'
Campos do Body:
body - Texto da mensagem (obrigatório se não houver mediaUrl)mediaType - Tipo de mídia (opcional): "image", "video", "audio", "document"mediaUrl - URL da mídia (obrigatório se não houver body)Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.
Parâmetros de Query Disponíveis:
companyId - ID da empresa (obrigatório para filtrar)userId - ID do usuário (filtra tickets do usuário)telefone - Número do telefone do contato (busca parcial)dataInicio - Data de início (formato: YYYY-MM-DD ou ISO 8601)dataFim - Data final (formato: YYYY-MM-DD ou ISO 8601)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/tags?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 5,
"name": "VIP",
"color": "#FF5733",
"kanban": 0,
"companyId": 3,
"timeLane": 0,
"nextLaneId": 0,
"greetingMessageLane": "",
"rollbackLaneId": 0,
"mediaFiles": null,
"totalContacts": 25,
"totalTickets": 150,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
},
{
"id": 6,
"name": "Urgente",
"color": "#FF0000",
"kanban": 0,
"companyId": 3,
"timeLane": 0,
"nextLaneId": 0,
"greetingMessageLane": "",
"rollbackLaneId": 0,
"mediaFiles": null,
"totalContacts": 10,
"totalTickets": 45,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
Nota: A resposta inclui estatísticas de quantos contatos e tickets estão associados a cada tag.
# O número 5 é o ID da tag (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X GET "http://sua_url/api/1/tags/5?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 5,
"name": "VIP",
"color": "#FF5733",
"kanban": 0,
"companyId": 3,
"timeLane": 0,
"nextLaneId": 0,
"greetingMessageLane": "",
"rollbackLaneId": 0,
"mediaFiles": null,
"totalContacts": 25,
"totalTickets": 150,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/tags \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "Cliente Premium",
"color": "#00A884"
}'
Resposta:
{
"id": 7,
"name": "Cliente Premium",
"color": "#00A884",
"kanban": 0,
"companyId": 3,
"timeLane": 0,
"nextLaneId": 0,
"greetingMessageLane": "",
"rollbackLaneId": 0,
"mediaFiles": null,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Nota: Os campos opcionais recebem valores padrão automaticamente:
kanban: 0timeLane: 0nextLaneId: 0greetingMessageLane: ""rollbackLaneId: 0mediaFiles: nullCampos disponíveis:
companyId - ID da empresa (obrigatório)name - Nome da tag (obrigatório, deve ser único por empresa)color - Cor da tag (opcional, formato hexadecimal)kanban - Posição no kanban (opcional)timeLane - Tempo na lane (opcional)nextLaneId - ID da próxima lane (opcional)greetingMessageLane - Mensagem de boas-vindas da lane (opcional)rollbackLaneId - ID da lane de rollback (opcional)mediaFiles - Arquivos de mídia (opcional)Nota: O nome da tag deve ser único dentro da mesma empresa.
# O número 5 é o ID da tag (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X PUT "http://sua_url/api/1/tags/5?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "VIP Atualizado",
"color": "#FF0000"
}'
Resposta:
{
"id": 5,
"name": "VIP Atualizado",
"color": "#FF0000",
"companyId": 3,
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados. Se alterar o nome, o sistema verificará se já existe outra tag com o mesmo nome na empresa.
# O número 5 é o ID da tag (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X DELETE "http://sua_url/api/1/tags/5?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Tag excluída com sucesso"
}
Nota: Ao excluir uma tag, todas as associações com contatos e tickets serão removidas automaticamente.
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/chats?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
# Filtrar chats onde o usuário participa
curl -X GET "http://sua_url/api/1/chats?companyId=3&userId=5" \
-H "Authorization: Bearer seu_token"
# Filtrar chats criados por um usuário
curl -X GET "http://sua_url/api/1/chats?companyId=3&ownerId=5" \
-H "Authorization: Bearer seu_token"
# Filtrar apenas chats de grupo
curl -X GET "http://sua_url/api/1/chats?companyId=3&isGroup=true" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 10,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"title": "Equipe de Suporte",
"lastMessage": "Vamos resolver isso juntos",
"isGroup": true,
"groupName": "Equipe de Suporte",
"groupAdminId": 5,
"description": "Chat da equipe de suporte",
"groupImage": "",
"companyId": 3,
"owner": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"totalUsers": 5,
"totalMessages": 120,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
]
# O número 10 é o ID do chat (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X GET "http://sua_url/api/1/chats/10?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 10,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"title": "Equipe de Suporte",
"lastMessage": "Vamos resolver isso juntos",
"isGroup": true,
"groupName": "Equipe de Suporte",
"groupAdminId": 5,
"description": "Chat da equipe de suporte",
"groupImage": "",
"companyId": 3,
"owner": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"users": [
{
"id": 5,
"name": "Sérgio Costa",
"email": "sergio@empresa.com",
"profileImage": "https://..."
},
{
"id": 10,
"name": "Maria Silva",
"email": "maria@empresa.com",
"profileImage": "https://..."
}
],
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/chats \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"ownerId": 5,
"title": "Chat de Suporte",
"isGroup": false,
"users": [5, 10]
}'
Resposta:
{
"id": 15,
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"title": "Chat de Suporte",
"lastMessage": "",
"isGroup": false,
"groupName": "",
"groupAdminId": null,
"description": "",
"groupImage": "",
"companyId": 3,
"ownerId": 5,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Campos disponíveis:
companyId - ID da empresa (obrigatório)ownerId - ID do proprietário do chat (obrigatório)title - Título do chat (opcional)lastMessage - Última mensagem (opcional)isGroup - Se é grupo (boolean, padrão: false)groupName - Nome do grupo (opcional)groupAdminId - ID do administrador do grupo (opcional)description - Descrição do chat (opcional)groupImage - Imagem do grupo (opcional)users - Array de IDs de usuários para adicionar ao chat (opcional)Nota: Se não informar users, o owner será automaticamente adicionado ao chat.
# O número 10 é o ID do chat (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X PUT "http://sua_url/api/1/chats/10?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"title": "Equipe de Suporte Atualizado",
"description": "Nova descrição",
"users": [5, 10, 15]
}'
Resposta:
{
"id": 10,
"title": "Equipe de Suporte Atualizado",
"description": "Nova descrição",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota:
users, todos os usuários atuais serão substituídos pelos novos# O número 10 é o ID do chat (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X DELETE "http://sua_url/api/1/chats/10?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Chat excluído com sucesso"
}
Nota: Ao excluir um chat, todas as mensagens e associações com usuários serão removidas automaticamente.
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)userId - Filtrar chats onde o usuário participa (opcional)ownerId - Filtrar chats criados por um usuário (opcional)isGroup - Filtrar por tipo: true (grupos) ou false (individuais) (opcional)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/flowbuilders?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
# Filtrar flowbuilders de um usuário específico
curl -X GET "http://sua_url/api/1/flowbuilders?companyId=3&userId=1" \
-H "Authorization: Bearer seu_token"
# Filtrar apenas flowbuilders ativos
curl -X GET "http://sua_url/api/1/flowbuilders?companyId=3&active=true" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"user_id": 1,
"company_id": 3,
"name": "vendas",
"active": true,
"flow": null,
"user": {
"id": 1,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
curl -X GET http://sua_url/api/1/flowbuilders/5 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 1,
"user_id": 1,
"company_id": 3,
"name": "vendas",
"active": true,
"flow": null,
"user": {
"id": 1,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), company_id=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/flowbuilders \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"company_id": 3,
"user_id": 1,
"name": "vendas",
"active": true,
"flow": null
}'
Resposta:
{
"active": true,
"id": 1,
"user_id": 1,
"company_id": 1,
"name": "vendas",
"updatedAt": "2025-11-20T20:28:51.948Z",
"createdAt": "2025-11-20T20:28:51.948Z",
"flow": null
}
Campos disponíveis:
company_id ou companyId - ID da empresa (obrigatório)user_id ou userId - ID do usuário (obrigatório)name - Nome do FlowBuilder (obrigatório)active - Se está ativo (boolean, padrão: true)flow - JSON com a estrutura do fluxo (opcional, pode ser null)Nota: O sistema valida que o usuário pertence à empresa informada.
curl -X PUT http://sua_url/api/1/flowbuilders/1 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "vendas atualizado",
"active": false
}'
Resposta:
{
"id": 1,
"user_id": 1,
"company_id": 3,
"name": "vendas atualizado",
"active": false,
"flow": null,
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados. O campo flow aceita JSON e pode ser atualizado com a estrutura completa do fluxo.
curl -X DELETE http://sua_url/api/1/flowbuilders/5 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "FlowBuilder excluído com sucesso"
}
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)userId - Filtrar por ID do usuário (opcional)active - Filtrar por status: true (ativos) ou false (inativos) (opcional)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)# Exporta todos os FlowBuilders de uma empresa em formato SQL
curl -X GET "http://sua_url/api/1/flowbuilders/exportar-sql?companyId=3" \
-H "Authorization: Bearer seu_token" \
--output flowbuilders_export.sql
Resposta: Retorna um arquivo SQL com todos os INSERTs dos FlowBuilders da empresa.
Exemplo do SQL gerado:
-- Exportação de FlowBuilders da empresa 3
-- Total de registros: 5
-- Data da exportação: 2025-01-20T12:00:00.000Z
INSERT INTO "FlowBuilders" ("user_id", "company_id", "name", "active", "flow", "createdAt", "updatedAt")
VALUES (1, 3, $name$vendas$name$, true, $flow${"nodes":[],"edges":[]}$flow$::jsonb, '2025-01-20T10:00:00.000Z', '2025-01-20T10:00:00.000Z');
Nota: O SQL gerado usa dollar quoting ($tag$...$tag$) para evitar problemas com aspas em strings e JSON, tornando o SQL mais seguro e fácil de importar.
Nota: O arquivo SQL pode ser usado para importar os FlowBuilders em outra empresa.
# Importa FlowBuilders de um arquivo SQL para uma empresa (formato JSON)
curl -X POST http://sua_url/api/1/flowbuilders/importar-sql \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"targetCompanyId": 5,
"sql": "INSERT INTO \"FlowBuilders\" (\"user_id\", \"company_id\", \"name\", \"active\", \"flow\", \"createdAt\", \"updatedAt\") VALUES (1, 5, $name$vendas$name$, true, $flow${\"nodes\":[],\"edges\":[]}$flow$::jsonb, '\''2025-01-20T10:00:00.000Z'\'', '\''2025-01-20T10:00:00.000Z'\'');"
}'
Alternativa - Enviar SQL como texto puro:
# Importa FlowBuilders enviando SQL diretamente como texto
curl -X POST "http://sua_url/api/1/flowbuilders/importar-sql?targetCompanyId=5" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: text/plain" \
--data-raw "INSERT INTO \"FlowBuilders\" (\"user_id\", \"company_id\", \"name\", \"active\", \"flow\", \"createdAt\", \"updatedAt\") VALUES (1, 5, $name$vendas$name$, true, $flow${\"nodes\":[],\"edges\":[]}$flow$::jsonb, '2025-01-20T10:00:00.000Z', '2025-01-20T10:00:00.000Z');"
Resposta:
{
"message": "FlowBuilders importados com sucesso",
"imported": 1,
"total": 1
}
Campos disponíveis:
targetCompanyId - ID da empresa destino (obrigatório)companyId - ID da empresa origem (opcional, usado para substituir company_id no SQL)sql - SQL com os comandos INSERT (obrigatório)Nota:
targetCompanyId for diferente de companyId, o sistema substitui automaticamente o company_id no SQL# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/queues?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 10,
"name": "Suporte",
"color": "#00A884",
"greetingMessage": "Olá! Bem-vindo ao suporte.",
"orderQueue": 1,
"ativarRoteador": true,
"tempoRoteador": 30,
"typeRandomMode": "RANDOM",
"outOfHoursMessage": "Fora do horário de atendimento",
"schedules": null,
"closeTicket": false,
"randomizeImmediate": false,
"integrationId": null,
"fileListId": null,
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
curl -X GET http://sua_url/api/1/queues/10 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 10,
"name": "Suporte",
"color": "#00A884",
"greetingMessage": "Olá! Bem-vindo ao suporte.",
"orderQueue": 1,
"ativarRoteador": true,
"tempoRoteador": 30,
"typeRandomMode": "RANDOM",
"outOfHoursMessage": "Fora do horário de atendimento",
"schedules": null,
"closeTicket": false,
"randomizeImmediate": false,
"integrationId": null,
"fileListId": null,
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/queues \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "Financeiro",
"color": "#FF5733",
"greetingMessage": "Olá! Bem-vindo ao setor financeiro.",
"orderQueue": 2,
"ativarRoteador": true,
"tempoRoteador": 60,
"typeRandomMode": "RANDOM",
"outOfHoursMessage": "Fora do horário de atendimento",
"closeTicket": false,
"randomizeImmediate": false
}'
Resposta:
{
"id": 11,
"name": "Financeiro",
"color": "#FF5733",
"greetingMessage": "Olá! Bem-vindo ao setor financeiro.",
"orderQueue": 2,
"ativarRoteador": true,
"tempoRoteador": 60,
"typeRandomMode": "RANDOM",
"outOfHoursMessage": "Fora do horário de atendimento",
"schedules": null,
"closeTicket": false,
"randomizeImmediate": false,
"integrationId": null,
"fileListId": null,
"companyId": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Campos disponíveis:
companyId - ID da empresa (obrigatório)name - Nome da fila (obrigatório, deve ser único por empresa)color - Cor da fila (opcional, padrão: "#000000", deve ser único por empresa)greetingMessage - Mensagem de boas-vindas (opcional)orderQueue - Ordem da fila (opcional, padrão: 0)ativarRoteador - Ativar roteador (boolean, padrão: false)tempoRoteador - Tempo do roteador em segundos (opcional)typeRandomMode - Tipo de modo aleatório (opcional, padrão: "RANDOM")outOfHoursMessage - Mensagem fora do horário (opcional)schedules - Horários de funcionamento (JSON, opcional)closeTicket - Fechar ticket automaticamente (boolean, padrão: false)randomizeImmediate - Aleatorizar imediatamente (boolean, padrão: false)integrationId - ID da integração (opcional)fileListId - ID da lista de arquivos (opcional)Nota: O nome e a cor devem ser únicos dentro da mesma empresa.
curl -X PUT http://sua_url/api/1/queues/10 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Suporte Atualizado",
"color": "#00FF00",
"greetingMessage": "Nova mensagem de boas-vindas"
}'
Resposta:
{
"id": 10,
"name": "Suporte Atualizado",
"color": "#00FF00",
"greetingMessage": "Nova mensagem de boas-vindas",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
curl -X DELETE http://sua_url/api/1/queues/10 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Fila excluída com sucesso"
}
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Nota: As filas são ordenadas por orderQueue (ordem) e depois por data de criação.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/prompts?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
# Filtrar prompts de uma fila específica
curl -X GET "http://sua_url/api/1/prompts?companyId=3&queueId=10" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"name": "Prompt de Suporte",
"prompt": "Você é um assistente de suporte...",
"apiKey": "sk-...",
"maxMessages": 10,
"maxTokens": 100,
"temperature": 1,
"promptTokens": 0,
"completionTokens": 0,
"totalTokens": 0,
"voice": null,
"voiceKey": null,
"voiceRegion": null,
"queueId": 10,
"queue": {
"id": 10,
"name": "Suporte",
"color": "#00A884"
},
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
curl -X GET http://sua_url/api/1/prompts/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 1,
"name": "Prompt de Suporte",
"prompt": "Você é um assistente de suporte...",
"apiKey": "sk-...",
"maxMessages": 10,
"maxTokens": 100,
"temperature": 1,
"promptTokens": 0,
"completionTokens": 0,
"totalTokens": 0,
"voice": null,
"voiceKey": null,
"voiceRegion": null,
"queueId": 10,
"queue": {
"id": 10,
"name": "Suporte",
"color": "#00A884"
},
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/prompts \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"queueId": 10,
"name": "Prompt de Suporte",
"prompt": "Você é um assistente de suporte virtual. Seja cordial e prestativo.",
"apiKey": "sk-1234567890abcdef",
"maxMessages": 10,
"maxTokens": 100,
"temperature": 1
}'
Resposta:
{
"id": 1,
"name": "Prompt de Suporte",
"prompt": "Você é um assistente de suporte virtual. Seja cordial e prestativo.",
"apiKey": "sk-1234567890abcdef",
"maxMessages": 10,
"maxTokens": 100,
"temperature": 1,
"promptTokens": 0,
"completionTokens": 0,
"totalTokens": 0,
"voice": null,
"voiceKey": null,
"voiceRegion": null,
"queueId": 10,
"companyId": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Campos disponíveis:
companyId - ID da empresa (obrigatório)queueId - ID da fila (obrigatório)name - Nome do prompt (obrigatório)prompt - Texto do prompt (obrigatório)apiKey - Chave da API (obrigatório)maxMessages - Máximo de mensagens (opcional, padrão: 10)maxTokens - Máximo de tokens (opcional, padrão: 100)temperature - Temperatura (opcional, padrão: 1)promptTokens - Tokens do prompt (opcional, padrão: 0)completionTokens - Tokens de conclusão (opcional, padrão: 0)totalTokens - Total de tokens (opcional, padrão: 0)voice - Voz (opcional)voiceKey - Chave da voz (opcional)voiceRegion - Região da voz (opcional)Nota: O sistema valida que a fila pertence à empresa informada.
curl -X PUT http://sua_url/api/1/prompts/1 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Prompt de Suporte Atualizado",
"prompt": "Nova instrução do prompt...",
"maxTokens": 200
}'
Resposta:
{
"id": 1,
"name": "Prompt de Suporte Atualizado",
"prompt": "Nova instrução do prompt...",
"maxTokens": 200,
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
curl -X DELETE http://sua_url/api/1/prompts/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Prompt excluído com sucesso"
}
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)queueId - Filtrar por ID da fila (opcional)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)As rotas de companies permitem listar e criar empresas, incluindo informações do plano e métricas.
Rota:
# instalacaoId=1 (instalação no RUB)
curl -X POST "http://sua_url/api/1/companies" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Empresa Nova",
"email": "contato@empresanova.com.br",
"phone": "47999999999",
"document": "12345678000190",
"planId": 1,
"dueDate": "2025-12-31",
"masterUser": {
"name": "Administrador",
"email": "admin@empresanova.com.br",
"password": "senha123456"
}
}'
Campos obrigatórios:
name - Nome da empresa (obrigatório)dueDate - Data de vencimento da próxima fatura (obrigatório, formato: YYYY-MM-DD ou ISO 8601)masterUser - Objeto com dados do usuário master (obrigatório)masterUser.name - Nome do usuário master (obrigatório)masterUser.email - Email do usuário master (obrigatório, deve ser único)masterUser.password - Senha do usuário master (obrigatório)Campos opcionais:
email - Email da empresaphone - Telefone da empresadocument - Documento (CPF/CNPJ) da empresaplanId - ID do plano a ser associado à empresaResposta:
{
"message": "Empresa e usuário master criados com sucesso",
"company": {
"id": 5,
"name": "Empresa Nova",
"email": "contato@empresanova.com.br",
"status": true,
"dueDate": "2025-12-31T00:00:00.000Z",
"createdAt": "2025-01-20T10:00:00.000Z",
"phone": "47999999999",
"document": "12345678000190",
"lastLogin": null,
"folderSize": null,
"numberFileFolder": null,
"updatedAtFolder": null,
"generateInvoice": true,
"recurrence": "",
"updatedAt": "2025-01-20T10:00:00.000Z",
"plan": {
"id": 1,
"name": "Plano Básico",
"users": 10,
"connections": 5,
"queues": 3,
"amount": "100.00",
"useWhatsapp": true,
"useFacebook": false,
"useInstagram": false,
"useCampaigns": false,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": false,
"useKanban": false,
"useOpenAi": false,
"useIntegrations": false,
"wavoip": false
},
"metrics": {
"folderSize": 0,
"numberOfFiles": 0,
"lastUpdate": null
}
},
"masterUser": {
"id": 15,
"name": "Administrador",
"email": "admin@empresanova.com.br",
"profile": "admin",
"companyId": 5,
"createdAt": "2025-01-20T10:00:00.000Z"
}
}
Notas importantes:
profile = 'admin' automaticamenteRota explícita:
# id=1 (instalação no RUB)
curl -X GET "http://sua_url/api/instalacao/1/companies" \
-H "Authorization: Bearer seu_token"
Rota alternativa:
# instalacaoId=1 (instalação no RUB)
curl -X GET "http://sua_url/api/1/companies" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"companies": [
{
"id": 1,
"name": "Empresa 1",
"email": null,
"status": true,
"dueDate": null,
"createdAt": "2025-11-20T11:29:18.384Z",
"phone": null,
"document": "",
"lastLogin": "2025-11-20T12:34:27.405Z",
"folderSize": null,
"numberFileFolder": null,
"updatedAtFolder": null,
"generateInvoice": true,
"recurrence": "",
"plan": {
"id": 1,
"name": "Plano 1",
"users": 10,
"connections": 10,
"queues": 10,
"amount": "100",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"useOpenAi": true,
"useIntegrations": true,
"wavoip": false
},
"metrics": {
"folderSize": 8192,
"numberOfFiles": 2,
"lastUpdate": "20/11/2025 07:53:05"
}
}
]
}
O sistema suporta diferentes tipos de conexões através do campo channel:
whatsapp - WhatsApp tradicionalwhatsapp_oficial - WhatsApp Business API (Oficial)instagram - Instagram Directfacebook - Facebook# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/connections?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
# Filtrar apenas conexões WhatsApp
curl -X GET "http://sua_url/api/1/connections?companyId=3&channel=whatsapp" \
-H "Authorization: Bearer seu_token"
# Filtrar apenas conexões conectadas
curl -X GET "http://sua_url/api/1/connections?companyId=3&status=CONNECTED" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"name": "WhatsApp Principal",
"channel": "whatsapp",
"status": "CONNECTED",
"number": "5548999999999",
"isDefault": true,
"allowGroup": true,
"companyId": 3,
"greetingMessage": "Olá! Bem-vindo...",
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
curl -X GET http://sua_url/api/1/connections/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 1,
"name": "WhatsApp Principal",
"channel": "whatsapp",
"status": "CONNECTED",
"number": "5548999999999",
"isDefault": true,
"allowGroup": true,
"companyId": 3,
"greetingMessage": "Olá! Bem-vindo...",
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/connections \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "WhatsApp Principal",
"channel": "whatsapp",
"status": "OPENING",
"isDefault": true,
"allowGroup": true,
"greetingMessage": "Olá! Bem-vindo ao nosso atendimento."
}'
curl -X POST http://sua_url/api/1/connections \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "Instagram Principal",
"channel": "instagram",
"status": "OPENING",
"token": "EAABwzLix...",
"facebookUserId": "123456789",
"facebookUserToken": "token123",
"facebookPageUserId": "987654321"
}'
curl -X POST http://sua_url/api/1/connections \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "WhatsApp Business API",
"channel": "whatsapp_oficial",
"status": "OPENING",
"phone_number_id": "123456789",
"waba_id": "987654321",
"send_token": "token123",
"business_id": "business123",
"phone_number": "5548999999999"
}'
Campos disponíveis:
companyId - ID da empresa (obrigatório)name - Nome da conexão (obrigatório, deve ser único por canal e empresa)channel - Tipo de conexão (obrigatório): whatsapp, whatsapp_oficial, instagram, telegram, messenger, waba, facebookstatus - Status da conexão (opcional, padrão: "OPENING")isDefault - Se é conexão padrão (boolean, padrão: false, apenas para whatsapp/whatsapp_oficial)allowGroup - Permitir grupos (boolean, padrão: false)number - Número da conexão (opcional)greetingMessage - Mensagem de boas-vindas (opcional)farewellMessage - Mensagem de despedida (opcional)complationMessage - Mensagem de conclusão (opcional)outOfHoursMessage - Mensagem fora do horário (opcional)token - Token de autenticação (opcional, usado para Instagram/Facebook)facebookUserId - ID do usuário Facebook (opcional, usado para Instagram/Facebook)facebookUserToken - Token do usuário Facebook (opcional)facebookPageUserId - ID da página Facebook (opcional)phone_number_id - ID do número de telefone (opcional, usado para WABA)waba_id - ID do WABA (opcional, usado para WABA)send_token - Token de envio (opcional, usado para WABA)business_id - ID do negócio (opcional, usado para WABA)phone_number - Número de telefone (opcional, usado para WABA)waba_webhook - Webhook do WABA (opcional)color - Cor da conexão (opcional)schedules - Horários de funcionamento (JSON, opcional)promptId - ID do prompt (opcional)Nota:
whatsapp e whatsapp_oficial, apenas uma conexão pode ser isDefault = true por empresachannel e companyIdchannel)curl -X PUT http://sua_url/api/1/connections/1 \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "WhatsApp Principal Atualizado",
"status": "CONNECTED",
"greetingMessage": "Nova mensagem de boas-vindas"
}'
Resposta:
{
"id": 1,
"name": "WhatsApp Principal Atualizado",
"status": "CONNECTED",
"greetingMessage": "Nova mensagem de boas-vindas",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
curl -X DELETE http://sua_url/api/1/connections/1 \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Conexão excluída com sucesso"
}
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)channel - Filtrar por tipo de conexão: whatsapp, whatsapp_oficial, instagram, facebook (opcional)status - Filtrar por status: OPENING, CONNECTED, DISCONNECTED, etc. (opcional)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Nota: As conexões são ordenadas por isDefault (padrão primeiro) e depois por data de criação.
A tabela Settings é uma tabela chave-valor que armazena configurações gerais do sistema. A rota específica para chatBotType sempre trata o valor como texto.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket - opcional)
# Se companyId não for fornecido, busca configuração global (companyId IS NULL)
curl -X GET "http://sua_url/api/1/settings/chatBotType?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (opcional)Resposta:
{
"key": "chatBotType",
"value": "text",
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
Resposta quando não encontrado:
{
"error": "chatBotType não encontrado"
}
# instalacaoId=1 (instalação no RUB)
# Se companyId não for fornecido, atualiza/cria configuração global
curl -X PUT "http://sua_url/api/1/settings/chatBotType" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"value": "text",
"companyId": 3
}'
Campos obrigatórios:
value - Valor do chatBotType (obrigatório, sempre será tratado como texto)Campos opcionais:
companyId - ID da empresa (opcional)Resposta:
{
"message": "chatBotType atualizado com sucesso",
"setting": {
"id": 10,
"key": "chatBotType",
"value": "text",
"companyId": 3,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
}
Nota:
value sempre será tratado como texto (tipo text no banco)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/vendas?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório para filtrar)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
# Retorna estatísticas agregadas de vendas
curl -X GET "http://sua_url/api/1/vendas/estatisticas?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)userId - Filtrar por usuário/vendedor (opcional)dataInicio - Data inicial no formato YYYY-MM-DD (opcional)dataFim - Data final no formato YYYY-MM-DD (opcional)periodo - Período para agregação: "dia", "semana", "mes", "ano" (opcional, não implementado ainda)Resposta:
{
"totalVendas": 150,
"valorTotal": 45000.00,
"ticketMedio": 300.00,
"porPeriodo": {
"hoje": {
"quantidade": 5,
"valor": 1500.00
},
"semana": {
"quantidade": 25,
"valor": 7500.00
},
"mes": {
"quantidade": 150,
"valor": 45000.00
}
},
"topVendedores": [
{
"userId": 1,
"nome": "João Silva",
"vendas": 50,
"valor": 15000.00
},
{
"userId": 5,
"nome": "Maria Santos",
"vendas": 45,
"valor": 13500.00
}
]
}
Exemplos de uso:
Estatísticas gerais da empresa:
curl -X GET "http://sua_url/api/1/vendas/estatisticas?companyId=3" \
-H "Authorization: Bearer seu_token"
Estatísticas de um vendedor específico:
curl -X GET "http://sua_url/api/1/vendas/estatisticas?companyId=3&userId=5" \
-H "Authorization: Bearer seu_token"
Estatísticas de um período específico:
curl -X GET "http://sua_url/api/1/vendas/estatisticas?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Nota:
topVendedores só é retornado quando não há filtro por userIdfinalizadoComVenda = true e valorVenda IS NOT NULLticketMedio é calculado como a média de valorVenda de todas as vendas no período filtrado# instalacaoId=1 (instalação no RUB), id=123 (ID do ticket/venda), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X GET "http://sua_url/api/1/vendas/123?companyId=3" \
-H "Authorization: Bearer seu_token"
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que a venda pertence à empresa especificada.
# instalacaoId=1 (instalação no RUB)
# Registra uma venda associando um valor, ticket e usuário
curl -X POST "http://sua_url/api/1/vendas" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"valor": 1500.00,
"ticketId": 123,
"userId": 45,
"companyId": 3
}'
Campos obrigatórios:
valor - Valor da venda (número)ticketId - ID do ticketuserId - ID do usuário que fez a vendacompanyId - ID da empresaResposta de sucesso:
{
"message": "Venda registrada com sucesso",
"venda": {
"id": 123,
"valorVenda": 1500.00,
"userId": 45,
"finalizadoComVenda": true,
"companyId": 3,
...
}
}
# instalacaoId=1 (instalação no RUB), id=123 (ID do ticket/venda), companyId=3 (empresa no Whaticket - opcional mas recomendado)
# Atualiza o valor da venda
curl -X PUT "http://sua_url/api/1/vendas/123?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"valor": 1800.00
}'
# Atualiza o valor e o usuário da venda
curl -X PUT "http://sua_url/api/1/vendas/123?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"valor": 1800.00,
"userId": 50
}'
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que a venda pertence à empresa especificada.
Campos opcionais:
valor - Novo valor da venda (opcional)userId - Novo ID do usuário (opcional)Resposta de sucesso:
{
"message": "Venda atualizada com sucesso",
"venda": {
"id": 123,
"valorVenda": 1800.00,
"userId": 50,
"finalizadoComVenda": true,
...
}
}
# instalacaoId=1 (instalação no RUB), id=123 (ID do ticket/venda), companyId=3 (empresa no Whaticket - opcional mas recomendado)
# Remove a marcação de venda do ticket (mantém o ticket, apenas remove os dados da venda)
curl -X DELETE "http://sua_url/api/1/vendas/123?companyId=3" \
-H "Authorization: Bearer seu_token"
Nota: O parâmetro companyId é opcional, mas recomendado para garantir que a venda pertence à empresa especificada.
Resposta de sucesso:
{
"message": "Venda excluída com sucesso",
"ticket": {
"id": 123,
"valorVenda": null,
"finalizadoComVenda": false,
...
}
}
Nota: A exclusão de venda não remove o ticket, apenas remove a marcação de venda (finalizadoComVenda = false) e o valor da venda (valorVenda = null).
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
# Valida se a empresa tem permissão para campanhas (useCampaigns)
curl -X POST "http://sua_url/api/1/campanhas" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"name": "Promoção de Verão",
"message1": "Olá! Temos uma promoção especial para você!",
"message2": "Desconto de 20% em todos os produtos!",
"status": "pending",
"confirmation": true,
"whatsappId": 1,
"contactListId": 10,
"scheduledAt": "2025-01-25T10:00:00.000Z"
}'
Campos obrigatórios:
companyId - ID da empresa (obrigatório)name - Nome da campanha (obrigatório)Campos opcionais:
message1 a message5 - Mensagens da campanha (texto)confirmationMessage1 a confirmationMessage5 - Mensagens de confirmação (texto)status - Status da campanha: "pending", "active", "running", "scheduled", "canceled", "completed" (padrão: "pending")confirmation - Se requer confirmação (boolean, padrão: false)mediaPath - Caminho da mídia (texto)mediaName - Nome da mídia (texto)contactListId - ID da lista de contatos (integer)whatsappId - ID do WhatsApp (integer)scheduledAt - Data e hora agendada (timestamp)userId - ID do usuário (integer)queueId - ID da fila (integer)statusTicket - Status do ticket (padrão: "closed")openTicket - Abrir ticket (padrão: "disabled")tagListId - ID da tag para seleção de contatos (texto)isRecurring - Se é recorrente (boolean, padrão: false)recurrenceType - Tipo de recorrência (texto)recurrenceInterval - Intervalo de recorrência (integer, padrão: 1)recurrenceDaysOfWeek - Dias da semana (texto)recurrenceDayOfMonth - Dia do mês (integer)recurrenceEndDate - Data de término da recorrência (timestamp)maxExecutions - Máximo de execuções (integer)Resposta:
{
"id": 15,
"name": "Promoção de Verão",
"message1": "Olá! Temos uma promoção especial para você!",
"message2": "Desconto de 20% em todos os produtos!",
"status": "pending",
"confirmation": true,
"companyId": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Nota: A empresa deve ter a permissão useCampaigns ativada no plano para criar campanhas. Caso contrário, retornará erro 403.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket - opcional)
# Retorna apenas campanhas com status 'active', 'running' ou 'scheduled'
curl -X GET "http://sua_url/api/1/campanhas/ativas?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (opcional, filtra por empresa)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Resposta:
[
{
"id": 10,
"name": "Promoção de Verão",
"status": "active",
"companyId": 3,
"scheduledAt": "2025-01-25T10:00:00.000Z",
"createdAt": "2025-01-20T10:00:00.000Z"
},
{
"id": 12,
"name": "Campanha Black Friday",
"status": "running",
"companyId": 3,
"createdAt": "2025-01-18T08:00:00.000Z"
}
]
# instalacaoId=1 (instalação no RUB), id=10 (ID da campanha), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X PUT "http://sua_url/api/1/campanhas/10/ativar?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Campanha ativada com sucesso",
"campaign": {
"id": 10,
"name": "Promoção de Verão",
"status": "active",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
}
Nota:
companyId é opcional, mas recomendado para garantir que a campanha pertence à empresa especificadauseCampaigns ativada no planostatus = 'active'# instalacaoId=1 (instalação no RUB), id=10 (ID da campanha), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X PUT "http://sua_url/api/1/campanhas/10/desativar?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Campanha desativada com sucesso",
"campaign": {
"id": 10,
"name": "Promoção de Verão",
"status": "canceled",
"updatedAt": "2025-01-20T12:35:00.000Z"
}
}
Nota:
companyId é opcional, mas recomendado para garantir que a campanha pertence à empresa especificadastatus = 'canceled'# instalacaoId=1 (instalação no RUB), id=10 (ID da campanha), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X GET "http://sua_url/api/1/campanhas/10/estatisticas?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"campaign": {
"id": 10,
"name": "Promoção de Verão",
"status": "active",
"createdAt": "2025-01-20T10:00:00.000Z",
"scheduledAt": "2025-01-25T10:00:00.000Z",
"completedAt": null
},
"estatisticas": {
"totalEnviados": 1000,
"entregues": 950,
"confirmados": 850,
"pendentesConfirmacao": 100,
"taxaEntrega": 95.00,
"taxaConfirmacao": 85.00
}
}
Nota:
companyId é opcional, mas recomendado para garantir que a campanha pertence à empresa especificadaCampaignShippingtaxaEntrega = (entregues / totalEnviados) * 100taxaConfirmacao = (confirmados / totalEnviados) * 100# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
# Valida campos obrigatórios, valores numéricos e datas
curl -X POST "http://sua_url/api/1/fatura" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"value": 1500.00,
"dueDate": "2025-02-15",
"detail": "Fatura mensal - Janeiro 2025",
"status": "pending",
"users": 10,
"connections": 5,
"queues": 3,
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": false,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": false,
"linkInvoice": "https://example.com/invoice/123"
}'
Campos obrigatórios:
companyId - ID da empresa (obrigatório)value - Valor da fatura (obrigatório, deve ser um número válido)dueDate - Data de vencimento (obrigatório, formato: YYYY-MM-DD ou ISO 8601)Campos opcionais:
detail - Detalhes da fatura (texto, padrão: '')status - Status da fatura: "pending", "paid", "overdue" (padrão: "pending")users - Número de usuários (integer, padrão: 0)connections - Número de conexões (integer, padrão: 0)queues - Número de filas (integer, padrão: 0)useWhatsapp - Usar WhatsApp (boolean, padrão: true)useFacebook - Usar Facebook (boolean, padrão: true)useInstagram - Usar Instagram (boolean, padrão: true)useCampaigns - Usar campanhas (boolean, padrão: true)useSchedules - Usar agendamentos (boolean, padrão: true)useInternalChat - Usar chat interno (boolean, padrão: true)useExternalApi - Usar API externa (boolean, padrão: true)linkInvoice - Link da fatura (texto, padrão: '')Resposta:
{
"id": 25,
"companyId": 3,
"value": 1500.00,
"dueDate": "2025-02-15",
"detail": "Fatura mensal - Janeiro 2025",
"status": "pending",
"users": 10,
"connections": 5,
"queues": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket - opcional)
# Retorna faturas com status 'pending' ou 'overdue'
curl -X GET "http://sua_url/api/1/fatura/pendentes?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (opcional, filtra por empresa)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Resposta:
[
{
"id": 20,
"companyId": 3,
"value": 1500.00,
"dueDate": "2025-02-15",
"detail": "Fatura mensal - Janeiro 2025",
"status": "pending",
"createdAt": "2025-01-20T10:00:00.000Z"
},
{
"id": 18,
"companyId": 3,
"value": 1200.00,
"dueDate": "2025-01-10",
"detail": "Fatura mensal - Dezembro 2024",
"status": "overdue",
"createdAt": "2024-12-20T10:00:00.000Z"
}
]
Nota: As faturas são ordenadas por data de vencimento (mais próximas primeiro).
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket - opcional)
# Retorna faturas vencidas (dueDate < hoje e status != 'paid')
curl -X GET "http://sua_url/api/1/fatura/vencidas?companyId=3" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (opcional, filtra por empresa)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Resposta:
[
{
"id": 18,
"companyId": 3,
"value": 1200.00,
"dueDate": "2025-01-10",
"detail": "Fatura mensal - Dezembro 2024",
"status": "pending",
"createdAt": "2024-12-20T10:00:00.000Z"
}
]
Nota: As faturas são ordenadas por data de vencimento (mais antigas primeiro).
# instalacaoId=1 (instalação no RUB), id=20 (ID da fatura), companyId=3 (empresa no Whaticket - opcional mas recomendado)
curl -X PUT "http://sua_url/api/1/fatura/20/pagar?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Fatura marcada como paga com sucesso",
"invoice": {
"id": 20,
"companyId": 3,
"value": 1500.00,
"dueDate": "2025-02-15",
"status": "paid",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
}
Nota:
companyId é opcional, mas recomendado para garantir que a fatura pertence à empresa especificadastatus = 'paid'# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket - opcional)
curl -X GET "http://sua_url/api/1/fatura/estatisticas?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"total": 50,
"pagas": 35,
"pendentes": 12,
"vencidas": 3,
"valores": {
"total": 75000.00,
"pago": 52500.00,
"pendente": 18000.00,
"vencido": 4500.00
}
}
Nota:
companyId é opcional. Se fornecido, filtra as estatísticas apenas para aquela empresavencidas inclui faturas com dueDate < hoje e status != 'paid'pendentes inclui faturas com status = 'pending' ou status = 'overdue'Nota: Estas rotas gerenciam os planos do Whaticket (banco das instalações), não os planos do sistema RUB.
# instalacaoId=1 (instalação no RUB)
curl -X GET "http://sua_url/api/1/plans" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
isPublic - Filtrar por planos públicos (boolean, opcional)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)Resposta:
[
{
"id": 1,
"name": "Plano Básico",
"users": 5,
"connections": 2,
"queues": 3,
"amount": "99.90",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"isPublic": true,
"recurrence": "monthly",
"trial": false,
"trialDays": 0,
"useOpenAi": true,
"useIntegrations": true,
"useWhatsappOfficial": false,
"wavoip": false,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
# instalacaoId=1 (instalação no RUB), id=1 (ID do plano)
curl -X GET "http://sua_url/api/1/plans/1" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"id": 1,
"name": "Plano Básico",
"users": 5,
"connections": 2,
"queues": 3,
"amount": "99.90",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"isPublic": true,
"recurrence": "monthly",
"trial": false,
"trialDays": 0,
"useOpenAi": true,
"useIntegrations": true,
"useWhatsappOfficial": false,
"wavoip": false,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB)
curl -X POST "http://sua_url/api/1/plans" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Plano Premium",
"users": 20,
"connections": 10,
"queues": 15,
"amount": "299.90",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"isPublic": true,
"recurrence": "monthly",
"trial": false,
"trialDays": 0,
"useOpenAi": true,
"useIntegrations": true,
"useWhatsappOfficial": false,
"wavoip": false
}'
Campos obrigatórios:
name - Nome do plano (obrigatório)Campos opcionais:
users - Número de usuários permitidos (integer, padrão: 0)connections - Número de conexões permitidas (integer, padrão: 0)queues - Número de filas permitidas (integer, padrão: 0)amount - Valor do plano (texto, padrão: null)useWhatsapp - Usar WhatsApp (boolean, padrão: true)useFacebook - Usar Facebook (boolean, padrão: true)useInstagram - Usar Instagram (boolean, padrão: true)useCampaigns - Usar campanhas (boolean, padrão: true)useSchedules - Usar agendamentos (boolean, padrão: true)useInternalChat - Usar chat interno (boolean, padrão: true)useExternalApi - Usar API externa (boolean, padrão: true)useKanban - Usar Kanban (boolean, padrão: true)isPublic - Plano público (boolean, padrão: true)recurrence - Recorrência: "monthly", "yearly", etc. (texto, padrão: null)trial - É plano de teste (boolean, padrão: false)trialDays - Dias de teste (integer, padrão: 0)useOpenAi - Usar OpenAI (boolean, padrão: true)useIntegrations - Usar integrações (boolean, padrão: true)useWhatsappOfficial - Usar WhatsApp Oficial (boolean, padrão: false)wavoip - Usar WAVoIP (boolean, padrão: false)Resposta:
{
"id": 2,
"name": "Plano Premium",
"users": 20,
"connections": 10,
"queues": 15,
"amount": "299.90",
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
# instalacaoId=1 (instalação no RUB), id=1 (ID do plano)
curl -X PUT "http://sua_url/api/1/plans/1" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Plano Básico Atualizado",
"users": 10,
"amount": "149.90"
}'
Resposta:
{
"id": 1,
"name": "Plano Básico Atualizado",
"users": 10,
"connections": 2,
"queues": 3,
"amount": "149.90",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
# instalacaoId=1 (instalação no RUB), id=1 (ID do plano)
curl -X DELETE "http://sua_url/api/1/plans/1" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Plano excluído com sucesso"
}
Nota:
# instalacaoId=1 (instalação no RUB), id=1 (ID do plano)
curl -X GET "http://sua_url/api/1/plans/1/empresas" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"plan": {
"id": 1,
"name": "Plano Básico"
},
"companies": [
{
"id": 3,
"name": "Empresa ABC",
"email": "contato@empresaabc.com",
"status": "active",
"createdAt": "2025-01-15T10:00:00.000Z"
},
{
"id": 5,
"name": "Empresa XYZ",
"email": "contato@empresaxyz.com",
"status": "active",
"createdAt": "2025-01-18T14:00:00.000Z"
}
],
"total": 2
}
Nota: Esta rota lista todas as empresas que estão usando o plano especificado.
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/schedules?companyId=3&limit=50" \
-H "Authorization: Bearer seu_token"
# Filtrar agendamentos de uma data específica (apenas data, sem hora)
# Formato: YYYY-MM-DD
curl -X GET "http://sua_url/api/1/schedules?companyId=3&data=2025-01-20" \
-H "Authorization: Bearer seu_token"
# Filtrar agendamentos de uma data e hora específica
# Formato: YYYY-MM-DDTHH:mm:ss ou ISO 8601
curl -X GET "http://sua_url/api/1/schedules?companyId=3&dataHora=2025-01-20T14:30:00" \
-H "Authorization: Bearer seu_token"
# Filtrar agendamentos entre duas datas
# Formato: YYYY-MM-DD ou ISO 8601
curl -X GET "http://sua_url/api/1/schedules?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
# Combinar filtros: data, usuário, contato, ticket, status
curl -X GET "http://sua_url/api/1/schedules?companyId=3&userId=5&contactId=10&dataInicio=2025-01-01&dataFim=2025-01-31&status=pending&limit=50&offset=0" \
-H "Authorization: Bearer seu_token"
Resposta (com dados relacionados):
[
{
"id": 25,
"body": "Lembrete: Sua consulta está agendada para amanhã às 14h",
"sendAt": "2025-01-21T14:00:00.000Z",
"sentAt": null,
"status": "pending",
"statusTicket": "closed",
"openTicket": "disabled",
"mediaPath": null,
"mediaName": null,
"intervalo": null,
"valorIntervalo": null,
"enviarQuantasVezes": null,
"tipoDias": null,
"contadorEnvio": 0,
"assinar": false,
"reminderDate": null,
"reminderMessage": null,
"reminderSentAt": null,
"reminderStatus": null,
"companyId": 3,
"contact": {
"id": 10,
"name": "João Silva",
"number": "5548999999999",
"profilePicUrl": "https://..."
},
"user": {
"id": 5,
"name": "Sérgio Costa",
"profileImage": "https://..."
},
"ticket": {
"id": 123,
"status": "closed"
},
"queue": {
"id": 10,
"name": "Suporte",
"color": "#00A884"
},
"whatsappId": 1,
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
}
]
# O número 25 é o ID do agendamento (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X GET "http://sua_url/api/1/schedules/25?companyId=3" \
-H "Authorization: Bearer seu_token"
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X POST http://sua_url/api/1/schedules \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"companyId": 3,
"contactId": 10,
"userId": 5,
"ticketId": 123,
"queueId": 10,
"whatsappId": 1,
"body": "Lembrete: Sua consulta está agendada para amanhã às 14h",
"sendAt": "2025-01-21T14:00:00.000Z",
"status": "pending",
"statusTicket": "closed",
"openTicket": "disabled"
}'
Resposta:
{
"id": 25,
"body": "Lembrete: Sua consulta está agendada para amanhã às 14h",
"sendAt": "2025-01-21T14:00:00.000Z",
"status": "pending",
"companyId": 3,
"createdAt": "2025-01-20T12:00:00.000Z",
"updatedAt": "2025-01-20T12:00:00.000Z"
}
Campos disponíveis:
companyId - ID da empresa (obrigatório)contactId - ID do contato (opcional)userId - ID do usuário (opcional)ticketId - ID do ticket (opcional)ticketUserId - ID do usuário do ticket (opcional)queueId - ID da fila (opcional)whatsappId - ID do WhatsApp (opcional)body - Texto da mensagem (obrigatório)sendAt - Data e hora de envio (obrigatório, formato: ISO 8601)status - Status do agendamento (opcional)statusTicket - Status do ticket (opcional, padrão: "closed")openTicket - Abrir ticket (opcional, padrão: "disabled")mediaPath - Caminho da mídia (opcional)mediaName - Nome da mídia (opcional)intervalo - Intervalo de envio (opcional)valorIntervalo - Valor do intervalo (opcional)enviarQuantasVezes - Quantas vezes enviar (opcional)tipoDias - Tipo de dias (opcional)assinar - Assinar mensagem (opcional, padrão: false)reminderDate - Data do lembrete (opcional)reminderMessage - Mensagem do lembrete (opcional)reminderStatus - Status do lembrete (opcional)# O número 25 é o ID do agendamento (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X PUT "http://sua_url/api/1/schedules/25?companyId=3" \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"body": "Lembrete atualizado: Sua consulta está agendada para amanhã às 15h",
"sendAt": "2025-01-21T15:00:00.000Z",
"status": "pending"
}'
Resposta:
{
"id": 25,
"body": "Lembrete atualizado: Sua consulta está agendada para amanhã às 15h",
"sendAt": "2025-01-21T15:00:00.000Z",
"status": "pending",
"updatedAt": "2025-01-20T12:30:00.000Z"
}
Nota: Você pode atualizar apenas os campos que desejar. Os campos não informados permanecerão inalterados.
# O número 25 é o ID do agendamento (não é o companyId)
# companyId pode ser passado como query parameter para validação de segurança
curl -X DELETE "http://sua_url/api/1/schedules/25?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"message": "Agendamento excluído com sucesso"
}
Parâmetros de Query Disponíveis para Listar:
companyId - ID da empresa (obrigatório)userId - Filtrar por ID do usuário (opcional)contactId - Filtrar por ID do contato (opcional)ticketId - Filtrar por ID do ticket (opcional)status - Filtrar por status (opcional)data - Filtrar por data específica (formato: YYYY-MM-DD)dataHora - Filtrar por data e hora específica (formato: ISO 8601)dataInicio - Filtrar a partir de uma data (formato: YYYY-MM-DD ou ISO 8601)dataFim - Filtrar até uma data (formato: YYYY-MM-DD ou ISO 8601)limit - Limite de resultados (padrão: 100)offset - Offset para paginação (padrão: 0)curl -X GET http://sua_url/api/cliente \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"name": "Empresa ABC",
"phone": "47999999999",
"email": "contato@empresa.com",
"instalacaoId": 1,
"instalacaoNome": "Whaticket Produção"
},
{
"id": 2,
"name": "Empresa XYZ",
"phone": "47988888888",
"email": "contato@xyz.com",
"instalacaoId": 2,
"instalacaoNome": "Whaticket Teste"
}
]
curl -X GET http://sua_url/api/companies \
-H "Authorization: Bearer seu_token"
Resposta:
{
"companies": [
{
"id": 1,
"name": "Empresa 1",
"email": null,
"status": true,
"dueDate": null,
"createdAt": "2025-11-20T11:29:18.384Z",
"phone": null,
"document": "",
"lastLogin": "2025-11-20T12:34:27.405Z",
"folderSize": null,
"numberFileFolder": null,
"updatedAtFolder": null,
"generateInvoice": true,
"recurrence": "",
"plan": {
"id": 1,
"name": "Plano 1",
"users": 10,
"connections": 10,
"queues": 10,
"amount": "100",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"useOpenAi": true,
"useIntegrations": true,
"wavoip": false
},
"metrics": {
"folderSize": 8192,
"numberOfFiles": 2,
"lastUpdate": "20/11/2025 07:53:05"
},
"instalacaoId": 1,
"instalacaoNome": "Whaticket Produção"
},
{
"id": 2,
"name": "Empresa 2",
"email": "contato@empresa2.com",
"status": true,
"dueDate": null,
"createdAt": "2025-11-21T10:00:00.000Z",
"phone": "47999999999",
"document": "",
"lastLogin": "2025-11-21T14:30:00.000Z",
"folderSize": null,
"numberFileFolder": null,
"updatedAtFolder": null,
"generateInvoice": true,
"recurrence": "",
"plan": {
"id": 2,
"name": "Plano Premium",
"users": 50,
"connections": 20,
"queues": 20,
"amount": "500",
"useWhatsapp": true,
"useFacebook": true,
"useInstagram": true,
"useCampaigns": true,
"useSchedules": true,
"useInternalChat": true,
"useExternalApi": true,
"useKanban": true,
"useOpenAi": true,
"useIntegrations": true,
"wavoip": true
},
"metrics": {
"folderSize": 16384,
"numberOfFiles": 5,
"lastUpdate": "21/11/2025 08:15:30"
},
"instalacaoId": 2,
"instalacaoNome": "Whaticket Teste"
}
]
}
curl -X GET http://sua_url/api/connections \
-H "Authorization: Bearer seu_token"
Com parâmetro para ocultar session:
curl -X GET "http://sua_url/api/connections?session=0" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"id": 1,
"name": "WhatsApp Principal",
"channel": "whatsapp",
"status": "CONNECTED",
"number": "5548999999999",
"isDefault": true,
"allowGroup": true,
"companyId": 3,
"greetingMessage": "Olá! Bem-vindo...",
"queues": [
{
"id": 10,
"name": "Suporte",
"color": "#00A884",
"greetingMessage": "Bem-vindo à fila de suporte"
},
{
"id": 22,
"name": "Financeiro",
"color": "#1F7AE0",
"greetingMessage": "Bem-vindo à fila financeira"
}
],
"instalacaoId": 1,
"instalacaoNome": "Whaticket Produção",
"createdAt": "2025-01-20T10:00:00.000Z",
"updatedAt": "2025-01-20T10:00:00.000Z"
},
{
"id": 2,
"name": "Instagram Direct",
"channel": "instagram",
"status": "CONNECTED",
"companyId": 3,
"queues": [],
"instalacaoId": 1,
"instalacaoNome": "Whaticket Produção",
"createdAt": "2025-01-21T14:30:00.000Z",
"updatedAt": "2025-01-21T14:30:00.000Z"
}
]
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket), userId=5 (usuário no Whaticket)
curl -X GET http://sua_url/api/1/infousuario/3/5 \
-H "Authorization: Bearer seu_token"
Parâmetros da rota:
/:instalacaoId = ID da instalação no RUB (ex: 1)/:companyId = ID da empresa no Whaticket (ex: 3)/:userId = ID do usuário no Whaticket (ex: 5)Resposta:
{
"usuario": {
"id": 5,
"companyId": 1,
"nome": "Sérgio Costa",
"email": "sergio@empresa.com",
"perfil": "admin",
"fotoPerfil": "https://cdn.whats.com/perfil/123.jpg",
"statusOnline": true,
"ultimoAcesso": "2025-11-20T10:45:00",
"filas": [
{
"id": 10,
"nome": "Suporte",
"cor": "#00A884"
}
],
"conexoes": [],
"permissoes": {
"admin": true,
"verDashboards": true,
"criarCampanhas": true,
"atenderTickets": true,
"verUsuarios": true,
"verRelatorios": true
}
},
"tickets": {
"atendidos": {
"24h": 18,
"48h": 34,
"semana": 112,
"mes": 451,
"semestre": 2192,
"ano": 3890
},
"fechados": {
"24h": 15,
"48h": 29,
"semana": 94,
"mes": 407,
"semestre": 1980,
"ano": 3550
},
"reabertos": {
"24h": 1,
"48h": 2,
"semana": 8,
"mes": 31,
"semestre": 155,
"ano": 299
},
"taxas": {
"fechamento": "91%",
"reabertura": "7.6%",
"abandono": "3%"
}
},
"vendas": {
"total": {
"24h": 940.50,
"48h": 1800.00,
"semana": 5340.90,
"mes": 19850.89,
"semestre": 103550.22,
"ano": 209450.40
},
"ticketsComVenda": {
"24h": 4,
"48h": 8,
"semana": 21,
"mes": 72,
"semestre": 320,
"ano": 602
},
"ticketMedio": 275.30,
"melhoresProdutos": []
},
"mensagens": {
"totalEnviadas": 1820,
"totalRecebidas": 1950,
"respostasPorHora": {
"media": 32,
"pico": 58
},
"sentimento": {
"positivo": 68,
"neutro": 22,
"negativo": 10
},
"tagsMaisUsadas": []
},
"qualidade": {
"avaliacoes": {
"5estrelas": 57,
"4estrelas": 24,
"3estrelas": 6,
"2estrelas": 1,
"1estrela": 2
},
"mediaAvaliacao": 4.52,
"nps": 72
},
"comportamento": {
"errosComuns": [],
"usoTagErrada": 8,
"inatividadeMinutos": 45,
"horariosProdutivos": {
"melhorHora": "14:00",
"piorHora": "17:00"
}
},
"rankingInterno": {
"posicaoGeral": 4,
"posicaoFilas": {}
},
"painelIA": {
"probabilidadeBurnout": "12%",
"riscoRotatividade": "baixo",
"nivelStressIA": "leve",
"recomendacoes": [
"Aumentar pausas entre 15h e 17h",
"Evitar acúmulo de tickets no período da manhã"
]
}
}
curl -X GET http://sua_url/api/1/admin/backup \
-H "Authorization: Bearer seu_token" \
--output backup_completo.sql
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/admin/backup?companyId=3" \
-H "Authorization: Bearer seu_token" \
--output backup_empresa_3.sql
# instalacaoId=1 (instalação no RUB), userId=5 (usuário no Whaticket), contactId=10 (contato no Whaticket)
curl -X GET http://sua_url/api/1/admin/relatorio/5/10 \
-H "Authorization: Bearer seu_token"
Parâmetros da rota:
/:instalacaoId = ID da instalação no RUB (ex: 1)/:userId = ID do usuário no Whaticket (ex: 5)/:contactId = ID do contato no Whaticket (ex: 10)Resposta:
{
"atendente": {
"id": 5,
"nome": "Sérgio Costa",
"fotoPerfil": "https://..."
},
"contato": {
"id": 10,
"nome": "João Silva",
"fotoPerfil": "https://..."
},
"tickets": [
{
"data": "2025-01-20",
"dia": "20/01/2025",
"dialogos": [
{
"ticketId": 123,
"status": "closed",
"dia": "20/01/2025",
"dialogos": [
{
"id": 456,
"body": "Olá, como posso ajudar?",
"fromMe": true,
"createdAt": "2025-01-20T10:00:00",
"mediaType": null,
"mediaUrl": null
}
]
}
]
}
]
}
# Copia empresa 3 da instalação 1 para a instalação 2
curl -X POST http://sua_url/api/admin/copiar-instancia \
-H "Authorization: Bearer seu_token" \
-H "Content-Type: application/json" \
-d '{
"instalacaoIdOrigem": 1,
"companyId": 3,
"instalacaoIdDestino": 2
}'
Parâmetros:
instalacaoIdOrigem = ID da instalação no RUB de origem (ex: 1)companyId = ID da empresa no Whaticket a ser copiada (ex: 3)instalacaoIdDestino = ID da instalação no RUB de destino (ex: 2)Resposta:
{
"message": "Migração concluída",
"resultados": {
"Companies": 1,
"Users": 10,
"Contacts": 500,
"Tickets": 1000,
"Messages": 5000
}
}
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X DELETE http://sua_url/api/1/admin/empresa/3 \
-H "Authorization: Bearer seu_token"
Parâmetros da rota:
/:instalacaoId = ID da instalação no RUB (ex: 1)/:companyId = ID da empresa no Whaticket a ser excluída (ex: 3)Resposta:
{
"message": "Empresa excluída com sucesso",
"resultados": {
"Companies": 1,
"Users": 10,
"Contacts": 500,
"Tickets": 1000
}
}
Authorization: Bearer TOKEN ou X-Token: TOKENlimit e offset para paginaçãoinstalacaoId: ID da instalação cadastrada no RUB (banco de dados do RUB)companyId: ID da empresa dentro do banco do WhaticketExemplo prático:
instalacaoId = 1 no RUB```
GET /api/1/contatos?companyId=3
```
Onde: 1 = instalacaoId (RUB) e 3 = companyId (Whaticket)
Os relatórios fornecem análises detalhadas sobre a operação, performance de atendentes, SLA, qualidade e muito mais.
Rota:
# instalacaoId=1 (instalação no RUB), companyId=3 (empresa no Whaticket)
curl -X GET "http://sua_url/api/1/relatorios/volume-tickets?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31&periodo=mes" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)dataInicio - Data inicial (opcional, formato: YYYY-MM-DD)dataFim - Data final (opcional, formato: YYYY-MM-DD)periodo - Período de agrupamento: dia, semana, mes (opcional, padrão: dia)Resposta:
{
"volumeTotal": 150,
"volumePorPeriodo": [
{
"periodo": "2025-01-01",
"quantidade": 10
},
{
"periodo": "2025-01-02",
"quantidade": 15
}
],
"crescimentoPercentual": 12.5,
"horariosPico": [
{
"hora": 9,
"quantidade": 25
},
{
"hora": 14,
"quantidade": 20
}
],
"categoriasMaisAcionadas": [
{
"id": 1,
"nomeFila": "Suporte",
"quantidade": 50
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/sla-geral?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"tempoMedioPrimeiraResposta": 15.5,
"tempoMedioResolucao": 120.3,
"percentualDentroSLA": 85.5,
"filasEstouramSLA": [
{
"id": 2,
"nomeFila": "Técnico",
"total": 30,
"estouramSLA": 8
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/retrabalho?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"totalTicketsReabertos": 12,
"ticketsReabertos": [
{
"id": 100,
"contactId": 50,
"userId": 5,
"queueId": 1,
"motivoFinalizacao": "Resolvido",
"vezesReaberto": 2
}
],
"motivosReabertura": [
{
"motivoFinalizacao": "Problema não resolvido",
"quantidade": 8
}
],
"departamentosReincidencia": [
{
"id": 1,
"nomeFila": "Suporte",
"ticketsReabertos": 5
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/produtividade-departamento?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31&queueId=1" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)dataInicio - Data inicial (opcional)dataFim - Data final (opcional)queueId - ID da fila/departamento (opcional, filtra por departamento específico)Resposta:
{
"produtividade": [
{
"id": 1,
"nomeFila": "Suporte",
"ticketsRecebidos": 100,
"tempoMedioAtendimentoMinutos": 45.5,
"ticketsFechados": 85
}
],
"assuntosRecorrentes": [
{
"queueId": 1,
"nomeFila": "Suporte",
"assunto": "Problema de acesso",
"quantidade": 20
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/indicadores-atendente?companyId=3&userId=5&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)userId - ID do atendente (opcional, se não fornecido retorna todos)dataInicio - Data inicial (opcional)dataFim - Data final (opcional)Resposta:
[
{
"userId": 5,
"nomeAtendente": "João Silva",
"email": "joao@empresa.com",
"ticketsAtendidos": 50,
"tempoMedioRespostaMinutos": 12.5,
"tempoMedioResolucaoMinutos": 95.3,
"resolvidosSemRepasse": 45,
"ticketsFechados": 48,
"taxaResolucaoSemRepasse": 93.75
}
]
Rota:
curl -X GET "http://sua_url/api/1/relatorios/ranking-performance?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31&limite=10" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)dataInicio - Data inicial (opcional)dataFim - Data final (opcional)limite - Número de atendentes no ranking (opcional, padrão: 10)Resposta:
[
{
"userId": 5,
"nomeAtendente": "João Silva",
"email": "joao@empresa.com",
"volume": 50,
"tempoMedioResposta": 12.5,
"tempoMedioResolucao": 95.3,
"fechamentos": 48,
"dentroSLA": 45,
"resolvidosSemRepasse": 45,
"posicao": 1,
"scoreTotal": 85.5
}
]
Rota:
curl -X GET "http://sua_url/api/1/relatorios/transferencias?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"quemTransfere": [
{
"userId": 5,
"nomeAtendente": "João Silva",
"totalTransferencias": 10
}
],
"quemRecebe": [
{
"userId": 6,
"nomeAtendente": "Maria Santos",
"ticketsRecebidos": 15
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/tempo-etapa?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"etapa": "open",
"quantidade": 50,
"tempoMedioMinutos": 45.5,
"tempoMinimoMinutos": 5.2,
"tempoMaximoMinutos": 180.5
},
{
"etapa": "closed",
"quantidade": 100,
"tempoMedioMinutos": 120.3,
"tempoMinimoMinutos": 10.0,
"tempoMaximoMinutos": 480.0
}
]
Rota:
curl -X GET "http://sua_url/api/1/relatorios/tempo-parado?companyId=3&horas=24" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)horas - Horas sem interação (opcional, padrão: 24)Resposta:
{
"totalTicketsSemInteracao": 15,
"porFaixa": {
"1h": 5,
"3h": 4,
"24h": 3,
"48h+": 3
},
"tickets": [
{
"id": 100,
"status": "open",
"contactId": 50,
"userId": 5,
"queueId": 1,
"nomeFila": "Suporte",
"nomeAtendente": "João Silva",
"minutosSemInteracao": 1440,
"ultimaInteracao": "2025-01-19T10:00:00.000Z"
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/tempo-dia-semana?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"diaSemana": 1,
"nomeDia": "Segunda-feira",
"quantidade": 25,
"tempoMedioMinutos": 120.5
},
{
"diaSemana": 5,
"nomeDia": "Sexta-feira",
"quantidade": 15,
"tempoMedioMinutos": 95.3
}
]
Rota:
curl -X GET "http://sua_url/api/1/relatorios/motivos-contato?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
[
{
"motivo": "Problema de acesso",
"quantidade": 30,
"contatosUnicos": 25
},
{
"motivo": "Dúvida sobre produto",
"quantidade": 20,
"contatosUnicos": 18
}
]
Rota:
curl -X GET "http://sua_url/api/1/relatorios/automacao?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"totalTickets": 150,
"resolvidosAutomaticamente": 30,
"percentualAutomatico": 20.0,
"horariosAutomacao": [
{
"hora": 22,
"automaticos": 10
},
{
"hora": 23,
"automaticos": 8
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/carga-trabalho?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"distribuicaoPorFila": [
{
"id": 1,
"nomeFila": "Suporte",
"ticketsAbertos": 25,
"pendentes": 10,
"emAtendimento": 15
}
],
"distribuicaoPorAtendente": [
{
"userId": 5,
"nomeAtendente": "João Silva",
"ticketsAbertos": 12,
"emAtendimento": 8
}
],
"excessoCarga": [
{
"userId": 6,
"nomeAtendente": "Maria Santos",
"ticketsAbertos": 15
}
],
"totalTicketsAbertos": 50
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/tickets-sensiveis?companyId=3&dataInicio=2025-01-01&dataFim=2025-01-31&queueId=1" \
-H "Authorization: Bearer seu_token"
Parâmetros de Query:
companyId - ID da empresa (obrigatório)dataInicio - Data inicial (opcional)dataFim - Data final (opcional)queueId - ID da fila (opcional, filtra por fila específica)Resposta:
{
"total": 10,
"tickets": [
{
"id": 100,
"status": "closed",
"createdAt": "2025-01-15T10:00:00.000Z",
"updatedAt": "2025-01-15T12:00:00.000Z",
"nomeFila": "RH",
"nomeAtendente": "João Silva",
"nomeContato": "Maria Santos"
}
]
}
Rota:
curl -X GET "http://sua_url/api/1/relatorios/ticket/100?companyId=3" \
-H "Authorization: Bearer seu_token"
Resposta:
{
"ticket": {
"id": 100,
"status": "closed",
"contactId": 50,
"userId": 5,
"queueId": 1,
"createdAt": "2025-01-15T10:00:00.000Z",
"updatedAt": "2025-01-15T12:00:00.000Z",
"nomeFila": "Suporte",
"nomeAtendente": "João Silva",
"emailAtendente": "joao@empresa.com",
"nomeContato": "Maria Santos",
"numeroContato": "47999999999"
},
"mensagens": [
{
"id": 1000,
"body": "Olá, como posso ajudar?",
"fromMe": true,
"createdAt": "2025-01-15T10:05:00.000Z"
}
],
"logs": [
{
"id": 1,
"type": "open",
"createdAt": "2025-01-15T10:00:00.000Z",
"nomeUsuario": "João Silva"
}
],
"estatisticas": {
"tempoTotalMinutos": 120,
"tempoPrimeiraRespostaMinutos": 5,
"totalMensagens": 10,
"totalLogs": 5
}
}
Nota: Todas as rotas de relatórios são independentes de permissões do plano. Apenas requerem autenticação válida. Os parâmetros dataInicio e dataFim são opcionais, mas recomendados para filtrar os resultados por período específico.