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.

By Studeia Team 2026-07-04 6 min
Resposta curta

In Studeia's CMS you build courses in a simple structure β€” course β†’ modules β†’ lessons β€” with 8 lesson types (slides, video, PDF, text, quiz, assignment, live, link) and 6 interactive subtypes. Create via the interface or the API, clone courses, import via IMS Common Cartridge, generate an AI draft from a document and schedule publishing. The material also feeds the AI tutor (RAG), all in a visual, no-code flow.

Hierarchy

Tenant (Institution)
  └── Course (title, slug, status, 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, 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