Endpoints
Sessions
List public sessions or read one session with its public summary as Markdown and text.
Read public sessions in the campaign attached to your key. Sessions marked public show up in the API no matter what processing status they carry. Every request relies on authentication and the shared rate limits.
List sessions
/api/public/v1/sessionsGives back session metadata, sorted by recording date with the most recent one first. Entries that lack a recording date appear at the end. To obtain a session summary, read that session on its own.
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Optional positive page size. Defaults to 50. Values above 100 are capped at 100. |
cursor |
string | Optional next_cursor from the previous page. Omit it for the first page. |
curl "https://app.saga20.com/api/public/v1/sessions?limit=2" \
-H "Authorization: Bearer $SAGA20_API_KEY"
List response fields
Inside the response you get data and pagination. To read another page, follow pagination.
| Field | Type | Description |
|---|---|---|
data |
array of objects | Records on this page, with the fields below. |
data[].id |
string | Session id. Use it in a single-session request. |
data[].title |
string | Session title. |
data[].status |
string | Stored processing status, such as completed, processing or failed. The API does not filter on this field. |
data[].recording_date |
string or null | Session recording date, or null when unset. |
data[].created_at |
string or null | Creation timestamp, or null. |
data[].updated_at |
string or null | Last update timestamp, or null. |
data[].session_type |
string | Stored session kind, such as audio or text_doc. |
data[].visibility |
string | Always "public" for returned sessions. |
pagination |
object | Pagination values for this list. |
pagination.next_cursor |
string or null | Cursor for the next page, or null on the last page. |
pagination.has_more |
boolean | True when another page is available. |
{
"data": [
{
"id": "7b1e3f0a-52c4-4d1e-9a2b-3c8f6d1a9e41",
"title": "The Broken Gate",
"status": "completed",
"recording_date": "2026-09-24T00:00:00+00:00",
"created_at": "2026-09-24T19:12:45+00:00",
"updated_at": "2026-09-25T08:03:10+00:00",
"session_type": "audio",
"visibility": "public"
},
{
"id": "0c9d2e77-1b3a-4f56-8e0d-92a4b7c5d318",
"title": "Ashes at Greywatch",
"status": "completed",
"recording_date": "2026-09-17T00:00:00+00:00",
"created_at": "2026-09-17T20:30:02+00:00",
"updated_at": "2026-09-18T07:41:55+00:00",
"session_type": "audio",
"visibility": "public"
}
],
"pagination": {
"next_cursor": null,
"has_more": false
}
}
Get one session
/api/public/v1/sessions/{id}Gives back one public session along with the public portion of its saved notes. Any sections reserved for the GM are stripped out. Summary formatting follows what the API returns.
| Parameter | Type | Description |
|---|---|---|
id |
string | Required path parameter. Use a session id from the list response. |
A session that is missing, private or belongs to another campaign gives back 404 with {"error":"Session not found"}.
curl "https://app.saga20.com/api/public/v1/sessions/7b1e3f0a-52c4-4d1e-9a2b-3c8f6d1a9e41" \
-H "Authorization: Bearer $SAGA20_API_KEY"
Session response fields
The response holds the session object by itself, with no data wrapper around it.
| Field | Type | Description |
|---|---|---|
id |
string | Session id. Use it in a single-session request. |
title |
string | Session title. |
status |
string | Stored processing status, such as completed, processing or failed. The API does not filter on this field. |
recording_date |
string or null | Session recording date, or null when unset. |
created_at |
string or null | Creation timestamp, or null. |
updated_at |
string or null | Last update timestamp, or null. |
session_type |
string | Stored session kind, such as audio or text_doc. |
visibility |
string | Always "public" for returned sessions. |
summary_markdown |
string | Public summary as normalized Markdown. Empty when no public summary content is available. |
summary_text |
string | Matching summary without heading or bold markers or images. List and table markers can remain. |
{
"id": "7b1e3f0a-52c4-4d1e-9a2b-3c8f6d1a9e41",
"title": "The Broken Gate",
"status": "completed",
"recording_date": "2026-09-24T00:00:00+00:00",
"created_at": "2026-09-24T19:12:45+00:00",
"updated_at": "2026-09-25T08:03:10+00:00",
"session_type": "audio",
"visibility": "public",
"summary_markdown": "## At Greywatch\n\nThe party reached Greywatch Keep at dusk.\n\n- Nyra read the **Ashen Compact** seal on the broken gate.\n\n- Brom found a lantern burning without oil.",
"summary_text": "At Greywatch\n\nThe party reached Greywatch Keep at dusk.\n\n- Nyra read the Ashen Compact seal on the broken gate.\n\n- Brom found a lantern burning without oil."
}