> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.sessionboard.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Session Files

> Attach PDFs, PowerPoint decks, and other documents to sessions.

For step-by-step integration flows, start with the [Uploading session files](https://apidocs.sessionboard.com/guides/uploading-session-files.md) guide.

> [!NOTE]
>
> Session files are **not** the media or recording upload flow. Use [Media & Transcriptions](https://apidocs.sessionboard.com/guides/uploading-media-and-transcriptions.md) for video/audio that should be transcribed or stored as session recordings.

## Upload paths

**Simple (≤ 50 MB)**

One multipart call — Sessionboard detects size and MIME type, scans the file, and returns the attached `Content` object.

1. `POST .../files/upload` with multipart field **`file`**
2. Optional form fields: `title`, `assigned_participant_id`

**Direct to storage (≤ 500 MB)**

Presigned URL flow for larger files or clients that prefer direct-to-S3 upload:

1. `POST .../files` — JSON with `filename` and `size_bytes`
2. `PUT` bytes to `data.upload.url`
3. `POST .../files/{fileId}/complete`

## Upload slots

Organizers can define what they ask speakers for as **upload slots** — Poster, Presentation, Handout — each with its own deadline, accepted file types and file count (**Program → Settings → Files → Use upload slots**). `GET /v1/event/{eventId}/content-slots` lists them in the order speakers see them, and every session file carries `content_slot_id` pointing at the slot it answers, so a poster is distinguishable from a deck without inspecting filenames or MIME types.

Events still on a single file request return an empty slot list and `content_slot_id: null` on every file. Slot definitions are read-only through the API.

**Uploading into a slot.** `POST .../files` and `POST .../files/upload` accept an optional `content_slot_id`. Ask `GET /v1/event/{eventId}/content-slots?session_id={sessionId}` which slots apply to the session, then send the slot's id with the file. API callers act as the organization, so no slot deadline applies and a file may still be attached without a slot — but a slot you name is a contract: it must be active, apply to the session, accept the file's declared type and have room under its `max_files`, or the request answers `400` naming the slot. The file's `type` is derived from the slot's `content_type`.

## Scopes

| Action | Scope |
| - | - |
| List upload slots | `read:sessions` |
| List files | `read:sessions` |
| Upload / create / complete / replace / update / delete | `write:sessions` |

## Endpoints

> **[List upload slots](https://apidocs.sessionboard.com/api-reference/session-files/list-upload-slots.md)**
>
> GET /v1/event/{eventId}/content-slots

> **[Simple upload](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files~1upload/post)**
>
> POST /v1/event/{eventId}/sessions/{sessionId}/files/upload

> **[List session files](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files/get)**
>
> GET /v1/event/{eventId}/sessions/{sessionId}/files

> **[Start direct upload](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files/post)**
>
> POST /v1/event/{eventId}/sessions/{sessionId}/files

> **[Complete direct upload](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files~1%7BfileId%7D~1complete/post)**
>
> POST .../files/{fileId}/complete

> **[Replace file bytes](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files~1%7BfileId%7D~1replace/post)**
>
> POST .../files/{fileId}/replace

> **[Update metadata](https://apidocs.sessionboard.com/api-reference/openapi.yaml#/paths/~1v1~1event~1%7BeventId%7D~1sessions~1%7BsessionId%7D~1files~1%7BfileId%7D/put)**
>
> PUT /v1/event/{eventId}/sessions/{sessionId}/files/{fileId}

## Response shape

File objects use the `Content` schema (`id`, `url`, `title`, `filename`, `size`, `mimetype`, `type`, `label`, assigned participant fields, timestamps). Direct-to-storage create/replace responses also include an `upload` object with `url`, `method`, and `headers` for the presigned PUT.

`type` is the organizer-facing file type (`presentation`, `handout`, `poster`, `holding_slide` for slides Sessionboard generated, …) and `label` is the display label from the session's Files tab. The list endpoint filters on it:

```bash theme={null}
# Only the generated holding slide(s) for a session
curl "https://public-api.sessionboard.com/v1/event/{eventId}/sessions/{sessionId}/files?type=holding_slide" \
  -H "x-access-token: YOUR_TOKEN"

# Several types: comma-separated or repeated
curl ".../files?type=presentation,handout"
curl ".../files?type=presentation&type=handout"
```

A generated holding slide keeps the same `id` when it is regenerated, so a client that cached the file id keeps working; only `url`, `filename`, `size` and `updated_at` change.

## Related reference

* [Uploading session files](https://apidocs.sessionboard.com/guides/uploading-session-files.md) — full playbook
* [Transcriptions & Media](https://apidocs.sessionboard.com/api-reference/transcriptions-and-media.md)
* [Authentication & scopes](https://apidocs.sessionboard.com/authentication.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.