Ir al artículo
Aniq-UI

LearnioReferencia de la API

Referencia de la API

Todas las rutas que sirve la API de Learnio, quién puede llamarlas y cómo funcionan el inicio de sesión, los permisos, los errores y la paginación.

Para el paquete Full Stack

URL base y formato de respuesta

Todas las rutas se sirven con el prefijo /api. En local, la URL base es http://localhost:8000/api. En un servidor es la dirección de tu API seguida de /api, el mismo valor que ambos frontends leen de NEXT_PUBLIC_API_BASE_URL (Variables de entorno).

La API sirve a dos públicos que nunca comparten un token. Los estudiantes usan las rutas de /api/users/<area> y /api/shop, que se enumeran en las secciones para estudiantes más abajo. El panel de administración usa todas las demás rutas, incluidas /api/users y /api/users/<username>, que gestionan las cuentas de los estudiantes.

Los cuerpos de las solicitudes son JSON, excepto la subida de archivos. Cada respuesta llega en el mismo envoltorio:

Envoltorio
{
  "success": true,
  "data": { },
  "message": ""
}

data contiene el resultado. message es una frase corta que rellenan algunas escrituras, traducida al idioma de la solicitud, y vacía en los demás casos. La comprobación de estado no necesita token y muestra el envoltorio:

Terminal
curl http://localhost:8000/api/health
Respuesta
{"success":true,"data":{"status":"ok"},"message":""}

Responde 503 mientras no se puede acceder a la base de datos o esta no tiene tablas, así que un balanceador de carga puede usarla como sonda de disponibilidad.

Errores

Una solicitud fallida responde con el estado HTTP correspondiente y el mismo sobre, con success: false, data: null y, en la validación, los problemas por campo, con el nombre del campo como clave (un campo dentro de un objeto anidado, con su ruta separada por puntos):

Terminal
curl -X POST http://localhost:8000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"not-an-email","password":"x"}'
Respuesta (400)
{
  "success": false,
  "data": null,
  "message": "Enter a valid email address (example@domain.com).",
  "errors": {
    "email": ["Enter a valid email address (example@domain.com)."]
  }
}
EstadoCuándo
400Un campo no superó la validación, un valor de la consulta no es válido o el cuerpo contiene un campo que la ruta no acepta. Los campos desconocidos se rechazan, no se ignoran.
401El token falta, ha caducado o pertenece al otro público. También un inicio de sesión fallido, tanto si el email no tiene cuenta como si la contraseña es incorrecta.
403Los roles del administrador no conceden el permiso de la ruta, o una cuenta de instructor intentó acceder fuera de sus propios cursos.
404No existe ese registro.
409La escritura entra en conflicto con un registro existente, como un correo o un slug ya en uso.
429Demasiados intentos desde una misma dirección en una ruta de inicio de sesión, registro o contraseña. La cabecera Retry-After indica cuántos segundos esperar.
500Un fallo inesperado. El mensaje sigue siendo genérico y los detalles van al registro de la API.

Las escrituras correctas responden 201 para POST y 200 para los demás métodos.

Paginación y ordenación

Las listas llegan en dos formas, una por público. Las rutas de estudiantes responden con la forma que lee el sitio para estudiantes; las rutas de administración responden con la forma que lee el panel.

Listas públicas y de estudiantesListas de administración
Páginapage, desde 1page, desde 1
Tamaño de páginapage_count (cursos, blog, inscripciones, reseñas) o per_page (instructores). Los cursos usan por defecto el ajuste courses_per_page; las inscripciones, 100.page_count, 15 por defecto (10 para administradores). Los pedidos usan limit.
OrdenaciónSolo cursos: sort_by y sort_dir (asc o desc)sort y order (asc o desc). Los pedidos usan sort_by y sort_order.
Orden predeterminadoCursos por actualización más reciente, blog por publicación más recientePrimero los actualizados más recientemente, con los empates resueltos por id. Las categorías y los instructores mantienen su orden curado.
Respuestadata, current_page, last_page, per_page, total, from, to, más los enlaces de páginadata, page, limit, total, totalPages

Una página tiene como máximo 100 filas: un tamaño mayor se lee como 100, y uno ausente o ilegible vuelve al valor por defecto de la lista. Lo mismo ocurre con page, que vuelve a 1.

sort solo acepta las columnas que permite cada lista. Una clave desconocida recurre al orden predeterminado en lugar de fallar, así que un marcador antiguo sigue cargando.

La lista pública de cursos se ordena por id, price, discount_percentage, rating, duration, level, language, created_at o updated_at, y se filtra por title, category_id, instructor_id y type (live o recorded).

Idioma

Envía el idioma del lector en la cabecera Accept-Language. La API habla los idiomas indicados en back-end/src/i18n/locales.ts, en y ar tal como viene. Lee la primera etiqueta, así que ar-SA es árabe, y una solicitud que no nombra ningún idioma admitido se responde en el idioma del ajuste default_locale. No hay parámetro de consulta para el idioma.

  • Los mensajes de error y el message de una escritura correcta se traducen.
  • El texto guardado en ambos idiomas, como los títulos y las descripciones de los cursos, vuelve como { "en": "...", "ar": "..." } y el cliente elige uno.
  • Algunas rutas de estudiantes responden solo en el idioma solicitado: la lista de inscripciones, el contenido de un curso y la búsqueda.
  • El pago toma el idioma de su cuerpo (locale, uno de los idiomas admitidos), para que el recibo coincida con la página en la que compró el estudiante.

Autenticación

Los estudiantes y los administradores inician sesión en endpoints distintos, contra tablas distintas, y reciben tokens que solo aceptan sus propias rutas.

PúblicoInicio de sesiónToken en la respuestaAceptado en
EstudiantePOST /api/users/auth/logindata.token, con data.userRutas de estudiantes
Panel de administraciónPOST /api/auth/logindata.access_token, con data.admin (roles y permisos)Rutas de administración
  • Ambos son JWT firmados con JWT_SECRET. Envíalos como Authorization: Bearer <token>.
  • Un token dura JWT_EXPIRATION, 7d por defecto (Variables de entorno). El inicio de sesión de administrador indica el mismo valor en expires_in.
  • No hay endpoint de renovación. Cuando un token caduca, la siguiente solicitud responde 401 y el cliente vuelve a iniciar sesión.
  • Cerrar sesión (POST /api/users/auth/logout) solo le indica al cliente que descarte su token. No se revoca nada en el servidor, así que un token sigue siendo válido hasta que caduca.
  • Un token de estudiante se rechaza en las rutas de administración y un token de administrador en las rutas de estudiantes, aunque ambos usan el mismo secreto.
  • Un inicio de sesión fallido responde 401 con un único mensaje, tanto si el email no tiene cuenta como si la contraseña es incorrecta, así que el formulario no sirve para averiguar quién tiene cuenta.
  • Las rutas de inicio de sesión, registro y contraseña aceptan 10 intentos por minuto desde una misma dirección, contados por ruta. Pasado eso responden 429 con una cabecera Retry-After. La cuenta se guarda en la memoria de la API, así que se reinicia al reiniciarla y cada instancia lleva la suya.
  1. Inicia sesión como el Super Admin de los datos iniciales

    Terminal
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"admin@learnio.com","password":"Admin@123"}'
    Respuesta
    {
      "success": true,
      "data": {
        "access_token": "eyJhbGciOiJIUzI1NiIs...",
        "token_type": "Bearer",
        "expires_in": "7d",
        "admin": {
          "id": 1,
          "email": "admin@learnio.com",
          "instructor_id": null,
          "roles": [{ "id": 1, "name": "Super Admin", "guard_name": "web" }],
          "permissions": ["admins.view", "admins.create", "..."]
        }
      },
      "message": "Signed in successfully."
    }
  2. Llama a una ruta protegida con el token

    Terminal
    curl "http://localhost:8000/api/courses?page=1&page_count=5" \
      -H "Authorization: Bearer <access_token>"

    Resultado esperado: Los cinco primeros cursos, con la forma de lista de administración.

  3. Inicia sesión como el estudiante de los datos iniciales

    Los datos de ejemplo también incluyen un estudiante, demo@learnio.com con la contraseña Demo@123:

    Terminal
    curl -X POST http://localhost:8000/api/users/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"demo@learnio.com","password":"Demo@123"}'

    Después pasa data.token de la misma forma, por ejemplo a GET /api/users/enrollments.

Cambia las contraseñas de los datos iniciales

Las cuentas de los datos de ejemplo usan contraseñas publicadas: Admin@123 para el Super Admin, admin123 para el resto del personal y Demo@123 para el estudiante de demostración. Cámbialas, o empieza con las tablas vacías, antes de que un sitio pase a producción.

Permisos

Cada ruta de administración comprueba primero el token y luego el permiso que indica. Los permisos se llaman <module>.<action>, y un administrador tiene todos los permisos de todos sus roles. Cuando una ruta indica varios, basta con uno de ellos. En las tablas de administración de más abajo, un nombre de permiso en la columna Quién puede llamarla significa un administrador cuyos roles lo conceden.

Volver a ejecutar el seeder crea los roles que faltan y deja como están los permisos de los roles existentes, así que los cambios hechos en el panel se conservan. Super Admin es la excepción: recibe cualquier permiso que aún no tenga.

MóduloPermisos
Administradoresadmins.view, admins.create, admins.edit, admins.delete, admins.assign_roles
Rolesroles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions
Ajustessettings.view, settings.edit
Estudiantesstudents.view, students.create, students.update, students.delete, students.restore, students.verify
Categoríascategories.view, categories.create, categories.edit, categories.delete, categories.restore
Cursoscourses.view, courses.create, courses.edit, courses.delete, courses.restore
Plan de estudioscurriculum.view, curriculum.create, curriculum.edit, curriculum.delete
Instructoresinstructors.view, instructors.create, instructors.edit, instructors.delete, instructors.restore
Inscripcionesenrollments.view, enrollments.create, enrollments.edit, enrollments.delete
Pedidosorders.view, orders.create, orders.edit, orders.delete
Reseñasreviews.view, reviews.edit, reviews.delete, reviews.restore
Clases en vivolive_sessions.view, live_sessions.create, live_sessions.edit, live_sessions.delete
Tareasassignments.view, assignments.create, assignments.edit, assignments.delete
Blogblog.view, blog.create, blog.edit, blog.delete, blog.restore
Asistente de IAai_chat.use, ai_chat.view_models

Todos los permisos de lectura terminan en .view y ningún otro lo hace: el rol Viewer de los datos iniciales se construye con esa regla. Los roles que crean los datos de ejemplo:

RolConcede
Super AdminTodo
Panel de administraciónTodo excepto roles.*, admins.* y settings.edit
ManagerCursos, plan de estudios, categorías, instructores, inscripciones y pedidos sin eliminaciones, más students.view, reviews.view y reviews.edit
Editorblog.*, reviews.view, reviews.edit, categories.view, courses.view, instructors.view
ViewerTodos los permisos .view
InstructorClases en vivo, tareas y plan de estudios, courses.view, courses.create, courses.edit, y lectura de estudiantes, inscripciones y reseñas

Una cuenta de administrador vinculada a un instructor lleva un instructor_id en su respuesta de inicio de sesión y, además de sus permisos, queda limitada a sus propios cursos: las listas solo muestran esos cursos y sus estudiantes, y una escritura fuera de ellos responde 403.

Cuando cambian los roles de un administrador, el panel recibe el aviso por el socket /auth (evento permissions-updated) para refrescar GET /api/auth/me. Ese socket solo acepta tokens de administrador.

Catálogo público

No se necesita token. Son las rutas que llaman las páginas públicas del sitio para estudiantes.

MétodoRutaQuién puede llamarlaQué hace
GET/api/healthCualquieraComprobación de disponibilidad
GET/api/users/coursesCualquieraLista los cursos públicos publicados, paginados (page_count, el ajuste courses_per_page por defecto), con filtros y ordenación
GET/api/users/courses/categoriesCualquieraLas categorías que tienen al menos un curso público, con sus recuentos
GET/api/users/courses/:slugCualquieraUn curso público publicado con sus secciones y lecciones. Un borrador responde 404. Solo las lecciones de vista previa gratuita incluyen su contenido y su vídeo.
GET/api/users/courses/:slug/reviewsCualquieraLas reseñas publicadas del curso, de la actualizada más recientemente a la más antigua, paginadas (page_count, 5 por defecto)
GET/api/users/InstructorsCualquieraDirectorio de instructores, paginado (per_page, 8 por defecto), con filtro por specialty
GET/api/users/Instructors/:usernameCualquieraUn instructor con sus cursos públicos
GET/api/users/blogCualquieraArtículos publicados, del más reciente al más antiguo, paginados (page_count, 9 por defecto), con filtro por tag
GET/api/users/blog/tagsCualquieraTodas las etiquetas en uso, con cuántos artículos las llevan
GET/api/users/blog/:slugCualquieraUn artículo publicado
GET/api/users/platform/figuresCualquieraLos recuentos de la página de inicio: estudiantes, cursos, instructores, países y satisfacción
GET/api/categoriesCualquieraLista de categorías, paginada, con search, is_active, parent_id, has_courses
GET/api/categories/rootsCualquieraCategorías de nivel superior
GET/api/categories/slug/:slugCualquieraUna categoría por slug
GET/api/categories/:idCualquieraUna categoría por id
GET/api/helpers/countriesCualquieraPaíses para un campo de selección, en el idioma de la solicitud
GET/api/shop/payment-methodsCualquieraLos métodos de pago que debe ofrecer el pago, y cuáles de ellos son alojados

La I mayúscula de /api/users/Instructors es la ruta que llama el sitio para estudiantes; la coincidencia no distingue mayúsculas de minúsculas.

Registro e inicio de sesión de estudiantes

El sitio para estudiantes usa las rutas de /api/users/auth. El registro inicia la sesión del estudiante al momento y envía por correo un enlace de confirmación; una cuenta sin confirmar puede igualmente navegar y comprar.

MétodoRutaQuién puede llamarlaQué hace
POST/api/users/auth/registerCualquieraCrea la cuenta (first_name, last_name, email, password de 8 caracteres o más, phone opcional) e inicia sesión. data.verification_email_sent indica si el correo salió.
POST/api/users/auth/loginCualquieraInicia sesión con email y password, y responde token y user
POST/api/users/auth/logoutCualquieraNo hay nada que revocar; permite al cliente borrar su token
POST/api/users/auth/resendCualquieraVuelve a enviar el enlace de confirmación a email
POST/api/users/auth/verify-emailCualquieraConfirma la dirección con el token del enlace (válido 24 horas)
POST/api/users/auth/forgot-passwordCualquieraEnvía un enlace de restablecimiento a email (válido 1 hora)
POST/api/users/auth/reset-passwordCualquieraEstablece una nueva password con el token del enlace
GET/api/users/auth/meEstudianteEl estudiante con sesión iniciada

resend y forgot-password responden igual tanto si la dirección tiene cuenta como si no, así que no sirven para averiguar quién está registrado. El inicio de sesión, el registro, resend, forgot-password y reset-password tienen límite de intentos (Autenticación).

Un segundo conjunto de rutas de estudiantes en /api/students/auth trabaja con las mismas cuentas y también responde token y user. El sitio para estudiantes no lo usa; usa preferiblemente /api/users/auth.

MétodoRutaQuién puede llamarlaQué hace
POST/api/students/auth/registerCualquieraCrea una cuenta de estudiante e inicia sesión, sin correo de confirmación
POST/api/students/auth/loginCualquieraInicia sesión
GET/api/students/auth/meEstudianteEl perfil del estudiante con sesión iniciada
PATCH/api/students/auth/meEstudianteActualiza el nombre, el correo o el teléfono
PATCH/api/students/auth/me/passwordEstudianteCambia la contraseña
POST/api/students/auth/forgot-passwordCualquieraEnvía un enlace de restablecimiento a email, y responde igual tanto si la dirección tiene cuenta como si no
POST/api/students/auth/reset-passwordCualquieraEstablece una nueva contraseña con un token de restablecimiento

Perfil, cursos y progreso del estudiante

Todas estas rutas necesitan un token de estudiante. Los cursos y las lecciones se identifican por su code, no por su id numérico.

MétodoRutaQuién puede llamarlaQué hace
GET/api/users/profileEstudianteEl estudiante con sesión iniciada
PATCH/api/users/profileEstudianteActualiza first_name, last_name, email o phone
PATCH/api/users/profile/passwordEstudianteCambia la contraseña (la actual y una nueva de 8 caracteres o más)
GET/api/users/dashboard/overviewEstudianteTodo lo que muestra la pantalla de inicio del panel, en una sola llamada
GET/api/users/dashboard/kpisEstudianteLas cifras principales del estudiante
GET/api/users/dashboard/radarEstudianteEl gráfico de habilidades, a partir del ajuste dashboard_radar_metrics
GET/api/users/enrollmentsEstudianteLos cursos del estudiante, paginados (page_count, 100 por defecto), con filtro por type, search y status
GET/api/users/enrollments/courses/:codeEstudianteEl contenido completo de un curso que tiene el estudiante, con el estado de cada lección y el progreso
PATCH/api/users/enrollments/courses/:codeEstudianteRegistra la última lección abierta (last_accessed_lesson_id)
POST/api/users/enrollments/lessons/:lessonCode/completeEstudianteMarca una lección como completada y actualiza el progreso del curso
GET/api/users/enrollments/lessons/:lessonCode/noteEstudianteLa nota del estudiante sobre una lección
PUT/api/users/enrollments/lessons/:lessonCode/noteEstudianteGuarda la nota (body)
GET/api/users/searchEstudianteBúsqueda global (q, limit por tipo): los cursos del estudiante, el catálogo, los instructores y más
GET/api/users/courses/:courseId/reviewEstudianteLa reseña del propio estudiante sobre el curso, o null si no tiene
PUT/api/users/courses/:courseId/reviewEstudianteEscribe o sustituye la reseña del estudiante: rating de 1 a 5 y comment opcional de hasta 2.000 caracteres
DELETE/api/users/courses/:courseId/reviewEstudianteRetira la reseña del estudiante

Las rutas de reseñas usan el id numérico del curso, y cada estudiante tiene una reseña por curso. Solo puede escribirla un estudiante inscrito en el curso; una inscripción cancelada responde 403.

  • Una reseña queda published al instante, o pending hasta que un moderador la apruebe cuando el ajuste reviews_require_approval vale true. Editar una reseña que un moderador ocultó la devuelve a pending.
  • Una reseña que eliminó un moderador vuelve con status: removed y ya no se puede editar ni retirar (403).
  • Cada escritura recalcula la valoración y el número de reseñas del curso, y los de su instructor.
  • Una reseña nueva, y una edición que espera aprobación, notifican al personal que tiene reviews.view.

Cuestionarios, tareas y calendario

MétodoRutaQuién puede llamarlaQué hace
GET/api/users/quizzes?course_id=EstudianteLos cuestionarios de un curso que tiene el estudiante
GET/api/users/quizzes/:idEstudianteUn cuestionario con sus preguntas, sin las respuestas
GET/api/users/quizzes/:id/attemptsEstudianteLos intentos anteriores del estudiante
POST/api/users/quizzes/:id/attemptsEstudianteEnvía answers (id de la pregunta con los ids de las opciones elegidas) y devuelve la puntuación
GET/api/users/dashboard/calendarEstudianteLas clases y las fechas límite de las tareas entre from y to (fechas ISO, 7 días por defecto, 92 como máximo)
POST/api/users/dashboard/calendar/assignments/:id/submitEstudianteEntrega una tarea (body)
DELETE/api/users/dashboard/calendar/assignments/:id/submitEstudianteRetira una entrega

Las rutas de clases en vivo del calendario se describen en Clases en vivo.

Mensajes y notificaciones del estudiante

MétodoRutaQuién puede llamarlaQué hace
GET/api/users/conversationsEstudianteLas conversaciones del estudiante con sus instructores
POST/api/users/conversationsEstudianteAbre, o devuelve, la conversación con el instructor de course_id
GET/api/users/conversations/:id/messagesEstudianteLos mensajes de una conversación
POST/api/users/conversations/:id/messagesEstudianteEnvía un mensaje: body, una imagen (attachment_url, attachment_name, attachment_type), o ambos
PATCH/api/users/conversations/:id/readEstudianteMarca la conversación como leída
PATCH/api/users/conversations/:id/unreadEstudianteLa marca como no leída
GET/api/users/notificationsEstudianteLas notificaciones del estudiante
PATCH/api/users/notifications/:id/readEstudianteMarca una como leída
PATCH/api/users/notifications/read-allEstudianteMarca todas como leídas
DELETE/api/users/notifications/:idEstudianteElimina una

Las notificaciones nuevas también se envían por Socket.IO, en el namespace /notifications en la dirección de la API sin /api. Pasa el token como auth.token en el handshake y escucha notification:created. Los administradores usan el mismo socket con su propio token.

Pago y cobros

MétodoRutaQuién puede llamarlaQué hace
GET/api/shop/payment-methodsCualquieraLos methods que ofrece el pago y cuáles son hosted
POST/api/shop/checkoutEstudianteCompra course_id, o hasta 50 course_ids en un solo cobro, con payment_method (card o paypal) y locale
POST/api/shop/orders/:reference/settleEstudianteFinaliza un pago alojado cuando vuelve el comprador. Es necesario para PayPal; no hace nada para Stripe.
GET/api/shop/ordersEstudianteLos pedidos del estudiante
POST/api/webhooks/payments/stripeStripe, firmadoLiquida, marca como fallidos o reembolsa pedidos a partir de los eventos de Stripe
POST/api/webhooks/payments/paypalPayPal, firmadoLiquida, marca como fallidos o reembolsa pedidos a partir de los eventos de PayPal

Cuando el pago responde con redirect_url, envía allí al comprador y trata el pedido como pending: la plaza se concede cuando el webhook del procesador confirma el pago, no al volver. Cada webhook comprueba la firma del procesador y responde 401 cuando no coincide. Los eventos se aplican una sola vez, por mucho que el procesador reintente.

Un curso gratuito (precio 0) pasa por la misma ruta y nunca llega a un procesador, así que funciona sin ninguna clave de pago. El pedido se guarda como paid con gateway: "free" y redirect_url: null, la plaza se concede al momento y el estudiante recibe el email de inscripción sin recibo. Los pedidos gratuitos cuentan como inscripciones, no como ventas: quedan fuera del valor medio de pedido.

Configuración de los procesadores y sus suscripciones a webhooks: Pagos.

Inicio de sesión de administradores y cuentas del personal

MétodoRutaQuién puede llamarlaQué hace
POST/api/auth/loginCualquieraInicia la sesión de un administrador; responde access_token, roles y permisos. Con límite de intentos.
GET/api/auth/meCualquier administrador con sesión iniciadaEl administrador con sesión iniciada, con sus roles y permisos
GET/api/adminsadmins.viewLista del personal, con filtro por email, name, phone, role_id
GET/api/admins/statisticsadmins.viewRecuentos del personal
GET/api/admins/:idadmins.viewUn administrador
POST/api/adminsadmins.createCrea un administrador
PATCH/api/admins/:idadmins.editActualiza un administrador
PATCH/api/admins/:id/rolesadmins.assign_rolesSustituye los roles del administrador (role_ids)
DELETE/api/admins/:idadmins.deleteElimina un administrador
PATCH/api/admins/profileCualquier administrador con sesión iniciadaActualiza el nombre, los datos de contacto y la foto del propio administrador con sesión iniciada
PATCH/api/admins/profile/passwordCualquier administrador con sesión iniciadaCambia la contraseña del propio administrador con sesión iniciada

Una dirección de email pertenece a un solo administrador, incluso a uno eliminado: crear un administrador, o cambiar un email por uno ya usado, responde 409.

Roles

MétodoRutaQuién puede llamarlaQué hace
GET/api/rolesroles.viewRoles, paginados cuando se envía page, con filtro por name, guard_name, created_from, created_to
GET/api/roles/statisticsroles.viewRecuentos de roles
GET/api/roles/selectroles.viewTodos los roles, para un selector
GET/api/roles/permissionsroles.viewTodos los permisos, agrupados por módulo
GET/api/roles/:idroles.viewUn rol con sus permisos
POST/api/rolesroles.createCrea un rol (name)
PUT/api/roles/:idroles.editCambia el nombre de un rol
POST/api/roles/:id/permissionsroles.assign_permissionsSustituye los permisos del rol por permissions, una lista de nombres
DELETE/api/roles/:idroles.deleteElimina un rol

Estudiantes

Las cuentas de estudiantes se identifican por username. Eliminar una es un borrado lógico que se puede restaurar.

MétodoRutaQuién puede llamarlaQué hace
GET/api/usersstudents.viewEstudiantes, con search, email, phone, country_id, username, first_name, last_name, from_date, to_date, verified
GET/api/users/statisticstudents.viewRecuentos de estudiantes
GET/api/users/:usernamestudents.viewUn estudiante
POST/api/usersstudents.createCrea un estudiante
PATCH/api/users/:usernamestudents.updateActualiza un estudiante
PATCH/api/users/:username/change-passwordstudents.updateEstablece la contraseña de un estudiante
POST/api/users/:username/resend-verification-emailstudents.updateVuelve a enviar el enlace de confirmación. data.sent vale false y data.simulated vale true cuando no hay proveedor de correo y el enlace fue al registro. 409 si ya está confirmado, 429 cuando la dirección recibió demasiados, 503 cuando el proveedor lo rechazó.
POST/api/users/:username/make-verifiedstudents.verifyMarca el correo como confirmado
POST/api/users/:username/make-unverifiedstudents.verifyMarca el correo como no confirmado
DELETE/api/users/:usernamestudents.deleteMueve el estudiante a la papelera
GET/api/users/deletedstudents.view, students.delete o students.restoreEstudiantes eliminados
GET/api/users/deleted/:usernamestudents.view, students.delete o students.restoreUn estudiante eliminado
POST/api/users/deleted/:username/restorestudents.restoreRestaura un estudiante eliminado

Instructores

MétodoRutaQuién puede llamarlaQué hace
GET/api/instructorsinstructors.viewInstructores, con search, specialty, status, is_featured
GET/api/instructors/statisticinstructors.viewRecuentos de instructores
GET/api/instructors/username/:usernameinstructors.viewUn instructor por nombre de usuario
GET/api/instructors/:idinstructors.viewUn instructor
POST/api/instructorsinstructors.createCrea un instructor
PATCH/api/instructors/:idinstructors.editActualiza un instructor
DELETE/api/instructors/:idinstructors.deleteMueve un instructor a la papelera
GET/api/instructors/deletedinstructors.view, instructors.delete o instructors.restoreInstructores eliminados
POST/api/instructors/deleted/:id/restoreinstructors.restoreRestaura uno

Una cuenta de instructor escribe a sus estudiantes mediante estas rutas, que responden 403 para un administrador no vinculado a un instructor:

MétodoRutaQuién puede llamarlaQué hace
GET/api/conversationsCuenta de instructorLas conversaciones del instructor
GET/api/conversations/with/:userIdCuenta de instructorLos cursos que el instructor comparte con un estudiante, para iniciar una conversación desde ellos
POST/api/conversationsCuenta de instructorAbre, o devuelve, una conversación con user_id, opcionalmente sobre course_id
GET/api/conversations/:id/messagesCuenta de instructorLos mensajes de una conversación
POST/api/conversations/:id/messagesCuenta de instructorEnvía un mensaje
PATCH/api/conversations/:id/readCuenta de instructorLa marca como leída
PATCH/api/conversations/:id/unreadCuenta de instructorLa marca como no leída

Categorías

Las lecturas están abiertas a cualquiera y se enumeran en el Catálogo público. Las escrituras necesitan un permiso:

MétodoRutaQuién puede llamarlaQué hace
GET/api/categories/statisticcategories.viewRecuentos de categorías
POST/api/categoriescategories.createCrea una categoría
PATCH/api/categories/:idcategories.editActualiza una categoría
DELETE/api/categories/:idcategories.deleteMueve una categoría a la papelera
GET/api/categories/deletedcategories.delete o categories.restoreCategorías eliminadas
POST/api/categories/deleted/:id/restorecategories.restoreRestaura uno

Cursos

MétodoRutaQuién puede llamarlaQué hace
GET/api/coursescourses.viewCursos, con search, category_id, instructor_id, status, type, is_public, is_featured
GET/api/courses/statisticcourses.viewRecuentos de cursos
GET/api/courses/slug/:slugcourses.viewUn curso por slug
GET/api/courses/:idcourses.viewUn curso
POST/api/coursescourses.createCrea un curso
PATCH/api/courses/:idcourses.editActualiza un curso
DELETE/api/courses/:idcourses.deleteMueve un curso a la papelera
GET/api/courses/deletedcourses.delete o courses.restoreCursos eliminados
POST/api/courses/deleted/:id/restorecourses.restoreRestaura uno

Plan de estudios: secciones, lecciones y recursos

MétodoRutaQuién puede llamarlaQué hace
GET/api/courses/:courseId/sectionscurriculum.viewLas secciones de un curso
POST/api/courses/:courseId/sectionscurriculum.createAñade una sección
POST/api/courses/:courseId/sections/reordercurriculum.editDefine el orden de las secciones a partir de ids
GET/api/sections/:idcurriculum.viewUna sección
PATCH/api/sections/:idcurriculum.editActualiza una sección
DELETE/api/sections/:idcurriculum.deleteElimina una sección
GET/api/sections/:sectionId/lessonscurriculum.viewLas lecciones de una sección
POST/api/sections/:sectionId/lessonscurriculum.createAñade una lección
POST/api/sections/:sectionId/lessons/reordercurriculum.editDefine el orden de las lecciones a partir de ids
GET/api/lessons/:idcurriculum.viewUna lección
PATCH/api/lessons/:idcurriculum.editActualiza una lección
DELETE/api/lessons/:idcurriculum.deleteElimina una lección
GET/api/lessons/:lessonId/resourcescurriculum.viewLos recursos descargables de una lección
POST/api/lessons/:lessonId/resourcescurriculum.editAdjunta un recurso
PATCH/api/lesson-resources/:idcurriculum.editActualiza un recurso
DELETE/api/lesson-resources/:idcurriculum.editQuita un recurso

Cuestionarios y tareas

MétodoRutaQuién puede llamarlaQué hace
GET/api/quizzes?course_id=courses.viewLos cuestionarios de un curso (course_id es obligatorio)
GET/api/quizzes/:idcourses.viewUn cuestionario con sus preguntas y respuestas
POST/api/quizzescourses.createCrea un cuestionario
PATCH/api/quizzes/:idcourses.editActualiza un cuestionario
DELETE/api/quizzes/:idcourses.deleteElimina un cuestionario
POST/api/quizzes/:id/questionscourses.editAñade una pregunta
PATCH/api/quizzes/:id/questions/:questionIdcourses.editActualiza una pregunta
DELETE/api/quizzes/:id/questions/:questionIdcourses.editElimina una pregunta
GET/api/assignmentsassignments.viewTareas, con search, course_id, lesson_id, status, from, to
GET/api/assignments/:idassignments.viewUna tarea
GET/api/assignments/:id/submissionsassignments.viewLas entregas pendientes de calificar
PATCH/api/assignments/submissions/:submissionId/gradeassignments.editCalifica una entrega
POST/api/assignmentsassignments.createCrea una tarea
PATCH/api/assignments/:idassignments.editActualiza una tarea
DELETE/api/assignments/:idassignments.deleteElimina una tarea

Inscripciones y pedidos

MétodoRutaQuién puede llamarlaQué hace
GET/api/enrollmentsenrollments.viewInscripciones, con search, course_id, user_id, status, date_from, date_to
GET/api/enrollments/statisticenrollments.viewRecuentos de inscripciones
GET/api/enrollments/:idenrollments.viewUna inscripción
POST/api/enrollmentsenrollments.createInscribe a un estudiante manualmente
PATCH/api/enrollments/:idenrollments.editActualiza una inscripción
DELETE/api/enrollments/:idenrollments.deleteQuita una inscripción
GET/api/ordersorders.viewPedidos, con search, status, payment_method, course_id, user_id, date_from, date_to, page, limit, sort_by, sort_order
GET/api/orders/revenueorders.viewIngresos entre date_from y date_to. El valor medio de pedido deja fuera los pedidos gratuitos.
GET/api/orders/revenue/seriesorders.viewLos ingresos diarios de los últimos days (30 por defecto, 365 como máximo)
GET/api/orders/:idorders.viewUn pedido
POST/api/ordersorders.createRegistra una plaza pagada por otra vía
PATCH/api/orders/:idorders.editActualiza un pedido
DELETE/api/orders/:idorders.deleteElimina un pedido

El status de un pedido es pending, paid, failed o refunded. Su gateway indica el procesador que cobró, demo para el simulador integrado o free para un curso que no costaba nada.

Reseñas

MétodoRutaQuién puede llamarlaQué hace
GET/api/course-reviewsreviews.viewReseñas, con search, course_id, user_id, rating, status
GET/api/course-reviews/statisticreviews.viewRecuentos de reseñas
GET/api/course-reviews/:idreviews.viewUna reseña
PATCH/api/course-reviews/:idreviews.editModera una reseña: status es published, pending o hidden
DELETE/api/course-reviews/:idreviews.deleteMueve una reseña a la papelera
GET/api/course-reviews/deletedreviews.delete o reviews.restoreReseñas eliminadas
POST/api/course-reviews/deleted/:id/restorereviews.restoreRestaura uno

Los estudiantes escriben sus propias reseñas mediante las rutas de estudiante, y la página del curso lee las publicadas del Catálogo público. Cada cambio de moderación recalcula la valoración del curso y la del instructor.

Blog

MétodoRutaQuién puede llamarlaQué hace
GET/api/blogblog.viewArtículos en cualquier estado, con search, category_slug, status, tag
GET/api/blog/statisticblog.viewRecuentos de artículos
GET/api/blog/slug/:slugblog.viewUn artículo por slug
GET/api/blog/:idblog.viewUn artículo
POST/api/blogblog.createCrea un artículo
PATCH/api/blog/:idblog.editActualiza un artículo
DELETE/api/blog/:idblog.deleteMueve un artículo a la papelera
GET/api/blog/deletedblog.delete o blog.restoreArtículos eliminados
POST/api/blog/deleted/:id/restoreblog.restoreRestaura uno

Ajustes

Los ajustes de la plataforma se guardan como pares de clave y valor y se identifican por key.

MétodoRutaQuién puede llamarlaQué hace
GET/api/settingssettings.viewAjustes, con search, category, type
GET/api/settings/:keysettings.viewUn ajuste
PATCH/api/settings/:keysettings.editCambia el valor de un ajuste
DELETE/api/settings/:keysettings.editElimina un ajuste

El seeder crea estos seis, y cada uno lo lee la API o el panel del estudiante:

ClaveValor inicialQué hace
site_nameLearnioEl nombre del producto que aparece en cada email que envía la API
default_localeenEl idioma que se usa cuando una solicitud no nombra ningún idioma admitido. Un valor que no sea un idioma admitido se rechaza con 400.
support_emailsupport@learnio.comLa dirección de respuesta de todos los emails, para que una respuesta llegue a una persona
courses_per_page12El tamaño de página del catálogo público cuando la solicitud no indica ninguno (de 1 a 100)
reviews_require_approvalfalseCon true, la reseña de un estudiante espera como pending hasta que un moderador la publica
dashboard_radar_metricsUn mapa JSON de métrica a puntuaciónEl gráfico de habilidades del panel del estudiante

Un cambio se aplica en la siguiente solicitud o el siguiente email, sin reiniciar. Volver a ejecutar el seeder añade un ajuste que falte, pero nunca sobrescribe un valor ya guardado.

Subida de archivos multimedia

MétodoRutaQuién puede llamarlaQué hace
POST/api/helpers/uploadCualquier administrador con sesión iniciada, o un estudianteSube un archivo al bucket de archivos multimedia y responde con sus direcciones

Envía multipart/form-data con el archivo en file, hasta 150 MB, y opcionalmente path (la carpeta, uploads por defecto), for (un tamaño de imagen predefinido) y type (video para omitir el procesamiento de imágenes). Las imágenes se redimensionan en varias versiones; los videos (mp4, webm, mov, m4v) se guardan tal cual. Necesita la configuración del bucket de Almacenamiento multimedia.

La ruta necesita un token de administrador o de estudiante, comprobado antes de leer el archivo. path debe ser una de las carpetas indicadas en back-end/src/modules/helpers/upload/upload-folders.constants.ts; cualquier otra responde 400. Un administrador puede subir a uploads, admins/profile, admins/profiles, users/profiles, blog, categories, courses, instructors, messages y ai-chat. Un estudiante solo puede subir a messages, para las imágenes que adjunta a una conversación. Una pantalla nueva que suba a una carpeta propia necesita añadir esa carpeta a la lista.

Terminal
curl -X POST http://localhost:8000/api/helpers/upload \
  -H "Authorization: Bearer <access_token>" \
  -F "file=@cover.jpg" -F "path=courses"

Notificaciones, búsqueda y estadísticas

MétodoRutaQuién puede llamarlaQué hace
GET/api/notificationsCualquier administrador con sesión iniciadaLas notificaciones del administrador con sesión iniciada y el número de no leídas
PATCH/api/notifications/read-allCualquier administrador con sesión iniciadaMarca todas como leídas y responde con todo el feed
PATCH/api/notifications/:id/readCualquier administrador con sesión iniciadaMarca una como leída y responde con todo el feed
DELETE/api/notifications/:idCualquier administrador con sesión iniciadaElimina una y responde con todo el feed
GET/api/searchCualquier administrador con sesión iniciadaBúsqueda global (q, limit por tipo). Solo se buscan los tipos que permiten los permisos del administrador.
GET/api/statistics/trendscourses.viewLas cifras de cada tarjeta de estadísticas, en una sola llamada
GET/api/statistics/overviewcourses.viewEl resumen de la página de inicio del panel, sobre days, con limit filas por lista

Un administrador solo lee y cambia sus propias notificaciones: las rutas toman al administrador del token. La API escribe una por cada uno de estos eventos, para cada administrador que tenga el permiso que necesita la pantalla enlazada:

TipoCuándoQuién lo recibe
enrollment_createdUn estudiante recibe una plaza, por una compra, un curso gratuito o el personalenrollments.view
course_completedUn estudiante termina un cursoenrollments.view
course_review_submittedUn estudiante deja una reseña, o edita una que espera aprobaciónreviews.view
course_publishedSe publica un cursocourses.view
student_registeredUn estudiante crea una cuentastudents.view

Una cuenta de administrador vinculada a un instructor solo recibe avisos de los cursos de ese instructor, y no de los registros nuevos. Cada una se envía además por el socket /notifications en cuanto se guarda.

Clases en vivo

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas de las clases en vivo: la programación de sesiones y los tokens de acceso que reciben los estudiantes y los anfitriones para una sala de Jitsi Meet.

Certificados

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas de certificados: cómo solicita un estudiante uno para un curso terminado, y la dirección pública de verificación.

Asistente de IA

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas del asistente de IA: la transmisión de una respuesta, la lista de modelos y las sesiones de chat guardadas.

Historial de chat del asistente

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Guardar, listar y renombrar las conversaciones del asistente.

Servidor MCP

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

El módulo MCP que ofrece los datos del panel como herramientas para el asistente.

Rutas del modo demostración

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas que usa una demostración pública: el interruptor de la demostración y las cuentas por visitante.

Pasarelas de pago personalizadas

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Cómo está construida la capa de pagos: las interfaces de pasarela y de webhook, el webhook del simulador y cómo añadir un procesador.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.