📚 Documentação da API RUB 360 House

Obs: Sistema compatível com Multi100, Multi-Flow, Multi-Flow-Pro, Whaticket Ninja, PWL, ERP-360, ERP-Delux

Exemplos de Uso da API RUB

Configuração Inicial

1. Cadastrar uma Instalação

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
}

2. Listar Todas as Instalações

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"
  }
]

3. Buscar Instalação por ID

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.

4. Atualizar Instalação

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.

5. Excluir Instalação

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.

Operações com Entidades

Importante:

Exemplo: Se você cadastrou uma instalação com ID 1 no RUB, e quer acessar a empresa 3 do Whaticket:

Contatos

Criar Contato

# 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:

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"
}

Listar Contatos

# 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"

Buscar Contato por ID

curl -X GET http://sua_url/api/1/contatos/123 \
  -H "Authorization: Bearer seu_token"

Atualizar Contato

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"
  }'

Atualizar Data de Aniversário do Contato

# 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 Data de Aniversário do Contato

# 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:

Excluir Contato

curl -X DELETE http://sua_url/api/1/contatos/123 \
  -H "Authorization: Bearer seu_token"

Usuários

Listar Todos os Usuários de Todos os Bancos

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"
  }
]

Listar Usuários de uma Instalação

# 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.

Buscar Usuário por ID

# 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.

Criar Usuário

# 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:

Campos opcionais:

Permissões (opcionais):

Relacionamentos (opcionais):

Resposta:

{
  "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.

Atualizar Usuário

# 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:

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:

Excluir Usuário

# 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"
}

Quick Messages (Mensagens Rápidas)

Listar Mensagens Rápidas

# 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"
  }
]

Listar Mensagens Rápidas por Usuário

# 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"

Buscar Mensagem Rápida por ID

# 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"
}

Criar Mensagem Rápida

# 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:

Atualizar Mensagem Rápida

# 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.

Excluir Mensagem Rápida

# 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"
}

Tickets

Listar Todos os Tickets

# 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"

Listar Tickets com Filtro de Data

# 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"

Listar Tickets por Telefone

# 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"

Listar Tickets por Usuário

# 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"

Listar Tickets com Múltiplos Filtros

# 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"
    }
  }
]

Buscar Ticket por ID

# 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.

Criar Ticket

# 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
  }'

Atualizar Ticket

# 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.

Excluir Ticket

# 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.

Transferir Ticket para Outra Conexão (WhatsApp)

# 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.

Transferir Ticket para Outro Atendente

# 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:

Nota:

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:

Buscar Mensagens de um Ticket

# 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.

Enviar Mensagem em um Ticket

# 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:

Nota: O parâmetro companyId é opcional, mas recomendado para garantir que o ticket pertence à empresa especificada.

Parâmetros de Query Disponíveis:

Tags

Listar Tags

# 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.

Buscar Tag por ID

# 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"
}

Criar Tag

# 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:

Campos disponíveis:

Nota: O nome da tag deve ser único dentro da mesma empresa.

Atualizar 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 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.

Excluir 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 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:

Chats (Chat Interno)

Listar Chats

# 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"

Listar Chats por Usuário

# 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"

Listar Chats por Proprietário

# 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"

Listar Chats por Tipo (Grupo ou Individual)

# 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"
  }
]

Buscar Chat por ID

# 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"
}

Criar Chat

# 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:

Nota: Se não informar users, o owner será automaticamente adicionado ao chat.

Atualizar 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:

Excluir 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 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:

FlowBuilders (Chatbots)

Listar FlowBuilders

# 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"

Listar FlowBuilders por Usuário

# 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"

Listar FlowBuilders Ativos/Inativos

# 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"
  }
]

Buscar FlowBuilder por ID

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"
}

Criar FlowBuilder

# 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:

Nota: O sistema valida que o usuário pertence à empresa informada.

Atualizar FlowBuilder

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.

Excluir FlowBuilder

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:

Exportar FlowBuilders em SQL

# 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.

Importar FlowBuilders de SQL

# 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:

Nota:

Queues (Filas)

Listar Filas

# 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"
  }
]

Buscar Fila por ID

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"
}

Criar Fila

# 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:

Nota: O nome e a cor devem ser únicos dentro da mesma empresa.

Atualizar Fila

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.

Excluir Fila

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:

Nota: As filas são ordenadas por orderQueue (ordem) e depois por data de criação.

Prompts

Listar Prompts

# 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"

Listar Prompts por Fila

# 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"
  }
]

Buscar Prompt por ID

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"
}

Criar Prompt

# 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:

Nota: O sistema valida que a fila pertence à empresa informada.

Atualizar Prompt

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.

Excluir Prompt

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:

Companies (Empresas)

As rotas de companies permitem listar e criar empresas, incluindo informações do plano e métricas.

Criar Empresa com Usuário Master

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:

Campos opcionais:

Resposta:

{
  "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:

Listar Empresas de uma Instalação Específica

Rota 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"
      }
    }
  ]
}

Connections (Conexões)

O sistema suporta diferentes tipos de conexões através do campo channel:

Listar Conexões

# 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"

Listar Conexões por Tipo

# Filtrar apenas conexões WhatsApp
curl -X GET "http://sua_url/api/1/connections?companyId=3&channel=whatsapp" \
  -H "Authorization: Bearer seu_token"

Listar Conexões por Status

# 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"
  }
]

Buscar Conexão por ID

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"
}

Criar Conexão WhatsApp

# 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."
  }'

Criar Conexão Instagram

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"
  }'

Criar Conexão WhatsApp Oficial (WABA)

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:

Nota:

Atualizar Conexão

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.

Excluir Conexão

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:

Nota: As conexões são ordenadas por isDefault (padrão primeiro) e depois por data de criação.

Settings (Configurações Gerais)

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.

Buscar chatBotType

# 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:

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"
}

Atualizar chatBotType

# 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:

Campos opcionais:

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:

Vendas

Listar Vendas (Tickets com venda)

# 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:

Estatísticas de Vendas

# 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:

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:

Buscar Venda por ID

# 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.

Registrar Venda

# 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:

Resposta de sucesso:

{
  "message": "Venda registrada com sucesso",
  "venda": {
    "id": 123,
    "valorVenda": 1500.00,
    "userId": 45,
    "finalizadoComVenda": true,
    "companyId": 3,
    ...
  }
}

Atualizar Venda

# 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:

Resposta de sucesso:

{
  "message": "Venda atualizada com sucesso",
  "venda": {
    "id": 123,
    "valorVenda": 1800.00,
    "userId": 50,
    "finalizadoComVenda": true,
    ...
  }
}

Excluir Venda

# 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).

Campanhas

Criar Campanha

# 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:

Campos opcionais:

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.

Listar Campanhas Ativas

# 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:

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"
  }
]

Ativar Campanha

# 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:

Desativar Campanha

# 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:

Estatísticas de Campanha

# 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:

Faturas

Criar Fatura

# 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:

Campos opcionais:

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"
}

Listar Faturas Pendentes

# 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:

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).

Listar Faturas Vencidas

# 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:

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).

Marcar Fatura como Paga

# 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:

Estatísticas de Faturas

# 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:

Planos (Whaticket)

Nota: Estas rotas gerenciam os planos do Whaticket (banco das instalações), não os planos do sistema RUB.

Listar Planos

# instalacaoId=1 (instalação no RUB)
curl -X GET "http://sua_url/api/1/plans" \
  -H "Authorization: Bearer seu_token"

Parâmetros de Query:

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"
  }
]

Buscar Plano por ID

# 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"
}

Criar Plano

# 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:

Campos opcionais:

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"
}

Atualizar Plano

# 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.

Excluir Plano

# 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:

Listar Empresas de um Plano

# 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.

Schedules (Agendamentos)

Listar Agendamentos

# 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"

Listar Agendamentos por Data Específica

# 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"

Listar Agendamentos por Data e Hora Específica

# 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"

Listar Agendamentos por Faixa de Data

# 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"

Listar Agendamentos com Múltiplos Filtros

# 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"
  }
]

Buscar Agendamento por ID

# 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"

Criar Agendamento

# 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:

Atualizar Agendamento

# 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.

Excluir Agendamento

# 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:

Rotas Especiais

Listar Todas as Empresas de Todos os Bancos

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"
  }
]

Listar Todas as Empresas de Todos os Bancos

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"
    }
  ]
}

Listar Todas as Conexões de Todos os Bancos

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"
  }
]

Informações Detalhadas do Usuário

# 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:

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ã"
    ]
  }
}

Rotas Administrativas

Backup do Banco de Dados

Backup Completo

curl -X GET http://sua_url/api/1/admin/backup \
  -H "Authorization: Bearer seu_token" \
  --output backup_completo.sql

Backup de uma Empresa Específica

# 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

Relatório de Contato

# 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:

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
            }
          ]
        }
      ]
    }
  ]
}

Copiar Instância (Migração)

# 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:

Resposta:

{
  "message": "Migração concluída",
  "resultados": {
    "Companies": 1,
    "Users": 10,
    "Contacts": 500,
    "Tickets": 1000,
    "Messages": 5000
  }
}

Excluir Empresa

# 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:

Resposta:

{
  "message": "Empresa excluída com sucesso",
  "resultados": {
    "Companies": 1,
    "Users": 10,
    "Contacts": 500,
    "Tickets": 1000
  }
}

Notas Importantes

Entendendo os IDs

Exemplo prático:

```

GET /api/1/contatos?companyId=3

```

Onde: 1 = instalacaoId (RUB) e 3 = companyId (Whaticket)

Relatórios

Os relatórios fornecem análises detalhadas sobre a operação, performance de atendentes, SLA, qualidade e muito mais.

1.1. Volume de Tickets

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:

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
    }
  ]
}

1.2. SLA Geral

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
    }
  ]
}

1.3. Taxa de Retrabalho

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
    }
  ]
}

2.1. Produtividade por Departamento

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:

Resposta:

{
  "produtividade": [
    {
      "id": 1,
      "nomeFila": "Suporte",
      "ticketsRecebidos": 100,
      "tempoMedioAtendimentoMinutos": 45.5,
      "ticketsFechados": 85
    }
  ],
  "assuntosRecorrentes": [
    {
      "queueId": 1,
      "nomeFila": "Suporte",
      "assunto": "Problema de acesso",
      "quantidade": 20
    }
  ]
}

3.1. Indicadores Individuais por Atendente

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:

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
  }
]

3.2. Ranking de Performance

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:

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
  }
]

3.3. Transferências

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
    }
  ]
}

4.1. Tempo por Etapa

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
  }
]

4.2. Tempo Parado (Tickets sem Interação)

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:

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"
    }
  ]
}

4.3. Tempo por Dia da Semana

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
  }
]

5.2. Motivos de Contato

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
  }
]

6.1. Automação

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
    }
  ]
}

7.1. Carga de Trabalho

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
}

8.1. Tickets Sensíveis

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:

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"
    }
  ]
}

8.2. Relatório Completo por Ticket

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.