Search participants
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Search every contact assigned to at least one session on the event in
any participant role — the standard roles (speaker, chairperson,
moderator) and any custom role configured for the event (Panelist,
Coach, Author, …). This is the superset of
POST /v1/event/{eventId}/speakers, which matches speakers only.
Each contact is returned once, however many sessions or roles it
holds, with a roles array listing every role it has on the event and
the session ids where it holds each one. Every other field is the same
Contact shape POST /speakers returns, in the same order, with
roles appended last. roles always describes the contact's full
set of roles on the event — it is not narrowed by the request filters,
so a search filtered to the Moderator role still shows that a result is
also a Speaker elsewhere on the program.
Filters. Every Search Speakers filter is accepted and behaves the
same: createdAt, updatedAt, status (the session's status),
trackIds, levelIds, formatIds, languageIds, tagIds, plus
sort and expand. Categorization filters are evaluated against the
top-level session, so a participant on a subsession matches when
the subsession's parent satisfies the filter. Each array filter needs
at least one id — [] is a 400 naming the field; omit the property
to apply no filter.
Three filters are specific to this endpoint:
roleIds— return only participants holding at least one of the given roles, standard or custom. Get the ids fromGET /v1/event/{eventId}/participant-roles.roleSlugs— the same, by role slug (speaker,chairperson,moderator, or a custom role's slug). Use this to get every speaker without resolving ids per event, or on older events where roles haveroleId: null.email— exact, case-insensitive match on the contact's email. An unknown address returns an emptyresultsarray withtotalResults: 0, not an error. For a single-record lookup that answers404instead, useGET /v1/event/{eventId}/participants?email=.
Roles on older events. Roles are stored per event. An event that
has never been opened in the Sessions editor may not have its standard
roles created yet; its participants are still returned, but a
standard role on such an event has roleId: null (with roleName,
slug and coreRole filled in) and cannot be matched by roleIds
until the roles exist — filter by roleSlugs instead.
GET .../participant-roles returns an empty list for such an event.
Request example
curl --request POST \ --url 'https://public-api.sessionboard.com/v1/event/{eventId}/participants' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" }}'const response = await fetch('https://public-api.sessionboard.com/v1/event/{eventId}/participants', { method: 'POST', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" } }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "POST", "https://public-api.sessionboard.com/v1/event/{eventId}/participants", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" } },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/event/{eventId}/participants", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" }}', 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/event/{eventId}/participants", strings.NewReader(`{ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" }}`)) 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/event/{eventId}/participants")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"filters\": {\n \"roleIds\": [\n \"4efeb845-050f-4002-9496-cb586cdf10f2\",\n \"52d60237-19db-4bda-a116-8b9fcb6750e9\"\n ],\n \"status\": \"accepted\"\n }\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
eventIdintegerpathrequiredThe event ID.
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
Request body
Search request body for participants. Every SpeakerSearchBody filter
is accepted with the same semantics (categorization filters match the
participant's top-level session), plus roleIds, roleSlugs and email.
filtersobjectShow child attributes
createdAtDateRangeFilterFilter by a date range using before and/or after bounds.
Show child attributes
beforestring<date-time>Return records before this date-time.
afterstring<date-time>Return records after this date-time.
updatedAtDateRangeFilterFilter by a date range using before and/or after bounds.
Show child attributes
beforestring<date-time>Return records before this date-time.
afterstring<date-time>Return records after this date-time.
statusstringMatch participants on sessions with this session status.
- Allowed values
"accepted", "accept_queue", "pending", "decline_queue", "declined"
trackIdsstring<uuid>[]Send at least one ID — an empty array is rejected with a 400; to apply no track filter, omit the property.
- Min items
1
levelIdsstring<uuid>[]- Min items
1
formatIdsstring<uuid>[]- Min items
1
languageIdsstring<uuid>[]- Min items
1
tagIdsstring<uuid>[]- Min items
1
roleIdsstring<uuid>[]Return participants holding at least one of these roles (standard or custom). Ids come from
GET /v1/event/{eventId}/participant-roles. An empty array is a 400; omit the property to match every role.- Min items
1
roleSlugsstring[]Return participants holding at least one role with these slugs — the standard
speaker,chairperson,moderator, or a custom role'sslugfromGET .../participant-roles. Works on events whose roles haveroleId: null. Case-insensitive. Combines withroleIdsas AND. An empty array is a 400.- Min items
1
emailstringExact, case-insensitive match on the contact's email. An unknown address returns an empty result set, not an error.
- Min length
1- Max length
320
sortSortOptionsNested sort keys matching the search POST body (
createdAt.sort, not a flatorderenum). Each key is optional.Show child attributes
createdAtNestedSortFieldOne sort key.
sortis the direction;orderis the priority when multiple keys are set (lower numbers apply first).Show child attributes
sortstring- Allowed values
"asc", "desc"
orderinteger
updatedAtNestedSortFieldOne sort key.
sortis the direction;orderis the priority when multiple keys are set (lower numbers apply first).Show child attributes
sortstring- Allowed values
"asc", "desc"
orderinteger
expandstring[]- Allowed values
"translated_fields"
{ "filters": { "roleIds": [ "4efeb845-050f-4002-9496-cb586cdf10f2", "52d60237-19db-4bda-a116-8b9fcb6750e9" ], "status": "accepted" }}{ "filters": { "roleSlugs": [ "speaker" ] }}{ "filters": { "email": "jane.smith@university.edu" }}Responses
200application/json
OK
resultsParticipant[]Show child attributes
idstringfriendly_idstringfull_namestringfirst_namestringlast_namestringemailstringcreated_atstringupdated_atstring<date-time>When the contact last changed, from any source: an admin or portal edit, a sync, or a Public API write (create, update or bulk). Send it back as
updated_atonPUT /v1/event/{eventId}/contacts/{contactId}or a bulk update for optimistic concurrency; the write returns the new value.photo_urlstringURL of the contact's headshot. Images larger than 2 MB are delivered resized from this URL, scaled to fit within 2400 x 2400 pixels (a PNG may arrive as WebP for clients that accept it). The uploaded file is stored unchanged; for full-resolution originals use the bulk download tools in Sessionboard, such as Download Headshots (Contacts, More menu).
company_namestringtitlestringaboutstringphone_homestringphone_mobilestringaddress_line_1stringaddress_line_2stringaddress_citystringaddress_statestringaddress_postal_codestringaddress_countrystringwebsite_urlstringlinkedin_urlstringtwitter_urlstringfacebook_urlstringhonorificstringsalutationstringpronounsstringgenderstringpast_companiesstringeducational_affiliationstringhighest_level_of_educationstringethnicitystringlanguagesstringspeaker_scorestringorganization_contactstringspeaker_feestringavailabilitystringpreferred_session_formatstringannual_revenuestringheadcountstringyears_in_operationstringorganization_structurestringindustrystringglobal_regionstringaudience_typestringtarget_age_rangestringtopic_expertisestringbrandstringtranslated_fieldsTranslatedField[]Show child attributes
idstringnamestringtypestringparent_field_idstringparent_field_sourcestringparent_field_namestringparent_field_internal_namestringtranslated_languagestringvaluestring
custom_fieldsCustomFieldValue[]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
admin_urlstring<uri> | nullDeep link to this entity in the Sessionboard admin UI.
rolesParticipantRoleAssignment[]requiredEvery role the contact holds on the event and the sessions it holds each one on. Always the contact's complete set — not narrowed by the request filters. Ordered by the role's configured sort order.
Show child attributes
roleIdstring<uuid> | nullrequiredThe role's id — the value to pass in the
roleIdsfilter and theidreturned byGET /v1/event/{eventId}/participant-roles.nullonly for a standard role on an event whose roles have not been created yet (see the endpoint description).roleNamestringrequiredDisplay name of the role (singular), e.g.
Speaker,Panelist.slugstringrequiredStable programmatic identifier for the role within the event.
coreRolestringrequiredThe standard category the role maps to. Not a display label.
- Allowed values
"speaker", "chairperson", "moderator"
isCustombooleanrequiredtruefor a role the organizer added;falsefor Speaker, Chairperson and Moderator.sessionIdsstring<uuid>[]requiredIds of the sessions (including subsessions) on which the contact holds this role.
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
400
Validation error — an empty filter array, a non-UUID in roleIds, or an out-of-range page / pageSize.
401
Unauthorized
404
Event not found
Response examples
{ "results": [ { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "friendly_id": "SPK-42", "full_name": "Dr. Jane Smith", "first_name": "Jane", "last_name": "Smith", "email": "jane.smith@university.edu", "created_at": "2023-11-01T10:00:00Z", "updated_at": "2024-02-15T16:30:00Z", "company_name": "State University", "title": "Professor of Computer Science", "custom_fields": [], "roles": [ { "roleId": "84bd12e5-d5ec-4c64-a604-4051e06c8dc2", "roleName": "Speaker", "slug": "speaker", "coreRole": "speaker", "isCustom": false, "sessionIds": [ "04efb360-2b15-44db-b639-4035fae2772c" ] }, { "roleId": "4efeb845-050f-4002-9496-cb586cdf10f2", "roleName": "Moderator", "slug": "moderator", "coreRole": "moderator", "isCustom": false, "sessionIds": [ "26e465fc-1fb1-4c04-af52-f4d6314dfca4" ] }, { "roleId": "52d60237-19db-4bda-a116-8b9fcb6750e9", "roleName": "Panelist", "slug": "panelist", "coreRole": "speaker", "isCustom": true, "sessionIds": [ "140b8e82-41ca-444e-82ab-f7dd1011e95b", "2c198cce-adff-4fb2-81e1-319b601d564b" ] } ] } ], "pagination": { "currentPage": 1, "pageSize": 25, "totalPages": 4, "totalResults": 97 }}