Skip to content

Search speakers

POST/v1/event/{eventId}/speakers

US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com

Search and filter speakers within an event. Supports the session categorization filters (trackIds, tagIds, levelIds, formatIds, languageIds) to match speakers by the sessions they are assigned to. sort uses the same nested shape as other search endpoints ({"createdAt": {"sort": "desc"}}).

Categorization filters are evaluated against the top-level session, matching session search semantics: a speaker assigned to a subsession matches when the subsession's parent (root) session satisfies the filter — a subsession's own categorization values are not consulted.

Each categorization filter needs at least one ID. An empty array is rejected with a 400 naming the field — to apply no filter at all, omit the property rather than sending [].

Only a session's speakers are matched. A contact attached to a matching session as a chairperson, moderator or other participant is not returned by this endpoint — with or without a filter. The session object from POST /v1/event/{eventId}/sessions exposes four separate participant arrays (speakers, chairpersons, moderators, participants) and they are not interchangeable here: reconciling "speakers on track X" against a session search must compare against the speakers array alone, or the counts will not agree. The same contact can appear under different roles on different sessions, so a contact present in the unfiltered speaker list may still be absent from a filtered one when its attachment to the matching session is a non-speaker role.

To retrieve every participant regardless of role — chairpersons, moderators and custom roles included, each with the roles it holds — use POST /v1/event/{eventId}/participants. It accepts the same filters and returns the same contact fields plus a roles array.

Request example

Terminal window
curl --request POST \
--url 'https://public-api.sessionboard.com/v1/event/{eventId}/speakers' \
--header 'x-access-token: <api-token>' \
--header 'Content-Type: application/json' \
--data '{
"filters": {
"createdAt": {
"before": "2026-01-15T09:30:00Z",
"after": "2026-01-15T09:30:00Z"
},
"updatedAt": {
"before": "2026-01-15T09:30:00Z",
"after": "2026-01-15T09:30:00Z"
},
"status": "accepted",
"trackIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"levelIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"formatIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"languageIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"tagIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"sort": {
"createdAt": {
"sort": "asc",
"order": 123
},
"updatedAt": {
"sort": "asc",
"order": 123
}
},
"expand": [
"translated_fields"
]
}'

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 speakers, including session metadata filters. Categorization filters (trackIds, levelIds, formatIds, languageIds, tagIds) match against the speaker's top-level session — a speaker on a subsession matches via the subsession's parent (root) session, mirroring session search semantics.

  • 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
      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
  • 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": {
"createdAt": {
"before": "2026-01-15T09:30:00Z",
"after": "2026-01-15T09:30:00Z"
},
"updatedAt": {
"before": "2026-01-15T09:30:00Z",
"after": "2026-01-15T09:30:00Z"
},
"status": "accepted",
"trackIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"levelIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"formatIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"languageIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"tagIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"sort": {
"createdAt": {
"sort": "asc",
"order": 123
},
"updatedAt": {
"sort": "asc",
"order": 123
}
},
"expand": [
"translated_fields"
]
}

Responses

200application/json

OK

  • resultsContact[]
    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.

  • 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

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",
"photo_url": "https://cdn.sessionboard.com/photos/jane-smith.jpg",
"company_name": "State University",
"title": "Professor of Computer Science",
"about": "Dr. Smith is a leading researcher in distributed systems.",
"address_city": "Austin",
"address_state": "TX",
"address_country": "US",
"honorific": "Dr.",
"pronouns": "she/her",
"topic_expertise": "Distributed Systems, Cloud Computing",
"custom_fields": [],
"translated_fields": []
}
],
"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.