Skip to content

Make draft courses from a meeting

POST/v1/organization/{orgId}/learning/workspace/on-demand/{eventId}

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

Turns the event's sessions into draft courses, gathered into one course for the meeting (" on demand"). Each course carries the session's recording, quiz, credit, faculty and disclosure decisions. By default only sessions with a recording are used; with includeWithoutRecording, sessions without one become drafts that wait for a recording. Up to 60 sessions per call: remaining says how many are left, so call again until it is 0. Safe to repeat: a session that is already a course is never drafted twice, a waiting draft whose session now has a recording gets it (attached), and a draft nobody edited takes the session's new title and description (refreshed). With dryRun it only counts. Nothing is published and no one is notified; publishing is Publish a meeting on demand. Learners keep the credit they already claimed in the room. The token's user needs the Lessons create permission. Requires write:learning; refused for a key restricted to particular events. Also at POST /v1/learning/workspace/on-demand/{eventId}.

Request example

Terminal window
curl --request POST \
--url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/on-demand/{eventId}' \
--header 'x-access-token: <api-token>' \
--header 'Content-Type: application/json' \
--data '{
"sessionIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"includeWithoutRecording": true,
"dryRun": false
}'

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.

  • eventIdintegerpathrequired

    The Sessionboard event. Another organization's event answers 401.

    Minimum
    1

Request body

application/json

  • sessionIdsstring<uuid>[]

    Only these sessions. Omit for every session of the event.

    Max items
    500
  • includeWithoutRecordingboolean

    Also draft sessions with no recording yet, as courses waiting for one.

  • dryRunboolean

    Count what would be made; write nothing.

    Default
    false
{
"sessionIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"includeWithoutRecording": true,
"dryRun": false
}

Responses

201application/json

Drafted (or, with dryRun, counted). A dry run answers LearningOnDemandDryRun; otherwise LearningOnDemandMakeResult. When every session is already a course, created is 0 and message says so.

  • successboolean
  • payloadLearningOnDemandDryRun | LearningOnDemandMakeResult
    dry_run: true (LearningOnDemandDryRun)
    • dry_runboolean
    • eventLearningEventRef
      Show child attributes
      • idinteger
      • namestring
    • would_createinteger
    • would_wait_for_recordinginteger
    • batchinteger

      Sessions drafted per call (60).

    Option 2 (LearningOnDemandMakeResult)
    • eventLearningEventRef
      Show child attributes
      • idinteger
      • namestring
    • createdinteger
    • waiting_for_recordinginteger

      Of the courses made, how many wait for a recording. Absent when created is 0.

    • attachedinteger

      Waiting drafts that got their recording.

    • refreshedinteger

      Untouched drafts that took the session's new title and description.

    • remaininginteger

      Sessions left; call again until 0.

    • series_idstring<uuid> | null

      The meeting's course (" on demand"). null when nothing was made.

    • coursesobject[]

      The draft courses made. Absent when created is 0.

      Show child attributes
      • idstring<uuid>
      • titlestring
      • statusstring
    • messagestring

400application/json

The body failed validation, eventId is not a whole number, or No courses could be made from those sessions.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

401

Missing, invalid or expired token, or the event does not belong to your organization (Event does not belong to your organization).

403application/json

As for every Learning workspace operation:

  • SCOPE_REQUIRED — the token lacks read:learning (reads) or write:learning (writes). Legacy tokens with no scopes cannot write.
  • ORG_WIDE_TOKEN_REQUIRED — the token is restricted to particular events: "The Learning workspace covers every event and learner in the organization, so this API key (restricted to particular events) cannot use it. Use a key without an event restriction."
  • EVENT_ARCHIVED — the event is archived.
  • FEATURE_NOT_ENABLED (feature: lessons_credits) — Learning is not on for the organization.
  • FORBIDDEN — the token's user is not an active member of the organization, or lacks the Lessons permission the operation needs.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

404application/json

orgId is not your organization (error: NOT_FOUND, message: Organization not found).

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

423application/json

A person has paused connected assistants for the organization or the event (code: AGENT_WRITES_PAUSED). Ask them to resume it in Sessionboard before trying again.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>

429application/json

  • The token's request limit (100 requests per 15 minutes per bucket by default — see Rate Limiting). Wait Retry-After seconds.
  • QUOTA_EXCEEDED (writes) — the token's daily write quota (10,000 a day). Resets at midnight UTC.

Gateway errors carry error (a code) and message. Errors from Learning itself carry status, success: false, message, name, and sometimes code (and feature or paused_at).

  • errorstring | object

    The gateway's error code (SCOPE_REQUIRED, ORG_WIDE_TOKEN_REQUIRED, NOT_FOUND, …).

  • messagestring
  • statusinteger
  • successboolean
  • namestring
  • codestring

    FEATURE_NOT_ENABLED, AGENT_WRITES_PAUSED, …

  • featurestring
  • paused_atstring<date-time>
  • Retry-Afterintegerheader

    Seconds to wait before retrying.

Response examples

{
"success": true,
"payload": {
"dry_run": true,
"event": {
"id": 123,
"name": "<string>"
},
"would_create": 123,
"would_wait_for_recording": 123,
"batch": 123
}
}