Referencia — Administración
Endpoints del back-office. Todas las rutas cuelgan de /api/v1. Auth: admin = tenant_admin o super_admin con Bearer JWT; algunos bloques exigen super_admin estricto; los marcados EE requieren además una capability Enterprise (sin licencia → 402).
Organizaciones — /admin/tenants (solo super_admin)
| Método |
Ruta |
Qué hace |
| GET |
/admin/tenants · /:id |
Lista todos los tenants · detalle. |
| GET |
/admin/tenants/capacity |
Nº de tenants y si la licencia permite crear más. |
| POST |
/admin/tenants |
Crea tenant + primer tenant_admin + dominio primario y envía email de bienvenida. 402 al superar el límite Community sin feat:multi_tenant.real. |
| PATCH |
/admin/tenants/:id · /:id/status |
Renombra · cambia estado (SUSPENDED/ARCHIVED invalidan todas las sesiones de sus usuarios). |
| POST · DELETE |
/admin/tenants/:id/domains[/:hostname] |
Añade dominio · lo quita (el primario no se puede quitar). |
Usuarios — /admin/users (admin, scoped al tenant del token)
| Método |
Ruta |
Qué hace |
| GET |
/admin/users |
Lista paginada con filtros (search, status, role, externalSource, page, limit). |
| GET |
/admin/users/:id |
Detalle con roles y sesiones recientes. |
| POST |
/admin/users |
Invita: crea usuario PENDING + email para definir contraseña. { email, name?, role, accessGroupId? }. |
| PATCH |
/admin/users/:id/status |
ACTIVE/SUSPENDED/DEACTIVATED (suspender invalida sesiones; no puedes suspenderte a ti). |
| POST · PATCH |
/admin/users/:id/roles · /roles/remove |
Asigna / quita rol. Asignables: tenant_admin, formador, alumno, auditor, empresa_manager (nunca super_admin). |
| POST |
/admin/users/:id/resend-invite |
Reenvía la invitación. |
Invitaciones — /admin/invitations (admin)
| Método |
Ruta |
Qué hace |
| GET |
/admin/invitations/summary · /admin/invitations |
Contadores y listado con estado (filtros invitados/activados/sin-enviar/sin-acceso). |
| POST |
/admin/invitations/send-batch |
Envío por lotes en segundo plano (size, emails? para priorizar, pauseMs?). Idempotente: nadie recibe dos veces. |
Módulos — /admin/modules
| Método |
Ruta |
Auth |
Qué hace |
| GET |
/admin/modules |
admin |
Módulos disponibles con estado y dependencias (?tenantId= para otro tenant, solo super_admin). |
| POST |
/admin/modules/:name/enable · disable |
admin |
Activa (idempotente) · desactiva (?force=true cascadea). Errores: 409 dependientes activos, 422 módulo core. |
| POST |
/admin/modules/install |
super_admin |
Instala un paquete ZIP (body = ZIP crudo, Content-Type: application/zip). Errores tipados: 413 demasiado grande, 422 firma/lint/boot, 403 vendor no confiable, 412 core incompatible, 409 nombre reservado o ya instalado. |
| GET |
/admin/modules/installed[/:name[/routes]] |
super_admin |
Módulos third-party instalados · detalle · rutas expuestas. |
| DELETE |
/admin/modules/installed/:name |
super_admin |
Desinstala (desregistra rutas, borra registro y blob) → 204. |
Claves, imágenes y métricas (admin)
| Método |
Ruta |
Qué hace |
| GET · POST · DELETE |
/admin/api-keys[/:id] |
API keys de todo el tenant (crear devuelve el token una sola vez; DELETE revoca → 204). |
| GET · POST |
/admin/images/inventory · optimize |
Inventario de imágenes con ahorro estimado · reoptimiza hasta 50 por lote. |
| GET |
/admin/stats?range=all\|7d\|30d |
Usuarios activos, cursos, matriculaciones, certificados, tasa de finalización. |
| GET |
/admin/metrics/business |
KPIs de negocio: NPS 30d, ventas, impagos, altas/bajas, uso del tutor IA, actividad. |
| GET |
/admin/system/health-detail |
Estado consolidado de BD, Redis, storage, SMTP y outbox (diagnóstico on-call). |
| GET |
/admin/rate-limit/info |
Tier de rate limit activo y límites efectivos (informativo, nunca 402). |
SMTP — /admin/tenant-settings/smtp (admin)
| Método |
Ruta |
Qué hace |
| GET · PUT |
/admin/tenant-settings/smtp |
Config sin contraseña (flags hasPassword, verifiedAt) · alta/edición (password vacío conserva el guardado; credenciales cifradas AES-256-GCM). |
| POST |
/admin/tenant-settings/smtp/test |
Email de prueba con el SMTP del tenant; si va bien sella verifiedAt. El error real del MTA viaja al admin. |
| POST |
/admin/tenant-settings/smtp/test-template |
Envía el email real de una plantilla del catálogo con variables. |
Identidad corporativa EE
| Método |
Ruta |
Capability |
Qué hace |
| GET · PUT · DELETE |
/admin/sso/oidc/config |
feat:sso.oidc |
Config OIDC (el clientSecret se cifra y nunca vuelve en GET; enviarlo en PUT lo rota). |
| POST |
/admin/sso/oidc/test-discovery |
feat:sso.oidc |
OIDC Discovery contra el issuer. |
| GET · PUT · DELETE |
/admin/sso/saml/config |
feat:sso.saml |
Config SAML + URLs del SP (entityId, acsUrl, metadataUrl) para pegar en el IdP. |
| POST |
/admin/sso/saml/test-connection |
feat:sso.saml |
Valida el certificado PEM y la URL (SAML no tiene discovery). |
| GET · POST · DELETE |
/admin/scim/token |
feat:scim |
Estado · genera token nuevo (scim_…, mostrado una sola vez; reemplaza el anterior) · revoca. |
| GET · PUT |
/admin/mfa-policy |
PUT: feat:mfa.enforcement |
Política MFA del tenant (requiredForAll, gracePeriodDays 1-90). El GET es libre para pintar el upsell. |
| GET |
/super/users |
feat:multi_tenant.real (solo super_admin) |
Usuarios de todos los tenants con filtros. |
| GET · POST · PATCH · DELETE |
/admin/custom-domains[...] |
feat:custom_domains |
Dominios personalizados: alta (genera cnameTarget + token), verificación, suspensión/reactivación, borrado. |
| GET · POST · DELETE |
/admin/webhooks/dead-letter[...] |
feat:api.webhooks.high_throughput |
Dead-letter de webhooks: listar · reintentar (202) · descartar (204). |
WP-SSO es Community: GET/PUT/DELETE /admin/sso/wp/config (admin, sin capability).
IA — /admin/ai (admin)
| Método |
Ruta |
Qué hace |
| GET |
/admin/ai/providers/catalog · /admin/ai/providers |
Proveedores disponibles (openai, anthropic, gemini, openrouter, mistral, groq, ollama, voyage) · configs del tenant (sin claves). |
| PUT · DELETE |
/admin/ai/providers/:purpose |
Configura chat o embed ({ provider, model?, apiKey, baseUrl?, … }; clave cifrada) · borra (vuelve al default global). |
| GET · POST |
/admin/ai-tutor/answers[/:messageId/review] |
Revisión de respuestas del tutor: listado con filtros · marcar correcta o corregida (la corrección pasa a conocimiento validado). |
| GET · POST · PATCH · DELETE |
/admin/ai-tutor/corrections[/:id] |
Conocimiento validado: CRUD (cambiar la pregunta recalcula el embedding). |
| GET |
/admin/ai-tutor/report/monthly?mes=YYYY-MM |
Informe mensual de preguntas por tema y volumen. |
| POST |
/admin/ai-tutor/courses/:courseId/index · /admin/ai-tutor/reindex-all |
Re-indexa un curso · todos los publicados (backfill del RAG). |
Plantillas, moderación y registro
| Método |
Ruta |
Qué hace |
| GET |
/admin/notifications/templates/keys · catalog · /admin/notifications/templates?key= |
Claves conocidas · catálogo con variables · overrides del tenant. |
| PUT · DELETE |
/admin/notifications/templates/:key |
Override por (channel, locale) · borrado (sin query params borra todos los del key). |
| GET · POST |
/admin/users/:userId/restrictions |
Histórico de sanciones · sanciona ({ scopes[], reason, expiresAt? } — el usuario sigue entrando y leyendo, no aportando). |
| POST |
/admin/users/:userId/restrictions/:id/lift |
Levanta la sanción (sella liftedAt, no borra). |
| GET |
/admin/users/:userId/dossier |
Expediente completo (identidad, compras, formación, actividad, sanciones). Cada consulta queda auditada. |
| GET |
/admin/restrictions/scopes · active?userIds=csv |
Áreas sancionables · sanciones vigentes en lote (máx. 200). |
| GET · POST · DELETE |
/admin/registry/status · opt-in |
super_admin. Registro opt-in de la instalación con el equipo de Didacta (acceptTerms: true obligatorio) · opt-out RGPD con borrado remoto. Decisión de instancia, no de tenant. |
| Método |
Ruta |
Qué hace |
| GET · POST · PATCH · DELETE |
/admin/fundae/companies[/:id] |
Empresas bonificadas: NIF con checksum español (inmutable tras el alta), CCC, crédito. 409 si tiene grupos activos al borrar. |
| GET · POST · DELETE |
/admin/fundae/companies/:companyId/rlpt-notices[/:id] |
Notificaciones RLPT (PDF/imagen ≤10 MiB al Evidence Vault con hash). El plazo legal de 15 días se calcula solo. |
| GET · POST · PATCH |
/admin/fundae/groups[/:id] |
Grupos bonificables (estados DRAFT→ACTIVE→CLOSED/CANCELLED). |
| POST |
/admin/fundae/groups/:id/start · close · cancel · finalize |
Transiciones: start valida RLPT y crédito; close debita crédito; finalize calcula APTO/NO_APTO (umbral 75%, con preview). |
| GET |
/admin/fundae/groups/:id/start-xml · end-xml · audit-zip |
XML de inicio · de fin (nominal + costes) · ZIP de auditoría completo con manifest SHA-256. |
| GET · POST · PATCH · DELETE |
/admin/fundae/groups/:id/costs[/:costId] |
Costes imputados al grupo (bloqueados con el grupo cerrado). |
| GET · POST · PATCH · DELETE |
/admin/fundae/groups/:groupId/participants[/:id] |
Participantes nominales (+ bulk-enroll desde el curso de la acción). Soft-delete → REMOVED, trazabilidad Fundae. |