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.
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.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", "user_id": 42, "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.
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.terminada
|
Uma sessão de suporte foi encerrada. Inclui a duração e a transcrição completa do chat. |
Mais tipos de eventos serão adicionados em versões futuras.