Base URLs
Use the base URL corresponding to the region where your organization’s data is hosted.
Authentication
All requests require anx-access-token header containing a valid API token. See Authentication for details on generating and managing tokens.
Common Patterns
Pagination
Search endpoints acceptpage and pageSize parameters and return a pagination object in the response. The default page size is 25 and the maximum is 100.
Session responses include is_abstract and composition_status for composition-aware integrations. Subsessions inherit these fields from their parent. See Sessions & composition for filters, expand options, and contact session summaries.
Filtering
POST-based search endpoints accept filter criteria in the request body. Refer to each endpoint’s documentation for available filter fields.Session categorization filters
The five categorization filters — tracks, tags, levels, formats, and languages — are implemented on exactly four endpoints:
Within one filter, IDs match with OR; separate filters combine with AND. Other search endpoints (contacts, sponsors, exhibitors) do not accept these filters.
Filter values must be UUIDs. On the CRUD list endpoint, a non-UUID value returns
400 with error code VALIDATION_ERROR and a message naming the offending parameter (for example track_id must be a UUID (received "nope")).
Speaker search matches the speakers role only.
POST /v1/event/{eventId}/speakers returns the contacts attached to a session as speakers. Chairpersons, moderators and other participants are not returned — with or without a categorization filter.This trips up reconciliation because the session object from POST /v1/event/{eventId}/sessions exposes four separate participant arrays (speakers, chairpersons, moderators, participants), and only the first one feeds speaker search. To compare “speakers on track X” against “sessions on track X”, collect the speakers array alone.Roles are per session, so the same contact can be a speaker on one session and a moderator on another. A contact can therefore appear in the unfiltered speaker list and still be absent from a filtered one, when its attachment to the matching session is a non-speaker role. That is expected, not a filtering bug.Create vs Search Endpoints
Some resources have twoPOST endpoints at similar paths:
The
/create suffix distinguishes write operations from search where both use POST on the same collection path (sessions, contacts, exhibitors, sponsors, custom fields, and metadata entities).
Session-scoped transcriptions, recordings, and session files use standard REST — POST on the collection path creates a resource; there is no conflicting search endpoint. See Media & Transcriptions and Uploading session files for upload flows.
Custom fields
Create and update endpoints acceptcustom_fields as an object keyed by field internal name. Responses that include custom field values use the CustomFieldValue shape (id, name, type, internal_name, value, created_at) — see the CustomFieldValue schema in the API reference.
Event-level custom field definitions are listed at
GET /v1/event/{eventId}/fields. Event record values use GET /v1/events?expand=custom_fields.
Groups: sponsors and exhibitors
Sponsors and exhibitors are the same underlying account record wearing a role on an event, not two separate record types. One account can hold both roles on the same event, in which case it is returned by both searches and readable on bothGET endpoints, under the same id.
Two consequences worth designing for:
- To add a second role to a group you already created, call the other role’s
/createendpoint withaccount_idset to the existing account. Sending anameinstead creates a second, unrelated account. - A
GETfor a role the record does not hold is a404, even though the record exists — as is aGETfor a contact id on a group endpoint. Look the record up on the endpoint for the role it actually holds.
Sorting
POST-based search endpoints accept asort object in the request body to control result ordering. Each sortable field is a nested object key carrying a sort direction (asc / desc) and an optional integer order for multi-key priority — there is no flat {"order": "createdAt", "sort": "asc"} form:
createdAt and updatedAt keys. Session search additionally supports startsAt — sessions with a null starts_at always sort last, regardless of direction. Session status search (POST /v1/event/{eventId}/sessions/status) additionally supports deletedAt.
Expanding Records
Some endpoints support anexpand query parameter (or request-body field) to include additional data in the response.
Nested session metadata
Session responses embed assigned metadata as nested objects:
Unassigned metadata is returned as an empty object
{} on POST /v1/event/{eventId}/sessions (search). CRUD proxy endpoints (GET list, create, update, restore) return null instead.
Subsessions
Sessions can have subsessions (child sessions linked to a parent). Subsessions are returned both:- Nested, inside
parent.subsessions[]on every session response. The default shape is minimal — passexpand=subsession_detailsto receive full parity with the parent session. - Top-level, by calling
GET /v1/event/{eventId}/sessions/{sessionId}with the subsession’s UUID directly. The endpoint always returns the full session shape (includingchairpersons,moderators,custom_fields, etc.) plusparent_session_friendly_idandparent_session_friendly_id_rawkeys identifying the parent. Theexpand=subsession_detailsflag has no effect at the top level.
parent.subsessions[], take each subsession id, and call the GET endpoint to retrieve the same shape they would for a parent session — useful for integration patterns that need to walk the session tree.
Session participants (Sessions 2.0)
Session responses include both legacy role arrays and a flatparticipants array:
Each participant object uses the
SessionSpeaker contact profile shape plus participant_role (slug, name, name_plural, core_role). Use participant_role.name (or slug) as the display/program role — for example Author or Panelist. core_role is only the legacy junction mapping (speaker, chairperson, moderator) and is not the role label.
Contact profile fields on embedded participants — photo_url, company_name, title, address_country, and other standard contact fields — are included in the event’s default language without expand. Use expand=translated_fields for other locales.
Legacy speakers / chairpersons / moderators entries also include participant_role when the event has Sessions 2.0 roles configured.
Organization-Scoped vs Convenience Routes
Dashboards, widgets, and saved reports support three route patterns:
The convenience routes are recommended for org-level operations — they’re simpler and don’t require you to know the org ID. The org-scoped routes (
/v1/organization/{orgId}/...) are equivalent but require the org ID in the URL.
Media & Transcriptions
Sessionboard exposes three related but distinct media workflows. Pick the path that matches what you have:
Start with the Media & Transcriptions guide for playbooks and examples, or the API overview for resource shapes. Endpoint pages are grouped under Event — Media in the sidebar.
Error Codes
Error codes on 400
Write endpoints return a machine-readable error code alongside the human-readable message, so integrations can branch without parsing prose:
details.field carries the offending field’s internal name on all three field errors.
On the sessions, exhibitors and sponsors bulk endpoints, a TYPE_MISMATCH for a value that is not one of a dropdown field’s options also carries valid_options on the result’s error object — an array with one entry per option the field accepts. The message quotes each option, because an option label can contain a comma; branch on the array, not on the message text:
valid_options is absent on every other error, including a TYPE_MISMATCH on a non-dropdown field. Contacts bulk returns error as a plain string, so it never carries valid_options; the quoted options are in that string.
