Skip to content

Get a course draft

GET/v1/organization/{orgId}/learning/drafts/{draftId}

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

While generating: status and progress. When ready: the bundle (lessons, the course, the certification), the diff publishing would make, warnings (questions left out because the clip doesn't answer them) and media — per clip, its status and a short-lived playable url. Requires read:learning. Also at GET /v1/learning/drafts/{draftId}.

Request example

Terminal window
curl --request GET \
--url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/drafts/{draftId}' \
--header 'x-access-token: <api-token>'

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
GET

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.

  • draftIdstring<uuid>pathrequired

Responses

200application/json

OK

  • payloadobject
    Show child attributes
    • draftCourseDraft
      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.

      • bundleCourseBundle

        Lessons, the course and the certification. A lesson's watch step plays a clip (mediaItemId) and may carry checkpoints — questions with atSeconds, seconds into the clip. A question has prompt, type, options, answer (multi-select, ordering and matching answers are JSON strings), optional config and feedback (correct, incorrect, hint). Keys are permanent: publishing upserts by key.

        Show child attributes
        • lessonsobject[]required
        • coursesobject[]
        • certificationsobject[]
      • diffobject

        What publishing would do — created / updated / unchanged for lessons, courses and certifications.

      • warningsobject[]
        Show child attributes
        • lessoninteger
        • messagestring
      • mediaobject

        Per clip id — status (ready, processing, failed, missing), a short-lived url, duration_s, poster_url.

      • apply_resultobject | null

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.

404

Not found — also returned for another organization's draft.

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",
"bundle": {
"lessons": [
{}
],
"courses": [
{}
],
"certifications": [
{}
]
},
"diff": {},
"warnings": [
{
"lesson": 123,
"message": "<string>"
}
],
"media": {},
"apply_result": {}
}
}
}