Skip to main content

Request headers

string
required
The service user’s API token in the Bearer YOUR_TOKEN format. The school owner issues the token in the admin panel: Manage → School → For developers → API keys — see the “Authentication” section for details.
integer
required
The numeric ID of the seller — the account the school belongs to. Copy it on the API keys page, in the Integration data → Identifiers card. The token’s permissions are checked against this ID.
integer
required
The numeric ID of the school, found in the same place as Seller-Id. The value must match the seller’s school — otherwise a 400 error with cause: "ForbiddenSchoolMismatch" is returned.
Requires authentication and the “Course Management” permission (CourseManage). The method is available to schools only. The method creates a course with the same parameters as the “Create course” button in the admin panel. If you pass modules, the whole course tree is created in the same request: modules, lessons inside them and the content blocks of each lesson. Without modules an empty course is created — lessons can be added later in the admin panel.
Created automatically together with the course:
  • the course product — published right away; its ID is returned in the productId field of the response;
  • a default group (“Group 1”) — you can enroll users into it. List groups with the courseIds filter returns the group ID.
The API key’s user becomes an author of the course and is assigned as its editor, so the created course is available to this key in update and get even when the course uses the “Assigned” access mode.
Creation is not atomic. The course, modules, lessons and blocks are written one after another, without a shared transaction. Body validation errors are returned before anything is written, so nothing gets created. But if the request breaks off in the middle of writing (a dropped connection, a timeout, a server failure), the part created so far stays in the school and the course is left incomplete. Repeating the request creates a new course rather than completing the previous one — delete the incomplete course or finish it in the admin panel.
Unknown fields in the request body are silently dropped — no error is returned. Check field names against this page.

Request parameters

Course

enum
required
Course type: TextCourse, VideoCourse, Webinar, Assessment, PersonalLesson, Bundle.
string
required
Course name. 1 to 130 characters; leading and trailing spaces are trimmed.
string
required
Course description. Up to 500 characters; may be an empty string "".
string[]
required
Course tags, each at least 2 characters long. Pass [] if there are none.
integer[]
required
IDs of school users listed as course authors. The API key’s user is added automatically. Pass [] if there are no other authors.
string
Course URL alias: Latin letters, digits and _. Cannot consist of digits only and must be unique.
object
Course images.
string
Link to the course promo video.
string[]
SEO tags.
integer[]
IDs of the course subject categories.
integer
ID of the course content category.
object
Course settings. All fields are optional.
object
Course product parameters. If omitted, the product is created with the default settings.
object[]
For type: Bundle only — courses included in the bundle (up to 50). The courses and their groups must belong to the same school.
The buildStatus and aiContext fields are internal — they are filled in by the AI course wizard. Do not pass them: with buildStatus: AiGenerating the course is hidden from everyone except its author.

Modules and lessons

object[]
Course modules — up to 50. The order of modules, lessons and blocks in the course follows the order in the arrays.
Modules and lessons are created as Draft — students do not see them. To make the materials available right away, pass status: "Published" for modules and lessons. Do not pass parentLessonId: modules and lessons are linked by array nesting.

Content blocks

Each lesson block is an object with the fields:
enum
required
Block type. For lessons: EditorJsBlock, TaskQuestion, Checklist, Button, Checkpoint, ChatMessage, Video, Iframe, NotionPage. Other values (Text, Audio, Scorm, Survey and promo block types) are not recommended for creation via the API.
string
Heading shown above the block in the lesson.
object
required
Block content. Its shape depends on type — see the examples below.
The API does not validate content: the block is saved as passed. A block with the wrong content shape is created but renders empty or broken in the lesson. Check the shape against the examples. Generate every uuid inside content on your side (UUID v4), unique within the block. Blocks with files (uploaded video, audio, a SCORM package) cannot be created via the API — the file is uploaded in the admin panel.
The main block for theory: headings, paragraphs, lists, quotes, tables and a delimiter. content is an EditorJS document. The text may use <b>, <i>, <u>, <a> tags.
Inner block ids are arbitrary unique strings. A header level is 2 or 3; a list style is unordered or ordered.
A question with answer options, checked right in the lesson. answerType: Single — one correct option, Multiple — several.
messages is optional. When set, the blocks below the question stay hidden until the student answers.
A divider button: everything below stays hidden until the student presses it.
A public Notion page, displayed inside the lesson.

Response fields

object
The created course — a course object. The module and lesson tree is not included in the response.

Errors

The InvalidAlias and AliasAlreadyBusy messages are currently returned in Russian — rely on cause.

Permission requirements

Requires token authentication and the “Course Management” permission (CourseManage). The method is available to schools only.

Updated: 2026-09-28 05:04 UTC