Saltar al contenido

Ticket de uso único para abrir o WebSocket do chat (apelido, sai no próximo deploy)

POST/api/chat/ticket

Auth
Requiere token
Clave de API:
No acepta clave de API
X-CommunityId
X-CommunityId Envía el X-CommunityId de la comunidad en la que ocurre la operación.
Las descripciones de los endpoints vienen de la especificación de la API y, por ahora, están en portugués. La interfaz alrededor está traducida.

**Apelido antigo, por um deploy:** o app novo usa `POST /api/realtime/ticket` e `/api/realtime/socket` (subprotocolo `memberfy-realtime`), que funcionam com o chat ligado ou desligado. Esta rota e `/api/chat/socket` ficam só para abas abertas com o app antigo, com a regra de antes (chat desligado: 403 e fechamento 4003). Os eventos abaixo valem para os dois sockets.

Qualquer papel. Devolve um ticket de **uso único**, válido por 60 s, preso à pessoa **e a esta comunidade**. Abra `wss://<api>/api/chat/socket` (`data.path`) passando o ticket como segundo subprotocolo: `new WebSocket(url, ['memberfy-chat', ticket])` (`data.protocols`); o servidor responde com `memberfy-chat`. O ticket nunca vai na URL (ela fica em log de roteador); na query ele é ignorado. Trocar de comunidade no app fecha o socket e pede outro ticket. Sem ticket válido a conexão é recusada antes de virar WebSocket (401). O servidor manda `ping` a cada 25 s; reconecte com backoff pedindo ticket novo.

**Eventos do servidor** (JSON `{ type, data }`): `ready`, `message.new` (uma `ChatMessage`, mais `silent: true` quando quem recebe está indisponível ou Ocupado; o e-mail de aviso de quem está Ocupado segue a regra de Disponível), `message.deleted` (`{ id, conversationId, deletedAt }`), `typing` (`{ conversationId, profileId }`), `read` (`{ conversationId, profileId, readAt }`), `conversation.cleared` (`{ conversationId, clearedAt }`, só para quem limpou o histórico), `presence.delta` (`{ profileId, online, status?, lastSeenAt?, profile?, canStart?, connection? }`, só para quem está disponível; com `online: false` vem `lastSeenAt` (visto por último, arredondado ao minuto; `null` quando a pessoa ou quem recebe desligou `chatShowLastSeen`, e no bloqueio); com `online: true` vem `status` (`AVAILABLE`, `AWAY` ou `BUSY`), e toda troca de status com o app aberto (inclusive o Ausente automático entrar ou sair) publica de novo `online: true` com o `status` novo; com `online: true` vêm também `connection` e `canStart` como quem recebe veria aquela pessoa na linha de `GET /api/chat/members`, para inserir a linha sem buscar de novo; `canStart` some enquanto o servidor ainda não leu a regra de quem recebe, e um plano novo reflete em até um minuto), `conversation.blocked` (`{ conversationId, profileId, blocked }`, só para quem bloqueou), `me.updated` (`{ chatAvailable, chatStatus, chatShowLastSeen }`, quando o status ou o `chatShowLastSeen` da própria pessoa muda), `connection.requested` / `connection.accepted` / `connection.removed` (`{ connectionId, profileId, connection, profile? }`: `profileId` é sempre a outra pessoa; recusa e bloqueio só avisam quem agiu), `notification.new` (uma `Notification`), `notification.read` (`{ ids? , all?, unreadCount }`), `notification.removed` (`{ id }`), `chat.settings` (`{ enabled, whoCanStart, startMode }`; desligado fecha o socket com o código 4003), `session.revoked` (`{}`: a pessoa saiu da comunidade ou a sessão foi encerrada; o socket fecha com 4004 e o app não deve reconectar com a mesma sessão) e `pong`. **Do cliente:** `{ "type": "typing", "conversationId": "<uuid>" }`, `{ "type": "presence.idle", "idle": true|false }` (a aba ficou inativa ou voltou; a pessoa fica `AWAY` quando **todas** as abas estão inativas; uma mudança por conexão a cada 10 s, a de dentro da janela espera e vale a última) e `{ "type": "ping" }`; quadros de até 4 KB, sem binário, no máximo 5 por segundo (acima disso o socket fecha com 1008). Até 10 sockets por pessoa por servidor (o mais antigo fecha com 4009). O ticket vale para a geração da sessão em que foi pedido. Sem Redis: 503, e o app segue buscando pelas rotas.

Headers

NombreTipoDescripción
X-CommunityIdopcionalstring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Cuerpo de la solicitud application/json

La especificación no declara los campos de este cuerpo (una subida multipart, por ejemplo). Consulta la guía del tema.

Respuestas

CódigoDescripción
201Ticket emitido.
401Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`).
403Autenticado, mas sem permissão para esta operação.
500Erro interno do servidor.
503Tempo real fora do ar (sem Redis); use as rotas.

Ejemplo con curl

curl -X POST "https://api.memberfy.net/api/chat/ticket" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID" \
  -H "Content-Type: application/json" \
  -d '{}'