Skip to content
Studeia Docs

CMS: courses, modules and lessons

Content hierarchy in Studeia: Course → Module → Lesson. CRUD via UI or API. 8 lesson types + 6 interactive subtypes. Support for clone, IMS CC import, AI auto-generation, scheduled publishing.

2026-05-23 6 min
Resposta curta

Studeia organizes content in Course → Module → Lesson hierarchy. Each course belongs to a Tenant, can have multiple modules (with sortOrder), each module can have multiple lessons with 8 types (slides, video, PDF, rich_text, quiz, assignment, live_class, external_link) + 6 interactive subtypes. CRUD via UI or public API. Support for clone, IMS CC import, AI auto-generation (PDF→course), scheduled publishing (publishAt) and RAG ingestion for AI tutor.

Hierarchy

Tenant (Institution)
  └── Course (title, slug, status, theme, publishAt, aiTutorEnabled)
      └── CourseModule (title, sortOrder)
          └── CourseLesson (type, content JSON, sortOrder, isPublished, publishAt)
              ├── CourseLessonMedia (N:N with MediaAsset)
              └── LessonCompletion (1:N per studentId)

CRUD endpoints

POST   /api/institution/courses
GET    /api/institution/courses
GET    /api/institution/courses/[id]
PATCH  /api/institution/courses/[id]
DELETE /api/institution/courses/[id]
POST   /api/institution/courses/[id]/clone
POST   /api/institution/courses/import        (IMS CC)

POST   /api/institution/courses/[id]/modules
PATCH  /api/institution/courses/[id]/modules/[mid]
DELETE /api/institution/courses/[id]/modules/[mid]
PATCH  /api/institution/courses/[id]/modules/reorder

POST   /api/institution/courses/[id]/modules/[mid]/lessons
PATCH  /api/institution/courses/[id]/modules/[mid]/lessons/[lid]
DELETE /api/institution/courses/[id]/modules/[mid]/lessons/[lid]

Scopes: courses:read (GET) | courses:write (POST/PATCH/DELETE).

Course status

Course.status: draft | published | archived. Course.publishAt schedules automatic publishing via cron.

Scheduled publishing

Combine Course.publishAt with Lesson.publishAt for granular control. checkLessonAvailability() validates in ALL lesson endpoints.

Prerequisites

Lesson.prerequisiteLessonId points to lesson that MUST be complete before access.

Clone

POST /api/institution/courses/[id]/clone creates new Course with deep copy of modules + lessons. Does NOT copy: Enrollments, LessonCompletions, ClassGroups, QuizAttempts, RAG ingestion. Respects plan limit.

IMS CC import

Supports IMS CC v1.0, v1.1, v1.2, v1.3. Resources: web links, file resources, basic LTI links, QTI 1.2 quizzes, web content. NOT supported: H5P content packages, SCORM 2004 PIF, IMS CP.

Limitations

  • Maximum 100 modules per course (soft limit, performance)
  • Maximum 200 lessons per module (soft limit, UX)
  • Content JSON per lesson up to 5MB
  • Slug must be unique per tenant + language

See also

FAQ

How to create a new course?

Via UI: /institution/courses > New Course. Define title, slug, description, visual theme, status (draft). Via API: POST /api/institution/courses (scope courses:write). After creating, add modules and lessons.

Can I clone an existing course?

Yes. POST /api/institution/courses/[id]/clone. Creates copy with new slug, same modules and lessons (deep copy). Useful for creating new classes based on existing course. Respects plan course limit.

Can I import content from Moodle/Canvas/Blackboard?

Yes, via IMS Common Cartridge (IMS CC v1.x). POST /api/institution/courses/import with .imscc file. Parser extracts modules, lessons, resources (PDFs, links, basic quizzes). H5P and SCORM 2004 are not 100% supported — only native IMS CC.

How to publish lesson with scheduled date?

Set lesson.isPublished=false + lesson.publishAt=timestamp. Student doesn't see lesson until publishAt. checkLessonAvailability() validates in all endpoints (quiz, complete, view).

Veja tambem

CMS: courses, modules and lessons