List files attached to a session
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Returns completed files on the session (latest version per file group).
Incomplete uploads (create/replace without complete) are omitted.
Each file carries content_slot_id — the upload slot
it answers — once the event uses upload slots; null otherwise.
Requires read:sessions scope (legacy tokens with empty scopes pass).
Request example
curl --request GET \ --url 'https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files' \ --header 'x-access-token: <api-token>'const response = await fetch('https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files', { 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}/sessions/{sessionId}/files", 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}/sessions/{sessionId}/files", 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}/sessions/{sessionId}/files", 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}/sessions/{sessionId}/files")) .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
eventIdintegerpathrequiredEvent ID
sessionIdstring<uuid>pathrequiredSession UUID
Query parameters
typestringqueryOnly return files of these types.
typeis the organizer-facing file type (presentation,handout,poster,holding_slide, …). Pass one value, a comma-separated list, or repeat the parameter (?type=holding_slide&type=handout). Values are matched case-insensitively; at most 20 values per request. A value with characters other than letters, digits,_and-answers400.
Responses
200application/json
OK
dataContent[]Show child attributes
idstring<uuid>urlstring<uri> | nullDownload URL.
nullwhile Approvals holds the file back (seeapproval_status), so nothing built on the API can publish it early.titlestringfilenamestringsizeintegermimetypestringtypestring | nullOrganizer-facing file type, e.g.
presentation,handout,poster, orholding_slidefor slides generated by Sessionboard. Filterable with?type=on the list endpoint.- Example
"holding_slide"
labelstring | nullDisplay label shown on the session's Files tab, e.g.
Holding Slide.- Example
"Holding Slide"
created_atstring<date-time>updated_atstring<date-time>assigned_participant_idstring<uuid> | nullContact UUID of the session participant this file is assigned to.
assigned_participant_emailstring<email> | nullassigned_participant_namestring | nullcontent_slot_idstring<uuid> | nullThe upload slot this file answers — see
GET /v1/event/{eventId}/content-slots. Present only while the event uses upload slots;nullfor events on a single file request, and for files uploaded before slots existed or outside any slot.approval_statusstringApproval state, returned by the Session Files endpoints.
not_required: not under an approval workflow (no workflow, workflow off, or uploaded before it was turned on).pending: waiting on a reviewer.approved: approved and released.denied: sent back to the uploader for changes.superseded: a newer version replaced it before it was decided.embargoed: approved (or not required) but held until a release time; seeembargo_until.
Only
approvedandnot_requiredfiles have aurl.- Allowed values
"not_required", "pending", "approved", "denied", "superseded", "embargoed"- Example
"approved"
embargo_untilstring<date-time> | nullWhen an
embargoedfile is released (UTC).nullwhen it is not embargoed, or when it waits for its session to be scheduled (release "when each file's session starts").
400
Malformed type filter
403
Missing read:sessions scope
404
Session not found
Response examples
{ "data": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "url": "https://example.com", "title": "<string>", "filename": "<string>", "size": 123, "mimetype": "<string>", "type": "holding_slide", "label": "Holding Slide", "created_at": "2026-01-15T09:30:00Z", "updated_at": "2026-01-15T09:30:00Z", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "assigned_participant_email": "jane@example.com", "assigned_participant_name": "<string>", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "approval_status": "approved", "embargo_until": "2026-01-15T09:30:00Z" } ]}