Docs/Sesiones

Sesiones

Crea una sesión de visualización en vivo, envía una invitación al cliente y consulta su estado. Las marcas de tiempo son ISO-8601 UTC (…Z).

Dos formas de autenticarse
Crear una sesión, consultar su estado, obtener una sesión y emitir un token de agente aceptan un JWT del panel, una clave de API de equipo, o un token OAuth con el ámbito correspondiente. Listar sesiones sigue siendo exclusivo del panel (JWT).

Crear una sesión

POST/sessions

Crea una sesión y su invitación, y luego envía el enlace de invitación por el channel elegido. Envía teamId con un JWT del panel; una clave de API implica su propio equipo.

CampoDescripción
teamIdEl UUID del equipo. Requerido al autenticarse con un JWT del panel; se infiere automáticamente de una clave de API.
channelCómo se entrega la invitación: sms, email, o link (no se envía nada — tú distribuyes la URL).
recipientPhoneEl número de teléfono del cliente en formato E.164 (p. ej. +15555550123). Requerido cuando channel es sms.
recipientEmailLa dirección de correo del cliente. Requerida cuando channel es email — el mensaje incluye el enlace más un código QR incorporado.
noteUna etiqueta interna opcional, de hasta 500 caracteres (p. ej. un número de ticket), mostrada junto a la sesión en el panel.
ttlMinutesCuánto tiempo permanece válida la invitación, en minutos (11440). El valor predeterminado es 30.
smsConsentObligatorio cuando channel es sms: debe ser true para confirmar que el destinatario aceptó recibir un SMS de seeitlive.io. Pueden aplicarse tarifas del operador.
metadataPares clave/valor personalizados opcionales (un mapa plano de cadenas, p. ej. tu propio id de agente externo o referencia de ticket). Se almacenan tal cual y se devuelven en las lecturas. Hasta 30 claves; claves de hasta 64 caracteres, valores de hasta 500.
shortLinkOpcional. Si es true, genera un enlace corto sitl.cc/s/code para la URL del invitado, devuelto como inviteShortUrl. El valor predeterminado es false. Las invitaciones por SMS siempre usan un enlace corto.
protectionOpcional. password o totp. Obliga al invitado a introducir un secreto antes de poder compartir su cámara. Omítelo para un enlace sin protección.
protectionSecretOpcional. La contraseña, o una semilla TOTP en base32. Si no la envías, generamos una y la devolvemos una sola vez en la respuesta.
curl -X POST https://api.seeitlive.io/v1/sessions \
  -H "Authorization: Bearer sil_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "channel": "sms", "recipientPhone": "+15555550123", "smsConsent": true, "note": "Ticket #4821" }'

inviteShortUrl es un alias corto sitl.cc/s/code de la inviteUrl del invitado, o null cuando no se generó ningún enlace corto. Los agentes siempre incrustan el agentViewUrl completo.

json
{
  "id": "f74f1305-2222-4a11-8b1e-1234567890ab",
  "status": "pending",
  "inviteCode": "aZ3kQ9",
  "inviteUrl": "https://seeitlive.io/u/aZ3kQ9#3n9F1Qk7xY2zR8vB5tW6uL0mC4pD1sA...",
  "inviteShortUrl": "https://sitl.cc/s/aB3xK9p2",
  "agentViewUrl": "https://seeitlive.io/a/pL2mN8#7dR2Xa4Wq9Kj6bV3nF1yT8sH5cE0uZ...",
  "protection": "totp",
  "protectionSecret": "JBSWY3DPEHPK3PXP",
  "protectionOtpauthUrl": "otpauth://totp/SeeItLive:session-aZ3kQ9?secret=JBSWY3DPEHPK3PXP&issuer=SeeItLive",
  "expiresAt": "2026-07-07T09:42:00.000Z"
}
Se muestra una sola vez
inviteUrl y agentViewUrl llevan los tokens de la sesión en texto plano en el fragmento de su URL. Se devuelven solo al crear la sesión — guárdalos de inmediato.

Obtener una sesión

GET/sessions/:id

Devuelve una sesión, incluyendo su metadata y su invitación (código, expiración, hora de apertura, canal, destinatario) — nunca un hash de token ni el secreto del invitado. Requiere el permiso view_sessions en un JWT del panel, o un token de API/OAuth con el ámbito sessions:read. Devuelve 404 si la sesión no existe.

curl https://api.seeitlive.io/v1/sessions/f74f1305-2222-4a11-8b1e-1234567890ab \
  -H "Authorization: Bearer $SEEITLIVE_KEY"
json
{
  "id": "f74f1305-2222-4a11-8b1e-1234567890ab",
  "teamId": "b5a2b2b0-6c7a-4e2f-9f2a-1234567890ab",
  "env": "live",
  "status": "live",
  "createdByClientId": "9d8c7b6a-5f4e-3d2c-1b0a-abcdef123456",
  "createdByApiKeyId": null,
  "note": "Ticket #4821",
  "metadata": { "ticketId": "4821" },
  "startedAt": "2026-07-07T09:14:03.000Z",
  "endedAt": null,
  "createdAt": "2026-07-07T09:12:00.000Z",
  "invitation": {
    "code": "aZ3kQ9",
    "expiresAt": "2026-07-07T09:42:00.000Z",
    "openedAt": "2026-07-07T09:13:41.000Z",
    "channel": "sms",
    "recipient": "+15555550123"
  }
}

Estado de la sesión

GET/sessions/:id/status

Consulta este endpoint para saber cuándo el cliente está frente a la cámara.

status avanza de pendingringingliveended a medida que el cliente se une y se retira, o pasa directamente a expired (la invitación nunca se abrió) o cancelled.

json
{
  "id": "f74f1305-2222-4a11-8b1e-1234567890ab",
  "status": "live",
  "startedAt": "2026-07-07T09:14:03.000Z",
  "endedAt": null,
  "producerCount": 1,
  "hasVideo": true
}

Proteger una sesión

Una sesión protegida pide al invitado un secreto que le comunicas por otro canal: normalmente el agente se lo dicta por teléfono. Con password el secreto es fijo durante toda la vida de la invitación. Con totp es un código de 6 dígitos que cambia cada 30 segundos; envía tu propia semilla base32 para mostrar el código actual en tus propias herramientas, o deja que la generemos.

La comparación de contraseñas es flexible a propósito
Una contraseña dictada no debe fallar por una mayúscula: la comparación ignora mayúsculas y espacios sobrantes. Las contraseñas generadas tienen 8 caracteres, sin I, O, 0 ni 1.

Leer el secreto actual

GET/sessions/:id/protection

Devuelve lo que el agente debe dictar: la contraseña, o el código del momento con los segundos que le quedan. La semilla TOTP solo se devuelve una vez, al crear la sesión.

json
{
  "type": "totp",
  "password": null,
  "code": "418205",
  "secondsRemaining": 17,
  "locked": false,
  "failedAttempts": 0
}

Definir la protección

PUT/sessions/:id/protection

Cambia el desafío de invitado de una sesión después de crearla. Omita protectionSecret y se genera uno automáticamente: una contraseña de 8 caracteres o una semilla TOTP base32. Devuelve la misma estructura que el GET anterior.

json
{
  "protection": "password",
  "protectionSecret": "K7QMX2RT"
}

Enviar {"protection": "none"} elimina el desafío y borra con él cualquier bloqueo. Cada cambio reinicia el contador de intentos fallidos, porque al cliente se le va a comunicar un secreto distinto.

Levantar un bloqueo

POST/sessions/:id/protection/reset

Cinco respuestas incorrectas bloquean la invitación. Esto levanta el bloqueo; pase rotate: true para generar además un secreto nuevo. La rotación es opcional porque la causa habitual es un error de tecleo, y un secreto nuevo solo obliga a dictarlo otra vez.

json
{
  "rotate": true
}

Desbloqueo del invitado

POST/invitations/unlock

La página del invitado canjea la respuesta por un token de desbloqueo de corta duración, que después exige el handshake de señalización. Cinco respuestas incorrectas bloquean la invitación y devuelven 403 con code: "invitation_locked" hasta que un agente la desbloquee.

Envía el code de la invitación, su token (el fragmento de la URL de invitación) y la respuesta del cliente en answer: la contraseña, o el código de 6 dígitos del momento. Omite answer en una invitación sin protección.

json
{
  "code": "aZ3kQ9",
  "token": "3n9F1Qk7xY2zR8vB5tW6uL0mC4pD1sA...",
  "answer": "418205"
}

Si acierta, recibes una prueba de corta duración. Caduca a los 60 minutos, o con la invitación si esta expira antes, y deja de aceptarse en cuanto se renueva el secreto.

json
{
  "unlockToken": "sil_gu_eyJpIjoiOWQ4YzdiNmEiLCJlIjoxNzg1...",
  "expiresAt": "2026-08-05T10:42:00.000Z"
}

Reclamar la invitación

POST/invitations/claim

La página del invitado llama a este endpoint para autenticarse y hacer que la sesión suene en la pantalla del agente. Una invitación protegida debe presentar además el token unlock del paso anterior.

json
{
  "code": "aZ3kQ9",
  "token": "3n9F1Qk7xY2zR8vB5tW6uL0mC4pD1sA...",
  "unlock": "sil_gu_eyJpIjoiOWQ4YzdiNmEiLCJlIjoxNzg1..."
}

Sin él —o con una prueba emitida para otra invitación, o contra un secreto ya renovado— la llamada se rechaza con 403 y code: "protection_required", sin tocar la sesión.

json
{
  "statusCode": 403,
  "error": "ForbiddenError",
  "message": "This session is protected — enter the password or code first",
  "code": "protection_required"
}

Emitir un token de agente

POST/sessions/:id/agent-token

Emite un nuevo token de vista de agente, válido durante 120 minutos, para una sesión a la que el emisor ya tiene acceso — úsalo para reincrustar el visor, por ejemplo tras la expiración del agentViewUrl original. Acepta un label opcional (1 a 64 caracteres) mostrado en la lista de visores del panel; si se omite, un emisor con clave de API u OAuth obtiene "Integration viewer", y un JWT del panel obtiene "Dashboard viewer". Requiere el permiso view_sessions en un JWT del panel, o un token de API/OAuth con el ámbito sessions:write.

curl -X POST https://api.seeitlive.io/v1/sessions/f74f1305-2222-4a11-8b1e-1234567890ab/agent-token \
  -H "Authorization: Bearer $SEEITLIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "label": "Odoo — crm.lead 42" }'
json
{
  "code": "qR7mZ2",
  "token": "5aQ1nD8vC3xF6yK9bH2wS7pM4dJ0uT1gN...",
  "agentViewUrl": "https://seeitlive.io/a/qR7mZ2#5aQ1nD8vC3xF6yK9bH2wS7pM4dJ0uT1gN..."
}

Resolver una invitación (público)

GET/u/:code

El endpoint público que la página del invitado llama para resolver un code de invitación en su sesión y marca — no requiere token ni clave. Unirse a la transmisión se autentica por separado, con el token incorporado en el fragmento de la URL de invitación.

json
{
  "sessionId": "f74f1305-2222-4a11-8b1e-1234567890ab",
  "brand": {
    "name": "Acme Support",
    "brandLogoUrl": null,
    "brandColor": "#1a2b3c"
  },
  "status": "pending",
  "protection": "totp",
  "locked": false
}
Limitado en frecuencia
Limitado a 20 solicitudes por minuto por IP, ya que no está autenticado y es accesible desde cualquier lugar.
Sesiones