API REST + WebSocket para TerminalServer.es. Base URL: https://terminalserver.es
La API de TerminalServer.es sigue convenciones REST estándar. Todas las respuestas son JSON.
https://terminalserver.es/api/ http://localhost:8080/api/ ← desarrollo
| Método | Descripción |
|---|---|
| GET | Leer un recurso |
| POST | Crear un recurso |
| PUT | Reemplazar un recurso completamente |
| PATCH | Actualizar campos específicos |
| DELETE | Eliminar un recurso |
La API usa JWT Bearer tokens. Incluye el token en el header Authorization o en el header X-API-Key (para API Keys).
Authorization: Bearer eyJhbGciOiJIUzI1NiIs... # O con API Key: X-API-Key: ts_abc123def456...
Obtén tu token haciendo POST a /api/auth/login. Los tokens de usuario expiran en 24h (o 30 días si usas remember: true). Los tokens de admin no expiran por defecto.
| Código | Significado |
|---|---|
| 200 | OK — solicitud exitosa |
| 201 | Created — recurso creado |
| 400 | Bad Request — parámetros inválidos |
| 401 | Unauthorized — token inválido o expirado |
| 403 | Forbidden — sin permisos para esta acción |
| 404 | Not Found — recurso no encontrado |
| 409 | Conflict — recurso ya existe (ej: email duplicado) |
| 429 | Too Many Requests — rate limit alcanzado |
| 500 | Internal Server Error |
{ "error": "Mensaje descriptivo del error" }Crea una nueva cuenta de usuario. El plan inicial siempre es free.
Body (JSON)
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| name | string | Req | Nombre completo |
| string | Req | Email único | |
| password | string | Req | Mínimo 8 caracteres |
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{"name":"Juan García","email":"juan@example.com","password":"MiPass123!"}'| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| string | Req | Email de la cuenta | |
| password | string | Req | Contraseña |
| remember | boolean | Opt | Si true, el token dura 30 días |
Devuelve los datos del usuario cuyo token se envía en el header Authorization.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| current | string | Req | Contraseña actual |
| newPassword | string | Req | Nueva contraseña (min 8 chars) |
Genera un secreto TOTP y devuelve el URI para el código QR. Compatible con Google Authenticator, Authy y cualquier app TOTP.
{
"secret": "JBSWY3DPEHPK3PXP",
"otpUri": "otpauth://totp/TerminalServer.es:user@example.com?secret=..."
}| Campo | Tipo | Descripción |
|---|---|---|
| code | string | Código TOTP de 6 dígitos de la app autenticadora |
Los usuarios ven sus propios tickets. Los admins ven todos.
| Query param | Tipo | Descripción |
|---|---|---|
| status | string | open | in-progress | resolved | closed |
| priority | string | low | normal | high | urgent |
| search | string | Buscar en el asunto |
| page | number | Página (default: 1) |
| limit | number | Por página (default: 20, max: 100) |
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| subject | string | Req | Asunto del ticket |
| message | string | Req | Descripción del problema |
| category | string | Opt | soporte-tecnico | facturacion | cuenta | bug | feature | otro |
| priority | string | Opt | low | normal | high | urgent (default: normal) |
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | Texto del mensaje |
Los usuarios solo pueden cerrar sus propios tickets. Los admins pueden cambiar todos los campos.
| Campo | Admin only | Descripción |
|---|---|---|
| status | No | open | in-progress | resolved | closed |
| priority | Sí | low | normal | high | urgent |
| assignedTo | Sí | Email del agente asignado |
| Campo | Tipo | Descripción |
|---|---|---|
| code | string | Código de 6 dígitos de la sala |
| role | string | host | client |
| Campo | Tipo | Descripción |
|---|---|---|
| host | string | Dominio o IP a consultar |
| type | string | A | AAAA | MX | TXT | NS | CNAME (default: A) |
| Campo | Tipo | Descripción |
|---|---|---|
| host | string | Hostname o IP a escanear |
| ports | string | Lista separada por comas: "80,443,3306" |
| timeout | number | Timeout por puerto en ms (default: 2000) |
| Campo | Tipo | Descripción |
|---|---|---|
| host | string | IP o dominio (default: 8.8.8.8) |
| count | number | Número de pings (default: 8, max: 20) |
| Campo | Tipo | Descripción |
|---|---|---|
| mac | string | Dirección MAC (formato: AA:BB:CC:DD:EE:FF) |
| broadcast | string | IP de broadcast (default: 255.255.255.255) |
| Query param | Descripción |
|---|---|
| search | Buscar por nombre o email |
| role | admin | user |
| page, limit | Paginación |
{
"status": "online",
"rooms": 2,
"clients": 4,
"uptime": 86400,
"version": "4.0.0",
"users": 12,
"tickets": 3
}Inicia un proceso de pago unificado compatible con Stripe y PayPal.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| plan | string | Req | Plan a contratar |
| method | string | Req | Método de pago: stripe | paypal |
| coupon | string | Opt | Código de cupón de descuento |
Activa una prueba gratuita de 14 días para el usuario autenticado.
Devuelve si el usuario puede iniciar una prueba gratuita.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| code | string | Req | Código del cupón a validar |
Devuelve los datos fiscales almacenados del usuario autenticado.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| nif | string | Opt | NIF / CIF |
| razonSocial | string | Opt | Razón social |
| direccion | string | Opt | Dirección fiscal |
Cancela la suscripción activa del usuario.
Desactiva la renovación automática sin cancelar inmediatamente la suscripción.
Devuelve el estado actual de la renovación automática de la suscripción.
Procesa un reembolso para la factura indicada. Solo administradores.
Devuelve la lista completa de cupones de descuento.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| code | string | Req | Código del cupón |
| type | string | Req | Tipo de descuento (porcentaje, fijo, etc.) |
| value | number | Req | Valor del descuento |
| maxUses | number | Opt | Número máximo de usos |
| validUntil | string | Opt | Fecha de expiración (ISO 8601) |
Elimina el cupón identificado por su código.
Devuelve la configuración actual de las credenciales de PayPal.
Actualiza las credenciales de integración con PayPal.
Verifica que la configuración SMTP es correcta enviando un test de conexión.
Devuelve estadísticas de envío de emails (enviados, fallidos, etc.).
Devuelve el historial de emails enviados con paginación.
Genera una vista previa de la plantilla de email indicada.
Devuelve la lista de plantillas de email personalizadas.
Guarda o actualiza una plantilla de email personalizada.
Elimina la personalización y restaura la plantilla original.
Genera una vista previa con contenido personalizado antes de guardar.
Permite al usuario cancelar la suscripción a emails mediante un enlace con token.
Devuelve las preferencias de notificaciones por email del usuario.
Actualiza las preferencias de notificaciones por email.
Devuelve el estado actual del sistema de verificación de integridad de archivos.
Lanza una verificación de integridad de archivos contra el baseline actual.
Genera un nuevo baseline de hashes para la verificación de integridad de archivos.
Devuelve la lista de incidentes de integridad detectados.
Restaura archivos modificados o eliminados desde la copia de seguridad.
Ejecuta un test completo de integridad necesario antes de la reactivación del sistema.
Sube un nuevo archivo de agente para reemplazar el existente.
Devuelve si el sistema está actualmente en modo lockdown.
Reactiva el servicio web después de un lockdown de seguridad.
Devuelve el estado de la integración con Groq para análisis de seguridad con IA.
Actualiza la clave de API de Groq para el módulo de seguridad.
Envía texto para ser analizado por IA en busca de amenazas de seguridad.
El servidor WebSocket en wss://terminalserver.es/ws gestiona el intercambio de SDP/ICE para establecer conexiones WebRTC P2P.
// Crear sala (anfitrión) { "type": "create-room", "code": "482719" } // Unirse a sala (cliente) { "type": "join-room", "code": "482719" } // Enviar señal WebRTC (SDP offer/answer, ICE candidate) { "type": "signal", "data": { "type": "offer", "sdp": "..." } } // Chat (sin conexión P2P) { "type": "chat", "msg": "Hola" } // Ping de latencia { "type": "ping", "ts": 1700000000000 }
// Bienvenida al conectar { "type": "welcome", "clientId": "abc123", "ts": 1700000000000 } // Sala creada { "type": "room-created", "code": "482719", "expires": 1700000600000 } // Cliente unido { "type": "joined", "code": "482719" } // Nuevo cliente en la sala (al host) { "type": "client-joined", "clientId": "def456" } // Señal WebRTC recibida { "type": "signal", "from": "host", "data": { ... } } // Chat { "type": "chat", "from": "abc123", "msg": "Hola", "ts": ... } // Host desconectado { "type": "host-disconnected" } // Código expirado { "type": "room-expired" } // Pong { "type": "pong", "ts": 1700000000000, "serverTs": ... } // Error { "type": "error", "msg": "Código no encontrado" }