Bring in a meeting from a registration platform
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Makes the platform's event a Sessionboard event and queues the import of its sessions, speakers (on the sessions they present, where the platform reads that), tracks and session check-ins. Nothing is written to the platform, nothing is published and no one is notified. Safe to repeat: an event brought in before is updated (new sessions added, changed ones updated unless someone edited them in Sessionboard), never duplicated. With dryRun it reads the platform's event and says what would happen (status: preview), writing nothing. The import runs in the background: poll Get an imported meeting with jobId until import.state is done, then make courses from it. Always answers 202; status says what happened: queued, preview, not_connected (with connect_url, where a person connects the platform), needs_remote_event, not_available or managed_on_platform. The token's user needs the Lessons create permission and permission to view integrations. Requires write:learning; refused for a key restricted to particular events. Also at POST /v1/learning/workspace/meetings/import.
Request example
curl --request POST \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/import' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "appId": "cvent", "remoteEventId": "<string>", "dryRun": true}'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/import', { method: 'POST', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "appId": "cvent", "remoteEventId": "<string>", "dryRun": true }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/import", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "appId": "cvent", "remoteEventId": "<string>", "dryRun": True },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/import", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{ "appId": "cvent", "remoteEventId": "<string>", "dryRun": true}', CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", "Content-Type: application/json", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http" "strings")
func main() { req, _ := http.NewRequest("POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/learning/workspace/meetings/import", strings.NewReader(`{ "appId": "cvent", "remoteEventId": "<string>", "dryRun": true}`)) req.Header.Add("x-access-token", "<api-token>") req.Header.Add("Content-Type", "application/json")
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/import")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"appId\": \"cvent\",\n \"remoteEventId\": \"<string>\",\n \"dryRun\": true\n}")) .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.
Request body
appIdstringrequiredA registration platform. Today sessions can be brought in from
cvent,swoogoandbizzabo; the others answernot_available(List registration platforms says why).- Allowed values
"cvent", "swoogo", "bizzabo", "rainfocus", "eventbrite", "swapcard", "visit", "map-your-show", "a2z"
remoteEventIdstringThe platform's event id, from List a registration platform's events.
- Max length
200
dryRunbooleanSay what would happen; write nothing.
{ "appId": "cvent", "remoteEventId": "<string>", "dryRun": true}Responses
202application/json
Queued, previewed, or why not (status).
successbooleanpayloadLearningMeetingImportShow child attributes
app_idstringA registration platform. Today sessions can be brought in from
cvent,swoogoandbizzabo; the others answernot_available(List registration platforms says why).- Allowed values
"cvent", "swoogo", "bizzabo", "rainfocus", "eventbrite", "swapcard", "visit", "map-your-show", "a2z"
remote_event_idstring | nullsourceLearningRegistrationSourceShow child attributes
idstringA registration platform. Today sessions can be brought in from
cvent,swoogoandbizzabo; the others answernot_available(List registration platforms says why).- Allowed values
"cvent", "swoogo", "bizzabo", "rainfocus", "eventbrite", "swapcard", "visit", "map-your-show", "a2z"
namestringconnectedbooleanconnection_idstring | nullneeds_reauthbooleansimulatedbooleancomingbooleanCannot be connected yet.
importablebooleanSessions can be brought in from it.
connectstringHow a person connects it.
- Allowed values
"oauth", "api_key", "coming"
bringsobjectShow child attributes
sessionsLearningSourceBringsShow child attributes
availablebooleannotestring
speakersobjectShow child attributes
availablebooleannotestringon_sessionsbooleanSpeakers arrive on the sessions they present, so faculty carry over.
recordingsLearningSourceBringsShow child attributes
availablebooleannotestring
attendanceobjectShow child attributes
availablebooleannotestringneeds_new_sign_inbooleanThe connection's sign-in cannot read attendees or check-ins.
linestringOne line to show a person.
statusstring- Allowed values
"queued", "preview", "not_connected", "needs_remote_event", "not_available", "managed_on_platform"
dry_runbooleanpreviewonly.connect_urlstringnot_connectedonly: where a person connects the platform in Sessionboard Learning.remote_eventLearningRemoteEventShow child attributes
idstringThe platform's event id.
namestringstarts_atstring | nullimported_event_idinteger | nullThe Sessionboard event it was brought into before.
imported_event_namestring | null
eventobject | nullThe Sessionboard event. On
preview:id(nullwhen one will be made),name,will_create. After an import:id,name,created;nullwhen nothing was queued and no event was made.Show child attributes
idinteger | nullnamestringcreatedbooleanwill_createboolean
includestring[]What is brought in.
- Allowed values
"sessions", "speakers", "attendees"
outcomeobjectPer kind,
queued,not_availableormanaged_on_platform.reasonsobjectPer kind that is not brought in, why.
job_idstring<uuid> | nullThe import job; pass it as
jobIdto Get an imported meeting.notesstring[]messagestring
400application/json
The body failed validation, or the connection has no event with that id (There is no <platform> event with id <id> on this connection.).
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.
403application/json
SCOPE_REQUIRED— the token lacksread:learning(reads) orwrite:learning(writes). Legacy tokens with no scopes cannot write.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."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, lacks the Lessons permission, or (listing a platform's events, importing) lacks permission to view integrations (You need permission to view integrations to use Apps).
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": { "app_id": "cvent", "remote_event_id": "<string>", "source": { "id": "cvent", "name": "<string>", "connected": true, "connection_id": "<string>", "needs_reauth": true, "simulated": true, "coming": true, "importable": true, "connect": "oauth", "brings": { "sessions": { "available": true, "note": "<string>" }, "speakers": { "available": true, "note": "<string>", "on_sessions": true }, "recordings": { "available": true, "note": "<string>" }, "attendance": { "available": true, "note": "<string>", "needs_new_sign_in": true } }, "line": "<string>" }, "status": "queued", "dry_run": true, "connect_url": "<string>", "remote_event": { "id": "<string>", "name": "<string>", "starts_at": "<string>", "imported_event_id": 123, "imported_event_name": "<string>" }, "event": { "id": 123, "name": "<string>", "created": true, "will_create": true }, "include": [ "sessions" ], "outcome": { "key": "<string>" }, "reasons": { "key": "<string>" }, "job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "notes": [ "<string>" ], "message": "<string>" }}{ "error": "<string>", "message": "<string>", "status": 123, "success": true, "name": "<string>", "code": "<string>", "feature": "<string>", "paused_at": "2026-01-15T09:30:00Z"}{ "error": "ORG_WIDE_TOKEN_REQUIRED", "message": "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."}{ "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"}