---
title: "List product lessons"
method: GET
path: "/api/products/{productId}/lessons"
tags: ["Product Content"]
---

# List product lessons

`GET /api/products/{productId}/lessons`

## Path parameters

- `productId` string, required

## Response `200`

Success.

- LessonListResponse
  - `data` LessonGroup[]
    - `groupId` string
    - `lessons` Lesson[]
      - `lessonId` string
      - `title` string
      - `type` 'text' | 'video' | 'audio' | 'pdf' | 'file' | 'embed' | 'quiz'
      - `content` union — `text` lessons use `TiptapDocument`; `embed` lessons use `EmbedContent`; `quiz` lessons use `QuizContent`. Media-backed lessons (`video`, `audio`, `pdf`, `file`) use `media` instead of `content`.
        - TiptapDocument — Tiptap/ProseMirror document JSON used by `text` lessons. Supported nodes include `doc`, `paragraph`, `heading` (`level` 1, 2, or 3), `text`, `bulletList`, `orderedList`, `listItem`, `blockquote`, `horizontalRule`, `codeBlock`, `table`, `tableRow`, `tableHeader`, `tableCell`, `image`, and `hardBreak`. Supported marks include `bold`, `italic`, `underline`, `strike`, `code`, `link`, and `highlight`. An `image` node uses `attrs` with `src` (required), `alt` (optional), and `title` (optional).
          - `type` string, required
          - `content` object[], required
        - EmbedContent — Embed content for `embed` lessons. The value can be a supported video URL or iframe/embed code, matching the dashboard Embed lesson field.
          - `value` string, required
        - QuizContent — Quiz content for `quiz` lesson type.
          - `questions` object[], required — List of quiz questions.
            - `text` string, required — Question text.
            - `options` object[], required — Answer options. Exactly one option should have `correctAnswer: true` for single-choice; multiple for multiple-choice.
              - …
          - `requiresPassingGrade` boolean, required — Whether a minimum score is required to pass.
          - `passingGrade` number, required — Score threshold (0–100) when `requiresPassingGrade` is true.
      - `media` LessonMedia — Media object used by `video`, `audio`, `pdf`, and `file` lessons. Use `/api/media/presigned` to upload to MediaLit first, then send the resulting media metadata here.
        - `mediaId` string, required
        - `originalFileName` string
        - `mimeType` string
        - `size` number
        - `access` 'public' | 'private'
        - `file` string — Public file URL when available. Private media may omit this field.
        - `thumbnail` string
        - `caption` string
      - `downloadable` boolean
      - `courseId` string
      - `groupId` string
      - `requiresEnrollment` boolean
      - `published` boolean

## Other responses

- `404` — Product not found.

## Changes

> 2 revisions in range; 1 could not be searched.

- **2026-04-19** `85a1c15f561d` — 1 breaking
  - api path removed without deprecation

[Change history](https://skmtc.dev/codelitdev/apis/courselit-rest-api/changes/api/products/:productId/lessons/get.md)

---

[API](https://skmtc.dev/codelitdev/apis/courselit-rest-api.md) · [All operations](https://skmtc.dev/codelitdev/apis/courselit-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/codelitdev/courselit-rest-api/revisions/3b48f60910dc/schema)
