---
title: "Get lesson"
method: GET
path: "/v2/lessons/{id}"
tags: ["Lessons"]
---

# Get lesson

`GET /v2/lessons/{id}`

Retrieve a single lesson by ID.

**Required OAuth scope:** `lessons:read`

## Path parameters

- `id` string, required

## Response `200`

OK

- LessonDetailResponse — Single-resource envelope for GET /v2/lessons/{id}/ responses.
  - `data` LessonDetailResource, required — JSON:API resource object for a lesson on the detail/create/update path. Carries ``content_items`` (via ``LessonDetailAttributes``). The **list** route keeps returning the plain ``LessonResource`` so its shape is unchanged.
    - `type` 'lessons' — Always "lessons".
    - `id` string, required — Opaque lesson ID. Use in URL paths.
    - `attributes` LessonDetailAttributes, required — Attributes of a lesson resource on the detail/create/update responses. Extends the list attributes with the MODULAR ``content_items`` array. Kept off the shared ``LessonAttributes`` so the **list** response stays byte-identical (an Optional ``content_items`` on the list type would serialize as ``content_items: null`` — the list route has no ``exclude_none``). ``None`` for non-MODULAR lessons; the detail/create/update routes set ``exclude_none`` so the field is omitted then.
      - `title` string, required — Lesson title.
      - `type` string, required — Lesson type code (e.g. HTML).
      - `order` integer, required — Ordering value within the parent course.
      - `course_id` string, required — Obfuscated ID of the parent course.
      - `description_html` string — HTML description shown above the lesson body.
      - `content_html` string, nullable — HTML body of the lesson (when type="HTML").
      - `quiz_id` string, nullable — Obfuscated ID of the referenced quiz (when type="QUIZ").
      - `external_id` string, required — Stable UUID5 for cross-system correlation.
      - `created_at` string, date-time, required — Timestamp when the lesson was created.
      - `modified_at` string, date-time, required — Timestamp when the lesson was last modified.
      - `content_items` ContentItemResource[], nullable — Ordered content blocks. Present only when type is "MODULAR".
        - `id` string, required — Obfuscated content-item id.
        - `type` string, required — Content item type code.
        - `header` string — Header shown above the block.
        - `content_html` string, nullable — HTML body (when type is "HTML").
        - `asset_id` string, nullable — Obfuscated asset id (when type is "VIDEO"/"AUDIO").
        - `quiz_id` string, nullable — Obfuscated quiz id (when type is "QUIZ").
        - `rating` RatingConfig — Rating configuration carried by a ``RATING`` content item. ``rating_scale`` is a **proxy** for the course-level ``Course.rating_scale`` (not a ``RatingContentBlock`` column), mirroring ``api/v1/lessons/rating_content_blocks/serializers.py``. Constrained to ``5`` / ``10`` at the type level so an out-of-range value (e.g. ``7``) is a 422; the 10-point capability gate is enforced in the service. Unknown keys are rejected (422) so a typo'd rating field never silently no-ops. Reused as the read shape on ``ContentItemResource``: the builder echoes the effective course ``rating_scale`` and omits the low/high labels when the 10-point flag is off (relying on the endpoint's ``exclude_none``).
          - `rating_question` string, nullable — Main rating question shown to learners.
          - `additional_feedback_question` string, nullable — Optional follow-up feedback question.
          - `include_additional_feedback` boolean, nullable — Whether to show the feedback question.
          - `rating_scale_low_label` string, nullable — Low-end label (10-point scale only).
          - `rating_scale_high_label` string, nullable — High-end label (10-point scale only).
          - `rating_scale` 5 | 10, nullable — Rating scale (5 or 10). Course-level proxy — stored on Course, not the block.
    - `relationships` object, nullable — Related resource links.
    - `links` object, nullable — Self and related links.

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `422` — Unprocessable Entity
- `500` — Internal Server Error

---

[API](https://skmtc.net/skilljar/apis/skilljar-api-v2.md) · [All operations](https://skmtc.net/skilljar/apis/skilljar-api-v2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/skilljar/skilljar-api-v2/revisions/f8025de20169/schema)
