Consuming session content
Use the content endpoints when you want a ready-to-render pack for a session or event — not the raw polymorphic transcriptions list.
When to use which API
Section titled “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)
Section titled “Session pack (canonical)”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):
{ "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
Section titled “Join transcript text”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
Section titled “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
Section titled “Slim the payload”# Transcript + summary only.../content?expand=transcription,summaryPrefer a summary provider
Section titled “Prefer a summary provider”.../content?provider=claudeWhen multiple rolling summaries exist, the newest is returned unless provider matches.
Event list
Section titled “Event list”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
Section titled “Event-level artifacts”GET /v1/event/{eventId}/content/eventIncludes document (event_report) and recap (quotes, topics, summary excerpts).
Podcasts and PDFs
Section titled “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
Section titled “Single item”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 |
