Get a participant by email
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Look up one participant by email address. The match is exact and
case-insensitive. Returns the participant, or 404 when no contact
with that address holds a session role on the event.
Search on this API is a POST, so a GET on the collection path is
free for the lookup — no /by-email sub-path is needed. email is
required; a bare GET /participants is a 400, not an unpaginated
list.
Contacts are not unique by email. If more than one contact on the
event shares the address, the earliest-created one is returned; use
POST /v1/event/{eventId}/participants with the email filter to see
them all.
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/event/{eventId}/participants?email=jane%40example.com' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/event/{eventId}/participants?email=jane%40example.com', { 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/event/{eventId}/participants", params={ "email": "jane@example.com" }, 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/event/{eventId}/participants?email=jane%40example.com", 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/event/{eventId}/participants?email=jane%40example.com", 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/event/{eventId}/participants?email=jane%40example.com")) .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
eventIdintegerpathrequiredThe event ID.
Query parameters
emailstring<email>queryrequiredThe contact's email address. Matched exactly, ignoring case.
expandstring[]queryExpand records with additional data.
Possible values:
translated_fields— includes thetranslated_fieldsarray on records when the event has language variants configured.subsession_details— applies to session responses. Each subsession insideparent.subsessions[]is returned with full parent-session field parity (status,custom_status,custom_fields,chairpersons,moderators,sponsors,exhibitors,tags,language,track,level,room,is_public,external_url,client_session_id,ceu_credits,capacity,source) instead of the default minimal shape. Subsessions inheritis_abstract,composition_status, and optionalcompositionfrom the parent. Not required when callingGET /v1/event/{eventId}/sessions/{sessionId}with a subsession UUID — that endpoint always returns the full shape at the top level.linked_sources— include sessions that are linked as composition sources (excluded from list/search results by default).composition— attach a fullcompositionobject with target and source details on each returned session. Recommended for single-session GET; use cautiously on broad searches.
A single value can be passed directly, and multiple values repeat the parameter — all of these are accepted:
?expand=composition?expand=translated_fields&expand=composition?expand[]=translated_fields&expand[]=composition
- Allowed values
"translated_fields", "subsession_details", "linked_sources", "composition"
Responses
200application/json
OK
A contact (speaker, attendee, or organizational contact) in Sessionboard.
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.
400
email is missing or empty.
401
Unauthorized
404
Event not found, or no participant with that email on the event.
Response examples
{ "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" ] } ]}