On this page
Sessions and Transcripts API
A session is one sitting in a room. Sessions are kept after the call ends, so you can read who was there, the transcript and the chat.
Transcripts are paginated when format=json (the default). With format=txt, vtt or srt the body is the whole transcript as plain text.
Chat attachments are not exposed, only has_attachment.
Past and current sessions, newest first#
GET /api/v1/sessions
Parameters
| Name | In | Type | Description |
|---|---|---|---|
room | query | string | Only this room's sessions |
status | query | string | One of active, ended |
limit | query | integer | Default 10. Between 1 and 100 |
starting_after | query | string (uuid) | The id of the last session of the previous page |
Response
200 A page of sessions
| Field | Type | Description |
|---|---|---|
object | "list" | |
data | array of Session | |
data[].object | "session" | |
data[].id | string | |
data[].room | string | |
data[].room_id | string | |
data[].status | string | One of active, ended |
data[].started_at | string | |
data[].ended_at | string or null | |
data[].end_reason | string or null | |
data[].duration_seconds | integer | |
data[].participant_count | integer | |
data[].livemode | boolean | |
data[].participants | array of object | |
data[].participants[].id | string | |
data[].participants[].name | string | |
data[].participants[].role | string | |
data[].participants[].language | string or null | |
data[].participants[].admitted | boolean | |
data[].participants[].joined_at | string | |
data[].participants[].left_at | string or null | |
data[].participants[].duration_seconds | integer | |
has_more | boolean |
{
"object": "list",
"data": [
{
"object": "session",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"room": "order-1042",
"room_id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"status": "active",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z",
"end_reason": "end_reason",
"duration_seconds": 1860,
"participant_count": 1,
"livemode": false,
"participants": [
{
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"name": "order-1042",
"role": "role",
"language": "en",
"admitted": false,
"joined_at": "2026-11-02T09:31:12Z",
"left_at": "2026-11-02T09:30:00Z",
"duration_seconds": 1860
}
]
}
],
"has_more": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 429 | rate_limited; wait Retry-After seconds |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/sessions?room=order-1042&status=ended" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
for await (const s of meet.sessions.list({ room: "order-1042", status: "ended" })) {
console.log(s.id, s.duration_seconds);
}
One session with its participants#
GET /api/v1/sessions/{session_id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
session_id required | path | string (uuid) |
Response
200 The session
| Field | Type | Description |
|---|---|---|
object | "session" | |
id | string | |
room | string | |
room_id | string | |
status | string | One of active, ended |
started_at | string | |
ended_at | string or null | |
end_reason | string or null | |
duration_seconds | integer | |
participant_count | integer | |
livemode | boolean | |
participants | array of object | |
participants[].id | string | |
participants[].name | string | |
participants[].role | string | |
participants[].language | string or null | |
participants[].admitted | boolean | |
participants[].joined_at | string | |
participants[].left_at | string or null | |
participants[].duration_seconds | integer |
{
"object": "session",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"room": "order-1042",
"room_id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"status": "active",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z",
"end_reason": "end_reason",
"duration_seconds": 1860,
"participant_count": 1,
"livemode": false,
"participants": [
{
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"name": "order-1042",
"role": "role",
"language": "en",
"admitted": false,
"joined_at": "2026-11-02T09:31:12Z",
"left_at": "2026-11-02T09:30:00Z",
"duration_seconds": 1860
}
]
}Errors
| Status | Meaning |
|---|---|
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 429 | rate_limited; wait Retry-After seconds |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/sessions/6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
const session = await meet.sessions.get("6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10");
console.log(session.participants.length);
The caption lines of a session#
GET /api/v1/sessions/{session_id}/transcript
Parameters
| Name | In | Type | Description |
|---|---|---|---|
session_id required | path | string (uuid) | |
format | query | string | One of json, txt, vtt, srt. Default json |
lang | query | string | Show this translation where a line has one |
limit | query | integer | json only. Default 1000. Between 1 and 5000 |
starting_after | query | string (uuid) | json only: the id of the last line of the previous page |
Response
200 JSON, or text/plain, text/vtt or application/x-subrip with times counted from the start of the session
| Field | Type | Description |
|---|---|---|
object | "transcript" | |
session_id | string | |
lang | string or null | |
data | array of object | |
data[].id | string | |
data[].speaker | string or null | |
data[].language | string or null | |
data[].text | string | |
data[].translations | object | |
data[].start_ms | integer | From the start of the session |
data[].end_ms | integer | |
data[].at | string | |
has_more | boolean |
{
"object": "transcript",
"session_id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"lang": "en",
"data": [
{
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"speaker": "Ann",
"language": "en",
"text": "Hello everyone",
"start_ms": 4200,
"end_ms": 4200,
"at": "2026-11-02T09:33:05Z"
}
],
"has_more": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 429 | rate_limited; wait Retry-After seconds |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/sessions/6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10/transcript?format=vtt&lang=es" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
const vtt = await meet.sessions.transcript("6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10", { format: "vtt", lang: "es" });
console.log(vtt);
The chat messages of a session, oldest first#
GET /api/v1/sessions/{session_id}/chat
Parameters
| Name | In | Type | Description |
|---|---|---|---|
session_id required | path | string (uuid) | |
limit | query | integer | Default 100. Between 1 and 100 |
starting_after | query | string (uuid) |
Response
200 A page of messages
| Field | Type | Description |
|---|---|---|
object | "list" | |
session_id | string | |
data | array of object | |
data[].id | string | |
data[].author | string or null | |
data[].participant_id | string or null | |
data[].text | string | |
data[].has_attachment | boolean | |
data[].reply_to | string or null | |
data[].created_at | string | |
has_more | boolean |
{
"object": "list",
"session_id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"data": [
{
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"author": "Ann",
"participant_id": "participant_id",
"text": "Hello everyone",
"has_attachment": false,
"reply_to": "reply_to",
"created_at": "2026-11-02T09:30:00Z"
}
],
"has_more": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 429 | rate_limited; wait Retry-After seconds |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/sessions/6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10/chat" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
for await (const m of meet.sessions.chat("6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10")) {
console.log(m.author, m.text);
}