> ## 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.

# Consuming session content

> One-call composed transcripts, summaries, insights, podcasts, and PDFs for mobile and partner apps.

Use the **content** endpoints when you want a ready-to-render pack for a session or event — not the raw polymorphic transcriptions list.

> [!NOTE]
>
> **Content** is not the same as session **composition** (abstract → parent/child linking). Composition docs live under [Sessions & Composition](https://apidocs.sessionboard.com/api-reference/sessions-composition.md).

## When to use which API

| Goal | Endpoint family |
| - | - |
| Display a full session transcript + AI artifacts in an app | `GET .../sessions/{sessionId}/content` |
| Browse packs across an event | `GET .../content` (paginated) |
| Event report PDF + recap rollup | `GET .../content/event` |
| Create/update raw fragments, summaries, insights | `.../transcriptions` CRUD |

Scope: `read:transcriptions` (legacy tokens with empty scopes still pass for reads).

## Session pack (canonical)

```bash theme={null}
curl --request GET \
  --url 'https://public-api.sessionboard.com/v1/event/6046/sessions/{sessionId}/content' \
  --header 'x-access-token: YOUR_TOKEN'
```

Response shape (proxy envelope):

```json theme={null}
{
  "data": {
    "id": "session-uuid",
    "event_id": 6046,
    "title": "Keynote",
    "speakers": [{ "id": "0", "label": "Speaker 0", "name": null }],
    "has_transcription": true,
    "has_summary": true,
    "has_podcast": false,
    "items": [
      {
        "type": "transcription",
        "text": "Full joined transcript…",
        "elements": [
          {
            "value": "Speaker turn text…",
            "speaker": { "id": "0", "label": "Speaker 0", "name": null },
            "start_time": 2.23,
            "end_time": 51.88,
            "fragment_ids": ["…"]
          }
        ]
      },
      { "type": "summary", "provider": "openai", "content": { "summary": "…", "key_points": [] } },
      { "type": "insight", "insight_type": "thought", "name": "…" },
      { "type": "podcast", "status": "none", "url": null },
      { "type": "document", "document_type": "summary_pdf", "url": "https://…/sessions/{sessionId}/content/documents/summary_pdf" }
    ]
  }
}
```

### Join transcript text

```js theme={null}
const transcription = data.items.find((i) => i.type === "transcription");
const fullText =
  transcription?.text ??
  transcription?.elements?.map((e) => e.value).join(" ") ??
  "";
```

`elements.map(e => e.value).join(' ')` always equals `text` when elements are present.

### Speaker turns vs time windows

* Default: consecutive same-speaker fragments → one element (speaker turns).
* `?interval_sec=60`: rechunk same-speaker blocks into \~60s windows (speaker changes still split).

### Slim the payload

```bash theme={null}
# Transcript + summary only
.../content?expand=transcription,summary
```

### Prefer a summary provider

```bash theme={null}
.../content?provider=claude
```

When multiple rolling summaries exist, the newest is returned unless `provider` matches.

## Event list

```bash theme={null}
curl --request GET \
  --url 'https://public-api.sessionboard.com/v1/event/6046/content?page=1&page_size=25' \
  --header 'x-access-token: YOUR_TOKEN'
```

Returns `{ data: [ SessionContent, … ], pagination: { current_page, page_size, total_pages, total_results } }`.

List packs are **compact** by default (transcription `text` without full `elements`). Pass `expand=items` (with other types) for full element arrays.

## Event-level artifacts

```bash theme={null}
GET /v1/event/{eventId}/content/event
```

Includes `document` (`event_report`) and `recap` (quotes, topics, summary excerpts).

## Podcasts and PDFs

| Item | Behavior |
| - | - |
| `podcast` | `status`: `none` \| `queued` \| `generating` \| `ready` \| `failed`. When ready, `url` is a time-limited download link; refresh before `expires_at`. |
| `document` | Metadata + `url` pointing at authenticated download routes (`summary_pdf`, `summary_card`, `event_report`). |

Generation of podcasts/PDFs is not triggered by the public API — content endpoints are read-only.

## Single item

```bash theme={null}
GET /v1/event/{eventId}/content/items/{itemId}
```

| `itemId` | Result |
| - | - |
| Session UUID | Composed `transcription` item |
| Summary / insight / podcast UUID | That item |
| `summary_pdf` / `summary_card` | Document metadata (`?session_id=` required) |
| `event_report` / `recap` | Event-level item |

## Related

* [Transcriptions & Media overview](https://apidocs.sessionboard.com/api-reference/transcriptions-and-media.md)
* [Uploading media and transcriptions](https://apidocs.sessionboard.com/guides/uploading-media-and-transcriptions.md)


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