Integração de Webhooks com TSplus Remote Support
Visão geral
Webhooks permitem que você conecte TSplus Remote Support aos seus próprios sistemas (ticketing, CRM, SIEM, ferramentas internas). Quando um evento acontece na sua assinatura, o Remote Support envia um HTTP
POST
solicitação — contendo um payload JSON descrevendo o evento — para uma URL que você controla.
Cada solicitação é assinada criptograficamente para que seu servidor possa verificar se realmente vem do Remote Support e não foi adulterado.
Casos de uso típicos:
- Crie ou atualize automaticamente um ticket quando uma sessão de suporte termina.
- Arquive as transcrições de chat de sessão em seu próprio armazenamento.
- Acione notificações internas ou fluxos de trabalho de automação.
Pré-requisitos
Para configurar webhooks, certifique-se de que você tenha:
- Uma assinatura administrador conta.
-
Um acesso público
HTTPS
endpoint capaz de receber
POSTsolicitações. - A capacidade de ler os cabeçalhos de solicitação HTTP e o corpo da solicitação bruta em seu servidor (necessário para verificar a assinatura).
Configurando um webhook
-
Abra o TSplus Remote Support console de administração.
-
No menu à esquerda, expanda Integração e clique Webhooks .
-
Clique Adicionar um webhook .
-
Preencha o formulário:
- URL — o endpoint HTTPS que receberá os eventos.
- Descrição opcional — uma etiqueta para ajudá-lo a identificar este ponto final.
- Eventos — selecione pelo menos um tipo de evento para se inscrever.
-
Clique Salvar .
-
A segredo é gerado e exibido uma vez Copie-o agora e armazene-o com segurança — ele é usado para verificar a assinatura de solicitações recebidas e não será exibido novamente.
Segurança: Para sua proteção, a URL é validada quando você a salva. Os pontos finais apontando para
localhostou endereços IP privados/internos são rejeitados.
Gerenciando seus webhooks
Da lista de Webhooks, você pode:
- Enviar um evento de teste ícone de frasco — coloca em fila uma entrega de amostra para que você possa confirmar se seu endpoint recebe e aceita solicitações.
- Editar (ícone de lápis) — altere a URL, descrição, eventos inscritos ou ative/desative o endpoint.
- Excluir (ícone de lixo) — remover permanentemente o endpoint.
Cada endpoint mostra um status :
- Ativo — o endpoint está habilitado e recebendo eventos.
- Desativado — o endpoint foi desativado manualmente.
- Desativado automaticamente — O Suporte Remoto desativou automaticamente o endpoint após 10 entregas consecutivas falhadas Corrija o endpoint e reative-o a partir do formulário de edição.
Para inspecionar tentativas de entrega individuais, filtrar eventos passados ou tentar novamente uma entrega falhada, veja Rastreamento de Entrega de Webhook .
Formato de carga útil
Cada evento é entregue como um
POST
solicitação com um corpo JSON e os seguintes cabeçalhos:
| Cabeçalho | Descrição |
|---|---|
Tipo de Conteúdo
|
application/json
|
X-Webhook-Signature
|
assinatura HMAC-SHA256 do corpo bruto, prefixada com
sha256=
|
X-Webhook-Id
|
Identificador de evento exclusivo (use-o para idempotência do seu lado) |
X-Webhook-Timestamp
|
timestamp ISO 8601 da entrega |
Agente do Usuário
|
RemoteSupport-Webhook/1.0
|
Todos os eventos compartilham um envelope comum. Apenas o conteúdo de
dados
mudanças dependendo do tipo de evento:
{ "id": "evt_abc123def456", "type": "session.ended", "created_at": "2026-07-10T15:00:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { }}
sessão.iniciada
Enviado quando uma nova sessão de suporte é criada (o primeiro agente se conecta a um computador).
{ "id": "evt_abc123def456", "type": "session.started", "created_at": "2026-07-10T14:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "started_at": "2026-07-10T14:30:00Z" }}
sessão.terminada
Enviado quando uma sessão de suporte termina (todos os participantes desconectados). O conteúdo inclui a transcrição completa do chat coletada durante a sessão.
{ "id": "evt_xyz789ghi012", "type": "session.ended", "created_at": "2026-07-10T15:00:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "started_at": "2026-07-10T14:30:00Z", "ended_at": "2026-07-10T15:00:00Z", "duration_seconds": 1800, "is_abnormal_closure": false, "chat_transcript": [ { "timestamp": "2026-07-10T14:31:00Z", "sender": "agent", "message": "Hello, how can I help you?" }, { "timestamp": "2026-07-10T14:31:30Z", "sender": "client", "message": "My screen is black" } ] }}
é_fechamento_anormaléverdadeirosomente quando uma sessão é encerrada pela plataforma após uma reinicialização inesperada do relé. Nesse caso, otranscrição_do_chatestá vazio.
participante.juntou-se
Enviado quando um agente entra em uma sessão.
{ "id": "evt_join789abc", "type": "participant.joined", "created_at": "2026-07-10T14:32:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "joined_at": "2026-07-10T14:32:00Z" }}
participante.esquerda
Enviado quando um agente sai de uma sessão.
duração_segundos
é quanto tempo aquele agente esteve conectado.
{ "id": "evt_left456def", "type": "participant.left", "created_at": "2026-07-10T14:37:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "duration_seconds": 300, "left_at": "2026-07-10T14:37:00Z" }}
não assistido.conectado
Enviado quando uma sessão é estabelecida através de acesso não supervisionado (um agente se conectando com uma senha a um computador que já está online, em oposição a um usuário ao vivo compartilhando manualmente sua tela). Ele dispara exatamente como
sessão.iniciada
, mas apenas para sessões de acesso não supervisionadas.
nome_de_usuario
identifica o agente que está se conectando.
{ "id": "evt_unatt123on", "type": "unattended.connected", "created_at": "2026-07-10T14:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "user_name": "Jane Doe", "connected_at": "2026-07-10T14:30:00Z" }}
desconectado.sem supervisão
Enviado quando uma sessão de acesso não supervisionado termina (todos os participantes desconectados). Ele é acionado exatamente como
sessão.terminada
, mas apenas para sessões de acesso não supervisionado; nenhum participante único é atribuído, uma vez que a sessão como um todo termina.
duração_segundos
é quanto tempo a sessão durou.
{ "id": "evt_unatt456off", "type": "unattended.disconnected", "created_at": "2026-07-10T15:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "duration_seconds": 3600, "disconnected_at": "2026-07-10T15:30:00Z" }}
arquivo.transferido
Enviado quando um arquivo é transferido durante uma sessão. Apenas
metadados
é enviado — o conteúdo do arquivo nunca é armazenado nem transmitido.
direção
é
upload
(agent para máquina remota) ou
download
(máquina remota para agente).
nome_de_usuario
identifica o agente e pode estar vazio quando um download não pode ser atribuído a um único agente.
{ "id": "evt_file456abc", "type": "file.transferred", "created_at": "2026-07-10T14:45:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "file_name": "diagnostic.zip", "file_size_bytes": 2048576, "direction": "download", "timestamp": "2026-07-10T14:45:00Z" }}
Verificando a assinatura
Seu endpoint deve sempre verificar a assinatura antes de confiar em uma solicitação. Qualquer pessoa que conheça sua URL poderia, de outra forma, enviar eventos falsos; sem o segredo, não podem produzir uma assinatura válida.
Para verificar um pedido:
- Leia o corpo da solicitação bruta (os bytes exatos recebidos — não reserialize o JSON).
-
Calcular
HMAC-SHA256(rawBody, seuSegredo)e codificá-lo em hexadecimal. -
Prefixe com
sha256=e compare-o com oX-Webhook-Signaturecabeçalho usando uma comparação em tempo constante.
Node.js
const crypto = require('crypto');
function verifyWebhook(rawBody, signatureHeader, secret) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody, 'utf8') .digest('hex');
const a = Buffer.from(expected); const b = Buffer.from(signatureHeader || ''); return a.length === b.length && crypto.timingSafeEqual(a, b);}
Python
import hmacimport hashlib
def verify_webhook(raw_body: bytes, signature_header: str, secret: str) -> bool: expected = "sha256=" + hmac.new( secret.encode("utf-8"), raw_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header or "")
Entrega e tentativas
- Seu endpoint deve responder com um 2xx código de status o mais rápido possível. O pedido expira após 10 segundos .
- Se uma entrega falhar, o Suporte Remoto tenta novamente com um cronograma de retrocesso exponencial: 10s, 30s, 1min, 5min, 15min, 1h, 4h, 24h (até 8 tentativas em 24 horas).
-
As tentativas ocorrem em erros de conexão, HTTP
429e, e5xxrespostas. Outro4xxas respostas são tratadas como falhas permanentes e são não tentou novamente. - Depois 10 entregas consecutivas falhadas o endpoint é automaticamente desativado .
Para evitar o processamento do mesmo evento duas vezes (por exemplo, após uma nova tentativa), use o
X-Webhook-Id
cabeçalho (ou o
id
campo na carga útil) como uma chave de idempotência.
Eventos disponíveis
| Evento | Descrição |
|---|---|
sessão.iniciada
|
Uma nova sessão de suporte foi criada (o primeiro agente se conecta). |
sessão.terminada
|
Uma sessão de suporte foi encerrada. Inclui a duração e a transcrição completa do chat. |
participante.juntou-se
|
Um agente entrou em uma sessão. |
participante.esquerda
|
Um agente saiu de uma sessão. Inclui quanto tempo eles estiveram conectados. |
não assistido.conectado
|
Um computador não supervisionado ficou online. |
desconectado.sem supervisão
|
Um computador não supervisionado ficou offline. Inclui quanto tempo permaneceu conectado. |
arquivo.transferido
|
Um arquivo foi transferido durante uma sessão (metadados apenas: nome, tamanho, direção). |