EMPO Academy Docs
API quickstart

Features · Courses

Courses & lessons

How courses are structured and what lesson blocks are available.

The hierarchy

Course → Module → Lesson → Block. A course has any number of modules. A module has any number of lessons. A lesson is composed of one or more blocks stacked vertically.

Block types

  • Text, Heading, Statement, List— structured prose
  • Divider, Callout— visual breaks and emphasis
  • Column— 2/3/4-column container with nested blocks inside each slot
  • Image, Video, Audio, Drive resource, Link button— media + external links
  • Knowledge check— inline single-question check
  • Quiz— full multi-question quiz, auto-graded for MC + T/F, manual review for short-answer
  • Assignment— long-form submissions with file uploads, reviewed by the instructor

Course statuses

  • DRAFT— private to instructor, not visible in catalog
  • PENDING_REVIEW— submitted; admin must approve before publish
  • PUBLISHED— live in catalog, enrollable
  • PRIVATE— live but hidden from catalog; accessible via direct link only
  • ARCHIVED— closed to new enrollments

Drip + prerequisites

Each lesson can be configured to unlock N days after enrollment (drip release) and/or require another specific lesson to be completed first (prerequisite chain). Configure both in the lesson settings strip at the top of the lesson editor.

Field-ready badge

A course earns the Field-readybadge on its public detail page when it ships materials a learner can take into their actual work — specifically: any of (a) at least one item in Materials included, (b) any lesson with an assignment prompt, or (c) any ASSIGNMENT or QUIZlesson. It’s a derived signal, not a manual flag — the badge appears the moment your course satisfies the rule.

Content sanitisation

Rich-text fields (Tiptap output, markdown-derived block content) are run through a DOMPurify allowlist before storage AND before render. The allowlist is the Tiptap StarterKit set: p, br, strong, em, u, s, code, pre, blockquote, h1-h6, ul, ol, li, a, img, hr. Anything outside that — <script>, <iframe>, <style>, inline event handlers, javascript: URLs — is stripped automatically. You can paste content from anywhere without worrying about silent XSS.

See For instructors for the author workflow, or For learners for how it looks on the student side.