Get an imported meeting
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
A meeting brought in from a registration platform: with jobId, the import's progress (running, done or failed) and up to 12 notes on what did not come across; and the meeting as Preview a meeting on demand sees it (sessions, recordings, faculty, attendance, courses and the ones waiting for a recording). Reads only. Requires read:learning; refused for a key restricted to particular events. Also at GET /v1/learning/workspace/meetings/{eventId}.
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}', { method: 'GET', headers: { "x-access-token": "<api-token>" },});
const data = await response.json();console.log(data);import requests
response = requests.request( "GET", "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}", headers={ "x-access-token": "<api-token>" },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http")
func main() { req, _ := http.NewRequest("GET", "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}", nil) req.Header.Add("x-access-token", "<api-token>")
res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/{eventId}")) .header("x-access-token", "<api-token>") .method("GET", HttpRequest.BodyPublishers.noBody()) .build();
HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Try it
Response headers
Authorizations
x-access-tokenstringheaderOrganization API token. Generate from Organization Settings → API Tokens.
AuthorizationBearer <token>headerorOAuth 2.1 access token. Obtained via the OAuth PKCE flow at
/oauth/token.
Send one of these. See Authentication.
Path parameters
orgIdstringpathrequiredYour organization ID. Any other organization returns
404.eventIdintegerpathrequiredThe Sessionboard event. Another organization's event answers
401.- Minimum
1
Query parameters
jobIdstringqueryThe
job_idthe import answered. Omit andimportisnull.- Max length
64
Responses
200application/json
OK
successbooleanpayloadLearningImportedMeetingShow child attributes
eventobjectShow child attributes
idintegernamestringdate_fromstring<date-time> | nulldate_tostring<date-time> | nullevent_formatstring | null- Allowed values
"standard", "lite", "gathering", "webinar", null
importLearningImportState | any | nullnullwithoutjobId, or when the job is not this organization's.Show child attributes
job_idstring<uuid>statestring- Allowed values
"running", "done", "failed"
summaryobject | nullWhat the import reported.
errorstring | nullnotesobject[]What did not come across, in the import's words.
- Max items
12
Show child attributes
kindstringactionstring- Allowed values
"error", "skip"
textstring
totalsLearningOnDemandTotalsShow child attributes
sessionsintegerwith_recordingsintegerfacultyintegerdisclosures_missingintegerSessions with a faculty disclosure missing.
credit_sessionsintegerattendanceintegercourses_publishedintegercourses_draftintegerwaiting_for_recordingintegerimportedintegerSessions brought in from a registration platform.
sessionsLearningOnDemandSession[]Show child attributes
idstring<uuid>titlestringrecordingobject | nullShow child attributes
minutesinteger | nullcountinteger
facultyintegerdisclosures_missingintegerFaculty with no disclosure on file.
creditobject | nullThe session's credit, or the credit set on the course made from it (the course's wins per type). Types are never added together.
Show child attributes
amountnumber | nullOnly with one type.
type_namestring | nullOnly with one type.
typesintegerby_typeLearningCreditAmount[]Show child attributes
namestringamountnumber
labelstring
attendanceintegersourceobject | nullThe registration platform it came from.
Show child attributes
appstringexternal_idstring
courseobject | nullShow child attributes
idstring<uuid>statusstring- Allowed values
"draft", "published", "archived"
waiting_for_recordingbooleanrecording_readybooleanWaiting, and the session now has a recording; make courses again to add it.
400application/json
A path, query or body value failed validation, or an unknown body property was sent. message names the field. (A source object naming the assistant, with the person's prompt, is accepted on every write and removed before validation.) For an {eventId} path that is not a whole number: error: VALIDATION_ERROR, eventId must be a valid integer.
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 | objectThe gateway's error code (
SCOPE_REQUIRED,ORG_WIDE_TOKEN_REQUIRED,NOT_FOUND, …).messagestringstatusintegersuccessbooleannamestringcodestringFEATURE_NOT_ENABLED,AGENT_WRITES_PAUSED, …featurestringpaused_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
SCOPE_REQUIRED— the token lacksread:learning.ORG_WIDE_TOKEN_REQUIRED— the token is restricted to particular events: "Bringing in a meeting reaches the organization's registration platforms and every event, 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 read permission.
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 | objectThe gateway's error code (
SCOPE_REQUIRED,ORG_WIDE_TOKEN_REQUIRED,NOT_FOUND, …).messagestringstatusintegersuccessbooleannamestringcodestringFEATURE_NOT_ENABLED,AGENT_WRITES_PAUSED, …featurestringpaused_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 | objectThe gateway's error code (
SCOPE_REQUIRED,ORG_WIDE_TOKEN_REQUIRED,NOT_FOUND, …).messagestringstatusintegersuccessbooleannamestringcodestringFEATURE_NOT_ENABLED,AGENT_WRITES_PAUSED, …featurestringpaused_atstring<date-time>
429application/json
- The token's request limit (100 requests per 15 minutes per bucket by default — see Rate Limiting). Wait
Retry-Afterseconds. 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 | objectThe gateway's error code (
SCOPE_REQUIRED,ORG_WIDE_TOKEN_REQUIRED,NOT_FOUND, …).messagestringstatusintegersuccessbooleannamestringcodestringFEATURE_NOT_ENABLED,AGENT_WRITES_PAUSED, …featurestringpaused_atstring<date-time>
Retry-AfterintegerheaderSeconds to wait before retrying.
Response examples
{ "success": true, "payload": { "event": { "id": 123, "name": "<string>", "date_from": "2026-01-15T09:30:00Z", "date_to": "2026-01-15T09:30:00Z", "event_format": "standard" }, "import": { "job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "state": "running", "summary": {}, "error": "<string>", "notes": [ { "kind": "<string>", "action": "error", "text": "<string>" } ] }, "totals": { "sessions": 123, "with_recordings": 123, "faculty": 123, "disclosures_missing": 123, "credit_sessions": 123, "attendance": 123, "courses_published": 123, "courses_draft": 123, "waiting_for_recording": 123, "imported": 123 }, "sessions": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "title": "<string>", "recording": { "minutes": 123, "count": 123 }, "faculty": 123, "disclosures_missing": 123, "credit": { "amount": 123.45, "type_name": "<string>", "types": 123, "by_type": [ { "name": "<string>", "amount": 123.45 } ], "label": "<string>" }, "attendance": 123, "source": { "app": "<string>", "external_id": "<string>" }, "course": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "draft", "waiting_for_recording": true, "recording_ready": true } } ] }}{ "error": "<string>", "message": "<string>", "status": 123, "success": true, "name": "<string>", "code": "<string>", "feature": "<string>", "paused_at": "2026-01-15T09:30:00Z"}{ "error": "<string>", "message": "<string>", "status": 123, "success": true, "name": "<string>", "code": "<string>", "feature": "<string>", "paused_at": "2026-01-15T09:30:00Z"}{ "error": "NOT_FOUND", "message": "Organization not found"}{ "error": "<string>", "message": "<string>", "status": 123, "success": true, "name": "<string>", "code": "<string>", "feature": "<string>", "paused_at": "2026-01-15T09:30:00Z"}