List events
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Returns events accessible to the authenticated API key.
Results are paginated: page (1–999, default 1) and pageSize
(1–100, default 25) are honored, and the response wraps events in
the standard { results, pagination } envelope. Events are ordered
oldest-first (created_at ascending, ties broken by id), so pages
are stable across requests.
By default each event is id, name, timezone, starts_at,
ends_at, and features. Pass expand to attach extra collections.
expand=custom_fields includes org-defined event custom field values
(CustomFieldValue[]). An event with no values returns [].
Datetime custom field values are ISO 8601 in the event's local time
with its UTC offset (for example 2026-08-15T09:00:00-03:00); when
the event has no valid timezone the raw UTC instant is returned
(2026-08-15T12:00:00.000Z). Date-only (date) fields serialize
as M-DD-YYYY: month without a leading zero, day with one, four-digit
year (for example 9-22-2026 for 22 September 2026, 3-04-2026 for
4 March 2026). This is not ISO 8601; parse it with that exact pattern.
expand=integration_mappings includes conference connector mappings
(EventIntegrationMapping[]) from Integration_Event_Mapping_Union
(Cvent, Grip, Swoogo, Swapcard, ASP, Stova, Bizzabo, Gleanin,
ExpoPlatform, ON24). source is the union key (underscores, e.g.
expo_platform). LiveBuzz / apps-engine campaign IDs are not
included in this expand.
Repeat the query param or comma-separate values:
?expand=custom_fields&expand=integration_mappings
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/events' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/events', { 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/events", 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/events", 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/events", 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/events")) .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.
Query parameters
pageintegerqueryPage number for pagination.
- Default
1- Minimum
1- Maximum
999
pageSizeintegerqueryNumber of results per page.
The event-settings list endpoints (tags, tracks, levels, formats, rooms, languages, statuses) also accept the older spelling
page_size, and used to accept only that — a request sendingpageSizesilently got the default 25. Both now work,pageSizewins when both are sent, and on these endpoints a value outside 1–100 is clamped rather than rejected. Everywhere elsepageSizeis the only spelling.- Default
25- Minimum
1- Maximum
100
expandstring[]queryExtra collections on each event in
GET /v1/events. Not the same enum as sessionExpand(translated_fields,composition, …).Repeat the parameter (
?expand=custom_fields&expand=integration_mappings) or comma-separate (?expand=custom_fields,integration_mappings).custom_fields— org-defined Event custom field values. Omitted from the payload when this expand is not requested. Present as[]when requested and the event has no values.integration_mappings—{ name, source, external_event_id }rows from conferenceIntegration_*_Event_Mappings(via the union view).sourceuses underscores (expo_platform, notexpo-platform). LiveBuzz / apps-engine campaign IDs are not included.
- Allowed values
"custom_fields", "integration_mappings"
Responses
200application/json
OK
resultsEvent[]Show child attributes
idintegernamestringtimezonestringstarts_atstring<date-time> | nullends_atstring<date-time> | nullfeaturesobjectShow child attributes
primary_speakersbooleanspeaker_acceptancebooleantranslated_fieldsboolean
custom_fieldsCustomFieldValue[]Present only when
expand=custom_fieldsis passed toGET /v1/events. Empty array when the event has no values.Show child attributes
idstringnamestringvaluestring | boolean | nullThe formatted field value, or
nullwhen the field is empty. Numeric field types (number,currency,percent,quantity,formula) serialize a stored zero as its formatted value (for example"0") —nullmeans the field has no value, not that the value is zero.checkboxfields serialize as the strings"Yes"(checked) and"No"(explicitly unchecked); a checkbox that was never set isnull. Writes take booleantrue/false.datetimefields serialize as ISO 8601. On event custom fields (GET /v1/events?expand=custom_fields) the value is event-local time with the event's UTC offset (for example2026-08-15T09:00:00-03:00), falling back to the raw UTC instant (2026-08-15T12:00:00.000Z) when the event has no valid timezone. On session, speaker, sponsor, and exhibitor custom fields the value is the raw UTC instant.date(date-only) fields serialize asM-DD-YYYY: month without a leading zero, day with one, four-digit year (for example9-22-2026for 22 September 2026,3-04-2026for 4 March 2026). This is not ISO 8601; parse it with that exact pattern.typestringinternal_namestringcreated_atstring
integration_mappingsEventIntegrationMapping[]Present only when
expand=integration_mappingsis passed toGET /v1/events. Conference connector event IDs only — LiveBuzz / apps-engine campaign IDs are not included. Empty array when none are mapped.Show child attributes
namestringDisplay name (for example
Cvent,Grip).sourcestringIntegration key from
Integration_Event_Mapping_Union(table name minusIntegration_/_Event_Mappings, lowercased). Multi-word vendors use underscores, e.g.expo_platform.external_event_idstringVendor event id, always a string.
paginationPaginationPagination metadata returned with POST search responses. The event-settings GET lists return the same numbers under snake_case keys — see
ListPagination.Show child attributes
currentPageintegerpageSizeintegertotalPagesintegertotalResultsinteger
401
Unauthorized
Response examples
{ "results": [ { "id": 3960, "name": "Acme Conference", "timezone": "America/Chicago", "starts_at": "2026-10-05T13:00:00.000Z", "ends_at": "2026-10-07T22:00:00.000Z", "features": { "primary_speakers": true, "speaker_acceptance": false, "translated_fields": false } } ], "pagination": { "currentPage": 1, "pageSize": 25, "totalPages": 4, "totalResults": 97 }}