Skip to content

Draft a course from videos

POST/v1/organization/{orgId}/learning/drafts/create

US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com

Starts making a course from 1–10 videos or clips. The videos are checked now (same organization, a transcript, no cuts); then the course is generated in the background: lesson-sized segments, a clip cut for each, and per lesson a short reading, in-video questions and a quiz, every question grounded in that clip's transcript. Answers 202 with the draft (status: queued); poll GET /v1/organization/{orgId}/learning/drafts/{draftId} until status is ready or failed (usually a minute or two per video). Nothing is published and no one is notified. Requires write:learning. Also at POST /v1/learning/drafts/create.

Request example

Terminal window
curl --request POST \
--url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/drafts/create' \
--header 'x-access-token: <api-token>' \
--header 'Content-Type: application/json' \
--data '{
"mediaItemIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"title": "<string>",
"audience": "<string>",
"certification": true,
"validityMonths": 1,
"questionTypes": [
"multiple_choice"
],
"checkpointsPerLesson": 0,
"quizQuestions": 1,
"maxLessonsPerVideo": 1
}'

Try it

Authorization

Your token stays in this page. It is sent only to the region above and is never saved; it is gone when you leave or reload the page.

Path parameters
Body application/json
POST

Authorizations

  • x-access-tokenstringheader

    Organization API token. Generate from Organization Settings → API Tokens.

  • AuthorizationBearer <token>headeror

    OAuth 2.1 access token. Obtained via the OAuth PKCE flow at /oauth/token.

Send one of these. See Authentication.

Path parameters

  • orgIdstringpathrequired

    Your organization ID. Any other organization returns 404.

Request body

application/jsonrequired

  • mediaItemIdsstring<uuid>[]required

    Videos / clips from List videos, in course order.

    Min items
    1
    Max items
    10
  • titlestring

    Course title. Defaults to the video's title when there is one video.

    Max length
    255
  • audiencestring

    Who the course is for. Shapes the writing; it does not decide who is assigned.

    Max length
    500
  • certificationboolean

    Add a certification earned by completing every lesson.

  • validityMonthsinteger

    How long the certification lasts. Omit for never expires.

    Minimum
    1
    Maximum
    120
  • questionTypesstring[]

    Default multiple_choice, true_false, multi_select.

    Allowed values
    "multiple_choice", "true_false", "short_answer", "multi_select", "ordering", "matching", "numeric"
  • checkpointsPerLessoninteger

    Questions that pause the video, per lesson. Default 2.

    Minimum
    0
    Maximum
    3
  • quizQuestionsinteger

    Final quiz questions per lesson. Default 4.

    Minimum
    1
    Maximum
    10
  • maxLessonsPerVideointeger

    Upper bound on lessons from one long video, default 8. Exceeded only when fewer lessons would each run past 10 minutes.

    Minimum
    1
    Maximum
    12
{
"mediaItemIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"title": "<string>",
"audience": "<string>",
"certification": true,
"validityMonths": 1,
"questionTypes": [
"multiple_choice"
],
"checkpointsPerLesson": 0,
"quizQuestions": 1,
"maxLessonsPerVideo": 1
}

Responses

202application/json

Queued.

  • payloadobject
    Show child attributes
    • draftCourseDraftSummary
      Show child attributes
      • idstring<uuid>
      • statusstring
        Allowed values
        "queued", "generating", "ready", "applying", "applied", "failed"
      • titlestring | null
      • media_item_idsstring<uuid>[]
      • progressobject | null
        Show child attributes
        • stepstring
        • doneinteger
        • totalinteger
      • errorstring | null
      • lesson_countinteger
      • applied_atstring<date-time> | null
      • created_atstring<date-time>
      • updated_atstring<date-time>

        Send back as baseUpdatedAt when you save.

    • pollstring

      Internal path of the draft; poll the Get a course draft operation.

400

A video is not in this organization, has no transcript, or has cuts.

403

  • SCOPE_REQUIRED — the token lacks read:learning (reads) or write:learning (writes). Legacy tokens with no scopes cannot write.
  • FORBIDDEN — Learning is not on for the organization, or the token's user lacks the Lessons permission.

Response examples

{
"payload": {
"draft": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued",
"title": "<string>",
"media_item_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"progress": {
"step": "<string>",
"done": 123,
"total": 123
},
"error": "<string>",
"lesson_count": 123,
"applied_at": "2026-01-15T09:30:00Z",
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:30:00Z"
},
"poll": "<string>"
}
}