nimeet Docs
中文

Cloud Recording

Recording task lifecycle and Agora-compatible endpoints.

Generated from the public REST API definitions

Version v1.1.0 · Updated 2026-10-26 · revision 1

Group overview

Generated at build time from the public REST API definition: tag recordings, 13 operations (out of 189). For authentication, envelope and pagination conventions see REST API overview.

MethodPathSummary
POST/v1/apps/{appid}/cloud_recording/acquireAgora: acquire a recording resource
POST/v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/mode/{mode}/startAgora: start cloud recording
GET/v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/queryAgora: query cloud recording
POST/v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/stopAgora: stop cloud recording
POST/v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/updateLayoutAgora: update layout
POST/v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/updateUpdate a recording session
GET/v1/recordingsList recording tasks
POST/v1/recordingsStart a recording task
GET/v1/recordings/{id}Get a recording task
GET/v1/recordings/{id}/files/{fileIndex}Download one recording file
POST/v1/recordings/{id}/files/{fileIndex}/playback-ticketIssue a short-lived playback ticket for one recording file
POST/v1/recordings/{id}/layoutUpdate layout of a running recording
POST/v1/recordings/{id}/stopStop a recording task

Operation details

POST /v1/apps/{appid}/cloud_recording/acquire

Agora: acquire a recording resource

Returns a single-use resourceId valid for 30 seconds; call start next.

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$

Request body

FieldTypeRequiredDescription
cnamestringis
uidstringis
clientRequestobject
json
{
  "cname": "weekly-sync",
  "uid": "10001",
  "clientRequest": {
    "scene": 0
  }
}

Response

Status codesDescription / schema
200{ resourceId } — AgoraRecordingResource

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/acquire" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"cname":"weekly-sync","uid":"10001","clientRequest":{"scene":0}}'

POST /v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/mode/{mode}/start

Agora: start cloud recording

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$
resourceIdpathisstringlength 0..128
modepathisenum(mix | individual | web)

Request body

FieldTypeRequiredDescription
cnamestringis
uidstringis
clientRequestobjectrecordingConfig / storageConfig subset
json
{
  "cname": "weekly-sync",
  "uid": "10001",
  "clientRequest": {
    "recordingConfig": {
      "mixedVideoLayout": 1
    }
  }
}

Response

Status codesDescription / schema
200{ resourceId, sid, serverResponse: { taskId, state } } — AgoraRecordingStart

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/resourceid/$RESOURCE_ID/mode/mix/start" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"cname":"weekly-sync","uid":"10001","clientRequest":{"recordingConfig":{"mixedVideoLayout":1}}}'

GET /v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/query

Agora: query cloud recording

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$
resourceIdpathisstringlength 0..128
sidpathisstringlength 0..128
modepathisenum(mix | individual | web)

Response

Status codesDescription / schema
200{ resourceId, sid, serverResponse: { taskId, status, fileList } } — AgoraRecordingQuery

Example call

bash
curl -s -X GET "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/resourceid/$RESOURCE_ID/sid/$SID/mode/mix/query" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

POST /v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/stop

Agora: stop cloud recording

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$
resourceIdpathisstringlength 0..128
sidpathisstringlength 0..128
modepathisenum(mix | individual | web)

Request body

FieldTypeRequiredDescription
cnamestring
uidstring
clientRequestobject
json
{
  "cname": "weekly-sync",
  "uid": "10001",
  "clientRequest": {}
}

Response

Status codesDescription / schema
200{ resourceId, sid, serverResponse: { taskId, status, fileList } } — AgoraRecordingStop

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/resourceid/$RESOURCE_ID/sid/$SID/mode/mix/stop" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"cname":"weekly-sync","uid":"10001","clientRequest":{}}'

POST /v1/apps/{appid}/cloud_recording/resourceid/{resourceId}/sid/{sid}/mode/{mode}/updateLayout

Agora: update layout

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$
resourceIdpathisstringlength 0..128
sidpathisstringlength 0..128
modepathisenum(mix | individual | web)

Request body

FieldTypeRequiredDescription
cnamestring
uidstring
clientRequestobject
json
{
  "cname": "weekly-sync",
  "uid": "10001",
  "clientRequest": {
    "mixedVideoLayout": 2
  }
}

Response

Status codesDescription / schema
200{ resourceId, sid, serverResponse: { taskId, layout } } — AgoraRecordingLayout

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/resourceid/$RESOURCE_ID/sid/$SID/mode/mix/updateLayout" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"cname":"weekly-sync","uid":"10001","clientRequest":{"mixedVideoLayout":2}}'

POST /v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/update

Update a recording session

Changes the subscription list, pauses or resumes a web page recording, or re-points the CDN push of a running session. Only valid while the session is active.

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
appidpathisstringpattern ^[a-f0-9]{32}$
resourceidpathisstringlength 0..128
sidpathisstringlength 0..128
modepathisenum(mix | individual | web)

Request body

FieldTypeRequiredDescription
cnamestringislength 0..128
uidstringislength 0..64
clientRequestobject{ streamSubscribe, webRecordingConfig, rtmpPublishConfig, storageConfig }is
json
{
  "cname": "weekly-sync",
  "uid": "10001",
  "clientRequest": {
    "streamSubscribe": {
      "audioUidList": {
        "subscribeAudioUids": [
          "string"
        ],
        "unsubscribeAudioUids": [
          "string"
        ]
      },
      "videoUidList": {
        "subscribeVideoUids": [
          "string"
        ],
        "unsubscribeVideoUids": [
          "string"
        ]
      }
    },
    "webRecordingConfig": {
      "onhold": true
    },
    "rtmpPublishConfig": {
      "outputs": [
        {
          "rtmpUrl": "string"
        }
      ]
    }
  }
}

Response

Status codesDescription / schema
200the session was updated — object{ resourceId, sid, serverResponse }
400Invalid parameter — Error
401Missing/invalid credentials — Error
403Banned or service not enabled — Error
404Resource not found — Error
415Content-Type must be application/json — Error
429Quota exceeded — Error

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/apps/$APP_ID/cloud_recording/resourceid/resourceid/sid/$SID/mode/mix/update" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"cname":"weekly-sync","uid":"10001","clientRequest":{"streamSubscribe":{"audioUidList":{"subscribeAudioUids":["string"],"unsubscribeAudioUids":["string"]},"videoUidList":{"subscribeVideoUids":["string"],"unsubscribeVideoUids":["string"]}},"webRecordingConfig":{"onhold":true},"rtmpPublishConfig":{"outputs":[{"rtmpUrl":"string"}]}}}'

GET /v1/recordings

List recording tasks

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
channelNamequerystring
statequerystringcomma separated
limitqueryinteger<= 200

Response

Status codesDescription / schema
200{ total, tasks } — RecordingTaskList

Example call

bash
curl -s -X GET "$NIMEET_API_BASE/v1/recordings?channelName=weekly-sync&state=running&limit=50" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

POST /v1/recordings

Start a recording task

Requires the recording service. Composite mode records the mixed room; individual records one file per publisher; web records a page-oriented layout.

Authentication: project credentials (Base64 of customerId:customerSecret)

Request body

FieldTypeRequiredDescription
channelNamestringis
modeenum(composite | individual | web)
layoutobject
subscribeAudioUidsarray<integer>
subscribeVideoUidsarray<integer>
maxDurationSecondsinteger
idempotencyKeystring
json
{
  "channelName": "weekly-sync",
  "mode": "composite",
  "layout": {
    "preset": "grid"
  }
}

Response

Status codesDescription / schema
202accepted — RecordingTaskBody
403Banned or service not enabled — Error
404Resource not found — Error
429Quota exceeded — Error

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/recordings" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"channelName":"weekly-sync","mode":"composite","layout":{"preset":"grid"}}'

GET /v1/recordings/{id}

Get a recording task

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
idpathisstringlength 0..128

Response

Status codesDescription / schema
200task — RecordingTaskBody
404Resource not found — Error

Example call

bash
curl -s -X GET "$NIMEET_API_BASE/v1/recordings/weekly-sync_1a2b" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

GET /v1/recordings/{id}/files/{fileIndex}

Download one recording file

Streams the stored artifact of a recording task. Tenant-scoped: the task is looked up inside the authenticated project, so another tenant id returns 404. Replaces the deprecated operator-only /internal/objects/{objectKey} surface (no tenant boundary, sunset 2027-01-31).

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
idpathisstringlength 0..128
fileIndexpathisinteger>= 0

Response

Status codesDescription / schema
200recording file bytes
404Resource not found — Error

Example call

bash
curl -s -X GET "$NIMEET_API_BASE/v1/recordings/weekly-sync_1a2b/files/1" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

POST /v1/recordings/{id}/files/{fileIndex}/playback-ticket

Issue a short-lived playback ticket for one recording file

Browser players cannot attach Basic credentials to a <video> request, so a tenant-authenticated caller exchanges its credentials for a 10-minute HMAC ticket. The returned URL carries ?expires=&ticket= and the file route accepts it without project authentication (the signature covers task id, file index and expiry). Returns 503 when RECORDING_PLAYBACK_SECRET is not configured.

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
idpathisstringlength 0..128
fileIndexpathisinteger>= 0

Response

Status codesDescription / schema
200signed playback URL and its expiry — object{ url, expiresAt }
401Missing/invalid credentials — Error
404Resource not found — Error
503playback signing is not configured on this deployment — Error

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/recordings/weekly-sync_1a2b/files/1/playback-ticket" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

POST /v1/recordings/{id}/layout

Update layout of a running recording

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
idpathisstringlength 0..128

Request body

FieldTypeRequiredDescription
presetenum(grid | bestFit | pip | single)
canvasWidthinteger | null
canvasHeightinteger | null
backgroundColorstring | null
json
{
  "preset": "pip"
}

Response

Status codesDescription / schema
200the task after the layout was applied — RecordingTaskBody

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/recordings/weekly-sync_1a2b/layout" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC" \
  -H "Content-Type: application/json" \
  -d '{"preset":"pip"}'

POST /v1/recordings/{id}/stop

Stop a recording task

Authentication: project credentials (Base64 of customerId:customerSecret)

Parameters

NameLocationRequiredTypeDescription
idpathisstringlength 0..128

Response

Status codesDescription / schema
200the stopped task (same shape as GET /v1/recordings/{id}) — RecordingTaskBody
404Resource not found — Error

Example call

bash
curl -s -X POST "$NIMEET_API_BASE/v1/recordings/weekly-sync_1a2b/stop" \
  -H "Authorization: Basic $NIMEET_CUSTOMER_BASIC"

Schemas used by this group

AgoraRecordingFile — object{ fileName, duration, size }
FieldTypeRequiredDescription
fileNamestringis
durationnumberisseconds; 0 while the file is still being written
sizenumberisbytes; 0 while the file is still being written
AgoraRecordingLayout — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, layout }is
AgoraRecordingQuery — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, status, fileList, error }is
AgoraRecordingResource — object{ resourceId }
FieldTypeRequiredDescription
resourceIdstringissingle-use marker valid for 30 s; pass it to start
AgoraRecordingStart — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringisour recording task id (Agora calls it sid)
serverResponseobject{ taskId, state }is
AgoraRecordingStop — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, status, fileList }is
Error — object{ code, message, reason, sdkCode, details }
FieldTypeRequiredDescription
codestringisstable machine code, see errors.json
messagestringis
reasonstring
sdkCodeintegerAgora-aligned client error number
detailsobject
RecordingTaskBody — object
FieldTypeRequiredDescription
idstring
channelNamestring
modeenum(composite | individual | web)
stateenum(starting | running | stopping | stopped | failed | expired)
layoutobject{ preset, canvasWidth, canvasHeight, backgroundColor }
filesarray<object{ objectKey, url, format, durationSeconds, sizeBytes }>
usageSecondsnumber
errorstring | null
startedAtstring | null
endedAtstring | null
RecordingTaskList — object{ total, tasks }
FieldTypeRequiredDescription
totalintegeris
tasksarray<object>is

Generated by the documentation build pipeline · 2026-10-31 01:24:02 UTC · Documentation center v1.1.0.

Content follows the public API definitions.

ni-meet is a self-hosted RTC PaaS with a LiveKit-based media plane (Apache-2.0) and an Agora-compatible API.