⚡ API White-Label

Monta tu propio frontend y conéctalo al backend de TabletopCyber. La API v2 permite a empresas gestionar usuarios, sesiones de simulación, escenarios, webhooks y estadísticas de forma programática.

REST API v2White-LabelX-API-Key AuthJSON

🏷️ ¿Qué es el modelo white-label?

El modelo white-label de TabletopCyber permite a empresas construir su propia interfaz de usuario y conectarse al motor de simulación de TabletopCyber vía API. Tu frontend, nuestro backend. Tú controlas la experiencia, nosotros gestionamos la lógica de simulación, los escenarios y la puntuación.

👤 ¿Para quién es?

Empresas de ciberseguridad, academias de simulación, departamentos de TI y cualquier organización que quiera ofrecer simulaciones tabletop a sus usuarios bajo su propia marca.

🚀 ¿Qué permite hacer?

Crear y gestionar usuarios, iniciar partidas de simulación, enviar decisiones programadas, consultar resultados, registrar webhooks para notificaciones en tiempo real y obtener estadísticas de uso.

✅ Ventajas

Marca propia sin desarrollar el motor de simulación. Integración con tus sistemas existentes vía API y webhooks. Escalable según tu plan. Soporte para múltiples escenarios de ciberseguridad basados en ataques reales.

🔐 Autenticación

Todos los endpoints de la API v2 requieren autenticación mediante el header X-API-Key. Tu API key tiene el formato tc_... y puedes generarla desde el panel de administración en tu perfil.Mantenla segura: no la expongas en código cliente accesible públicamente.

🔑 Gestionar claves: Para crear una nueva API key, usa el endpoint POST /api/api-keys desde el panel (requiere autenticación de sesión, no de API key). Las claves tienen scopes configurables: users, sessions, scenarios, webhooks, stats.

# Ejemplo: autenticación con API key en todos los requests
curl https://tabletopcyber.duckdns.org/api/v2/users \
  -H "X-API-Key: tc_your_api_key_here"

🔄 Flujo de integración

Estos son los pasos típicos para integrar tu frontend con la API v2 de TabletopCyber:

👤

1. Crear usuario

POST /api/v2/users — Registra un usuario en tu tenant

📋

2. Listar escenarios

GET /api/v2/scenarios — Explora los escenarios disponibles

🎮

3. Iniciar partida

POST /api/v2/sessions — Crea una sesión para el usuario y escenario

🧠

4. Enviar decisiones

POST /api/v2/sessions/{id}/decision — El usuario elige A/B/C/D cada ronda

📊

5. Ver resultados

GET /api/v2/sessions/{id}/results — Obtiene puntuación y feedback

🔗

6. Recibir webhooks

Eventos user_created, session_completed, session_abandoned llegan a tu URL

👤 Endpoints — Usuarios

Gestiona los usuarios de tu tenant: crear, listar, ver, actualizar y eliminar.

POST/api/v2/usersX-API-Key

Crear usuario en el tenant

Crea un nuevo usuario dentro de tu organización. El usuario podrá iniciar sesiones de simulación inmediatamente.

ParámetroTipoRequeridoDescripción
emailstringEmail único del usuario
namestringNombre completo del usuario
passwordstringContraseña (mín. 8 caracteres)
curl -X POST https://tabletopcyber.duckdns.org/api/v2/users \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "email": "student@company.com",
    "name": "Jane Doe",
    "password": "secure123"
  }'
{
  "id": "usr_7f3a2b",
  "email": "student@company.com",
  "name": "Jane Doe",
  "created_at": "2026-08-10T10:49:00Z",
  "tenant_id": "tnt_a1b2c3"
}
GET/api/v2/usersX-API-Key

Listar usuarios del tenant

Devuelve todos los usuarios pertenecientes a tu organización, con paginación opcional.

ParámetroTipoRequeridoDescripción
limitintegerResultados por página (default 50, max 200)
offsetintegerDesplazamiento para paginación
searchstringFiltrar por nombre o email
curl https://tabletopcyber.duckdns.org/api/v2/users \
  -H "X-API-Key: tc_your_api_key_here"
{
  "users": [
    {
      "id": "usr_7f3a2b",
      "email": "student@company.com",
      "name": "Jane Doe",
      "created_at": "2026-08-10T10:49:00Z"
    },
    {
      "id": "usr_9k4m1n",
      "email": "analyst@company.com",
      "name": "John Smith",
      "created_at": "2026-08-05T14:20:00Z"
    }
  ],
  "total": 2,
  "limit": 50,
  "offset": 0
}
GET/api/v2/users/{user_id}X-API-Key

Ver usuario específico

Obtiene los datos completos de un usuario concreto del tenant.

ParámetroTipoRequeridoDescripción
user_idstringID del usuario (path param)
curl https://tabletopcyber.duckdns.org/api/v2/users/usr_7f3a2b \
  -H "X-API-Key: tc_your_api_key_here"
{
  "id": "usr_7f3a2b",
  "email": "student@company.com",
  "name": "Jane Doe",
  "created_at": "2026-08-10T10:49:00Z",
  "last_login": "2026-08-10T12:30:00Z",
  "sessions_count": 14,
  "best_score": 8700
}
PUT/api/v2/users/{user_id}X-API-Key

Actualizar usuario

Modifica el nombre o la contraseña de un usuario existente. Solo se actualizan los campos enviados.

ParámetroTipoRequeridoDescripción
user_idstringID del usuario (path param)
namestringNuevo nombre del usuario
passwordstringNueva contraseña (mín. 8 caracteres)
curl -X PUT https://tabletopcyber.duckdns.org/api/v2/users/usr_7f3a2b \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "name": "Jane Smith",
    "password": "newpassword456"
  }'
{
  "id": "usr_7f3a2b",
  "email": "student@company.com",
  "name": "Jane Smith",
  "updated_at": "2026-08-10T12:50:00Z"
}
DELETE/api/v2/users/{user_id}X-API-Key

Eliminar usuario

Elimina permanentemente un usuario del tenant. Las sesiones históricas se conservan para estadísticas.

ParámetroTipoRequeridoDescripción
user_idstringID del usuario (path param)
curl -X DELETE https://tabletopcyber.duckdns.org/api/v2/users/usr_7f3a2b \
  -H "X-API-Key: tc_your_api_key_here"
{
  "deleted": true,
  "id": "usr_7f3a2b"
}

🎮 Endpoints — Sesiones de juego

Inicia partidas, envía decisiones, consulta estado y obtén resultados de las simulaciones.

POST/api/v2/sessionsX-API-Key

Iniciar partida

Crea una nueva sesión de simulación para un usuario, vinculada a un escenario específico.

ParámetroTipoRequeridoDescripción
scenario_idstringID del escenario a jugar
user_idstringID del usuario que inicia la partida
curl -X POST https://tabletopcyber.duckdns.org/api/v2/sessions \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "scenario_id": "scn_ransomware_01",
    "user_id": "usr_7f3a2b"
  }'
{
  "session_id": "sess_a1b2c3",
  "scenario_id": "scn_ransomware_01",
  "user_id": "usr_7f3a2b",
  "status": "active",
  "current_round": 1,
  "total_rounds": 8,
  "narrative": "Un ransomware ha sido detectado en los servidores de la empresa...",
  "choices": [
    { "id": "A", "text": "Aislar los servidores afectados inmediatamente" },
    { "id": "B", "text": "Contactar al equipo de IR y evaluar el alcance" },
    { "id": "C", "text": "Pagar el rescato para recuperar los datos" },
    { "id": "D", "text": "Apagar todos los servidores para contener" }
  ],
  "created_at": "2026-08-10T12:00:00Z"
}
GET/api/v2/sessionsX-API-Key

Listar partidas

Lista las sesiones de simulación del tenant con filtros opcionales por estado y paginación.

ParámetroTipoRequeridoDescripción
statusstringFiltrar por estado: active, completed, abandoned
limitintegerResultados por página (default 20, max 100)
offsetintegerDesplazamiento para paginación
curl "https://tabletopcyber.duckdns.org/api/v2/sessions?status=active&limit=20" \
  -H "X-API-Key: tc_your_api_key_here"
{
  "sessions": [
    {
      "session_id": "sess_a1b2c3",
      "scenario_id": "scn_ransomware_01",
      "user_id": "usr_7f3a2b",
      "status": "active",
      "current_round": 3,
      "total_rounds": 8,
      "created_at": "2026-08-10T12:00:00Z"
    },
    {
      "session_id": "sess_d4e5f6",
      "scenario_id": "scn_phishing_02",
      "user_id": "usr_9k4m1n",
      "status": "completed",
      "score": 8200,
      "created_at": "2026-08-09T15:30:00Z"
    }
  ],
  "total": 2,
  "limit": 20,
  "offset": 0
}
GET/api/v2/sessions/{session_id}X-API-Key

Ver estado de partida

Obtiene el estado actual de una sesión de simulación: ronda actual, narrativa, decisiones disponibles y progreso.

ParámetroTipoRequeridoDescripción
session_idstringID de la sesión (path param)
curl https://tabletopcyber.duckdns.org/api/v2/sessions/sess_a1b2c3 \
  -H "X-API-Key: tc_your_api_key_here"
{
  "session_id": "sess_a1b2c3",
  "scenario_id": "scn_ransomware_01",
  "user_id": "usr_7f3a2b",
  "status": "active",
  "current_round": 3,
  "total_rounds": 8,
  "narrative": "El ransomware se ha propagado a 3 servidores adicionales. El equipo de IR ha llegado...",
  "choices": [
    { "id": "A", "text": "Restaurar desde backup los servidores afectados" },
    { "id": "B", "text": "Negociar con los atacantes mientras se recupera" },
    { "id": "C", "text": "Notificar a las autoridades y activar el plan de continuidad" },
    { "id": "D", "text": "Desconectar la red externa completamente" }
  ],
  "history": [
    { "round": 1, "choice": "B", "feedback": "Buena decisión: evaluar el alcance antes de actuar." },
    { "round": 2, "choice": "A", "feedback": "Aislar los servidores ha contenido la propagación parcialmente." }
  ],
  "created_at": "2026-08-10T12:00:00Z"
}
POST/api/v2/sessions/{session_id}/decisionX-API-Key

Enviar decisión

Envía la decisión del usuario para la ronda actual de la simulación. Avanza la partida a la siguiente ronda o la finaliza.

ParámetroTipoRequeridoDescripción
session_idstringID de la sesión (path param)
choicestringLetra de la elección: A, B, C o D
user_idstringID del usuario que envía la decisión
curl -X POST https://tabletopcyber.duckdns.org/api/v2/sessions/sess_a1b2c3/decision \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "choice": "B",
    "user_id": "usr_7f3a2b"
  }'
{
  "session_id": "sess_a1b2c3",
  "round": 4,
  "feedback": "Contactar al equipo de IR ha sido la mejor opción. Han identificado el vector de entrada.",
  "status": "active",
  "next_narrative": "El equipo de IR ha identificado que el vector de entrada fue un email de phishing...",
  "next_choices": [
    { "id": "A", "text": "Bloquear el dominio del email de phishing" },
    { "id": "B", "text": "Enviar un alerta a todos los empleados sobre el phishing" },
    { "id": "C", "text": "Implementar filtros de correo más agresivos" },
    { "id": "D", "text": "Realizar un ejercicio de phishing simulado" }
  ]
}
GET/api/v2/sessions/{session_id}/resultsX-API-Key

Ver resultados

Obtiene los resultados finales de una sesión completada: puntuación, decisiones, aciertos y áreas de mejora.

ParámetroTipoRequeridoDescripción
session_idstringID de la sesión (path param)
curl https://tabletopcyber.duckdns.org/api/v2/sessions/sess_a1b2c3/results \
  -H "X-API-Key: tc_your_api_key_here"
{
  "session_id": "sess_a1b2c3",
  "user_id": "usr_7f3a2b",
  "scenario_id": "scn_ransomware_01",
  "status": "completed",
  "score": 8700,
  "max_score": 10000,
  "correct_decisions": 6,
  "total_rounds": 8,
  "accuracy": 0.75,
  "time_spent_seconds": 1240,
  "strengths": [
    "Detección temprana del incidente",
    "Comunicación efectiva con el equipo de IR"
  ],
  "improvements": [
    "No se notificó a las autoridades en tiempo",
    "Los backups no estaban verificados"
  ],
  "rounds": [
    { "round": 1, "choice": "B", "correct": true, "feedback": "Evaluar el alcance antes de actuar" },
    { "round": 2, "choice": "A", "correct": true, "feedback": "Aislar servidores afectados" },
    { "round": 3, "choice": "C", "correct": true, "feedback": "Notificar a las autoridades" },
    { "round": 4, "choice": "B", "correct": false, "feedback": "Negociar con atacantes no es recomendado" }
  ],
  "completed_at": "2026-08-10T12:20:00Z"
}

📋 Endpoints — Escenarios

Explora los escenarios de simulación disponibles para tu tenant.

GET/api/v2/scenariosX-API-Key

Listar escenarios disponibles

Lista todos los escenarios de simulación disponibles para tu tenant, con filtros opcionales por categoría y dificultad.

ParámetroTipoRequeridoDescripción
categorystringFiltrar por categoría: incident_response, phishing, ransomware, etc.
difficultystringFiltrar por dificultad: easy, medium, hard
limitintegerResultados por página (default 50)
curl "https://tabletopcyber.duckdns.org/api/v2/scenarios?category=incident_response&difficulty=medium" \
  -H "X-API-Key: tc_your_api_key_here"
{
  "scenarios": [
    {
      "id": "scn_ransomware_01",
      "title": "Ransomware en Datacenter",
      "category": "ransomware",
      "difficulty": "medium",
      "rounds": 8,
      "description": "Un ransomware ha infectado los servidores del datacenter..."
    },
    {
      "id": "scn_phishing_02",
      "title": "Campaña de Phishing Dirigida",
      "category": "phishing",
      "difficulty": "easy",
      "rounds": 6,
      "description": "Empleados reportan emails sospechosos de suplantación..."
    },
    {
      "id": "scn_ddos_03",
      "title": "Ataque DDoS a Infraestructura",
      "category": "infrastructure",
      "difficulty": "hard",
      "rounds": 10,
      "description": "Un ataque DDoS sostenido está afectando los servicios..."
    }
  ],
  "total": 3
}
GET/api/v2/scenarios/{scenario_id}X-API-Key

Ver detalle de escenario

Obtiene la información completa de un escenario: descripción, rondas, decisiones posibles y objetivos de aprendizaje.

ParámetroTipoRequeridoDescripción
scenario_idstringID del escenario (path param)
curl https://tabletopcyber.duckdns.org/api/v2/scenarios/scn_ransomware_01 \
  -H "X-API-Key: tc_your_api_key_here"
{
  "id": "scn_ransomware_01",
  "title": "Ransomware en Datacenter",
  "category": "ransomware",
  "difficulty": "medium",
  "rounds": 8,
  "description": "Un ransomware ha infectado los servidores del datacenter principal de la empresa. Como analista del SOC, debes contener la amenaza, coordinar la respuesta y minimizar el impacto.",
  "learning_objectives": [
    "Identificar vectores de entrada de ransomware",
    "Aplicar técnicas de contención y aislamiento",
    "Coordinar comunicación con stakeholders",
    "Gestionar recuperación desde backups"
  ],
  "estimated_time_minutes": 20
}

🔗 Endpoints — Webhooks

Registra y gestiona webhooks para recibir notificaciones de eventos en tiempo real.

POST/api/v2/webhooksX-API-Key

Crear webhook

Registra una URL de endpoint para recibir notificaciones de eventos de tu tenant en tiempo real.

ParámetroTipoRequeridoDescripción
urlstringURL HTTPS que recibirá los POST de webhook
eventsstring[]Lista de eventos a escuchar: user_created, session_completed, session_abandoned
curl -X POST https://tabletopcyber.duckdns.org/api/v2/webhooks \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "url": "https://your-app.com/webhooks/tabletop",
    "events": ["user_created", "session_completed", "session_abandoned"]
  }'
{
  "id": "wh_9x8y7z",
  "url": "https://your-app.com/webhooks/tabletop",
  "events": ["user_created", "session_completed", "session_abandoned"],
  "active": true,
  "created_at": "2026-08-10T12:00:00Z"
}
GET/api/v2/webhooksX-API-Key

Listar webhooks

Lista todos los webhooks configurados en tu tenant con su estado actual.

curl https://tabletopcyber.duckdns.org/api/v2/webhooks \
  -H "X-API-Key: tc_your_api_key_here"
{
  "webhooks": [
    {
      "id": "wh_9x8y7z",
      "url": "https://your-app.com/webhooks/tabletop",
      "events": ["user_created", "session_completed", "session_abandoned"],
      "active": true,
      "last_delivery": "2026-08-10T12:20:00Z",
      "created_at": "2026-08-10T12:00:00Z"
    },
    {
      "id": "wh_2m3n4p",
      "url": "https://your-app.com/webhooks/alerts",
      "events": ["session_abandoned"],
      "active": false,
      "last_delivery": null,
      "created_at": "2026-08-05T10:00:00Z"
    }
  ]
}
DELETE/api/v2/webhooks/{webhook_id}X-API-Key

Eliminar webhook

Elimina un webhook configurado. Las entregas en curso se completarán pero no se enviarán nuevas.

ParámetroTipoRequeridoDescripción
webhook_idstringID del webhook (path param)
curl -X DELETE https://tabletopcyber.duckdns.org/api/v2/webhooks/wh_9x8y7z \
  -H "X-API-Key: tc_your_api_key_here"
{
  "deleted": true,
  "id": "wh_9x8y7z"
}

📊 Endpoints — Estadísticas

Obtiene métricas agregadas de tu organización y de usuarios individuales.

GET/api/v2/statsX-API-Key

Estadísticas del tenant

Devuelve métricas agregadas de toda la organización: sesiones completadas, puntuaciones medias, usuarios activos, etc.

ParámetroTipoRequeridoDescripción
fromstringFecha inicial (ISO 8601, ej: 2026-01-01)
tostringFecha final (ISO 8601, ej: 2026-08-10)
curl "https://tabletopcyber.duckdns.org/api/v2/stats?from=2026-01-01&to=2026-08-10" \
  -H "X-API-Key: tc_your_api_key_here"
{
  "tenant_id": "tnt_a1b2c3",
  "period": { "from": "2026-01-01", "to": "2026-08-10" },
  "total_users": 47,
  "active_users": 32,
  "total_sessions": 215,
  "completed_sessions": 180,
  "abandoned_sessions": 35,
  "average_score": 7200,
  "best_score": 9800,
  "by_category": {
    "ransomware": { "sessions": 78, "avg_score": 7400 },
    "phishing": { "sessions": 92, "avg_score": 7100 },
    "infrastructure": { "sessions": 45, "avg_score": 6900 }
  },
  "by_difficulty": {
    "easy": { "sessions": 90, "avg_score": 7600 },
    "medium": { "sessions": 95, "avg_score": 7100 },
    "hard": { "sessions": 30, "avg_score": 6500 }
  }
}
GET/api/v2/stats/users/{user_id}X-API-Key

Estadísticas de un usuario

Obtiene métricas detalladas de un usuario específico: progreso, puntuaciones, áreas de mejora y participación.

ParámetroTipoRequeridoDescripción
user_idstringID del usuario (path param)
curl https://tabletopcyber.duckdns.org/api/v2/stats/users/usr_7f3a2b \
  -H "X-API-Key: tc_your_api_key_here"
{
  "user_id": "usr_7f3a2b",
  "name": "Jane Doe",
  "email": "student@company.com",
  "total_sessions": 14,
  "completed_sessions": 12,
  "abandoned_sessions": 2,
  "average_score": 7800,
  "best_score": 9200,
  "current_streak": 3,
  "by_category": {
    "ransomware": { "sessions": 5, "avg_score": 8100 },
    "phishing": { "sessions": 6, "avg_score": 7500 },
    "infrastructure": { "sessions": 3, "avg_score": 7600 }
  },
  "skill_progression": {
    "detection": 85,
    "containment": 72,
    "communication": 68,
    "recovery": 60
  },
  "last_session": "2026-08-10T12:00:00Z"
}

🔑 Endpoint adicional — API Keys

Este endpoint no es parte de la API v2. Se usa desde el panel de administración con autenticación de sesión.

POST/api/api-keysPanel / Session

Crear API key (desde el panel)

Genera una nueva API key para autenticarte en la API v2. Este endpoint NO es parte de la API v2: se usa desde el panel de administración con autenticación de sesión.

ParámetroTipoRequeridoDescripción
namestringNombre descriptivo de la API key
scopesstring[]Ámbitos permitidos: users, sessions, scenarios, webhooks, stats
curl -X POST https://tabletopcyber.duckdns.org/api/api-keys \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tc_your_api_key_here" \
  -d '{
    "name": "Production Integration",
    "scopes": ["users", "sessions", "scenarios", "webhooks", "stats"]
  }'
{
  "id": "key_1a2b3c",
  "key": "tc_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "name": "Production Integration",
  "scopes": ["users", "sessions", "scenarios", "webhooks", "stats"],
  "active": true,
  "created_at": "2026-08-10T12:00:00Z"
}

🔗 Endpoints — Webhooks

Los webhooks permiten a tu aplicación recibir notificaciones de eventos en tiempo real. Registra una URL HTTPS mediante POST /api/v2/webhooks y TabletopCyber enviará un POST con el payload del evento a esa URL cada vez que ocurra.

Tu endpoint debe responder con 200 OK en menos de 10 segundos. Si no recibe respuesta exitosa, se reintentará hasta 3 veces con backoff exponencial (1s, 5s, 30s).

EVENTuser_created

Se dispara cuando un nuevo usuario se crea en el tenant vía API.

{
  "event": "user_created",
  "tenant_id": "tnt_a1b2c3",
  "data": {
    "user_id": "usr_7f3a2b",
    "email": "student@company.com",
    "name": "Jane Doe"
  },
  "timestamp": "2026-08-10T12:00:00Z"
}
EVENTsession_completed

Se dispara cuando una sesión de simulación termina (completada o abandonada).

{
  "event": "session_completed",
  "tenant_id": "tnt_a1b2c3",
  "data": {
    "session_id": "sess_a1b2c3",
    "user_id": "usr_7f3a2b",
    "scenario_id": "scn_ransomware_01",
    "status": "completed",
    "score": 8700,
    "accuracy": 0.75
  },
  "timestamp": "2026-08-10T12:20:00Z"
}
EVENTsession_abandoned

Se dispara cuando una sesión se abandona sin completar.

{
  "event": "session_abandoned",
  "tenant_id": "tnt_a1b2c3",
  "data": {
    "session_id": "sess_a1b2c3",
    "user_id": "usr_7f3a2b",
    "scenario_id": "scn_ransomware_01",
    "rounds_completed": 3,
    "total_rounds": 8
  },
  "timestamp": "2026-08-10T12:10:00Z"
}

💡 Tip: Verifica la autenticidad del webhook incluyendo un secret en la URL de registro (ej: https://your-app.com/webhooks/tabletop?secret=xyzy validándolo en tu servidor.

⏱️ Rate Limiting

El acceso a la API v2 está disponible solo para planes personalizados con el addon de API activado. Los planes Free e Individual no tienen acceso a la API. Si excedes el límite, recibirás 429 Too Many Requests.Todos los responses incluyen el header X-RateLimit-Remaining con el número de peticiones restantes en el minuto actual..

Tramo (plan personalizado)Límite / Precio
Custom — 120 req/minIncluido en base API (10€/mes)
Custom — 300 req/min+8€/mes
Custom — 600 req/min+15€/mes

⚠️ Códigos de Error

CódigoSignificado
200OK — La petición se completó correctamente.
400Bad Request — Faltan parámetros o son inválidos.
401Unauthorized — API key ausente o inválida.
403Forbidden — Sin permisos suficientes o API key inactiva.
404Not Found — El recurso, usuario o sesión no existe.
429Rate Limit Exceeded — Demasiadas peticiones. Revisa tu plan.
500Internal Server Error — Error del servidor. Reintenta más tarde.

Error format: Todos los errores devuelven JSON con la estructura: { "error": { "code": 404, "message": "Session not found" } }