> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.sessionboard.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Publish and assign a course draft

> Publishes the draft's lessons, course and certification to every learner in the organization. Lessons upsert by key, so publishing an edited draft again updates the same lessons and keeps learners' progress. With `assign`, assigns the certification (or the course when there is none) and messages each assignee (Slack DM, or email when Slack can't reach them); repeating the same `assign` does not assign or message again. With `announce.slackChannelId`, posts the announcement in that channel. Refused while clips are still being cut unless `allowPendingMedia`. The token's user needs the Lessons create and update permissions. Requires `write:learning`. Also at `POST /v1/learning/drafts/{draftId}/apply`.



## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/organization/{orgId}/learning/drafts/{draftId}/apply
openapi: 3.1.0
info:
  title: Sessionboard Public API
  version: '1.0'
  description: >-
    REST API for managing sessions, speakers, contacts, sponsors, exhibitors,
    and event data on the Sessionboard platform.
  contact:
    name: Sessionboard Support
    email: support@sessionboard.com
  termsOfService: https://www.sessionboard.com/legal/terms-of-service
servers:
  - url: https://public-api.sessionboard.com
    description: US Region
  - url: https://public-api-eu.sessionboard.com
    description: EU Region
security:
  - ApiKey: []
  - BearerToken: []
tags:
  - name: Events
    description: Manage events on the platform.
  - name: Sessions
    description: Search and retrieve sessions within an event.
  - name: Session Writes
    description: >-
      Create, update, delete, and restore sessions. Requires the
      `write:sessions` scope.
  - name: Contact Writes
    description: >-
      Create, update, delete, and restore contacts. Requires the
      `write:contacts` scope.
  - name: Exhibitor Writes
    description: >-
      Create, update, delete, and restore exhibitors. Requires the
      `write:exhibitors` scope.
  - name: Sponsor Writes
    description: >-
      Create, update, delete, and restore sponsors. Requires the
      `write:sponsors` scope.
  - name: Field Writes
    description: >-
      Create, update, and delete custom fields. Requires the `write:fields`
      scope.
  - name: Speakers
    description: Search and retrieve speakers within an event.
  - name: Participants
    description: |
      Search and retrieve every contact holding a session role on an event —
      speakers, chairpersons, moderators and custom roles — with the roles
      each one holds, and list the event's participant roles.
  - name: Contacts
    description: Search and retrieve contacts at the organization or event level.
  - name: Sponsors
    description: Search and retrieve sponsors within an event.
  - name: Exhibitors
    description: Search and retrieve exhibitors within an event.
  - name: Event Settings
    description: >-
      Retrieve event configuration such as fields, tags, tracks, rooms, formats,
      levels, languages, and session statuses.
  - name: GDPR
    description: Manage GDPR data access and erasure requests.
  - name: Insights
    description: >-
      Query event data using SbQL, generate queries with AI, and manage
      dashboards.
  - name: Ask
    description: >-
      Ask a natural-language question about one event and get a cited answer.
      Requires the `read:ask` scope, granted explicitly.
  - name: Metadata Writes
    description: >-
      Create, update, and delete session metadata (rooms, tracks, tags, formats,
      levels, languages, statuses). Requires the `write:metadata` scope.
  - name: Agenda Planning
    description: >-
      Manage agenda drafts, draft sessions, scheduling rules, and evaluation
      personas. Requires the `write:events` scope.
  - name: Dashboards & Widgets
    description: >-
      Create, read, update, and delete dashboards and widgets at the event or
      organization level. Requires `write:events` scope for writes.
  - name: Reports & Queries
    description: >-
      Create, read, update, delete, and run saved SbQL queries/reports at the
      event or organization level. Requires `write:events` scope for writes.
  - name: Transcriptions
    description: >-
      Transcript text on sessions — fragments, summaries, insights, and
      translations. Requires `read:transcriptions` / `write:transcriptions`
      scopes.
  - name: Session Recordings
    description: >-
      Session audio files for recording archives (live capture or imported
      audio). Requires `read:transcriptions` / `write:transcriptions` scopes.
  - name: Media
    description: >-
      Upload video or audio files for automatic transcription. Requires
      `read:media` / `write:media` scopes.
  - name: Session Files
    description: >
      Documents attached to sessions (PDFs, PowerPoint, Word, images, and
      similar).

      Simple upload: `POST .../files/upload` (multipart, max 50 MB).

      Direct-to-storage: create → PUT → complete (max 500 MB).

      Requires `read:sessions` / `write:sessions` scopes.

      See the [Uploading session files](/guides/uploading-session-files) guide.
  - name: OAuth
    description: >-
      OAuth 2.1 endpoints for AI client authorization (Claude, ChatGPT). Mounted
      at `/oauth/` (not `/v1/`).
  - name: Log Export
    description: >
      Pull your organization's API request, security and audit logs into a SIEM

      such as Splunk, Microsoft Sentinel or Elastic. Requires a dedicated API
      token

      with the `read:audit_logs` scope, which can call nothing else.

      See the [Exporting logs to a SIEM](/guides/exporting-logs-to-a-siem)
      guide.
  - name: Awards
    description: >-
      Read and manage Awards programs and their categories, rounds, promo codes,
      submissions and reviews. Organization-level: paths start at
      `/v1/organization/{orgId}/awards`. Requires `read:awards` / `write:awards`
      scopes.
  - name: Registration
    description: >
      Registration inside Sessionboard: registration forms, ticket types,
      registrations,

      orders, attendees and check-ins for one event. Requires the preview scopes

      `read:registrations` / `write:registrations`, which a token or OAuth
      client gets only

      when they are named explicitly (not by default, and not listed in
      `scopes_supported`).

      The event must have Registration turned on (Early Access); otherwise every
      endpoint

      answers `403 FORBIDDEN`.

      See the [Registration and Expo](/guides/registration-and-expo) guide.
  - name: Expo
    description: >
      Expo floor-map booths and sponsorship inventory for one event. Requires
      the preview

      scopes `read:expo` / `write:expo`, which a token or OAuth client gets only
      when they are

      named explicitly (not by default, and not listed in `scopes_supported`).
      The event must

      have Expo turned on (Early Access); otherwise every endpoint answers `403
      FORBIDDEN`.

      See the [Registration and Expo](/guides/registration-and-expo) guide.
  - name: Learning
    description: >
      Turn Media-section videos (webinars, recordings, uploads, clips) into a
      course: draft it from

      videos, review and edit the draft, then publish it and assign it.
      Organization-level: paths

      start at `/v1/organization/{orgId}/learning`, and the same operations are
      served under

      `/v1/learning` with the organization taken from the token. Requires the
      preview scopes

      `read:learning` / `write:learning`, which a token or OAuth client gets
      only when they are

      named explicitly (not by default, and not listed in `scopes_supported`).
      The organization

      must have Learning turned on, and the token's user needs the Lessons
      permissions.
paths:
  /v1/organization/{orgId}/learning/drafts/{draftId}/apply:
    post:
      tags:
        - Learning
      summary: Publish and assign a course draft
      description: >-
        Publishes the draft's lessons, course and certification to every learner
        in the organization. Lessons upsert by key, so publishing an edited
        draft again updates the same lessons and keeps learners' progress. With
        `assign`, assigns the certification (or the course when there is none)
        and messages each assignee (Slack DM, or email when Slack can't reach
        them); repeating the same `assign` does not assign or message again.
        With `announce.slackChannelId`, posts the announcement in that channel.
        Refused while clips are still being cut unless `allowPendingMedia`. The
        token's user needs the Lessons create and update permissions. Requires
        `write:learning`. Also at `POST /v1/learning/drafts/{draftId}/apply`.
      operationId: apply-course-draft
      parameters:
        - $ref: '#/components/parameters/LearningOrgId'
        - $ref: '#/components/parameters/CourseDraftId'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                assign:
                  type: object
                  properties:
                    allTeam:
                      type: boolean
                      description: Everyone on the team, including people who join later.
                    userIds:
                      type: array
                      items:
                        type: integer
                    dueInDays:
                      type:
                        - integer
                        - 'null'
                      minimum: 1
                      maximum: 365
                    required:
                      type: boolean
                      default: true
                announce:
                  type: object
                  properties:
                    slackChannelId:
                      type: string
                      maxLength: 32
                allowPendingMedia:
                  type: boolean
                  default: false
      responses:
        '200':
          description: >-
            Published; the draft with `apply_result` (`diff`, the assignment and
            its delivery report).
        '400':
          description: A clip could not be cut, or there is nothing to assign.
        '403':
          description: >-
            Token lacks `write:learning`, the user lacks the Lessons
            permissions, clips are still being cut, or the draft changed or is
            being published (reload it).
components:
  parameters:
    LearningOrgId:
      name: orgId
      in: path
      required: true
      schema:
        type: string
      description: Your organization ID. Any other organization returns `404`.
    CourseDraftId:
      name: draftId
      in: path
      required: true
      schema:
        type: string
        format: uuid
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: x-access-token
      description: >-
        Organization API token. Generate from Organization Settings → API
        Tokens.
    BearerToken:
      type: http
      scheme: bearer
      description: >-
        OAuth 2.1 access token. Obtained via the OAuth PKCE flow at
        `/oauth/token`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.