Skip to content

Search participants

POST/v1/event/{eventId}/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 from GET /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 have roleId: null.
  • email — exact, case-insensitive match on the contact's email. An unknown address returns an empty results array with totalResults: 0, not an error. For a single-record lookup that answers 404 instead, use GET /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

Terminal window
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"
}
}'

Try it

Authorization

Your token stays in this page. It is sent only to the region above and is never saved; it is gone when you leave or reload the page.

Path parameters
Query parameters
Body application/json
POST

Authorizations

  • x-access-tokenstringheader

    Organization API token. Generate from Organization Settings → API Tokens.

  • AuthorizationBearer <token>headeror

    OAuth 2.1 access token. Obtained via the OAuth PKCE flow at /oauth/token.

Send one of these. See Authentication.

Path parameters

  • eventIdintegerpathrequired

    The event ID.

Query parameters

  • pageintegerquery

    Page number for pagination.

    Default
    1
    Minimum
    1
    Maximum
    999
  • pageSizeintegerquery

    Number 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 sending pageSize silently got the default 25. Both now work, pageSize wins when both are sent, and on these endpoints a value outside 1–100 is clamped rather than rejected. Everywhere else pageSize is the only spelling.

    Default
    25
    Minimum
    1
    Maximum
    100

Request body

application/json

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.

  • filtersobject
    Show child attributes
    • createdAtDateRangeFilter

      Filter 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.

    • updatedAtDateRangeFilter

      Filter 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.

    • statusstring

      Match 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's slug from GET .../participant-roles. Works on events whose roles have roleId: null. Case-insensitive. Combines with roleIds as AND. An empty array is a 400.

      Min items
      1
    • emailstring

      Exact, 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
  • sortSortOptions

    Nested sort keys matching the search POST body (createdAt.sort, not a flat order enum). Each key is optional.

    Show child attributes
    • createdAtNestedSortField

      One sort key. sort is the direction; order is the priority when multiple keys are set (lower numbers apply first).

      Show child attributes
      • sortstring
        Allowed values
        "asc", "desc"
      • orderinteger
    • updatedAtNestedSortField

      One sort key. sort is the direction; order is 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"
}
}

Responses

200application/json

OK

  • resultsParticipant[]
    Show child attributes
    • idstring
    • friendly_idstring
    • full_namestring
    • first_namestring
    • last_namestring
    • emailstring
    • created_atstring
    • updated_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_at on PUT /v1/event/{eventId}/contacts/{contactId} or a bulk update for optimistic concurrency; the write returns the new value.

    • photo_urlstring

      URL 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_namestring
    • titlestring
    • aboutstring
    • phone_homestring
    • phone_mobilestring
    • address_line_1string
    • address_line_2string
    • address_citystring
    • address_statestring
    • address_postal_codestring
    • address_countrystring
    • website_urlstring
    • linkedin_urlstring
    • twitter_urlstring
    • facebook_urlstring
    • honorificstring
    • salutationstring
    • pronounsstring
    • genderstring
    • past_companiesstring
    • educational_affiliationstring
    • highest_level_of_educationstring
    • ethnicitystring
    • languagesstring
    • speaker_scorestring
    • organization_contactstring
    • speaker_feestring
    • availabilitystring
    • preferred_session_formatstring
    • annual_revenuestring
    • headcountstring
    • years_in_operationstring
    • organization_structurestring
    • industrystring
    • global_regionstring
    • audience_typestring
    • target_age_rangestring
    • topic_expertisestring
    • brandstring
    • translated_fieldsTranslatedField[]
      Show child attributes
      • idstring
      • namestring
      • typestring
      • parent_field_idstring
      • parent_field_sourcestring
      • parent_field_namestring
      • parent_field_internal_namestring
      • translated_languagestring
      • valuestring
    • custom_fieldsCustomFieldValue[]
      Show child attributes
      • idstring
      • namestring
      • valuestring | boolean | null

        The formatted field value, or null when the field is empty. Numeric field types (number, currency, percent, quantity, formula) serialize a stored zero as its formatted value (for example "0") — null means the field has no value, not that the value is zero.

        checkbox fields serialize as the strings "Yes" (checked) and "No" (explicitly unchecked); a checkbox that was never set is null. Writes take boolean true / false.

        datetime fields 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 example 2026-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 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.

      • typestring
      • internal_namestring
      • created_atstring
    • admin_urlstring<uri> | null

      Deep link to this entity in the Sessionboard admin UI.

    • rolesParticipantRoleAssignment[]required

      Every 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> | nullrequired

        The role's id — the value to pass in the roleIds filter and the id returned by GET /v1/event/{eventId}/participant-roles. null only for a standard role on an event whose roles have not been created yet (see the endpoint description).

      • roleNamestringrequired

        Display name of the role (singular), e.g. Speaker, Panelist.

      • slugstringrequired

        Stable programmatic identifier for the role within the event.

      • coreRolestringrequired

        The standard category the role maps to. Not a display label.

        Allowed values
        "speaker", "chairperson", "moderator"
      • isCustombooleanrequired

        true for a role the organizer added; false for Speaker, Chairperson and Moderator.

      • sessionIdsstring<uuid>[]required

        Ids of the sessions (including subsessions) on which the contact holds this role.

  • paginationPagination

    Pagination metadata returned with POST search responses. The event-settings GET lists return the same numbers under snake_case keys — see ListPagination.

    Show child attributes
    • currentPageinteger
    • pageSizeinteger
    • totalPagesinteger
    • totalResultsinteger

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
}
}

Get release notes by email

A short digest on the days something new goes live — each change with a link to its note in the release notes. No marketing, and one click to stop.

Company email addresses only. We’ll send one email to confirm it’s you. Already use Sessionboard? You can also turn this on under Community → What’s new.