Appi · Referencia

Learn

Cursos con lecciones, actividades entregables, cuestionarios autocalificados e inscripciones con progreso.

Las rutas públicas identifican cursos y lecciones por slug (/learn/courses/vue-desde-cero/lessons/componentes). Las rutas de administración usan ids.

Cada curso tiene sus propios roles, independientes del rol en el sitio: student (cursa), teacher (gestiona lecciones, preguntas y califica) y admin (además puede eliminar). Un usuario puede autoinscribirse como student si el curso tiene autoEnroll activo; los demás roles los asigna el owner del sitio.

El progreso del estudiante (0–100) se recalcula automáticamente cuando ve una lección, envía una actividad o completa un cuestionario.

Cursos e inscripción

GET/learn/courses Público

Listar cursos activos

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
groupstringFiltra por grupo.
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "vue-desde-cero",
      "name": "Vue desde cero",
      "group": "frontend",
      "description": "Aprende Vue 3…",
      "picture": "https://…",
      "video": "https://…",
      "autoEnroll": true,
      "active": true
    }
  ]
}
GET/learn/courses/:course Sesión opcional

Obtener un curso

Si la petición incluye un token, agrega la inscripción del usuario en enrollment (o null si no está inscrito).

Parámetros de ruta
courserequeridostringSlug del curso.
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "vue-desde-cero",
  "name": "Vue desde cero",
  "group": "frontend",
  "description": "Aprende Vue 3…",
  "picture": "https://…",
  "video": "https://…",
  "autoEnroll": true,
  "active": true,
  "enrollment": { "id": "uuid", "role": "student", "status": "active", "progress": "40" }
}
POST/learn/courses/:course/enrollments Autenticado

Autoinscribirse en un curso

Inscribe al usuario como student con estado active. Solo funciona si el curso tiene autoEnroll.

Parámetros de ruta
courserequeridostringSlug del curso.
  • Responde 400 si el curso no permite autoinscripción o si el usuario ya está inscrito.
GET/learn/courses/:course/enrollments Teacher / Admin del curso

Listar inscritos del curso

Parámetros de ruta
courserequeridostringSlug del curso.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
GET/learn/courses/:course/enrollments/:id Teacher / Admin del curso

Ver una inscripción

Parámetros de ruta
courserequeridostringSlug del curso.
idrequeridostringID de la inscripción.

Mi aprendizaje

Rutas para armar el panel del estudiante: los cursos en los que está inscrito y las lecciones que ya completó, en todos los cursos del sitio.

GET/learn/user/courses Autenticado

Listar mis cursos

Cursos activos del sitio en los que el usuario autenticado está inscrito (con cualquier rol), del más reciente al más antiguo. Cada curso incluye en enrollments la inscripción del propio usuario.

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "vue-desde-cero",
      "name": "Vue desde cero",
      "group": "frontend",
      "description": "Aprende Vue 3…",
      "picture": "https://…",
      "video": "https://…",
      "autoEnroll": true,
      "active": true,
      "enrollments": [
        { "id": "uuid", "role": "student", "status": "active", "progress": "40" }
      ]
    }
  ]
}
GET/learn/user/lessons Autenticado

Listar mis lecciones completadas

Lecciones que el usuario autenticado ya vio al menos una vez (el mismo criterio con el que se calcula el progreso), ordenadas por fecha de creación de la lección descendente. Cada lección incluye su curso en course.

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "componentes",
      "name": "Componentes",
      "description": "…",
      "format": "markdown",
      "content": "## Componentes…",
      "activity": "Crea un componente…",
      "video": "https://…",
      "order": 2,
      "active": true,
      "limitDate": null,
      "course": { "id": "uuid", "slug": "vue-desde-cero", "name": "Vue desde cero", … }
    }
  ]
}
  • Una lección cuenta como completada al abrirla con GET /learn/courses/:course/lessons/:lesson usando el token del estudiante.

Lecciones

GET/learn/courses/:course/lessons Sesión opcional

Listar lecciones

Ordenadas por order. Los teachers/admins del curso ven también las inactivas.

Parámetros de ruta
courserequeridostringSlug del curso.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "componentes",
      "name": "Componentes",
      "description": "…",
      "format": "markdown",
      "content": "## Componentes…",
      "activity": "Crea un componente…",
      "video": "https://…",
      "order": 2,
      "active": true,
      "limitDate": null
    }
  ]
}
GET/learn/courses/:course/lessons/:lesson Sesión opcional

Ver una lección

Si el usuario está inscrito, registra la vista, actualiza su progreso y agrega su entrega (myAnswer), su último intento de cuestionario (myQuiz) y las preguntas del cuestionario sin la respuesta correcta (quizQuestions).

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "componentes",
  "name": "Componentes",
  "description": "…",
  "format": "markdown",
  "content": "## Componentes…",
  "activity": "Crea un componente…",
  "video": "https://…",
  "order": 2,
  "active": true,
  "limitDate": null,
  "myAnswer": { "id": "uuid", "answer": "Mi solución…", "attachment": null, "feedback": "¡Bien!", "result": "90" },
  "myQuiz": { "id": "uuid", "status": "completed", "results": "75", "answers": "[…]" },
  "quizQuestions": [
    { "id": "uuid", "name": "¿Qué es un prop?", "description": null, "picture": null,
      "response_1": "…", "response_2": "…", "response_3": "…", "response_4": null, "response_5": null }
  ]
}
  • Para mostrar la lección como "vista" basta con llamar este endpoint con el token del estudiante.
POST/learn/courses/:course/lessons Teacher / Admin del curso

Crear una lección

Parámetros de ruta
courserequeridostringSlug del curso.
Cuerpo (JSON)
namerequeridostringTítulo. El slug se genera a partir de él.
descriptionstring | nullResumen.
format'text' | 'html' | 'markdown'Formato del contenido.
contentstring | nullContenido de la lección.
activitystring | nullEnunciado de la actividad entregable. Si es null, la lección no recibe entregas.
videostring | nullURL de video.
ordernumberPosición dentro del curso.
activebooleanVisible para estudiantes.
limit_datestring | nullFecha límite ISO para actividad y cuestionario.
Ejemplo de petición
{ "name": "Componentes", "format": "markdown", "content": "## Componentes…", "order": 2, "active": true }
PUT/learn/courses/:course/lessons/:lesson Teacher / Admin del curso

Actualizar una lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Cuerpo (JSON)
namestringTítulo. El slug se genera a partir de él.
descriptionstring | nullResumen.
format'text' | 'html' | 'markdown'Formato del contenido.
contentstring | nullContenido de la lección.
activitystring | nullEnunciado de la actividad entregable. Si es null, la lección no recibe entregas.
videostring | nullURL de video.
ordernumberPosición dentro del curso.
activebooleanVisible para estudiantes.
limit_datestring | nullFecha límite ISO para actividad y cuestionario.
DELETE/learn/courses/:course/lessons/:lesson Admin del curso

Eliminar una lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.

Actividades y cuestionarios

Una lección puede tener una actividad abierta (texto y/o archivo, calificada por un teacher) y un cuestionario de selección múltiple que appi califica automáticamente.

POST/learn/courses/:course/lessons/:lesson/answers Estudiante del curso

Entregar la actividad de una lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Cuerpo (JSON)
answerrequeridostringRespuesta del estudiante.
attachmentstring | nullURL de un archivo (puedes subirlo antes con /content/attachments).
Ejemplo de petición
{ "answer": "Mi solución…", "attachment": "https://…/entrega.pdf" }
  • Una sola entrega por lección. Responde 400 si la lección no tiene actividad, si pasó la fecha límite o si ya entregaste.
GET/learn/courses/:course/lessons/:lesson/answers/:id Inscrito en el curso

Ver una entrega

El estudiante solo puede ver la suya.

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID de la entrega.
GET/learn/courses/:course/lessons/:lesson/answers Teacher / Admin del curso

Listar entregas de la lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
PUT/learn/courses/:course/lessons/:lesson/answers/:id Teacher / Admin del curso

Calificar una entrega

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID de la entrega.
Cuerpo (JSON)
feedbackstring | nullRetroalimentación para el estudiante.
resultnumber (0-100) | nullNota.
Ejemplo de petición
{ "feedback": "¡Bien!", "result": 90 }
DELETE/learn/courses/:course/lessons/:lesson/answers/:id Admin del curso

Eliminar una entrega

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID de la entrega.
POST/learn/courses/:course/lessons/:lesson/quizzes Estudiante del curso

Enviar un intento de cuestionario

Envía en una sola petición la opción elegida para cada pregunta de quizQuestions. appi califica, guarda el intento y actualiza el progreso. Se permiten varios intentos.

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Cuerpo (JSON)
answersrequerido{ question_id: string, selected: 1-5 }[]Exactamente una respuesta por cada pregunta vinculada a la lección.
Ejemplo de petición
{
  "answers": [
    { "question_id": "uuid-1", "selected": 2 },
    { "question_id": "uuid-2", "selected": 4 }
  ]
}
Ejemplo de respuesta
{
  "id": "uuid",
  "status": "completed",
  "results": "50",
  "answers": "[{\"question_id\":\"uuid-1\",\"selected\":2,\"correct\":true}, …]",
  "questions": "[…]"
}
  • answers y questions llegan como JSON serializado en string: usa JSON.parse.
  • Responde 400 si faltan o sobran preguntas, si la lección no tiene preguntas o si pasó la fecha límite.
GET/learn/courses/:course/lessons/:lesson/quizzes/:id Inscrito en el curso

Ver un intento

El estudiante solo puede ver los suyos.

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID del intento.
GET/learn/courses/:course/lessons/:lesson/quizzes Teacher / Admin del curso

Listar intentos de la lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
PUT/learn/courses/:course/lessons/:lesson/quizzes/:id Teacher / Admin del curso

Corregir un intento

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID del intento.
Cuerpo (JSON)
status'pending' | 'completed'Estado del intento.
resultsnumber (0-100) | nullNota.
DELETE/learn/courses/:course/lessons/:lesson/quizzes/:id Admin del curso

Eliminar un intento

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID del intento.

Banco de preguntas del curso

Preguntas de selección múltiple reutilizables entre lecciones. appi lleva estadísticas de aciertos (wons), fallos (losses) y dificultad (% de fallos). Los teachers/admins del curso crean preguntas en el banco y las vinculan a cada lección para armar su cuestionario.

GET/learn/courses/:course/questions Teacher / Admin del curso

Listar preguntas

Parámetros de ruta
courserequeridostringSlug del curso.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
GET/learn/courses/:course/questions/:id Teacher / Admin del curso

Ver una pregunta

Parámetros de ruta
courserequeridostringSlug del curso.
idrequeridostringID de la pregunta.
POST/learn/courses/:course/questions Teacher / Admin del curso

Crear una pregunta

Parámetros de ruta
courserequeridostringSlug del curso.
Cuerpo (JSON)
namerequeridostringEnunciado.
response_1, response_2requeridostringOpciones obligatorias.
response_3 … response_5string | nullOpciones adicionales.
response_correctrequeridonumber (1-5)Número de la opción correcta.
descriptionstring | nullContexto adicional.
picturestring | nullURL de imagen.
attachmentstring | nullURL de archivo de apoyo.
Ejemplo de petición
{ "name": "¿Qué es un prop?", "response_1": "Un dato que recibe el componente", "response_2": "Un evento", "response_correct": 1 }
PUT/learn/courses/:course/questions/:id Teacher / Admin del curso

Actualizar una pregunta

Parámetros de ruta
courserequeridostringSlug del curso.
idrequeridostringID de la pregunta.
Cuerpo (JSON)
namestringEnunciado.
response_1, response_2stringOpciones obligatorias.
response_3 … response_5string | nullOpciones adicionales.
response_correctnumber (1-5)Número de la opción correcta.
descriptionstring | nullContexto adicional.
picturestring | nullURL de imagen.
attachmentstring | nullURL de archivo de apoyo.
DELETE/learn/courses/:course/questions/:id Admin del curso

Eliminar una pregunta

Parámetros de ruta
courserequeridostringSlug del curso.
idrequeridostringID de la pregunta.
GET/learn/courses/:course/lessons/:lesson/exam-questions Teacher / Admin del curso

Listar preguntas vinculadas a una lección

Preguntas del banco que forman el cuestionario de la lección. Cada vínculo incluye la pregunta completa (con la respuesta correcta) en question.

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Ejemplo de respuesta
[
  { "id": "uuid", "lessonId": "uuid", "questionId": "uuid",
    "question": { "id": "uuid", "name": "¿Qué es un prop?", "response1": "…", "response2": "…", "responseCorrect": 1, … } }
]
POST/learn/courses/:course/lessons/:lesson/exam-questions Teacher / Admin del curso

Vincular una pregunta al cuestionario de la lección

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
Cuerpo (JSON)
question_idrequeridostringPregunta del banco del mismo curso.
Ejemplo de petición
{ "question_id": "uuid" }
  • Responde 404 si la pregunta no pertenece al curso y 400 si ya está vinculada a la lección.
DELETE/learn/courses/:course/lessons/:lesson/exam-questions/:id Teacher / Admin del curso

Desvincular una pregunta

Quita la pregunta del cuestionario de la lección; la pregunta sigue en el banco.

Parámetros de ruta
courserequeridostringSlug del curso.
lessonrequeridostringSlug de la lección.
idrequeridostringID del vínculo.

Administración de cursos

Solo owner del sitio

Gestión de todos los cursos del sitio por id, incluyendo la asignación de roles de curso y la vinculación de preguntas a lecciones.

Estas rutas solo responden a usuarios con rol owner. Úsalas desde un panel de administración privado, nunca desde el frontend público de tu sitio.
GET/admin/learn/courses Owner del sitio

Listar cursos

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda.
groupstringFiltra por grupo.
POST/admin/learn/courses Owner del sitio

Crear un curso

Cuerpo (JSON)
namerequeridostringNombre. El slug se genera a partir de él.
groupstring | nullGrupo o categoría.
descriptionstring | nullDescripción.
picturestring | nullURL de imagen.
videostring | nullURL de video introductorio.
auto_enrollbooleanPermite autoinscripción.
activebooleanVisible en el catálogo.
Ejemplo de petición
{ "name": "Vue desde cero", "group": "frontend", "auto_enroll": true, "active": true }
GET/admin/learn/courses/:id Owner del sitio

Obtener un curso

Parámetros de ruta
idrequeridostringID del curso.
PUT/admin/learn/courses/:id Owner del sitio

Actualizar un curso

Parámetros de ruta
idrequeridostringID del curso.
DELETE/admin/learn/courses/:id Owner del sitio

Eliminar un curso

Parámetros de ruta
idrequeridostringID del curso.
GET/admin/learn/courses/:course_id/lessons Owner del sitio

CRUD de lecciones (index, store, show, update, destroy)

Mismos campos que la creación de lecciones del curso; disponible también con POST, GET/:id, PUT/:id y DELETE/:id.

Parámetros de ruta
course_idrequeridostringID del curso.
GET/admin/learn/courses/:course_id/questions Owner del sitio

CRUD del banco de preguntas

Disponible con POST, GET/:id, PUT/:id y DELETE/:id.

Parámetros de ruta
course_idrequeridostringID del curso.
GET/admin/learn/courses/:course_id/lessons/:lesson_id/exam-questions Owner del sitio

Listar preguntas vinculadas a una lección

Parámetros de ruta
course_idrequeridostringID del curso.
lesson_idrequeridostringID de la lección.
POST/admin/learn/courses/:course_id/lessons/:lesson_id/exam-questions Owner del sitio

Vincular una pregunta al cuestionario de la lección

Parámetros de ruta
course_idrequeridostringID del curso.
lesson_idrequeridostringID de la lección.
Cuerpo (JSON)
question_idrequeridostringPregunta del banco del mismo curso.
Ejemplo de petición
{ "question_id": "uuid" }
DELETE/admin/learn/courses/:course_id/lessons/:lesson_id/exam-questions/:id Owner del sitio

Desvincular una pregunta

Parámetros de ruta
course_idrequeridostringID del curso.
lesson_idrequeridostringID de la lección.
idrequeridostringID del vínculo.
GET/admin/learn/courses/:course_id/lessons/:lesson_id/answers Owner del sitio

CRUD de entregas

Disponible con POST (registrar una entrega a nombre de user_id), GET/:id, PUT/:id (calificar) y DELETE/:id.

Parámetros de ruta
course_idrequeridostringID del curso.
lesson_idrequeridostringID de la lección.
GET/admin/learn/courses/:course_id/lessons/:lesson_id/quizzes Owner del sitio

Intentos de cuestionario

Disponible con GET/:id, PUT/:id (status, results) y DELETE/:id.

Parámetros de ruta
course_idrequeridostringID del curso.
lesson_idrequeridostringID de la lección.
GET/admin/learn/enrollments Owner del sitio

Listar inscripciones del sitio

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
course_idstringFiltra por curso.
rolestringFiltra por rol.
statusstringFiltra por estado.
POST/admin/learn/enrollments Owner del sitio

Inscribir un usuario o asignarle un rol de curso

Cuerpo (JSON)
course_idrequeridostringID del curso.
user_idrequeridostringUsuario del sitio (búscalo con /admin/learn/site-users).
role'student' | 'teacher' | 'admin'Rol en el curso.
status'pending' | 'active' | 'completed' | 'canceled'Estado de la inscripción.
Ejemplo de petición
{ "course_id": "uuid", "user_id": "uuid", "role": "teacher", "status": "active" }
GET/admin/learn/enrollments/:id Owner del sitio

Ver una inscripción

Parámetros de ruta
idrequeridostringID de la inscripción.
PUT/admin/learn/enrollments/:id Owner del sitio

Cambiar rol, estado o progreso

Parámetros de ruta
idrequeridostringID de la inscripción.
Cuerpo (JSON)
role'student' | 'teacher' | 'admin'Rol en el curso.
status'pending' | 'active' | 'completed' | 'canceled'Estado.
progressnumber (0-100)Progreso manual.
DELETE/admin/learn/enrollments/:id Owner del sitio

Eliminar una inscripción

Parámetros de ruta
idrequeridostringID de la inscripción.
GET/admin/learn/site-users Owner del sitio

Buscar usuarios del sitio

Para elegir a quién inscribir o asignar como teacher/admin.

Query string
qstringNombre o email.