Skip to main content

Referencia de Endpoints API

Base URL: http://localhost:4000 (desarrollo) — configurable mediante variable de entorno PORT (default 4000)

Autenticación: La mayoría de los endpoints requieren token JWT en el header Authorization: Bearer <token>. Los endpoints públicos están marcados explícitamente.

Formato de respuesta: JSON. Las respuestas paginadas retornan { data: [], total: N } o { docs: [], totalDocs, page, limit }.


Módulo: Auth

Controlador: AuthController | Ruta base: /api/auth

MétodoRutaDescripciónAuth
POST/api/auth/healthVerificar salud del servicioPúblico
POST/api/auth/registerRegistrar nuevo usuarioPúblico
POST/api/auth/loginIniciar sesión (username + password)Público
POST/api/auth/refresh-tokenRefrescar token JWTPúblico
POST/api/auth/logoutCerrar sesión (invalida token)Público
POST/api/auth/change-passwordCambiar contraseña del usuario autenticadoJWT
POST/api/auth/verify-tokenVerificar validez de un token JWTJWT
GET/api/auth/profileObtener perfil del usuario autenticadoJWT
GET/api/auth/my-permissionsObtener permisos resueltos del usuario autenticadoJWT

Detalle de parámetros

POST /api/auth/register

  • Body: { username: string, password: string, email?: string, name?: string, avatar?: string, documentNumber?: string, documentType?: string, role?: string, company?: string }
  • Respuesta: { message: "User registered successfully" }

POST /api/auth/login

  • Body: { username: string, password: string }
  • Respuesta: { access_token: string, user: {...} }

POST /api/auth/change-password

  • Body: { currentPassword: string, newPassword: string }

POST /api/auth/logout

  • Body: { userId: string }

POST /api/auth/verify-token

  • Body: { token: string }

Módulo: Recuperación de Contraseña

Controlador: PasswordResetController | Ruta base: /api/password-reset

MétodoRutaDescripciónAuth
POST/api/password-reset/forgot-passwordSolicitar restablecimiento de contraseña (envía correo)Público
GET/api/password-reset/validate-tokenValidar token de restablecimientoPúblico
POST/api/password-reset/reset-passwordRestablecer contraseña con tokenPúblico

Detalle de parámetros

POST /api/password-reset/forgot-password

  • Body: { email: string }
  • Respuesta: { message: "Si el email existe, recibirás un enlace de restablecimiento" }

GET /api/password-reset/validate-token

  • Query: ?token=<jwt_token>
  • Respuesta: { valid: boolean, email: string }

POST /api/password-reset/reset-password

  • Body: { token: string, newPassword: string }
  • Respuesta: { message: "Contraseña actualizada exitosamente" }

Módulo: Users

Controlador: UsersController | Ruta base: /api/users

MétodoRutaDescripciónAuth
POST/api/users/createCrear un nuevo usuario (admin)JWT
POST/api/usersActualizar un usuario por _idPúblico
GET/api/users/allListar todos los usuariosJWT
GET/api/users/allPaginateLista paginada de usuarios ({ data, total })JWT
GET/api/users/search/:usernameBuscar usuario por usernameJWT
GET/api/users/id/:idObtener usuario por _idPúblico
GET/api/users/count-all-usersConteo total de usuariosPúblico
GET/api/users/search-by-role/docentesBuscar usuarios con rol docenteJWT
GET/api/users/triggerEmitir evento WebSocket de pruebaJWT

Detalle de parámetros

POST /api/users/create

  • Body: { username: string, password: string, email?: string, name?: string, documentNumber?: string, documentType?: string, avatar?: string, role?: string, company?: string, gender?: string, birthDate?: string }
  • Respuesta: { username: string }

POST /api/users (actualizar)

  • Body: { _id: string, username?: string, password?: string, email?: string, name?: string, ... }

GET /api/users/search/:username

  • Path: username — nombre de usuario a buscar

GET /api/users/search-by-role/docentes

  • Query: ?searchTerm=<termino>&limit=<numero>

Módulo: Activities

Controlador: ActivitiesController | Ruta base: /api/activities

MétodoRutaDescripciónAuth
GET/api/activitiesLista paginada con filtro por emoción y userIdJWT (bypass)
POST/api/activitiesCrear una nueva actividadJWT
GET/api/activities/allLista paginada de actividades (sin filtros)JWT
GET/api/activities/:idObtener detalle de una actividad por IDJWT
PUT/api/activities/:idActualizar una actividadJWT
DELETE/api/activities/:idDesactivar actividad (soft delete)JWT
GET/api/activities/by-monthActividades completadas agrupadas por mesJWT
GET/api/activities/count-all-activitiesNúmero total de actividadesJWT (bypass)
GET/api/activities/count-by-typeContar actividades por tipoJWT (bypass)
GET/api/activities/emotions/listListar IDs de emociones disponibles según actividadesJWT (bypass)
GET/api/activities/user/:userIdListar actividades de un usuario (con filtro por tipo)JWT (bypass)
GET/api/activities/daily/currentObtener actividad activa del día actualJWT (bypass)
POST/api/activities/:id/:userId/submitRegistrar respuestas de usuario a una actividadJWT (bypass)

Detalle de parámetros

GET /api/activities

  • Query: ?emotion=<id|all>&userId=<id>&page=<num>&limit=<num>

POST /api/activities

  • Body: { title: string, description?: string, emotion: string, difficulty: number, type: string, resources: [{ type, url, duration?, metadata? }], questions: [{ id, questionText, type, options?, correctAnswer?, points }], isActive?: boolean }

GET /api/activities/by-month

  • Query: ?year=<2026>&courseId=<id>

GET /api/activities/count-by-type

  • Query: ?type=<reto|evento_personal|actividad_pares|otro>

GET /api/activities/user/:userId

  • Path: userId
  • Query: ?type=<tipo>&page=<num>&limit=<num>

POST /api/activities/:id/:userId/submit

  • Path: id (actividad), userId (usuario)
  • Body: { responses: [{ questionId: string, answer: any, points?: number }] }

Módulo: Emotions

Controlador: EmotionsController | Ruta base: /api/emotions

MétodoRutaDescripciónAuth
GET/api/emotionsListar emociones (paginado)JWT (bypass)
POST/api/emotionsCrear una nueva emociónJWT
GET/api/emotions/:idObtener emoción por IDJWT
PUT/api/emotions/:idActualizar una emociónJWT
DELETE/api/emotions/:idDesactivar emoción (soft delete)JWT
GET/api/emotions/distributionDistribución de respuestas por emoción (gráfica donut)JWT
GET/api/emotions/evolutionEvolución temporal de emociones por día (gráfica líneas)JWT
GET/api/emotions/by-name/:nameConsultar emoción por nombre exactoJWT

Detalle de parámetros

POST /api/emotions

  • Body: { name: string, description?: string, icono: string, percentNote: number, category?: string, intensity?: number, orientationNote?: string, isActive?: boolean }

GET /api/emotions

  • Query: ?page=<num>&limit=<num>

GET /api/emotions/distribution

  • Query: ?startDate=<ISO>&endDate=<ISO>&courseId=<id>

GET /api/emotions/evolution

  • Query: ?days=<30>&startDate=<ISO>&endDate=<ISO>&courseId=<id>

Módulo: Participants

Controlador: ParticipantController | Ruta base: /api/participants

MétodoRutaDescripciónAuth
GET/api/participantsListar participantes (paginado)JWT
POST/api/participantsCrear participante desde registro de UserJWT
GET/api/participants/:idObtener participante por _idJWT
GET/api/participants/by-user/:userIdObtener participante por userIdJWT
PATCH/api/participants/:id/pointsIncrementar puntos y actualizar streak/levelJWT
GET/api/participants/:id/activity-historyHistorial de actividades completadas por díaJWT
GET/api/participants/leaderboardLeaderboard de participantes por puntosJWT
POST/api/participants/updateActualizar datos del participantePúblico
POST/api/participants/deleteEliminar participanteJWT
POST/api/participants/bulkCarga masiva de participantes (CSV)JWT
GET/api/participants/searchBuscar participantes por términoJWT
GET/api/participants/filterListar por rango de fechasJWT
GET/api/participants/paginatedListar participantes con paginación independienteJWT
GET/api/participants/count-all-participantsConteo total de participantesPúblico

Detalle de parámetros

POST /api/participants

  • Body: { userId: string, nickname: string, avatar?: string, courseId?: string }

PATCH /api/participants/:id/points

  • Body: { points: number, activityId?: string }

GET /api/participants/leaderboard

  • Query: ?courseId=<id>&limit=<num>

GET /api/participants/search

  • Query: ?searchTerm=<termino>

GET /api/participants/filter

  • Query: ?startDate=<YYYY-MM-DD>&endDate=<YYYY-MM-DD>&limit=<num>

POST /api/participants/bulk

  • Body: multipart/form-data con campo file (CSV)

Módulo: Feedback

Controlador: FeedbackController | Ruta base: /api/feedback

MétodoRutaDescripciónAuth
GET/api/feedbackListar feedbacks (paginado)JWT
POST/api/feedbackCrear feedbackJWT
GET/api/feedback/:idObtener feedback por IDJWT
PUT/api/feedback/:idActualizar feedbackJWT
DELETE/api/feedback/:idEliminar feedback (soft delete)JWT
DELETE/api/feedback/:id/hardEliminar feedback (hard delete)JWT
PUT/api/feedback/:id/statusActualizar estado (isActive) del feedbackJWT
PUT/api/feedback/:id/soft-deleteSoft delete con parámetrosJWT
POST/api/feedback/:id/convert-to-ideaConvertir feedback en idea del backlogJWT
POST/api/feedback/by-descriptionBuscar feedback por descripción exactaJWT
GET/api/feedback/search/termBuscar feedbacks por términoJWT
POST/api/feedback/upload-csvCargar CSV de feedbacksJWT

Detalle de parámetros

POST /api/feedback

  • Body: { description: string, ... }

POST /api/feedback/:id/convert-to-idea

  • Path: id — ID del feedback
  • Body: { title: string, description?: string, priority?: string, tags?: string[] }
  • Respuesta: { success: boolean, ideaId: string, idea: object }

POST /api/feedback/by-description

  • Body: { description: string }

GET /api/feedback/search/term

  • Query: ?searchTerm=<termino>&page=<num>&rows=<num>

Módulo: Rankings

Controlador: RankingsController | Ruta base: /api/rankings

MétodoRutaDescripciónAuth
GET/api/rankings/generalRanking general de todos los participantes activosPúblico
GET/api/rankings/course/:courseIdRanking por curso específicoPúblico
GET/api/rankings/institution/:institutionIdRanking por institución (company)Público

Detalle de parámetros

GET /api/rankings/general

  • Query: ?page=<num>&limit=<num>

GET /api/rankings/course/:courseId

  • Path: courseId — ID del curso
  • Query: ?page=<num>&limit=<num>

GET /api/rankings/institution/:institutionId

  • Path: institutionId — ID de la institución
  • Query: ?page=<num>&limit=<num>

Módulo: Courses

Controlador: CourseController | Ruta base: /api/courses

MétodoRutaDescripciónAuth
GET/api/coursesListar todos los cursos con filtrosPúblico
POST/api/coursesCrear un nuevo cursoJWT
GET/api/courses/:idObtener un curso por IDJWT
PUT/api/courses/:idActualizar un cursoJWT
DELETE/api/courses/:idEliminar un curso (soft delete)JWT
GET/api/courses/listLista simple de cursos (id, name) para selectoresJWT
GET/api/courses/progressProgreso de cursos (% de avance por curso)JWT
GET/api/courses/company/:companyIdListar cursos por instituciónJWT

Detalle de parámetros

GET /api/courses

  • Query: ?companyId=<id>&status=<true|false>&page=<num>&rows=<num>

POST /api/courses

  • Body: { name: string, description?: string, company?: string, isActive?: boolean }

DELETE /api/courses/:id

  • Body: { deletedBy?: string }

Módulo: Notifications

Controlador: NotificationController | Ruta base: /api/notifications

MétodoRutaDescripciónAuth
GET/api/notifications/allListar todas las notificaciones (paginado)JWT
POST/api/notificationsCrear una notificaciónJWT
POST/api/notifications/batchCrear múltiples notificacionesJWT
GET/api/notifications/:idObtener notificación por IDJWT
GET/api/notifications/title/:titleObtener notificación por títuloJWT
PUT/api/notifications/:idActualizar notificaciónJWT
DELETE/api/notifications/:idEliminar notificaciónJWT
PUT/api/notifications/read/:idMarcar notificación como leídaJWT
GET/api/notifications/search/:termBuscar notificaciones por términoJWT
GET/api/notifications/count-all-notificationsConteo total de notificacionesJWT
GET/api/notifications/count-all-notifications-by-dayConteo de notificaciones por díaJWT
GET/api/notifications/unread/count/:idContar notificaciones no leídas de un usuarioJWT
POST/api/notifications/batch/uploadCargar CSV con notificacionesJWT

Detalle de parámetros

POST /api/notifications

  • Body: { title: string, message: string, user?: string, notificationType: string, notificationChannel: string, priority: number, isActive?: boolean }

PUT /api/notifications/read/:id

  • Body: { editedBy?: string }

Módulo: Contacts

Controlador: ContactsController | Ruta base: /api/contact

MétodoRutaDescripciónAuth
POST/api/contactEnviar mensaje de contacto (formulario landing)Público
GET/api/contact/allListar todos los mensajes de contacto (admin)JWT
GET/api/contact/allPaginateLista paginada de mensajes (admin)JWT
GET/api/contact/id/:idObtener mensaje por ID (admin)JWT
GET/api/contact/statsEstadísticas por estado de mensajes (admin)JWT
POST/api/contact/updateActualizar estado/notas de un mensaje (admin)JWT

Detalle de parámetros

POST /api/contact

  • Body: { name: string, email: string, subject: string, message: string }

GET /api/contact/allPaginate

  • Query: ?page=<num>&limit=<num>&status=<unread|read|in_progress|resolved|spam>

POST /api/contact/update

  • Body: { _id: string, status?: string, notes?: string }

Módulo: PreTests

Controlador: PreTestController | Ruta base: /api/pretests

MétodoRutaDescripciónAuth
POST/api/pretestsCrear un nuevo pre-testJWT
POST/api/pretests/saveGuardar respuestas de pre-test (público)JWT (bypass)
GET/api/pretestsListar todos los pre-tests (paginado)JWT
GET/api/pretests/by-test/:testIdRespuestas de usuarios para un test específicoJWT
GET/api/pretests/count-all-pretestsConteo total de pretestsPúblico
PATCH/api/pretests/:idActualizar un pre-testJWT
DELETE/api/pretests/:idEliminar un pre-testJWT
POST/api/pretests/search/userAndTestObtener respuestas por userId + testIdJWT
GET/api/pretests/search/user/:userIdObtener todos los tests de un usuarioJWT (bypass)
GET/api/pretests/result-allObtener todos los resultados de pre-testsJWT
GET/api/pretests/result/:idObtener resultado por IDJWT (bypass)
GET/api/pretests/status/:userIdEstado de completitud de tests por usuarioJWT (bypass)

Detalle de parámetros

POST /api/pretests/save

  • Body: { testId: string, userId: string, responses: [{ questionId: string, answer: any, points?: number }] }

POST /api/pretests/search/userAndTest

  • Body: { userId: string, testId: string }

GET /api/pretests/by-test/:testId

  • Path: testId — ID del test
  • Query: ?page=<num>&limit=<num>

GET /api/pretests/status/:userId

  • Path: userId — documentNumber del usuario

Módulo: Activity Completions

Controlador: ActivityCompletionsController | Ruta base: /api/activity-completions

MétodoRutaDescripciónAuth
POST/api/activity-completionsRegistrar completación de actividadJWT
GET/api/activity-completions/:idDetalle de una completación por IDJWT
GET/api/activity-completions/participant/:participantIdHistorial de completaciones de un participanteJWT
GET/api/activity-completions/stats/:participantIdEstadísticas de un participante (puntajes, ranking)JWT
GET/api/activity-completions/today-countNúmero de actividades completadas hoyJWT
GET/api/activity-completions/rankingRanking global de participantes por puntajeJWT

Detalle de parámetros

POST /api/activity-completions

  • Body: { participantId: string, activityId: string, courseId?: string, score: number, maxScore?: number }

GET /api/activity-completions/participant/:participantId

  • Path: participantId
  • Query: ?page=<num>&limit=<num>

GET /api/activity-completions/ranking

  • Query: ?limit=<num>

Módulo: Reports

Controlador: ReportsController | Ruta base: /reports

MétodoRutaDescripciónAuth
GET/reportsListar todos los reportesJWT
POST/reportsCrear un reporteJWT
GET/reports/:idObtener reporte por IDJWT
PATCH/reports/:idActualizar reporteJWT
DELETE/reports/:idEliminar reporteJWT

Módulo: Admin

Controlador: AdminController | Ruta base: /api/admin

MétodoRutaDescripciónAuth
GET/api/admin/dashboardDashboard administrativoJWT

Módulo: File Upload

Controlador: FileUploadController | Ruta base: /api/file-upload

MétodoRutaDescripciónAuth
POST/api/file-uploadSubir archivo (multipart/form-data)JWT

Módulo: Config

Controlador: ConfigController | Ruta base: /api/config

MétodoRutaDescripciónAuth
GET/api/configObtener configuración del sistemaJWT
POST/api/configActualizar configuraciónJWT

Códigos de respuesta comunes

CódigoSignificado
200OK — operación exitosa
201Created — recurso creado exitosamente
400Bad Request — datos inválidos o faltantes
401Unauthorized — token ausente, inválido o expirado
403Forbidden — permisos insuficientes
404Not Found — recurso no encontrado
409Conflict — conflicto de unicidad (email duplicado, etc.)
429Too Many Requests — rate limit excedido
500Internal Server Error — error inesperado del servidor