Como configurar uma conexão WebSocket?

Pranav

Pranav

Última atualização em Jun 3, 2026

WebSockets estabelecem uma conexão contínua entre o cliente e o servidor, permitindo comunicação bidirecional. O Chatwoot utiliza essa conexão para fornecer atualizações em tempo real sobre eventos da plataforma. Para se conectar ao WebSocket do Chatwoot, basta fornecer um token e seguir as instruções de configuração descritas neste guia.

Nota: Este recurso é experimental, e a documentação pode mudar a cada versão. Além disso, não há garantia de compatibilidade retroativa, por isso é importante garantir que você está utilizando a versão mais recente da implementação.

Por que devo usar uma conexão WebSocket?

Uma conexão WebSocket permite atualizações de dados em tempo real, tornando-a ideal para clientes como um SDK de cliente Android ou iOS para o Chatwoot. Isso ajuda a atualizar o dashboard sem a necessidade de recarregar a página. Assim, pode melhorar a experiência do usuário e aumentar a produtividade de um agente.

Como configurar uma conexão WebSocket com o Chatwoot?

Para configurar uma conexão WebSocket com o Chatwoot, você precisa iniciar uma conexão utilizando o token de autenticação PubSub fornecido pelo Chatwoot. A URL para a conexão é wss://<your-installation-url>/cable. Se você estiver usando o Chatwoot Cloud, pode usar wss://app.chatwoot.com/cable como URL.

Um token PubSub é um token utilizado para autenticar um cliente ao se conectar a um serviço PubSub (publicar-assinar). O cliente deve apresentar esse token ao serviço para estabelecer uma conexão e começar a publicar ou assinar mensagens.

Existem dois tipos de tokens PubSub disponíveis no Chatwoot, conforme listado abaixo.

  1. Token PubSub de Usuário: Este token possui os privilégios de um agente/admin e receberá todos os eventos listados posteriormente nesta página. Você pode obter o token PubSub chamando a API de Perfil.

  2. Token PubSub de Contato: O Chatwoot gera um token PubSub único para cada sessão de contato. Este token pode ser usado para se conectar ao WebSocket e receber atualizações em tempo real para a mesma sessão. Quando um contato é criado por meio das APIs públicas, o pubsub_token é incluído no payload da resposta. Este token concede acesso somente aos eventos relacionados à sessão atual, como conversation.created,  conversation.status_changedmessage.createdmessage.updatedconversation_typing_onconversation_typing_off e presence.update.

Consulte as APIs do Cliente para construir integrações em tempo real voltadas ao cliente utilizando o Chatwoot.

Nota: Este token pode ser rotacionado regularmente de acordo com o tipo de instalação. Certifique-se de estar utilizando o token mais recente.

Como se conectar ao WebSocket do Chatwoot?

Para conectar-se ao WebSocket do Chatwoot, utilize o comando subscribe e inclua seu pubSubToken, accountId, e userId (se estiver usando um token de usuário) na requisição de conexão. Aqui está um exemplo de como se conectar ao Chatwoot.

// Adicione um método auxiliar para converter JSON em string
const stringify = (payload = {}) => JSON.stringify(payload);

const pubSubToken = "<contact/user-pub-sub-token>";
const accountId = "<your-account-id-in-integer>";
const userId = "<user-id-in-integer-if-using-user-token>";
const connection = new WebSocket(
  "wss://app.chatwoot.com/cable"
);

connection.send(
  stringify({
    command: "subscribe",
    identifier: stringify({
      channel: "RoomChannel",
      pubsub_token: pubSubToken,
      account_id: accountId,
      user_id: userId,
    }),
  })
);

// A string esperada em connection.send está no formato:
// {"command":"subscribe","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\",\\"account_id\\": account_id_integer,\\"user_id\\":user_id_integer }"}

Publicando presença para o servidor WebSocket

Para manter o status online dos seus usuários no Chatwoot, você pode enviar um evento de atualização de presença para o Chatwoot a cada 30 segundos. Essa ação manterá o status do agente/contato como online.

Como atualizar a presença de um agente/admin?

Para atualizar a presença de um agente ou admin, envie o seguinte payload para o servidor:

const userPayload = stringify({
  command: "message",
  identifier: stringify({
    channel: "RoomChannel",
    pubsub_token: "<user-pubsub-token>",
    account_id: accountId,
    user_id: userId,
  }),
  data: stringify({ action: "update_presence" }),
});

connection.send(userPayload);
// A string esperada em connection.send está no formato:
// {"command":"message","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\",\\"account_id\\": account_id_integer,\\"user_id\\":user_id_integer ","data":"{\\"action\\":\\"update_presence\\"}"}

Como atualizar a presença de um contato?

Para atualizar a presença de um contato, envie o seguinte payload para o servidor:

const agentPayload = stringify({
  command: "message",
  identifier: stringify({
    channel: "RoomChannel",
    pubsub_token: "<user-pubsub-token>",
  }),
  data: stringify({ action: "update_presence" }),
});

connection.send(agentPayload);
// A string esperada em connection.send está no formato:
// {"command":"message","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\","data":"{\\"action\\":\\"update_presence\\"}"}

Payload do WebSocket

Objetos

Um evento pode conter qualquer um dos objetos a seguir como payload. Diferentes tipos de objetos suportados no Chatwoot são os seguintes.

Conversação

O seguinte payload será retornado para uma conversação.

{
  "additional_attributes": {
    "browser": {
      "device_name": "string",
      "browser_name": "string",
      "platform_name": "string",
      "browser_version": "string",
      "platform_version": "string"
    },
    "referer": "string",
    "initiated_at": {
      "timestamp": "iso-datetime"
    }
  },
  "can_reply": "boolean",
  "channel": "string",
  "id": "integer",
  "inbox_id": "integer",
  "contact_inbox": {
    "id": "integer",
    "contact_id": "integer",
    "inbox_id": "integer",
    "source_id": "string",
    "created_at": "datetime",
    "updated_at": "datetime",
    "hmac_verified": "boolean"
  },
  "messages": ["Array of message objects"],
  "meta": {
    "sender": {
      // Objeto de Contato
    },
    "assignee": {
      // Objeto de Usuário
    }
  },
  "status": "string",
  "unread_count": "integer",
  "agent_last_seen_at": "unix-timestamp",
  "contact_last_seen_at": "unix-timestamp",
  "timestamp": "unix-timestamp",
  "account_id": "integer"
}

Contato

O seguinte payload será retornado para um contato.

{
  "additional_attributes": "object",
  "custom_attributes": "object",
  "email": "string",
  "id": "integer",
  "identifier": "string or null",
  "name": "string",
  "phone_number": "string or null",
  "thumbnail": "string"
}

Usuário

O seguinte payload será retornado para um agente/admin.

{
  "id": "integer",
  "name": "string",
  "available_name": "string",
  "avatar_url": "string",
  "availability_status": "string",
  "thumbnail": "string"
}

Mensagem

O seguinte payload será retornado para uma mensagem.

{
  "id": "integer",
  "content": "string",
  "account_id": "integer",
  "inbox_id": "integer",
  "message_type": "integer",
  "created_at": "unix-timestamp",
  "updated_at": "datetime",
  "private": "boolean",
  "status": "string",
  "source_id": "string / null",
  "content_type": "string",
  "content_attributes": "object",
  "sender_type": "string",
  "sender_id": "integer",
  "external_source_ids": "object",
  "sender": {
    "type": "string - contact/user"
    // Objeto de Usuário ou Contato
  }
}

Notificação

O seguinte payload será retornado para uma notificação.

{
  "id": "integer",
  "notification_type": "string",
  "primary_actor_type": "string",
  "primary_actor_id": "integer",
  "primary_actor": {
    "can_reply": "boolean",
    "channel": "string",
    "id": "integer",
    "inbox_id": "integer",
    "meta": {
      "assignee": {
        "id": "integer",
        "name": "string",
        "available_name": "string",
        "avatar_url": "string",
        "type": "user",
        "availability_status": "string",
        "thumbnail": "string"
      },
      "hmac_verified": "boolean"
    },
    "agent_last_seen_at": "unix-timestamp",
    "contact_last_seen_at": "unix-timestamp",
    "timestamp": "unix-timestamp",
  },
  "read_at": "unix-timestamp",
  "secondary_actor": "object/null",
  "created_at":"unix-timestamp",
  "account_id": "integer",
  "push_message_title": "string"
}

Identificador

Cada evento terá um atributo identifier no seguinte formato.

{
  "identifier": "{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"token\\",\\"account_id\\":id,\\"user_id\\":user_id}"
}

Mensagem

Cada evento incluirá um atributo message no qual retornamos o nome do evento, bem como os dados associados. Para ver a lista de eventos, consulte a documentação abaixo.

Tipos de Eventos

conversation.created

Este evento é acionado quando uma nova conversação é iniciada. Se estiver assinando o token PubSub do contato, este evento incluirá apenas dados relacionados à sessão específica associada ao token PubSub.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "conversation.created",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

conversation.read

Este evento é acionado e enviado aos agentes/admins que têm acesso à caixa de entrada, quando um contato lê uma mensagem.

Disponível para: agente/admin

{
  "message": {
    "event": "conversation.read",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

message.created

Este evento é acionado e enviado aos agentes, admins, contatos quando uma nova mensagem é criada em uma conversação à qual eles têm acesso.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "message.created",
    "data": {
      // Objeto de Mensagem estará disponível aqui
    }
  }
}

message.updated

Este evento é acionado e enviado aos agentes, admins, contatos quando uma mensagem é atualizada em uma conversação à qual eles têm acesso.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "message.updated",
    "data": {
      // Objeto de Mensagem estará disponível aqui
    }
  }
}

conversation.status_changed

Este evento é enviado aos agentes, admins, contatos quando o status de uma conversação é atualizado.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "conversation.status_changed",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

conversation.typing_on

Este evento é enviado aos agentes, admins, contatos quando um contato ou agente começa a digitar uma resposta.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "conversation.typing_on",
    "data": {
      "conversation": {
        // Objeto de Conversação estará disponível aqui
      },
      "user": {
        // Objeto de Contato / Agente,Admin estará disponível aqui.
      },
      "is_private": "boolean", // Indica se o agente está digitando uma nota privada ou não.
      "account_id": "integer"
    }
  }
}

conversation.typing_off

Este evento é enviado aos agentes, admins, contatos quando um contato ou agente para de digitar uma resposta.

Disponível para: agente/admin, contato

{
  "message": {
    "event": "conversation.typing_off",
    "data": {
      "conversation": {
        // Objeto de Conversação estará disponível aqui
      },
      "user": {
        // Objeto de Contato / Usuário estará disponível aqui.
      },
      "account_id": "integer"
    }
  }
}

assignee.changed

Este evento é enviado aos agentes/admins com acesso a uma caixa de entrada quando o agente atribuído é alterado.

Disponível para: agente/admin

{
  "message": {
    "event": "assignee.changed",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

team.changed

Este evento é enviado aos agentes/admins com acesso a uma caixa de entrada quando o time atribuído é alterado.

Disponível para: agente/admin

{
  "message": {
    "event": "team.changed",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

conversation.contact_changed

Este evento é enviado aos agentes/admins quando dois contatos são mesclados e todas as conversações são consolidadas sob um único contato.

Disponível para: agente/admin

{
  "message": {
    "event": "conversation.contact_changed",
    "data": {
      // Objeto de Conversação estará disponível aqui
    }
  }
}

contact.created

Este evento é enviado aos agentes/admins quando um contato é criado.

Disponível para: agente/admin

{
  "message": {
    "event": "contact.created",
    "data": {
      // Objeto de Contato estará disponível aqui
    }
  }
}

contact.updated

Este evento é enviado aos agentes/admins quando um contato é atualizado.

Disponível para: agente/admin

{
  "message": {
    "event": "contact.updated",
    "data": {
      // Objeto de Contato estará disponível aqui
    }
  }
}

presence.update

Disponível tanto para agente quanto para o contato, este evento fornece atualizações em tempo real sobre o status de disponibilidade dos usuários no sistema. O evento entregue aos contatos não incluirá informações sobre o status de disponibilidade de outros contatos.

Disponível para: agente/admin

{
  "message": {
    "event": "presence.update",
    "data": {
      "account_id": "integer",
      "users": {
        "user-id": "string"
      },
      "contacts": {
        "contact-id": "string"
      }
    }
  }
}

notification_created

Este evento é enviado aos agentes/admins quando uma notificação é criada.

Disponível para: agente/admin