Skip to content

Upload a session file (simple)

POST/v1/event/{eventId}/sessions/{sessionId}/files/upload

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

Upload a file in one multipart request. Sessionboard detects size and MIME type from the bytes, runs security scanning, and returns the finalized file. Max 50 MB. Requires write:sessions.

For files larger than 50 MB (up to 500 MB), use the direct-to-storage flow: POST .../files → PUT to signed URL → POST .../complete. See Uploading session files.

Request example

Terminal window
curl --request POST \
--url 'https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files/upload' \
--header 'x-access-token: <api-token>' \
--form 'file=@/path/to/slides.pdf' \
--form 'title=<string>' \
--form 'assigned_participant_id=3c90c3cc-0d44-4b50-8888-8dd25736052a' \
--form 'content_slot_id=3c90c3cc-0d44-4b50-8888-8dd25736052a'

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
Body multipart/form-data
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

    Event ID

  • sessionIdstring<uuid>pathrequired

    Session UUID

Request body

multipart/form-datarequired

  • filestring<binary>required

    The file to attach (field name must be file).

  • titlestring

    Display title. Defaults to the uploaded filename.

  • assigned_participant_idstring<uuid>

    Contact UUID of a session participant.

  • content_slot_idstring<uuid>

    Optional upload slot this file answers. Same rules as content_slot_id on POST .../files: the slot must be active, apply to the session, accept the file's type and have room; 400 names the slot otherwise. Sets the file's type.

{
"file": "<string>",
"title": "<string>",
"assigned_participant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content_slot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}

Responses

201application/json

Created — file attached and scanned

  • dataContent

    A 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: null until it is released. Publish only files whose approval_status is approved or not_required. When a file you already published moves to any other status, remove it from your destination.

    Show child attributes
    • idstring<uuid>
    • urlstring<uri> | null

      Download URL. null while Approvals holds the file back (see approval_status), so nothing built on the API can publish it early.

    • titlestring
    • filenamestring
    • sizeinteger
    • mimetypestring
    • typestring | null

      Organizer-facing file type, e.g. presentation, handout, poster, or holding_slide for slides generated by Sessionboard. Filterable with ?type= on the list endpoint.

      Example
      "holding_slide"
    • labelstring | null

      Display 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> | null

      Contact UUID of the session participant this file is assigned to.

    • assigned_participant_emailstring<email> | null
    • assigned_participant_namestring | null
    • content_slot_idstring<uuid> | null

      The upload slot this file answers — see GET /v1/event/{eventId}/content-slots. Present only while the event uses upload slots; null for events on a single file request, and for files uploaded before slots existed or outside any slot.

    • approval_statusstring

      Approval 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; see embargo_until.

      Only approved and not_required files have a url.

      Allowed values
      "not_required", "pending", "approved", "denied", "superseded", "embargoed"
      Example
      "approved"
    • embargo_untilstring<date-time> | null

      When an embargoed file is released (UTC). null when it is not embargoed, or when it waits for its session to be scheduled (release "when each file's session starts").

400

Validation error (missing file, oversize, denied type)

403

Missing write:sessions scope

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

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.