Bedrud Documentación

Los endpoints de gestión de salas están bajo /api/room/. Todos los endpoints requieren autenticación.

Resumen

EndpointMétodoDescripción
/api/room/createPOSTCrear una nueva sala
/api/room/joinPOSTUnirse a una sala y obtener un token de LiveKit
/api/room/listGETListar salas disponibles
/api/room/:roomId/kick/:identityPOSTExpulsar a un participante (admin)
/api/room/:roomId/mute/:identityPOSTSilenciar a un participante (admin)
/api/room/:roomId/video/:identity/offPOSTDesactivar video de participante (admin)

Endpoints

Crear Sala

Crea una nueva sala de reunión. El usuario autenticado se convierte en el administrador de la sala.

POST /api/room/create

Encabezados: Authorization: Bearer <accessToken>

Cuerpo de la Solicitud:

{
  "name": "team-standup",
  "isPublic": true,
  "mode": "standard",
  "settings": {
    "allowChat": true,
    "allowVideo": true,
    "allowAudio": true,
    "requireApproval": false,
    "e2ee": false
  }
}

Nota: El campo name es opcional. Si se omite o está vacío, el servidor generará automáticamente un nombre seguro para URL aleatorio en el formato xxx-xxxx-xxx (ej. bkf-qmzl-rja).

Reglas de Nombres de Sala:

Los nombres de sala aparecen en la URL como https://bedrud.xyz/m/NAME, por lo que deben ser seguros para URL:

ReglaDescripción
Caracteres permitidosLetras minúsculas (a-z), dígitos (0-9) y guiones (-)
Longitud mínima3 caracteres
Longitud máxima63 caracteres
Sin caracteres especiales#, @, _, ., /, \, <, >, &, %, +, =, ;, :, ', ", ?, !, espacios, etc. no están permitidos
Sin guiones al principio/final-sala y sala- son inválidos
Sin guiones consecutivossala--nombre es inválido
Solo minúsculasLas mayúsculas se rechazan; la entrada se convierte automáticamente a minúsculas
ÚnicoCada nombre de sala debe ser único

Respuesta (200):

{
  "id": "uuid",
  "name": "team-standup",
  "createdBy": "user-uuid",
  "isActive": true,
  "isPublic": true,
  "maxParticipants": 0,
  "settings": {
    "allowChat": true,
    "allowVideo": true,
    "allowAudio": true,
    "requireApproval": false,
    "e2ee": false
  },
  "livekitHost": "wss://lk.bedrud.xyz",
  "mode": "standard"
}

Campos

CampoTipoRequeridoDescripción
namestringNoNombre de sala seguro para URL (se genera automáticamente si se omite)
isPublicbooleanNoSi la sala aparece en listados públicos
modestringNoModo de sala (ej. "standard")
maxParticipantsnumberNoNúmero máximo de participantes
settings.allowChatbooleanNoSi el chat de texto está habilitado
settings.allowVideobooleanNoSi el video está habilitado
settings.allowAudiobooleanNoSi el audio está habilitado
settings.requireApprovalbooleanNoSi los participantes necesitan aprobación del administrador
settings.e2eebooleanNoSi el cifrado de extremo a extremo está habilitado

Unirse a Sala

Únete a una sala existente y recibe un token de LiveKit para la conexión multimedia.

POST /api/room/join

Encabezados: Authorization: Bearer <accessToken>

Cuerpo de la Solicitud:

{
  "roomName": "team-standup"
}

Respuesta (200):

{
  "id": "uuid",
  "name": "team-standup",
  "token": "eyJ...",
  "createdBy": "user-uuid",
  "adminId": "user-uuid",
  "isActive": true,
  "isPublic": true,
  "maxParticipants": 20,
  "expiresAt": "2026-02-16T12:00:00Z",
  "settings": { ... },
  "livekitHost": "wss://lk.bedrud.xyz",
  "mode": "standard"
}

El token es un token de acceso firmado de LiveKit. Úsalo para conectarte al servidor de LiveKit a través de WebSocket:

import { Room } from 'livekit-client';
 
const room = new Room();
await room.connect(livekitUrl, token);

Listar Salas

Obtén una lista de salas que el usuario ha creado.

GET /api/room/list

Encabezados: Authorization: Bearer <accessToken>

Respuesta (200):

[
  {
    "id": "uuid",
    "name": "team-standup",
    "createdBy": "user-uuid",
    "isActive": true,
    "maxParticipants": 20,
    "expiresAt": "2026-02-16T12:00:00Z",
    "settings": { ... },
    "mode": "standard",
    "relationship": "creator"
  }
]

Expulsar Participante

Elimina a un participante de la sala. Solo el administrador de la sala puede hacer esto.

POST /api/room/:roomId/kick/:identity

Encabezados: Authorization: Bearer <accessToken>

Respuesta (200):

{
  "status": "success"
}

Silenciar Participante

Silencia el micrófono de un participante. Solo el administrador de la sala puede hacer esto.

POST /api/room/:roomId/mute/:identity

Encabezados: Authorization: Bearer <accessToken>

Respuesta (200):

{
  "status": "success"
}

Desactivar Video de Participante

Apaga la cámara de un participante. Solo el administrador de la sala puede hacer esto.

POST /api/room/:roomId/video/:identity/off

Encabezados: Authorization: Bearer <accessToken>

Respuesta (200):

{
  "status": "success"
}

Controles de Administrador

Las acciones de administrador de sala (expulsar, silenciar, apagar video) solo están disponibles para el usuario que creó la sala (adminId). Intentar estas acciones como no administrador devuelve un error 403.

Matriz de Permisos

AcciónAdmin de SalaSuper AdminUsuario RegularInvitado
Crear salaNo
Unirse a sala
Listar salas
ExpulsarNoNo
SilenciarNoNo
Apagar videoNoNo

Respuestas de Error

Todos los errores siguen un formato consistente:

{
  "error": "human-readable error message"
}

Errores de Crear Sala

EstadoMensaje de ErrorDescripción
400"Invalid request body"JSON malformado
400"room name must contain only lowercase letters, numbers, and hyphens"El nombre contiene caracteres especiales (#, @, _, etc.)
400"room name must be at least 3 characters"Nombre demasiado corto
400"room name must be at most 63 characters"Nombre demasiado largo
409"a room with this name already exists"Nombre duplicado
500"Failed to create media room"Error del servidor de LiveKit
500"Failed to create room"Error de base de datos

Errores Generales

EstadoSignificado
400Solicitud incorrecta (datos faltantes/inválidos)
401No autenticado
403No autorizado (no-admin intentando acción de admin)
404Sala no encontrada
409Conflicto (recurso duplicado)
500Error interno del servidor

Véase también