Developers

Duplicate a lesson

POST/products/{product_id}/lessons/{lesson_id}/copies

Starts an asynchronous operation that copies the lesson into the product given by target_product_id, optionally into a specific module and under a new name. The copy is always created as a draft.

This operation requires an Idempotency-Key header. The response returns the operation, and the Location header points to it; retrieve the operation to track its progress and obtain the new lesson once it completes.

Requires the lessons.create permission on the destination product. Replicated lessons cannot be copied, and lessons cannot be copied into replicated products; both cases return replica_readonly.

AuthorizationBearer <token>

Credential: the API credential secret, sent as a bearer token. Credential secrets are identified by a fixed prefix.

In: header

Path Parameters

product_id*string

Public ID of the product, prefixed with prd_.

lesson_id*string

Public ID of the lesson, prefixed with les_.

Header Parameters

Idempotency-Key*string

Client-generated key that makes the request safe to retry. Must be 1 to 128 characters from [A-Za-z0-9._:-]. Required by this operation: a missing key returns idempotency_key_required, and a malformed key returns idempotency_key_invalid. Repeating the request with the same key and the same body returns the stored result with Idempotent-Replayed: true.

X-Client-Request-Id?string

Optional client-generated identifier of the request, up to 64 characters from [A-Za-z0-9._-]. Echoed back in the response and recorded in the request log; it never replaces the server-generated X-Request-Id.

Lengthlength <= 64

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/products/string/lessons/string/copies" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "target_product_id": "string"  }'
{  "data": {    "attempt": {      "number": 0,      "status": "running"    },    "cancellation_requested": true,    "created_at": "2019-08-24T14:15:22Z",    "error": {      "code": "worker_error",      "field": "string",      "message": "string",      "reason": "string",      "resource_id": "string"    },    "expires_at": "2019-08-24T14:15:22Z",    "finished_at": "2019-08-24T14:15:22Z",    "id": "string",    "items_url": "string",    "object": "operation",    "progress": {      "done": 0,      "failed": 0,      "total": 0    },    "result_url": "string",    "started_at": "2019-08-24T14:15:22Z",    "status": "queued",    "type": "string"  }}

Replace lesson content PUT

Replaces the lesson body and, when `video` is included, the lesson video. The `inherited` field returned by the retrieve operation is accepted and ignored, so retrieved content can be sent back as is, unless it contains a block that this operation does not accept (see below). The body is a list of Editor.js blocks. Each block has a `type`, a `data` object and, optionally, the `id` assigned by the editor. These are the block types the lesson page displays and the `data` fields of each one: | Type | `data` fields | |---|---| | `paragraph` | `text` | | `header` | `text`, `level` (an integer from 1 to 6) | | `list` | `style` (`ordered` or `unordered`), `items` (a list of strings) | | `quote` | `text`, `caption`, `alignment` (`left` or `center`) | | `table` | `content` (a list of rows, each a list of cells), `withHeadings`, `stretched` | | `warning` | `title`, `message` | | `code` | `code` | | `delimiter` | none | | `image` | `file.url`, `caption`, `withBorder`, `stretched`, `withBackground` | | `attaches` | `file` (`url`, `name`, `size`, `extension`), `title` | | `embed` | `source` (the video page URL), `service`, `embed` (the player URL), `width`, `height`, `caption` | | `linkTool` | `link` (required), `meta` (optional: `title`, `description`, `site_name`, `image.url`) | `withHeadings`, `stretched`, `withBorder` and `withBackground` are booleans; `width` and `height` are numbers. Text fields are stored as sanitized HTML: only basic formatting tags and links are kept. This applies to `text`, `caption`, `title` (except in `attaches`), `message`, `code`, list items, table cells and the `title`, `description` and `site_name` of a `linkTool` block. In a `linkTool` block, `link` must not contain HTML and must be a relative link or use the `http`, `https` or `mailto` scheme. `meta` can carry other keys returned by the page preview (such as `url` or `type`); they are stored as sent and are not displayed. `raw` blocks are not accepted. Embed blocks must use a recognized provider in `source`, and `embed`, when present, must be an `http` or `https` URL. Quiz lessons do not accept a video. The request body must not exceed 1 MiB. The content of a connected lesson belongs to its source lesson and cannot be changed; such requests fail with `state_conflict`. Replicated lessons are read-only, and requests to change them return `replica_readonly`. Send the lesson's current `ETag` in the `If-Match` header to avoid overwriting a newer version.

List lesson taxonomy terms GET

Returns the taxonomy terms assigned to the lesson. Only lessons in products with the `blog` format support taxonomies. For products in other formats, the API returns `format_unsupported` instead of an empty list.