Replace session file bytes
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Issues a new upload URL for the same file record. After PUTing the new
bytes, call complete again. Requires write:sessions. Max 500 MB
(direct-to-storage flow).
Request example
curl --request POST \ --url 'https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files/{fileId}/replace' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"}'const response = await fetch('https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files/{fileId}/replace', { method: 'POST', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "POST", "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files/{fileId}/replace", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files/{fileId}/replace", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"}', 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}/sessions/{sessionId}/files/{fileId}/replace", strings.NewReader(`{ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"}`)) 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}/sessions/{sessionId}/files/{fileId}/replace")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"filename\": \"keynote-slides.pptx\",\n \"size_bytes\": 1,\n \"content_type\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"mimetype\": \"<string>\",\n \"title\": \"<string>\",\n \"assigned_participant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"content_slot_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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
eventIdintegerpathrequiredEvent ID
sessionIdstring<uuid>pathrequiredSession UUID
fileIdstring<uuid>pathrequiredSession file (Content) UUID
Request body
filenamestringrequiredOriginal filename including extension (e.g.
slides.pptx,handout.pdf).- Example
"keynote-slides.pptx"
size_bytesintegerrequiredExact file size in bytes. Maximum 500 MB (524288000) for direct-to-storage upload. Use
POST .../files/uploadfor files up to 50 MB without specifying size.- Minimum
1- Maximum
524288000
content_typestringMIME type. Optional; inferred from the filename extension when omitted.
- Example
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
mimetypestringAlias for
content_type.titlestringDisplay title. Defaults to
filename.assigned_participant_idstring<uuid> | nullContact UUID of a session participant to assign this file to.
content_slot_idstring<uuid> | nullThe upload slot this file answers. Optional — API callers act as the organization, so no slot deadline applies and a file may be attached without a slot. When set, the slot must be active, apply to the session (
GET .../content-slots?session_id=), accept the file's declared type and have room under itsmax_files; otherwise400names the slot. The file'stypeis derived from the slot'scontent_type. Ignored on events that still use a single file request.
{ "filename": "keynote-slides.pptx", "size_bytes": 1, "content_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "mimetype": "<string>", "title": "<string>", "assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"}Responses
200application/json
OK — new upload URL included
dataobjectA content attachment (file, document, or media) associated with a session.
Approvals. On events using Approvals (Early Access), a file can be held back until it is approved and its release time has passed. The Session Files endpoints still list a held file, so an integration knows it exists, but return
url: nulluntil it is released. Publish only files whoseapproval_statusisapprovedornot_required. When a file you already published moves to any other status, remove it from your destination.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").uploadobjectShow child attributes
urlstring<uri>Presigned S3 URL — PUT the file bytes here.
methodstring- Example
"PUT"
headersobjectShow child attributes
Content-Typestring
400
Validation error
403
Missing write:sessions scope
404
File 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", "upload": { "url": "https://example.com", "method": "PUT", "headers": { "Content-Type": "<string>" } } }}