On this page
Recordings API
Read Record calls and get transcripts for how recording works. A recording is audio, or a 1280x720
MP4 of the call with "video": true, plus the transcript and chat. Test keys see test recordings only; another project's
recording is 404.
Start recording a live room (audio by default, composite MP4 with video true)#
POST /api/v1/rooms/{name}/recordings
Video recordings are capped per server (MEET_VIDEO_RECORDING_MAX, default 2): beyond that the answer is 429 video_recording_limit. Layouts: a grid of up to 9 tiles (the most recent speakers first) or, while someone shares a screen, the screen large with the speakers small. 1280x720, H.264 + AAC, faststart.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Body (JSON)
| Field | Type | Description |
|---|---|---|
video | boolean | true records the composite video as MP4. Default false |
Response
201 The recording, status recording
| Field | Type | Description |
|---|---|---|
object | "recording" | |
id | string | |
livemode | boolean | |
room | string | |
status | string | One of recording, processing, ready, failed |
kind | string | audio is mono Opus in WebM; video is the composite MP4. One of audio, video |
resolution | string or null | Picture size such as 1280x720; null for audio |
size_bytes | integer | |
duration_seconds | integer | |
mime | string or null | |
started_at | string | |
ended_at | string or null |
{
"object": "recording",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"livemode": false,
"room": "order-1042",
"status": "recording",
"kind": "audio",
"resolution": "resolution",
"size_bytes": 1,
"duration_seconds": 1860,
"mime": "mime",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z"
}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 |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/recordings" \
-H "Authorization: Bearer $MEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
undefined
Stop a running recording#
POST /api/v1/recordings/{id}/stop
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string (uuid) |
Response
200 The recording, now processing
| Field | Type | Description |
|---|---|---|
object | "recording" | |
id | string | |
livemode | boolean | |
room | string | |
status | string | One of recording, processing, ready, failed |
kind | string | audio is mono Opus in WebM; video is the composite MP4. One of audio, video |
resolution | string or null | Picture size such as 1280x720; null for audio |
size_bytes | integer | |
duration_seconds | integer | |
mime | string or null | |
started_at | string | |
ended_at | string or null |
{
"object": "recording",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"livemode": false,
"room": "order-1042",
"status": "recording",
"kind": "audio",
"resolution": "resolution",
"size_bytes": 1,
"duration_seconds": 1860,
"mime": "mime",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z"
}Errors
| Status | Meaning |
|---|---|
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/recordings/id/stop" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
undefined
List recordings#
GET /api/v1/recordings
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | string | One of recording, processing, ready, failed |
room | query | string | |
limit | query | integer | Default 20. Between 1 and 100 |
starting_after | query | string |
Response
200 A page of recordings (audio and video)
| Field | Type | Description |
|---|---|---|
object | "list" | |
data | array of Recording | |
data[].object | "recording" | |
data[].id | string | |
data[].livemode | boolean | |
data[].room | string | |
data[].status | string | One of recording, processing, ready, failed |
data[].kind | string | audio is mono Opus in WebM; video is the composite MP4. One of audio, video |
data[].resolution | string or null | Picture size such as 1280x720; null for audio |
data[].size_bytes | integer | |
data[].duration_seconds | integer | |
data[].mime | string or null | |
data[].started_at | string | |
data[].ended_at | string or null | |
has_more | boolean |
{
"object": "list",
"data": [
{
"object": "recording",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"livemode": false,
"room": "order-1042",
"status": "recording",
"kind": "audio",
"resolution": "resolution",
"size_bytes": 1,
"duration_seconds": 1860,
"mime": "mime",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z"
}
],
"has_more": false
}Errors
| Status | Meaning |
|---|---|
| 401 | invalid_api_key or revoked_api_key |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/recordings" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
undefined
One recording, with transcript and chat#
GET /api/v1/recordings/{id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string (uuid) |
Response
200 The recording
| Field | Type | Description |
|---|---|---|
object | "recording" | |
id | string | |
livemode | boolean | |
room | string | |
status | string | One of recording, processing, ready, failed |
kind | string | audio is mono Opus in WebM; video is the composite MP4. One of audio, video |
resolution | string or null | Picture size such as 1280x720; null for audio |
size_bytes | integer | |
duration_seconds | integer | |
mime | string or null | |
started_at | string | |
ended_at | string or null |
{
"object": "recording",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"livemode": false,
"room": "order-1042",
"status": "recording",
"kind": "audio",
"resolution": "resolution",
"size_bytes": 1,
"duration_seconds": 1860,
"mime": "mime",
"started_at": "2026-11-02T09:31:12Z",
"ended_at": "2026-11-02T09:30:00Z"
}Errors
| Status | Meaning |
|---|---|
| 404 | room_not_found, session_not_found or participant_not_found |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/recordings/id" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
undefined
Get a download link#
GET /api/v1/recordings/{id}/download-link returns { "url", "expires_at", "expires_in": 3600 }. The link is signed and works for one hour
without a key. Until the recording is ready the answer is 409 recording_not_ready.
curl "https://meet.respiresoft.com/api/v1/recordings/$RECORDING_ID/download-link" -H "Authorization: Bearer $MEET_API_KEY"const { url } = await meet.recordings.downloadLink(process.env.RECORDING_ID);
const res = await fetch(url); // the audio file, audio/webmDelete a recording#
DELETE /api/v1/recordings/{id} removes the row and the file. While a recording is still recording or processing the answer is
409 recording_in_progress.
curl -X DELETE "https://meet.respiresoft.com/api/v1/recordings/$RECORDING_ID" -H "Authorization: Bearer $MEET_API_KEY"await meet.recordings.delete(process.env.RECORDING_ID);