Socket.IO não é WebSocket puro — use um cliente Socket.IO (protocolo Engine.IO v4). Em JavaScript:
socket.io-client. Há clientes oficiais e da comunidade para Python, Java, Swift, Kotlin e outros.Conexão
O gateway roda em um endereço separado da API REST — não use a mesma URL base. Solicite o endereço do gateway do seu ambiente ao suporte.Autenticação
O handshake aceita o mesmo JWT retornado porPOST /auth/login, por três vias — em ordem de prioridade:
- Header
Authorization: Bearer <jwt> auth.tokenno handshake (recomendado para browsers, como no exemplo acima)- Cookie
access_token
Salas: como os eventos chegam até você
O gateway não envia tudo para todo mundo. Depois de conectar, o cliente entra em salas emitindo eventos de inscrição (veja Eventos do cliente) — e cada evento do servidor é entregue às salas relevantes. O fluxo típico de uma tela de atendimento:1
Identifique a sessão
Emita
user_logged_in com o userId do usuário logado — habilita notificações, fila pessoal e eventos de rascunho.2
Entre nas salas das equipes
Emita
user_join_team com os ids das equipes do atendente — habilita os eventos da fila de espera (conversa nova, transferência para a equipe).3
Observe os chats visíveis
Emita
user_start_watch_chats com os ids dos chats renderizados na lista — habilita atualizações desses itens.4
Ao abrir uma conversa
Emita
user_start_attendance com o chatId — habilita message.upsert/message.update daquela conversa.Reconexão
O servidor mantém uma janela de recuperação de sessão de 2 minutos (salas e pacotes perdidos são restaurados em quedas curtas). Mesmo assim, sempre re-emita os eventos de inscrição (user_logged_in, user_join_team, user_start_watch_chats, user_start_attendance) no evento connect do cliente — a janela de recuperação vive em memória e não sobrevive a um restart do servidor.
Versionamento
O vocabulário documentado nestas páginas faz parte do contrato v1:- Mudança quebra-compatibilidade (renomear evento, remover campo, mudar tipo) exige evento novo + descontinuação comunicada do antigo — nunca alteração in-place.
- Mudança aditiva (campo novo opcional, evento novo) pode acontecer a qualquer momento — trate campos desconhecidos como ignoráveis.
- Payloads novos carregam
schemaVersionno envelope (mesmo padrão dos webhooks).
call.*, whiteboard.*) e salas internas de administração do sistema.