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>"
}
}

Get release notes by email

A short digest on the days something new goes live — each change with a link to its note in the release notes. No marketing, and one click to stop.

Company email addresses only. We’ll send one email to confirm it’s you. Already use Sessionboard? You can also turn this on under Community → What’s new.