Web Call Server 5.3 REST API (3.0.0)
Download OpenAPI specification:
/rest-api/v3
This API provides control capabilities for the WCS server.
By default, the API is available on:
Use HTTP POST for all requests unless explicitly specified otherwise.
Available sections:
/rest-api/v3/app
The Application endpoint exposes CRUD operations over the applications stored in WCS_HOME/conf/database.yml. An application is identified by its key and carries a name, URL, handler and callback.
Each application owns a set of allowed REST hook methods. On creation an application is seeded with the default set of methods; the methods can be inspected and modified afterwards.
Available methods:
/rest-api/v3/app/create
Create a new application. The application is seeded with the default set of allowed REST hook methods.
| key required | string non-empty Application key (identity) |
| name | string Application name |
| url | string Application URL |
| handler | string Application handler. If omitted, the default WCS4 handler is used |
| callback | string Application callback. If omitted, the default WCS4 callback is used |
{- "key": "myApp",
- "name": "My Application",
- "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
- "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}/rest-api/v3/app/find
Get a single application by key.
| key required | string non-empty Application key |
{- "key": "myApp"
}{- "name": "My Application",
- "key": "myApp",
- "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
- "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}/rest-api/v3/app/find_all
Returns a list of all applications, sorted alphabetically by key.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "name": "My Application",
- "key": "myApp",
- "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
- "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}
]/rest-api/v3/app/rest_methods/add
Allow a REST hook method for the application. Only known methods are added; unknown method names are ignored.
| key required | string non-empty Application key |
| method required | string non-empty REST method name |
{- "key": "myApp",
- "method": "publishStream"
}/rest-api/v3/app/rest_methods/find
Returns the set of REST hook methods allowed for the application, sorted alphabetically.
| key required | string non-empty Application key |
{- "key": "myApp"
}[- "string"
]/rest-api/v3/app/rest_methods/remove
Disallow a REST hook method for the application.
| key required | string non-empty Application key |
| method required | string non-empty REST method name |
{- "key": "myApp",
- "method": "publishStream"
}/rest-api/v3/app/update
Partially update an existing application. Only the fields provided (non-null) in the request overlay the
existing values; omitted fields are left unchanged. The key identifies the application and is never changed.
| key required | string non-empty Application key (identity); used to look up the application, never changed |
| name | string Application name; if omitted, the existing value is preserved |
| url | string Application URL; if omitted, the existing value is preserved |
| handler | string Application handler; if omitted or empty, the existing value is preserved |
| callback | string Application callback; if omitted or empty, the existing value is preserved |
{- "key": "myApp",
- "name": "My Application",
- "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
- "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}/rest-api/v3/call
The Call endpoint represents an outbound SIP call. In this workflow, WCS acts as a SIP client that initiates a call to a remote PBX. A new call is created when the /call/startup endpoint is invoked. WCS sends a SIP INVITE request to the PBX. The PBX then replies with 200 OK, and a SIP session (the Call) is established.
The parameters rtmpStream and rtmpUrl, provided during call startup, allow incoming RTP media from the SIP call to be forwarded into an RTMP stream. The toStream parameter converts the incoming RTP media into a server-side publish stream, which can then be played over all supported protocols (WebRTC, HLS, RTSP, RTMP) and processed on the server — including mixing, transcoding, re-streaming, and more.
Available methods:
/rest-api/v3/call/find
Find active calls using a filter. You can filter by callId, status, caller, callee, or rtmpUrl.
This is the preferred way to check the status of a specific call or a group of calls belonging to a specific user without overhead.
| callId | string Unique SIP Call-ID of the active call | ||||||||||||||||
| status | string
Call status. SIP 180 → RING, SIP 183 → SESSION_PROGRESS, SIP 200 → ESTABLISHED | ||||||||||||||||
| caller | string Caller (From) peer identifier; value used in SIP From header | ||||||||||||||||
| callee | string Callee (To) peer identifier; value used in SIP To header | ||||||||||||||||
| rtmpUrl | string^rtmp://.+$ RTMP URL of the target server for re-streaming the RTP media received from the SIP endpoint (e.g. rtmp://server:1935/live/stream) | ||||||||||||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||||||||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "callId": "6d62f660",
- "status": "RING",
- "caller": "10001",
- "callee": "10002",
- "rtmpUrl": "rtmp://localhost:1935/live",
- "limit": 1000,
- "offset": 0
}[- {
- "callId": "6d62f660",
- "callUuid": "066a26d6",
- "incoming": true,
- "status": "RING",
- "caller": "10001",
- "callee": "10002",
- "createDate": 1759480746210,
- "hasAudio": true,
- "hasVideo": false,
- "sdp": "v=0\\r\\no=Flashphoner 0 1759480746034...",
- "visibleName": "10001",
- "mediaProvider": "Flash",
- "sipStatus": 200,
- "rtmpUrl": "rtmp://localhost:1935/live",
- "rtmpStreamStatus": "RTMP_STREAM_WAIT",
- "sipMessageRaw": "INVITE sip:...",
- "holdForTransfer": false
}
]/rest-api/v3/call/find_all
Returns a comprehensive list of all SIP sessions currently registered and active on the WCS server. This method provides a global snapshot of the signaling state for all outbound calls initiated via the REST API.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "callId": "6d62f660",
- "callUuid": "066a26d6",
- "incoming": true,
- "status": "RING",
- "caller": "10001",
- "callee": "10002",
- "createDate": 1759480746210,
- "hasAudio": true,
- "hasVideo": false,
- "sdp": "v=0\\r\\no=Flashphoner 0 1759480746034...",
- "visibleName": "10001",
- "mediaProvider": "Flash",
- "sipStatus": 200,
- "rtmpUrl": "rtmp://localhost:1935/live",
- "rtmpStreamStatus": "RTMP_STREAM_WAIT",
- "sipMessageRaw": "INVITE sip:...",
- "holdForTransfer": false
}
]/rest-api/v3/call/inject_sound
Inject WAV audio into the SIP call. As a result, the remote SIP party will receive and play the audio from the specified WAV file.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| callId required | string Unique SIP Call-ID of the active call |
| fileName required | string Name of the WAV audio file to inject into the call. The file is resolved relative to the |
{- "callId": "6d62f660",
- "fileName": "test.wav"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/call/inject_sound",
- "params": {
- "callId": "6d62f660",
- "fileName": "test.wav"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/call/inject_stream/startup
Inject a published stream into the SIP call. As a result, the remote SIP party will receive and play the audio and video from the specified stream.
| callId required | string Unique SIP Call-ID of the active call |
| streamName required | string Name of the published stream to inject into the SIP call |
{- "callId": "6d62f660",
- "streamName": "stream1"
}/rest-api/v3/call/inject_stream/terminate
Stop injecting the published stream into the SIP call. This restores the default media state or stops the transmission of the injected source.
| callId required | string Unique SIP Call-ID of the active call |
{- "callId": "6d62f660"
}/rest-api/v3/call/send_dtmf
Send a DTMF tone to the SIP party (via SIP or RTP).
| callId required | string Unique SIP Call-ID of the active call | ||||||||
| type required | string
DTMF transmission method | ||||||||
| dtmf required | string DTMF characters to send. Supports sequences of multiple characters. Allowed: 0-9, *, #, A-D |
{- "callId": "6d62f660",
- "type": "RFC2833",
- "dtmf": "9"
}/rest-api/v3/call/startup
Start a new outbound SIP call.
Option 1. RTMP re-streaming using rtmpUrl
Set the rtmpUrl parameter — after the SIP session is successfully established, RTP media will be pushed to the specified RTMP URL. If the rtmpStream parameter is also provided, it will be appended to rtmpUrl to form the final target.
Option 2. Convert incoming RTP into an internal stream using toStream
Set the toStream parameter — after the SIP session is established, the incoming RTP media will be converted into a server-side internal stream with the specified name, available for playback and further processing (HLS, transcoding, mixing, etc.).
Option 3. SIP call without media re-streaming
Do not set rtmpUrl, rtmpStream, or toStream. A SIP call will still be established. Methods inject_sound, inject_stream/startup, send_dtmf, and inject_stream/terminate can be applied to the active call regardless of whether media re-streaming is enabled.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse call/find, call/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| callId required | string SIP Call-ID for the new call. Used as the Call-ID header in the SIP INVITE request. It is recommended to use a UUID. | ||||||||
| callee required | string Callee (To) peer identifier; value used in SIP To header | ||||||||
| rtmpUrl | string^rtmp://.+$ RTMP URL of the target server for re-streaming the RTP media received from the SIP endpoint (e.g. rtmp://server:1935/live/stream) | ||||||||
| rtmpStream | string If provided, this value is appended to the rtmpUrl to form the final RTMP publish target.
The resulting URL format is rtmpUrl/rtmpStream. For example, with
| ||||||||
| toStream | string If provided, after the SIP session is established
the incoming RTP media will be converted into a server-side internal stream
with the specified name. For example, if | ||||||||
| callType | string (callType) Default: "AUDIO"
When sending a SIP INVITE, both audio and video codecs will be included in SDP if the value VIDEO_AUDIO is provided. Otherwise, only audio codecs will be included for AUDIO, and only video codecs for VIDEO. | ||||||||
| sipLogin required | string SIP From header value. Can be a full SIP URI (e.g. | ||||||||
| sipAuthenticationName required | string Username used for SIP Digest authentication (INVITE or REGISTER). | ||||||||
| sipPassword required | string Password used for SIP Digest authentication (INVITE or REGISTER). | ||||||||
| sipDomain required | string SIP server domain. | ||||||||
| sipOutboundProxy | string SIP proxy server or PBX to route calls through. Format: IP or FQDN | ||||||||
| sipPort | string Port of the SIP proxy or PBX where traffic is sent. Default: 5060. Applies to sipOutboundProxy if set, otherwise to sipDomain | ||||||||
| sipRegisterRequired | boolean Whether to perform SIP REGISTER before sending INVITE. SIP INVITE calls may work without registration depending on PBX configuration. | ||||||||
| appKey | string Application key that will receive webhook events on SIP session establishment. Default: defaultApp | ||||||||
| visibleName | string Caller's display name used in the SIP From header |
{- "callId": "6d62f660",
- "callee": "10002",
- "rtmpUrl": "rtmp://localhost:1935/live",
- "rtmpStream": "test",
- "toStream": "stream1",
- "callType": "AUDIO",
- "sipLogin": "10001",
- "sipAuthenticationName": "10001",
- "sipPassword": "Password_1234",
- "sipDomain": "sip.example.com",
- "sipOutboundProxy": "sip.proxy.example.com",
- "sipPort": "5060",
- "sipRegisterRequired": true,
- "appKey": "defaultApp",
- "visibleName": "10001"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/call/startup",
- "params": {
- "callId": "6d62f660",
- "callee": "10002",
- "rtmpUrl": "rtmp://localhost:1935/live",
- "rtmpStream": "test",
- "toStream": "stream1",
- "callType": "AUDIO",
- "sipLogin": "10001",
- "sipAuthenticationName": "10001",
- "sipPassword": "Password_1234",
- "sipDomain": "sip.example.com",
- "sipOutboundProxy": "sip.proxy.example.com",
- "sipPort": "5060",
- "sipRegisterRequired": true,
- "appKey": "defaultApp",
- "visibleName": "10001"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn
A content delivery network for low latency streaming can be deployed from multiple WCS instances. A publisher sends a stream to an Origin server. When a viewer requests playback, the Edge server pulls the stream from Origin and delivers it to the viewer. Streams can be re-encoded on a dedicated Transcoder server and recorded to files on a Recorder server. The network is dynamic — nodes discover each other automatically through a configured entry point, and all inter-node signaling is carried over WebSocket.
This API provides control over the CDN: node topology and state management, signaling channel reset and inspection, stream routing, transcoding profile configuration, stream-level access control (ACL), and automated recording and warmup traps.
The diagram below shows a multi-region CDN deployment with two groups: EU and US. Each group has a PRIMARY Origin where streams are originally published, SECONDARY Origins that replicate streams within the region, Transcoders for re-encoding, and Edges serving clients. PRIMARY Origins replicate streams to each other across groups, so both stream1 (published in EU) and stream2 (published in US) become available in all regions.
Available methods:
Topology management
Applies to any node
Connectivity & Channels
Applies to any node
Stream routing & Transcoding
Applies to any node
Access control (ACL)
Applies to Origin node only
Transcoding profiles
Applies to Edge node only
Recording traps
Applies to Recorder node only
Warmup traps
Applies to Edge node only
/rest-api/v3/cdn/stream/access_list/add
Add security keys to a stream's Access Control List (ACL). Keys added on Origin are synchronized to all Edge nodes. When a viewer requests a protected stream, the Edge node authorizes the request against these keys before pulling the stream from Origin.
| name required | string The name of the stream to which the ACL entries will be applied |
| keys required | Array of strings List of unique security keys or tokens allowed to access this stream |
Add ACL Keys Example
{- "name": "live_stream_01",
- "keys": [
- "token123",
- "token456"
]
}/rest-api/v3/cdn/stream/access_list/delete
Remove the entire Access Control List (ACL) for a stream, deleting all authorized keys. Once removed, the stream becomes accessible without key-based authorization on Edge nodes.
| name required | string Name of the published stream to which the ACL entries will be applied |
Delete All ACL Entries
{- "name": "test_stream"
}/rest-api/v3/cdn/stream/access_list/print
Retrieve the current Access Control List (ACL) for a specific stream. Returns all security keys currently authorized for this stream on the Origin node.
| name required | string Name of the published stream to which the ACL entries will be applied |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
Print ACL Example
{- "name": "live_stream_01"
}Active ACL Keys
[- "key1",
- "key2",
- "token_xyz"
]/rest-api/v3/cdn/stream/access_list/remove
Remove specific keys from a stream's Access Control List (ACL). Only the keys provided in the request are removed, leaving other keys intact. Viewers whose keys have been revoked will be denied access on the Edge node.
| name required | string The name of the stream to which the ACL entries will be applied |
| keys required | Array of strings List of unique security keys or tokens allowed to access this stream |
Remove ACL Key Example
{- "name": "live_stream_01",
- "keys": [
- "obsolete_key_01"
]
}/rest-api/v3/cdn/connection/reset_all
Drop and re-establish all signaling connections (both inbound and outbound) between this node and all connected CDN nodes. Outbound connections are re-established by this node immediately. Inbound connections are re-established by remote nodes when they detect the disconnection. Media streams are not interrupted — only the WebSocket signaling layer is reset.
The point of entry node typically has only inbound connections from other nodes. Other nodes that discover each other through the point of entry may have bidirectional connections (both inbound and outbound) between them.
/rest-api/v3/cdn/connection/reset_inbound
Forcefully drop and re-establish all incoming signaling connections from a specific node. The remote node detects the disconnection and automatically reconnects. Used to resolve stuck sessions or synchronization issues.
The point of entry node typically has only inbound connections from other nodes. Other nodes that discover each other through the point of entry may have bidirectional connections (both inbound and outbound) between them.
| nodeId required | string CDN node identifier — IP address or FQDN of the remote node, as configured in cdn_ip setting (e.g. 192.168.1.10, edge01.example.com) |
Reset Inbound Example
{- "nodeId": "origin-node-01.internal"
}/rest-api/v3/cdn/connection/reset_outbound
Forcefully drop and re-establish all outgoing signaling connections to a specific target node. Unlike reset_all, this only affects the path to the specified node, leaving other connections uninterrupted. The node immediately reconnects after the reset.
The point of entry node typically has only inbound connections from other nodes. Other nodes that discover each other through the point of entry may have bidirectional connections (both inbound and outbound) between them.
| nodeId required | string CDN node identifier — IP address or FQDN of the remote node, as configured in cdn_ip setting (e.g. 192.168.1.10, edge01.example.com) |
Reset Outbound Example
{- "nodeId": "edge-node-05.internal"
}/rest-api/v3/cdn/show_channels
Retrieve a list of active signaling channels on this CDN node.
A channel is a virtual signaling channel multiplexed within a single WebSocket connection between two CDN nodes. Each channel is identified by a unique channelId and serves exactly one media stream. For example, when an Edge node pulls 10 different streams from the same Origin, there will be 10 virtual channels sharing the same underlying WebSocket connection, each distinguished by its own channelId.
Each channel carries signaling messages (SDP offers/answers, ICE candidates, stream control commands) used to negotiate and manage the media delivery for that stream.
Channel direction is outbound if this node initiated the channel (e.g. Edge pulling a stream from Origin), or inbound if a remote node initiated the channel to this node (e.g. Origin receiving a pull request from Edge).
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}Channel List Example
[- {
- "id": "gWIM40Ly",
- "remoteIp": "192.168.0.1",
- "type": "outbound",
- "uptime": 32546
}, - {
- "id": "xK82Nq1P",
- "remoteIp": "10.0.0.5",
- "type": "inbound",
- "uptime": 1205
}
]/rest-api/v3/cdn/profile/add
Add a new transcoding profile. These profiles are used by the Edge node to request specific quality variants of a stream from the Transcoder.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse profile/print to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| name required | string Unique transcoding profile name. Used as a suffix to the stream name when requesting a specific quality (e.g. -720p, -480p) |
required | audio (object) or video (object) (CdnProfileRequestTuple) Profile descriptor |
{- "name": "-720p",
- "profile": {
- "audio": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "audio"
}, - "video": {
- "width": 640,
- "height": 360,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "h264",
- "codecImpl": "FF",
- "quality": 0,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio"
}
}
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/profile/add",
- "params": {
- "name": "-720p",
- "profile": {
- "audio": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "audio"
}, - "video": {
- "width": 640,
- "height": 360,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "h264",
- "codecImpl": "FF",
- "quality": 0,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio"
}
}
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/profile/modify
Update the parameters of an existing transcoding profile. A profile that is currently applied on any Edge node cannot be modified and returns 409 Conflict. Once updated, the new parameters apply to all subsequent stream requests.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse profile/print to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| name required | string Unique transcoding profile name. Used as a suffix to the stream name when requesting a specific quality (e.g. -720p, -480p) |
required | audio (object) or video (object) (CdnProfileRequestTuple) Profile descriptor |
{- "name": "-720p",
- "profile": {
- "audio": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "audio"
}, - "video": {
- "width": 640,
- "height": 360,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "h264",
- "codecImpl": "FF",
- "quality": 0,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio"
}
}
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/profile/modify",
- "params": {
- "name": "-720p",
- "profile": {
- "audio": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "audio"
}, - "video": {
- "width": 640,
- "height": 360,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "h264",
- "codecImpl": "FF",
- "quality": 0,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio"
}
}
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/profile/print
Retrieve all transcoding profiles configured on the Edge node. Each profile defines audio and video parameters (bitrate, resolution, codecs) that the Edge passes to the Transcoder when requesting a stream.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "name": "-720p",
- "audio": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "audio"
}, - "video": {
- "width": 640,
- "height": 360,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "h264",
- "codecImpl": "FF",
- "quality": 0,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio"
}
}
]/rest-api/v3/cdn/profile/remove
Remove a transcoding profile from the Edge node. A profile currently in use cannot be removed and returns 409 Conflict.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse profile/print to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| name required | string Unique transcoding profile name to remove (e.g. -720p, -480p) |
{- "name": "-720p"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/profile/remove",
- "params": {
- "name": "-720p"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/recorder/show_active
Retrieve a list of all active stream recordings. Each entry contains the stream identifier and the source node from which it is being captured. Requires Recorder role, otherwise returns 404.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- "live_stream_01 origin.internal",
- "news_feed_hd edge-02.internal"
]/rest-api/v3/cdn/recorder/trap/add
Add a new recording trap to enable automated recording of streams matching a pattern (regex or prefix). When a matching stream is detected on an Origin or Transcoder, the Recorder automatically starts a recording session. Traps persist across node restarts. Requires Recorder role.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse recorder/trap/show to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| streamName required | string Stream name pattern (regex) to match streams published on Origin. When a stream matching this pattern is published or already publishing, the Recorder will pull and record it (e.g. stream., live_.) |
| serverIps | Array of strings Allowed Origin IP addresses. Recording will only apply to streams from these Origins. If empty, all Origins are allowed |
| serverNames | Array of strings Allowed Origin domain names. Recording will only apply to streams from these Origins. If empty, all Origins are allowed |
| profile | string Deprecated Deprecated. Use profiles instead |
| profiles | Array of strings List of transcoding profiles to record. SOURCE records the original stream without transcoding, other values are profile names (e.g. -240p, -720p) |
{- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "SOURCE",
- "-240p"
]
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/recorder/trap/add",
- "params": {
- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "SOURCE",
- "-240p"
]
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/recorder/trap/remove
Remove a recording trap. New streams matching the removed pattern will no longer be recorded automatically. Streams already being recorded will continue until naturally terminated. Requires Recorder role.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse recorder/trap/show to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| id required | string Recording trap ID to remove. Obtained from recorder/trap/show response |
{- "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/recorder/trap/remove",
- "params": {
- "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/recorder/trap/show
Retrieve all configured recording traps. Recording traps are rules that trigger automatic stream recording based on name patterns (regex, prefix, or exact match). When a matching stream appears on an Origin or Transcoder, the Recorder automatically starts capturing it. Requires Recorder role, otherwise returns 404.
{- "streams": [
- {
- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "-240p"
], - "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}
], - "defaultProfile": "-360p"
}/rest-api/v3/cdn/show_routes
Get a list of active stream routes. Each entry contains the route identifier (Origin host, hop count, media tracks) and the name of the stream published under that identifier.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}Routes Example
[- {
- "routeKey": "0-origin.example.com-0-[AUDIO{codec='opus'}, VIDEO{codec='H264'}]",
- "streamName": "live_broadcast_01"
}
]/rest-api/v3/cdn/show_redundant_transcodings
Identify streams that are currently being transcoded on multiple Transcoder nodes simultaneously.
Important: This method should be called on an Edge node. Only Edge nodes receive route announcements from both Origin and Transcoder nodes, so only they have a complete routing table. Calling this on Origin or Transcoder will return incomplete or empty results.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}Redundant Transcoding Example
[- {
- "streamName": "live_stream_01",
- "nodes": "192.168.1.10, 192.168.1.11"
}
]/rest-api/v3/cdn/stream/show_routes
Retrieve the delivery path for a given stream. Returns a list of hops; each hop contains its identifier (the requested transcoding profile, a Transcoder node, or a proxy node) and the media tracks present at that hop.
| streamName required | string Stream name or stream name with profile suffix (e.g. stream1 or stream1-720p). When a profile suffix is provided, the route is resolved for the base stream with the specified transcoding profile |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "streamName": "stream123",
- "limit": 1000,
- "offset": 0
}[- {
- "stage": "REQUESTED-PROFILE",
- "tracks": [
- "AUDIO{bitrate=0, codec='opus', rate=48000, channels=0}",
- "VIDEO{width=640, height=360, gop=90, fps=30, bitrate=0, codec='h264', codecImpl='OPENH264', quality=null}"
]
}, - {
- "stage": "1-NEW-TRANSCODER-95.191.131.64",
- "tracks": [ ]
}, - {
- "stage": "2-PROXY-95.191.130.39",
- "tracks": [
- "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
- "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='null', quality=null}"
]
}
]/rest-api/v3/cdn/stream/trace_route
Trace the delivery path of a stream back to its publication source. In CDN, a stream flows from the Origin (PRIMARY) where it was originally published, optionally through another Origin (SECONDARY) that replicated it, then through a Transcoder, and finally to the Edge serving clients. This method returns that path as an ordered list, starting from the current node and ending at the Origin where the stream was originally published.
Each hop in the list is formatted as nodeId(ROLE:REPLICATION_MODE), for example 192.168.1.4(EDGE) or 192.168.1.1(ORIGIN:PRIMARY). The replication mode is shown only for Origin nodes: PRIMARY means the stream was originally published on this Origin, SECONDARY means the Origin pulled (replicated) the stream from another Origin.
| streamName required | string Name of the published stream to trace the delivery path for |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "streamName": "stream1",
- "limit": 1000,
- "offset": 0
}Trace Route Example
[- {
- "streamName": "stream1",
- "hops": [
- "192.168.1.4(EDGE)",
- "192.168.1.3(TRANSCODER)",
- "192.168.1.2(ORIGIN:SECONDARY)",
- "192.168.1.1(ORIGIN:PRIMARY)"
]
}
]/rest-api/v3/cdn/enforce_state
Forcefully set the operational state of the CDN node (Origin, Edge, Transcoder, or Recorder).
The updated state is broadcast to other nodes. Supported values: PASSIVE (refuse new media requests, drain mode) and NEW_STREAMS_ALLOWED (fully available).
| state required | string
CDN node state to enforce. Typically PASSIVE (drain mode) or NEW_STREAMS_ALLOWED (fully available) |
{- "state": "UNKNOWN"
}/rest-api/v3/cdn/remove_node
Remove a specific node (Origin, Edge, Transcoder, or Recorder) from the network.
A node in an ACTIVE state cannot be removed directly. First, change its state to PASSIVE using enforce_state to drain active sessions.
| nodeId required | string CDN node identifier — IP address or FQDN of the remote node, as configured in cdn_ip setting (e.g. 192.168.1.10, edge01.example.com) |
{- "nodeId": "vm1.localhost.com"
}/rest-api/v3/cdn/show_groups
Retrieve a list of all node groups and their members. Groups organize nodes by region or purpose. Each node entry includes role, software version, operational state, and RTT. Nodes not assigned to a specific group appear in the default group.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}Standard Response
[- {
- "name": "default",
- "nodes": [
- {
- "nodeId": "origin-01",
- "role": "ORIGIN(STANDALONE)",
- "version": "2.13",
- "state": "NEW_STREAMS_ALLOWED",
- "rtt": 45
}
]
}, - {
- "name": "EU-West",
- "nodes": [
- {
- "nodeId": "edge-01",
- "role": "EDGE",
- "version": "2.13",
- "state": null,
- "rtt": 15
}
]
}
]/rest-api/v3/cdn/show_nodes
Retrieve a list of all active nodes (Origin, Edge, Transcoder, Recorder) currently visible in the network. Each entry contains the nodeId, role, and operational state. Use the returned nodeId for operations like connection/reset_outbound or remove_node.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "id": "vm1.localhost.com",
- "version": "2.13",
- "role": "EDGE",
- "inboundConnected": true,
- "outboundConnected": false,
- "globalState": "ACTIVE",
- "processingState": "NEW_STREAMS_ALLOWED",
- "logs": "Node version 2.0 is incompatible",
- "group": "test_group",
- "connectionStats": {
- "lastRtt": 145,
- "lastSn": 5,
- "lastMessageSentMs": 1759841292104,
- "lastACKReceivedMs": 1759841292177,
- "maxRtt": 145,
- "inFlightSize": 0
}, - "monitorStats": {
- "mediaStats": {
- "rtt": 35,
- "packetLostPercent": 13.4,
- "incomingBitrate": 1500000,
- "outgoingBitrate": 1500000
}, - "signalingStats": {
- "rtt": 12,
- "lastPingSentMs": 1721134125000,
- "lastPongReceivedMs": 1721134125012
}, - "connectionQuality": "PERFECT"
}
}
]/rest-api/v3/cdn/show_state
Retrieve the current operational state of the node (Origin, Edge, Transcoder, or Recorder). Returned states: UNKNOWN (initializing), PASSIVE (refuses new requests, drain mode), GROUP_CONNECTIONS_ALLOWED (only existing groups), CONNECTIONS_ALLOWED (accepts connections), NEW_STREAMS_ALLOWED (fully available).
"UNKNOWN"/rest-api/v3/cdn/warmup/show_active
Retrieve a list of streams currently being pre-pulled by warmup rules. Each entry contains the stream name and the source Origin IP. The warmup service must be enabled, otherwise returns 404.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- "live_hd_01 192.168.1.10",
- "promo_video 10.0.0.5"
]/rest-api/v3/cdn/warmup/trap/add
Add a new warmup rule. When a stream matching the pattern is detected on an Origin, the Edge node automatically pre-pulls it so media data is available before any viewer requests playback.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse warmup/trap/show to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| streamName required | string Stream name pattern (regex) to match streams published on Origin. When a stream matching this pattern is published, the Edge will pre-pull it (e.g. stream., live_.) |
| serverIps | Array of strings Allowed Origin IP addresses. Warmup only applies to streams from these Origins. If empty, all Origins are allowed |
| serverNames | Array of strings Allowed Origin domain names. Warmup only applies to streams from these Origins. If empty, all Origins are allowed |
| profile | string Deprecated Deprecated. Use profiles instead |
| profiles | Array of strings List of transcoding profiles to pre-pull. SOURCE pulls the original stream without transcoding |
| abr | boolean Whether to additionally pre-pull the composite ABR stream containing all transcoding profiles from the Transcoder. Can be combined with individual profiles |
{- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "SOURCE",
- "-240p"
], - "abr": true
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/warmup/trap/add",
- "params": {
- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "SOURCE",
- "-240p"
], - "abr": true
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/warmup/trap/remove
Remove a warmup rule. New streams matching the removed pattern will no longer be pre-pulled. Streams already being pulled will continue until naturally terminated.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse warmup/trap/show to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| id required | string Warmup trap ID to remove. Obtained from warmup/trap/show response |
{- "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/cdn/warmup/trap/remove",
- "params": {
- "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/cdn/warmup/trap/show
Retrieve all configured warmup rules. Warmup rules define which streams should be automatically pre-pulled from Origin to this Edge node, reducing startup latency for viewers. The warmup service must be enabled, otherwise returns 404.
{- "streams": [
- {
- "streamName": "stream.*",
- "serverIps": [
- "172.16.1.0/16"
], - "serverNames": [
- "mydomain.com"
], - "profile": "-240p",
- "profiles": [
- "-240p"
], - "abr": true,
- "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}
], - "defaultProfile": "-360p"
}/rest-api/v3/certificate
The Certificate API lets you replace the server's TLS certificate at runtime without restarting, or roll back to the default self—signed bundled certificate. A single certificate secures all of the server's TLS-terminated services — HTTPS (the REST API and web admin UI), secure WebSocket (WSS), HLS-over-HTTPS, secure SIP (TLS), CDN inter-node TLS, and RTC metrics.
A new certificate is uploaded in a single request that carries both the public certificate chain (fullchain) and the matching private key. The server validates that the private key matches the leaf certificate before applying the new certificate to all of the server's secure connections.
Available methods:
/rest-api/v3/certificate/upload
Upload a new TLS certificate. The request carries both the public certificate chain (fullchain) and the matching private key. The private key is validated against the leaf certificate, and the new certificate is applied immediately to all of the server's TLS connections (HTTPS, WSS, HLS, secure SIP, CDN, RTC metrics).
Because the HTTPS REST API is served with this same certificate, the connection used to call this endpoint is itself re-keyed; clients may need to re-establish the TLS session.
Public certificate chain (fullchain) together with the matching private key, both PEM-encoded
| fullchain required | string non-empty PEM-encoded public certificate chain (fullchain). May contain one or more concatenated certificates, leaf first. The matching private key must be supplied in the same request |
| privkey required | string non-empty PEM-encoded private key matching the leaf certificate of the chain. Must be unencrypted |
{- "fullchain": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEbV6x...leaf certificate...J3Z0VnZ0VnZ0Vn\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyf...intermediate certificate...0VnZ0Vn\n-----END CERTIFICATE-----",
- "privkey": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQ...private key...\n-----END PRIVATE KEY-----"
}/rest-api/v3/connection
The Connection endpoint manages individual client WebSocket sessions used for signaling. Each session is identified by a unique sessionId and is used to establish and control media sessions (WebRTC, RTMP, etc.).
Use this API to discover active sessions, change log verbosity for a specific session at runtime, or forcefully terminate problematic connections.
Available methods:
/rest-api/v3/connection/find_all
Get all active connections. Returns an empty list if no clients are connected.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "appKey": "defaultApp",
- "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
- "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
- "mediaProviders": [
- "WebRTC"
], - "clientVersion": "2.0",
- "sipRegisterRequired": true,
- "sipLogin": "10001",
- "sipAuthenticationName": "10001",
- "sipPassword": "Password_1234",
- "sipVisibleName": "10001",
- "sipDomain": "sip.example.com",
- "sipOutboundProxy": "sip.proxy.example.com",
- "sipPort": 5060,
- "useDTLS": true,
- "msePacketizationVersion": 2,
- "authToken": "d62440e7-0e38-4831-9fc1-7d3beb2a0d31",
- "clientOSVersion": "5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
- "clientBrowserVersion": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
- "keepAlive": true,
- "width": 640,
- "height": 480,
- "status": "ESTABLISHED",
- "logLevel": "DEBUG",
- "webRTCMetricsServerDescription": " \"collect\": \"off\",\n \"sampling\": 1000,\n \"batchSize\": 30,\n \"compression\": \"none,gzip\",\n \"types\": {\n \"codec\": {\n \"metrics\": \"timestamp,payloadType,mimeType,clockRate,channels\"\n },\n \"inbound-rtp\": {\n \"metrics\": \"timestamp,ssrc,kind,packetsReceived,packetsReceivedWithEct1\"\n }\n }\n"
}
]/rest-api/v3/connection/find
Search for connections by criteria. If no criteria are specified, returns all connections.
| appKey | string REST hook application key. Determines the webhook URL for event notifications, as configured in database.yml |
| sessionId | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types |
| clientVersion | string Client version |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "appKey": "defaultApp",
- "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
- "clientVersion": "2.0",
- "limit": 1000,
- "offset": 0
}[- {
- "appKey": "defaultApp",
- "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
- "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
- "mediaProviders": [
- "WebRTC"
], - "clientVersion": "2.0",
- "sipRegisterRequired": true,
- "sipLogin": "10001",
- "sipAuthenticationName": "10001",
- "sipPassword": "Password_1234",
- "sipVisibleName": "10001",
- "sipDomain": "sip.example.com",
- "sipOutboundProxy": "sip.proxy.example.com",
- "sipPort": 5060,
- "useDTLS": true,
- "msePacketizationVersion": 2,
- "authToken": "d62440e7-0e38-4831-9fc1-7d3beb2a0d31",
- "clientOSVersion": "5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
- "clientBrowserVersion": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
- "keepAlive": true,
- "width": 640,
- "height": 480,
- "logLevel": "DEBUG",
- "webRTCMetricsServerDescription": " \"collect\": \"off\",\n \"sampling\": 1000,\n \"batchSize\": 30,\n \"compression\": \"none,gzip\",\n \"types\": {\n \"codec\": {\n \"metrics\": \"timestamp,payloadType,mimeType,clockRate,channels\"\n },\n \"inbound-rtp\": {\n \"metrics\": \"timestamp,ssrc,kind,packetsReceived,packetsReceivedWithEct1\"\n }\n }\n"
}
]/rest-api/v3/connection/set_log_level
Set the logger level for a specific connection for real-time debugging.
| sessionId required | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types | ||||||||||||||||||
| logLevel required | string
Per-connection logging level to set. Controls the log verbosity for this specific client without affecting other connections or global server logs |
{- "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
- "logLevel": "DEBUG"
}/rest-api/v3/connection/terminate
Forcefully terminate a connection. All associated media streams will be closed.
| sessionId required | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types |
{- "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3"
}/rest-api/v3/data
The Data endpoint allows sending custom JSON payloads to one or more active client sessions over WebSocket. This is commonly used for implementing chat systems, signaling custom application states, or triggering client-side events.
Data delivery is supported only for WebSocket connections. This endpoint does not deliver messages to WebRTC or RTMP or other streaming clients.
Available methods:
/rest-api/v3/data/batch_send
Send multiple independent messages in a single request. Each item is processed separately, allowing different payloads and target sessions.
| sessionId required | string Signaling session ID (Connection ID) of the target client. For WebSocket connections the format is /remoteIP:port/localIP:port |
| sessionIds | Array of strings List of signaling session IDs (Connection IDs) of the target clients |
required | object Custom JSON data to deliver to the target client(s) via WebSocket |
batch_example
[- {
- "sessionId": "/127.0.0.1:15422/127.0.0.1:8443",
- "payload": {
- "message": "Hello!"
}
}, - {
- "sessionIds": [
- "/127.0.0.1:15422/127.0.0.1:8443",
- "/127.0.0.1:15424/127.0.0.1:8443"
], - "payload": {
- "message": "Hi there!"
}
}
][- {
- "sessionId": "/192.168.1.102:15422/192.168.1.101:8443",
- "status": "SUCCESS",
- "error": "Client not found"
}
]/rest-api/v3/data/send
Send a JSON payload to one or more client sessions. The message is delivered only to WebSocket connections. If at least one target session is found, the request is considered successful. The response contains per-session delivery status.
| sessionId required | string Signaling session ID (Connection ID) of the target client. For WebSocket connections the format is /remoteIP:port/localIP:port |
| sessionIds | Array of strings List of signaling session IDs (Connection IDs) of the target clients |
required | object Custom JSON data to deliver to the target client(s) via WebSocket |
[- {
- "sessionId": "/192.168.1.102:15422/192.168.1.101:8443",
- "status": "SUCCESS",
- "error": "Client not found"
}
]/rest-api/v3/file-system-controller
A sandboxed filesystem API rooted at the server workdir and gated by a config-driven allow-list
(WCS_HOME/conf/RestFileSystemController.yml).
A path that starts with / is absolute; otherwise it is relative to the
workdir (the default). NUL bytes are always rejected with 400; for a relative path,
.. escapes and symlink escapes out of the workdir are rejected with 400 too. A
request is only served if the validated path matches an allow-list rule (longest-prefix) that grants the
permission the endpoint requires; otherwise it is denied with 403 (deny by default).
Absolute paths are disabled by default and rejected with 400. They are served only when
the file_system.allow_absolute_paths setting is true and an explicit
absolute allow-list rule (a rule whose path starts with /) grants the required
permission. Relative requests match only relative rules and absolute requests only absolute rules. For an
absolute request the canonical target must stay within the canonical matched rule root; a .. or
symlink escape beyond that root is rejected with 400. An absolute rule can expose any path the
server's OS user can access, so grant least privilege.
Permissions: read, write, create, delete,
stream. read and stream are distinct, so an administrator can allow
tailing a log without granting a full read of it (or vice versa).
Read/write/create/stream transfers are bounded by the file_system.max_transfer_size setting
(bytes); oversized writes/creates are rejected with 413 and oversized reads are capped and flagged
with truncated:true.
Use allowed_paths to inspect the workdir, the active rules and whether absolute paths are currently enabled.
/rest-api/v3/file-system-controller/allowed_paths
Returns the workdir root and the configured allow-list rules. Takes no request body and may be called with GET or POST. Useful for discovering which paths and permissions are available.
{- "workdir": "/usr/local/FlashphonerWebCallServer",
- "absolutePathsEnabled": false,
- "rules": [
- {
- "path": "logs",
- "absolute": false,
- "type": "dir",
- "recursive": true,
- "permissions": [
- "read",
- "stream"
]
}
]
}/rest-api/v3/file-system-controller/file/create_anchor
Counts the current number of lines N in a file and returns an anchor for line N. Pass the anchor to /file/stream to read only lines appended afterwards. Requires the stream permission.
| path required | string non-empty Workdir-relative path of the file to anchor |
{- "path": "logs/flashphoner_manager.log"
}{- "path": "logs/flashphoner_manager.log",
- "anchor": "NDI=",
- "line": 42
}/rest-api/v3/file-system-controller/directory/create
Creates a directory under the workdir. Requires the create permission. With parents=true any missing parent directories are created as well.
| path required | string non-empty Workdir-relative path of the directory to create |
| parents | boolean Default: false Create any missing parent directories as well |
{- "path": "records/scratch",
- "parents": false
}{- "path": "records/scratch",
- "created": true
}/rest-api/v3/file-system-controller/directory/delete
Deletes a directory under the workdir. Requires the delete permission. Without recursive=true the directory must be empty. Symlinks encountered while deleting are removed as links and never followed, so deletion can never escape the workdir.
| path required | string non-empty Workdir-relative path of the directory to delete |
| recursive | boolean Default: false Delete the directory and all its contents. If false, the directory must be empty. |
{- "path": "records/scratch",
- "recursive": false
}{- "path": "records/scratch",
- "deleted": true
}/rest-api/v3/file-system-controller/directory/read
Lists the entries of a directory under the workdir. Requires the read permission. With recursive=true all descendants are listed (entry names are relative to the listed directory). Symlinks are not followed.
| path required | string non-empty Workdir-relative path of the directory to list |
| recursive | boolean Default: false List all descendants recursively (entry names are relative to the listed directory) |
{- "path": "logs",
- "recursive": false
}{- "path": "logs",
- "entries": [
- {
- "name": "flashphoner_manager.log",
- "type": "file",
- "size": 1048576,
- "modified": "2026-05-26 10:15:30+00:00"
}
]
}/rest-api/v3/file-system-controller/file/create
Creates a new file under the workdir with optional initial content. Requires the create permission. Fails with 409 if the path already exists. Content larger than file_system.max_transfer_size is rejected with 413.
| path required | string non-empty Workdir-relative path of the file to create |
| content | string Optional initial UTF-8 content. Must not exceed file_system.max_transfer_size bytes. |
{- "path": "records/scratch/new.txt",
- "content": "string"
}{- "path": "records/scratch/new.txt",
- "created": true,
- "size": 0
}/rest-api/v3/file-system-controller/file/delete
Deletes a file under the workdir. Requires the delete permission. Use /directory/delete for directories.
| path required | string non-empty Workdir-relative path of the file to delete |
{- "path": "records/scratch/old.txt"
}{- "path": "records/scratch/old.txt",
- "deleted": true
}/rest-api/v3/file-system-controller/file/read
Reads a file under the workdir. Requires the read permission. At most min(maxBytes, file_system.max_transfer_size) bytes are returned; if the file is larger, truncated is true while size still reports the real size.
| path required | string non-empty Workdir-relative path of the file to read |
| encoding | string Default: "UTF-8" Charset used to decode the bytes into the returned content |
| maxBytes | integer <int64> Maximum number of bytes to return. The effective limit is min(maxBytes, file_system.max_transfer_size). If the file is larger than what is returned, 'truncated' is true. |
{- "path": "logs/flashphoner_manager.log",
- "encoding": "UTF-8",
- "maxBytes": 65536
}{- "path": "logs/flashphoner_manager.log",
- "content": "...log lines...",
- "size": 1048576,
- "encoding": "UTF-8",
- "truncated": true
}/rest-api/v3/file-system-controller/file/write
Writes UTF-8 content to a file under the workdir (OVERWRITE or APPEND). Requires the write permission; creating a new file additionally requires create and createIfMissing=true. Content larger than file_system.max_transfer_size is rejected with 413 and no partial file is written.
| path required | string non-empty Workdir-relative path of the file to write |
| content required | string UTF-8 content to write. Must not exceed file_system.max_transfer_size bytes. |
| mode | string Default: "OVERWRITE" Enum: "OVERWRITE" "APPEND" "OVERWRITE" "APPEND" File write strategy |
| createIfMissing | boolean Default: false Create the file if it does not exist (additionally requires the 'create' permission) |
{- "path": "records/scratch/notes.txt",
- "content": "hello world\n",
- "mode": "OVERWRITE",
- "createIfMissing": false
}{- "path": "records/scratch/notes.txt",
- "bytesWritten": 12,
- "size": 12
}/rest-api/v3/file-system-controller/file/stream
Streams the lines appended to a file since an anchor (log tailing). Requires the stream permission. With an anchor for line N it returns lines N+1 .. min(cur, N+maxLines); without an anchor it streams from the beginning. A chunk is bounded by both maxLines and file_system.max_transfer_size bytes; paginate via nextAnchor. If the file shrank below the anchor (truncation/rotation) the stream resets to the beginning (fromLine=0).
| path required | string non-empty Workdir-relative path of the file to stream |
| anchor | string Anchor returned by a previous create_anchor/stream call. Omit (or pass the anchor for line 0) to stream from the beginning. |
| maxLines | integer <int32> Default: 1000 Maximum number of lines to return in this chunk. A chunk is additionally bounded by file_system.max_transfer_size bytes. |
{- "path": "logs/flashphoner_manager.log",
- "anchor": "NDI=",
- "maxLines": 100
}{- "path": "logs/flashphoner_manager.log",
- "fromLine": 42,
- "toLine": 52,
- "lines": [
- "string"
], - "nextAnchor": "NTI=",
- "eof": false
}/rest-api/v3/gpu
The GPU endpoint provides real-time information about hardware acceleration resources available on the server, including GPU utilization, memory usage, temperature, and current capacity for transcoding tasks.
Available methods:
/rest-api/v3/gpu/info
Returns current information about all GPUs available on the server, including utilization, memory usage, and temperature. Use this to monitor system load and evaluate available resources for media processing.
{- "cudaVersion": "12.4",
- "nvencVersion": "12.2",
- "driverVersion": "550.163.01",
- "nvmlVersion": "12.550.163.01",
- "numOfAvailableDevices": 1,
- "numOfDecodingSessions": 1,
- "numOfEncodingSessions": 5,
- "numOfHostEncodingSessions": 6,
- "deviceList": [
- {
- "name": "NVIDIA GeForce RTX 3090",
- "pciBusId": "0000:2D:00.0",
- "computeCapability": "8.6",
- "computeMode": 0,
- "computeModeDescription": "Default compute mode (Multiple contexts allowed per device)",
- "numOfDecodingSessions": 1,
- "numOfEncodingSessions": 5,
- "numOfHostEncodingSessions": 6,
- "fpsStats": {
- "decoderFps": 30,
- "encoderFps": 30
}, - "nativeEncoderStats": {
- "averageFps": 30,
- "averageLatency": 5033
}, - "utilizationInfo": {
- "computeUtilization": 8,
- "memUtilization": 2,
- "decoderUtilization": 4,
- "encoderUtilization": 23,
- "totalMem": "24 GB",
- "freeMem": "21.57 GB",
- "usedMem": "2.43 GB",
- "usedPciBandwidth": "1.34 MB"
}, - "encodeCodecs": {
- "H265": {
- "minWidth": 129,
- "minHeight": 33,
- "maxWidth": 8192,
- "maxHeight": 8192
}, - "H264": {
- "minWidth": 145,
- "minHeight": 49,
- "maxWidth": 4096,
- "maxHeight": 4096
}
}, - "decodeCodecs": {
- "H265": {
- "minWidth": 144,
- "minHeight": 144,
- "maxWidth": 8192,
- "maxHeight": 8192
}, - "H264": {
- "minWidth": 48,
- "minHeight": 16,
- "maxWidth": 4096,
- "maxHeight": 4096
}
}
}
]
}/rest-api/v3/hls
The HLS endpoint manages conversion of live streams into HLS format. A stream is first published to the server over WebRTC, RTMP, or RTSP, then converted to HLS for playback. Use this API to start and stop HLS conversion, monitor active streams and viewers, and manage recording of HLS segments.
Available methods:
/rest-api/v3/hls/connections
Returns information about active HLS network connections.
This endpoint provides low-level connection data related to HLS delivery.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "ip": "192.168.100.1",
- "port": 55000,
- "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
]/rest-api/v3/hls/find_all
Returns a list of active HLS streams. Returns an empty list if no streams are active.
| logCount | integer <int32> >= 0 Number of most recent log entries to return per stream. Omit the field or set it to 0 to return all collected entries (up to hls_metrics_log_size). A positive value returns the last N entries, capped at what is collected. |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "logCount": 50,
- "limit": 1000,
- "offset": 0
}[- {
- "id": "stream1",
- "streamName": "stream1",
- "status": "NEW",
- "waitingSize": 0,
- "profiles": [
- "a_stream",
- "v_stream"
], - "subscribers": 1,
- "playlist": "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-STREAM-INF:BANDWIDTH=0\nv_stream1/index.m3u8",
- "createdDate": "2026-04-12 10:30:15.123000+00:00",
- "logs": [
- "Video resolution changed from 1280x720 to 854x480, pts 1234"
]
}
]/rest-api/v3/hls/profile
Returns the technical specifications of an active HLS profile, including video/audio codecs, resolution, and GOP settings used for segment generation.
| hlsId required | string HLS segmenter identifier. Equals the stream name for regular streams, or a hex-encoded name for pulled streams (RTSP, RTMP, VOD) |
| profileName required | string HLS segmenter profile name (e.g. v_stream1 for video, a_stream1 for audio) |
{- "hlsId": "stream1",
- "profileName": "v_stream1"
}{- "stream": {
- "name": "s0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "published": true,
- "hasVideo": true,
- "hasAudio": true,
- "status": "NEW",
- "lastStatus": "NEW",
- "mediaProvider": "HLS",
- "mediaType": "play",
- "sdp": "v=0\r\no=- 82374628 2 IN IP4 192.168.100.20\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS\r\nm=audio 49170 RTP/AVP 0\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:0 PCMU/8000\r\na=sendrecv\r\nm=video 51372 RTP/AVP 96\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:96 VP8/90000\r\na=sendrecv\r\n",
- "audioCodec": "opus",
- "videoCodec": "H264",
- "gop": 60,
- "info": "Failed by HLS writer error",
- "record": true,
- "recordName": "s0.mp4",
- "width": 720,
- "height": 480,
- "bitrate": 1000,
- "quality": 23,
- "rtmpUrl": "rtmp://example.com:1935/live",
- "creationDate": "2026-04-12 10:30:15.123000+00:00",
- "shiftTime": 1000,
- "transport": "UDP",
- "profile": 66,
- "level": 52,
- "preset": "medium",
- "custom": {
- "example": 0
}, - "appKey": "defaultApp",
- "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
- "sessionId": "/192.168.1.102:13252/192.168.1.101:8443"
}, - "keyFrameReceived": true,
- "audioProfile": {
- "bitrate": 64000,
- "codec": "opus",
- "rate": 48000,
- "channels": 2,
- "groupId": "default"
}, - "videoProfile": {
- "width": 1280,
- "height": 720,
- "gop": 60,
- "fps": 30,
- "bitrate": 2500000,
- "codec": "H264",
- "codecImpl": "OPENH264",
- "quality": 23,
- "profile": 66,
- "level": 31,
- "preset": "veryfast",
- "audioGroupId": "audio0"
}, - "metrics": {
- "minFPS": 10.01,
- "avgFPS": 12.5,
- "maxFPS": 14.99,
- "countGaps": 1,
- "resolutionChanges": 2,
- "queueSize": 0,
- "startPts": 0,
- "currentPts": 60000
}, - "subscribers": 3
}/rest-api/v3/hls/start_recording
Starts recording HLS segments to storage.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| hlsIds required | Array of strings unique List of HLS segmenter identifiers to record |
{- "hlsIds": [
- "string"
]
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/hls/start_recording",
- "params": {
- "hlsIds": [
- "string"
]
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/hls/startup
Start a new HLS stream conversion from an existing live source.
Option 1. HLS on a single node
The stream is published and converted to HLS on the same WCS server.
Option 2. HLS with CDN
The stream is published to Origin, pulled by Edge, and converted to HLS on the Edge.
Option 3. HLS ABR on a single node
The stream is transcoded into multiple quality profiles and converted to HLS ABR on the same WCS server.
Option 4. HLS ABR with CDN, Edge transcoding
The stream is pulled from Origin and both transcoded and converted to HLS ABR on the Edge.
Option 5. HLS ABR with CDN, dedicated Transcoder
The stream is transcoded on a dedicated Transcoder node, then pulled by Edge and converted to HLS ABR.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse hls/find_all, stream/find, stream/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| streamName required | string Name of the published stream to start HLS segmenting for |
{- "streamName": "stream1"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/hls/startup",
- "params": {
- "streamName": "stream1"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/hls/stop_recording
Stops HLS recording and finalizes output files.
This operation is used to complete recording started via /start_recording.
| hlsIds required | Array of strings unique List of HLS segmenter identifiers to stop recording |
{- "hlsIds": [
- "string"
]
}/rest-api/v3/hls/subscribers
Returns a list of active viewers consuming HLS streams.
Use this endpoint to monitor audience size and identify which streams are being watched.
| hlsId required | string HLS segmenter identifier. Equals the stream name for regular streams, or a hex-encoded name for pulled streams (RTSP, RTMP, VOD) |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "hlsId": "stream1",
- "limit": 1000,
- "offset": 0
}[- {
- "id": "192.168.100.1-55000-Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
- "ip": "192.168.100.1",
- "port": 55000,
- "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
- "active": true,
- "metrics": {
- "profileTime": {
- "v_stream1": 30000
}, - "requestsCount": 100,
- "requestsStatuses": {
- "200 OK": 99
}, - "profileSwitches": 3,
- "maxResponseTime": 2,
- "minResponseTime": 0,
- "avgResponseTime": 0.142784237477583
}
}
]/rest-api/v3/hls/terminate
Stops an active HLS stream.
This operation immediately terminates HLS generation and releases associated resources.
| name required | string Name of the published stream to stop HLS segmenting for |
{- "name": "stream1"
}/rest-api/v3/inject2
The Inject2 endpoint allows insertion of external media (ads, secondary feeds) into a stream being published to the server. The original stream is replaced by injected content until the injection is stopped or ends naturally.
Available methods:
/rest-api/v3/inject2/find_all
Returns a list of all active media injections currently processed by the server.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "streamName": "stream1",
- "videoInjectorInfo": {
- "targetStreamName": "overlay",
- "rootStreamName": "camera1",
- "startTime": 1709214000000
}, - "audioInjectorInfo": {
- "targetStreamName": "overlay",
- "rootStreamName": "camera1",
- "startTime": 1709214000000
}
}
]/rest-api/v3/inject2/startup
Start injecting external media into a stream being published to the server. At least one media type (audio or video) must be enabled. The injection can be verified via find_all.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse inject2/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| localStreamName required | string Name of the stream into which the injection occurs |
| remoteStreamName required | string Name of the stream providing media for this injection |
| audio required | boolean Whether to inject audio from the source stream |
| video | boolean Whether to inject video from the source stream |
| muteIfAbsent | boolean If true and the source stream does not have the requested media track (audio or video), mute the corresponding track in the target stream |
{- "localStreamName": "stream1",
- "remoteStreamName": "overlay",
- "audio": true,
- "video": true,
- "muteIfAbsent": true
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/inject2/startup",
- "params": {
- "localStreamName": "stream1",
- "remoteStreamName": "overlay",
- "audio": true,
- "video": true,
- "muteIfAbsent": true
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/inject2/terminate
Stop the specified media injection and restore the original stream. All injected content is removed and resources are released.
| localStreamName required | string Name of the stream into which the injection occurs |
| remoteStreamName required | string Name of the stream providing media for this injection |
{- "localStreamName": "stream1",
- "remoteStreamName": "overlay"
}/rest-api/v3/inject3
The Inject3 endpoint enables dynamic injection of media files or images into a stream being published to the server.
Available methods:
/rest-api/v3/inject3/find_all
Returns a list of all active injections.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "streamName": "string",
- "loop": true,
- "timerInfo": {
- "duration": 0,
- "left": 0
}, - "videoProcessInfo": {
- "resource": [
- {
- "uri": "file:///opt/media/video.mp4",
- "media": "video"
}
], - "startTime": 0,
- "speed": 0.1,
- "fps": 0,
- "gop": 0
}, - "audioProcessInfo": {
- "resource": [
- {
- "uri": "file:///opt/media/video.mp4",
- "media": "video"
}
], - "startTime": 0,
- "speed": 0.1
}
}
]/rest-api/v3/inject3/startup
Start injection from a file into a stream being published to the server.
Option 1. Injection from a local file
The file is read from the server's local filesystem.
Option 2. Injection from a remote file
The file is fetched from a remote URL before injection.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse /inject3/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| localStreamName required | string Stream name to inject to |
required | Array of objects (Inject3ResourceUnit) Ordered list of media resources to inject. The target stream has two slots: audio and video. Each resource claims one or both slots based on its media type. Resources are processed in order — once a slot is taken, subsequent resources cannot override it |
object (mediaPolicy) Default: {"required":true,"wait":false,"stub":true} Video source configuration | |
object (mediaPolicy) Default: {"required":true,"wait":false,"stub":true} Video source configuration | |
| speed | number <float> [ 0.1 .. 4 ] Default: 1 Playback speed multiplier (1.0 = normal, 2.0 = double speed) |
| loop | boolean Whether to restart injection from the beginning after it finishes |
| duration | integer <int32> Injection duration in seconds |
| fps | integer <int32> Frames per second (Applies only to image injection) |
| gop | integer <int32> Number of frames in a group (Applies only to image injection) |
{- "localStreamName": "test",
- "resources": [
- {
- "uri": "file:///opt/media/video.mp4",
- "media": "video"
}
], - "audio": {
- "required": true,
- "wait": false,
- "stub": true
}, - "video": {
- "required": true,
- "wait": false,
- "stub": true
}, - "speed": 1,
- "loop": true,
- "duration": 0,
- "fps": 0,
- "gop": 0
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/inject3/startup",
- "params": {
- "localStreamName": "test",
- "resources": [
- {
- "uri": "file:///opt/media/video.mp4",
- "media": "video"
}
], - "audio": {
- "required": true,
- "wait": false,
- "stub": true
}, - "video": {
- "required": true,
- "wait": false,
- "stub": true
}, - "speed": 1,
- "loop": true,
- "duration": 0,
- "fps": 0,
- "gop": 0
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/inject3/terminate
Stop the specified injection and restore the original stream.
| localStreamName required | string Name of the stream into which the injection occurs |
{- "localStreamName": "stream1"
}/rest-api/v3/inject3/update
Update injection parameters for an active stream without restarting it. You can adjust playback speed, looping, duration, and other parameters. The injected content itself is not replaced.
| localStreamName required | string Name of the stream into which the injection occurs |
| speed | number <float> Playback speed multiplier (1.0 = normal, 2.0 = double speed). Range: 0.1 to 4.0 |
| loop | boolean Whether to restart injection from the beginning after it finishes |
| duration | integer <int32> Injection duration in seconds |
| fps | integer <int32> Video frames per second. Applies only to image injection |
| gop | integer <int32> Group of Pictures — number of frames between keyframes. For example, with fps=30 and gop=60, a keyframe is produced every 2 seconds. Applies only to image injection |
{- "localStreamName": "stream1",
- "speed": 1.5,
- "loop": false,
- "duration": 96,
- "fps": 30,
- "gop": 10
}/rest-api/v3/jobs
Some REST API methods run as asynchronous Jobs. These methods are marked with a JOB badge.
When a Job endpoint is called:
1. If the job completes within the wait time, it returns 200 OK with the result in the response body.
2. If the job continues in the background, it returns 202 Accepted with a jobId. Use find to retrieve the result from the result field of the Job object.
Job statuses:
PENDING — queued, not yet startedRUNNING — currently executingDONE — completed successfullyFAILED — completed with errorCANCELED — canceled by the userTIMED_OUT — automatically canceled because the timeout was exceededPrefer HTTP header — controls synchronous wait time and execution timeout. Example: Prefer: wait=5, timeout=60
wait=5 — Sync wait time in seconds. Returns 200 OK if the job finishes within the specified time, otherwise 202 Accepted. Default: 5.
timeout=60 — Max execution time in seconds. Applies only to cancellable jobs. If the job does not complete within this time, it is automatically canceled. Default: 60.
Server-side settings (WCS_HOME/conf/flashphoner.properties):
jobs_max_prefer_wait_time — Default and upper limit for wait (default: 5 seconds).
jobs_max_prefer_timeout — Default and upper limit for timeout (default: 60 seconds).
If the Prefer header value is omitted or exceeds these limits, the server setting value is used.
Endpoints running as Jobs:
Available methods:
{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/v3/stream/snapshot",
- "params": {
- "streamName": "s0"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/jobs/cancel
Terminate a pending or running job. Only jobs marked as cancellable can be stopped.
| id required | string Job identifier (UUID), returned in the 202 Accepted response of an asynchronous operation |
{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/jobs/find
Retrieve detailed information about a single job by its ID.
| id required | string Job identifier (UUID), returned in the 202 Accepted response of an asynchronous operation |
{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/v3/stream/snapshot",
- "params": {
- "streamName": "s0"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/jobs/find_all
Returns a list of all currently registered jobs.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/v3/stream/snapshot",
- "params": {
- "streamName": "s0"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}
]/rest-api/v3/logger
The Logger API allows you to dynamically control logging levels for a specific client session without restarting the server. Use this for debugging and troubleshooting live sessions by enabling detailed logs only when needed.
Available methods:
/rest-api/v3/logger/disable_client_log
Disable logging for a specific client session and return it to the default logging behavior.
| sessionId required | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types |
{- "sessionId": "/127.0.0.1:57539/192.168.1.101:8443"
}/rest-api/v3/logger/enable_client_log
Enable logging for a specific client session. Once enabled, the server starts collecting detailed logs for the specified session without affecting other users.
| sessionId required | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types | ||||||||||||||||||
| logLevel required | string
Per-connection logging level to set. Controls the log verbosity for this specific client without affecting other connections or global server logs |
{- "sessionId": "/127.0.0.1:57539/192.168.1.101:8443",
- "logLevel": "DEBUG"
}/rest-api/v3/mixer
The Mixer API allows you to combine multiple streams into a single output stream. You can dynamically add or remove participants, control audio/video behavior, and apply visual elements such as watermarks, labels, and avatars.
Available methods:
/rest-api/v3/mixer/add
Adds a stream to an existing mixer. The stream is immediately included in the mixed output and becomes visible to all subscribers of the mixer stream. If the stream is already part of the mixer, a conflict response is returned.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the published stream to add to the mixer |
| streamLabel | string Text label displayed on the mixer canvas for this stream (e.g. participant name) |
| hasVideo | boolean Whether to include video from this stream in the mixer |
| hasAudio | boolean Whether to include audio from this stream in the mixer |
| videoPositionId | string Assigns this stream to a fixed position in the custom XML layout. Only one stream can occupy a position at a time |
| avatar | string Stream avatar |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "streamLabel": "Label",
- "hasVideo": true,
- "hasAudio": true,
- "videoPositionId": "desktop",
- "avatar": "/opt/avatar.png"
}/rest-api/v3/mixer/find_all
Returns a list of all active mixers. Each entry contains the current state, configuration, and associated streams.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "mixer://m1",
- "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "localStreamName": "local_stream",
- "status": "NEW",
- "mediaSessions": [
- {
- "localMediaSessionId": "string",
- "streamLabel": "string",
- "audioLevel": 0,
- "videoMutedInStream": true,
- "videoMutedInMixer": true,
- "localStreamName": "string",
- "boundStream": true,
- "avatar": "string"
}
], - "hasVideo": true,
- "hasAudio": true,
- "background": "path/to/background.png",
- "mixerVideoWidth": 640,
- "mixerVideoHeight": 480,
- "mixerVideoFps": 24,
- "watermark": "path/to/watermark.png",
- "videoPositionId": "desktop",
- "mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
- "mixerMinimalFontSize": 17,
- "mixerFontSize": 18,
- "mixerFontSizeAudioOnly": 18,
- "mixerTextFont": "Roboto",
- "mixerShowSeparateAudioFrame": true,
- "mixerAudioSilenceThreshold": -50,
- "mixerVoiceActivitySwitchDelay": 1500,
- "mixerAutoScaleDesktop": true,
- "mixerDesktopAlign": "TOP",
- "mixerTextColour": "#AABBCC",
- "mixerTextBulkWriteWithBuffer": true,
- "mixerTextBulkWrite": true,
- "textBackgroundOpacity": 30,
- "mixerTextBackgroundColour": "#DDCCBB",
- "mixerFrameBackgroundColour": "#443322",
- "mixerTextPaddingLeft": 20,
- "mixerTextPaddingRight": 20,
- "mixerTextPaddingTop": 20,
- "mixerTextPaddingBottom": 20,
- "mixerVoiceActivityFrameThickness": 3,
- "mixerVoiceActivityColour": "#998877",
- "mixerVoiceActivity": true,
- "mixerVideoLayoutDesktopKeyWord": "desktop_stream",
- "mixerVideoGridLayoutPadding": 0,
- "mixerVideoGridLayoutMiddlePadding": 0,
- "mixerVideoDesktopLayoutPadding": 0,
- "mixerVideoDesktopLayoutInlinePadding": 0,
- "mixerTextDisplayRoom": true,
- "mixerTextCutTop": 3,
- "mixerDisplayStreamName": true,
- "labelReplaceRegex": "^stream_\\d+",
- "labelReplaceWith": "s_",
- "mixerTextAutoscale": true,
- "mixerVoiceActivityFramePositionInner": true,
- "mixerTextOutsideFramePadding": 30,
- "mixerTextAlign": "TOP_LEFT",
- "mixerVideoDesktopFullscreen": true,
- "mixerLayoutDir": "path/to/layouts/",
- "mixerLinearSmoothingAudio": true,
- "mixerSeparateBufferingAudioVideo": true,
- "mixerMaintainStreamsDelayWhileBuffered": true
}
]/rest-api/v3/mixer/remove
Removes a stream from the mixer. The stream is instantly excluded from the mixed output and no longer appears in playback.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the published stream to remove from the mixer |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream"
}/rest-api/v3/mixer/remove_stream_avatar
Removes the avatar assigned to a stream in the mixer. After removal, the stream will no longer display the avatar in the mixed output.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the target stream in the mixer |
| remoteMediaSessionId | string Media session ID of the target stream in the mixer |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/mixer/setAudioVideo
Updates audio and video behavior for a stream inside the mixer. Allows enabling or disabling video and adjusting audio parameters for a specific stream. Changes are applied immediately without restarting the mixer.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
required | streamsQuery (object) or pattern (object) (query) Filter to select one or more streams in the mixer to apply the settings to. Streams can be selected by name list or regex pattern |
required | videoMuted (object) or audioLevel (object) (settings) Audio and video settings to apply to the matched streams |
{- "uri": "mixer://m1",
- "query": {
- "streamsQuery": [
- "stream1",
- "stream2"
], - "pattern": "^stream_\\d+"
}, - "settings": {
- "videoMuted": true,
- "audioLevel": 30
}
}/rest-api/v3/mixer/set_body_watermark
Overlays a watermark image on the mixer output stream canvas. The watermark is rendered on top of all participant video frames and becomes part of the encoded output stream visible to all viewers.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| watermark required | string PNG watermark image file path (relative to {WCS_HOME}/conf) or http/https URL |
| x | integer <int32> X coordinate of the watermark top-left corner on the canvas in pixels. If a margin value is larger, the margin takes precedence |
| y | integer <int32> Y coordinate of the watermark top-left corner on the canvas in pixels. If a margin value is larger, the margin takes precedence |
| marginRight | integer <int32> Minimum right margin from the canvas edge in pixels. The watermark is shifted inward if it would exceed this boundary |
| marginBottom | integer <int32> Minimum bottom margin from the canvas edge in pixels. The watermark is shifted inward if it would exceed this boundary |
| marginLeft | integer <int32> Minimum left margin from the canvas edge in pixels. Overrides x if the margin is larger |
| marginTop | integer <int32> Minimum top margin from the canvas edge in pixels. Overrides y if the margin is larger |
| text | string Text string to overlay on the canvas as a watermark. Used as an alternative to an image watermark |
| textFont | string Font family for the text watermark |
| textColour | string Color of the text watermark in hex format |
| textAlign | string Enum: "TOP_LEFT" "TOP_CENTER" "TOP_RIGHT" "CENTER" "BOTTOM_LEFT" "BOTTOM_CENTER" "BOTTOM_RIGHT" "EXTERNAL_TOP_CENTER" "EXTERNAL_BOTTOM_CENTER" Position of the text watermark on the canvas: TOP_LEFT, TOP_CENTER, TOP_RIGHT, CENTER, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT, EXTERNAL_TOP_CENTER, EXTERNAL_BOTTOM_CENTER |
| textBackgroundOpacity | integer <int32> Opacity of the text watermark background in percentage (0 = transparent, 100 = opaque) |
| fontSize | integer <int32> Font size in pixels for the text watermark |
| textBackgroundColour | string Background color of the text watermark in hex format |
object (dimension) Watermark image dimensions in pixels | |
object (size) Reference frame dimensions in pixels. Watermark position, margins, and size are specified relative to this frame size and proportionally scaled when the actual frame size differs. If not set, the actual frame size is used |
{- "uri": "mixer://m1",
- "watermark": "path/to/watermark.png",
- "x": 30,
- "y": 10,
- "marginRight": 20,
- "marginBottom": 50,
- "marginLeft": 150,
- "marginTop": 15,
- "text": "Watermark text",
- "textFont": "Arial",
- "textColour": "#ABCDEF",
- "textAlign": "TOP_LEFT",
- "textBackgroundOpacity": 30,
- "fontSize": 17,
- "textBackgroundColour": "#AABBCC",
- "watermarkSize": {
- "width": 30,
- "height": 50
}, - "frameSize": {
- "width": 640,
- "height": 480
}
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/mixer/set_body_watermark",
- "params": {
- "uri": "mixer://m1",
- "watermark": "path/to/watermark.png",
- "x": 30,
- "y": 10,
- "marginRight": 20,
- "marginBottom": 50,
- "marginLeft": 150,
- "marginTop": 15,
- "text": "Watermark text",
- "textFont": "Arial",
- "textColour": "#ABCDEF",
- "textAlign": "TOP_LEFT",
- "textBackgroundOpacity": 30,
- "fontSize": 17,
- "textBackgroundColour": "#AABBCC",
- "watermarkSize": {
- "width": 30,
- "height": 50
}, - "frameSize": {
- "width": 640,
- "height": 480
}
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/mixer/set_parameter
Updates mixer-level configuration parameters, including layout behavior, rendering options, and other global mixer settings. Changes are applied to the running mixer without restarting it.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| hasVideo | boolean Whether the mixer output stream includes video |
| hasAudio | boolean Whether the mixer output stream includes audio |
| mixerVideoWidth | integer <int32> Canvas width in pixels |
| mixerVideoHeight | integer <int32> Canvas height in pixels |
| mixerVideoFps | integer <int32> Frames per second of the mixer output stream |
| videoPositionId | string Assigns this stream to a fixed position in the custom XML layout. Only one stream can occupy a position at a time |
| mixerLayoutClass | string Java class name defining the video layout strategy for arranging participant frames on the canvas (e.g. GridLayout, ScreenSharingLayout) |
| mixerMinimalFontSize | integer <int32> Minimum font size in pixels when text autoscaling is enabled. Text will not be scaled below this value |
| mixerFontSize | integer <int32> Base font size in pixels for text labels on the mixer canvas (e.g. participant name) |
| mixerFontSizeAudioOnly | integer <int32> Font size in pixels for text labels when the stream has audio only (no video) |
| mixerTextFont | string Font family for text labels on the mixer canvas |
| mixerShowSeparateAudioFrame | boolean Whether to show a placeholder frame on the canvas for streams added with hasVideo: false |
| mixerAudioSilenceThreshold | number <double> Audio silence threshold in dB for voice activity indicator. When a participant's audio level is below this value, the colored frame around their video is not shown. Default: -50.0 |
| mixerVoiceActivitySwitchDelay | integer <int32> Delay in milliseconds before the voice activity frame disappears after the participant stops speaking. Prevents flickering during short pauses |
| mixerAutoScaleDesktop | boolean Whether to scale font size for screen sharing frames independently from regular participant frames |
| mixerDesktopAlign | string Enum: "TOP" "BOTTOM" "LEFT" "RIGHT" "CENTER" Position of the screen sharing stream on the canvas: TOP (participants below) or BOTTOM (participants above) |
| mixerTextColour | string Color of text labels on the mixer canvas in hex format |
| mixerTextBulkWriteWithBuffer | boolean Whether to cache rendered text as a single frame for better performance. Only works when textBackgroundOpacity is 100% |
| mixerTextBulkWrite | boolean Whether to use optimized bulk text rendering. Required for textBulkWriteWithBuffer. Only works when textBackgroundOpacity is 100% |
| textBackgroundOpacity | integer <int32> Opacity of the text label background in percentage (0 = transparent, 100 = opaque) |
| mixerTextBackgroundColour | string Background color of text labels on the mixer canvas in hex format |
| mixerFrameBackgroundColour | string Background color of each participant frame on the canvas in hex format. Visible when no video is displayed |
| mixerTextPaddingLeft | integer <int32> Inner left padding of the text label block in pixels |
| mixerTextPaddingRight | integer <int32> Inner right padding of the text label block in pixels |
| mixerTextPaddingTop | integer <int32> Inner top padding of the text label block in pixels |
| mixerTextPaddingBottom | integer <int32> Inner bottom padding of the text label block in pixels |
| mixerVoiceActivityFrameThickness | integer <int32> Thickness of the voice activity frame around the participant video in pixels |
| mixerVoiceActivityColour | string Color of the voice activity frame around the participant video in hex format |
| mixerVoiceActivity | boolean Whether to display the voice activity frame around the participant video when speaking |
| mixerVideoLayoutDesktopKeyWord | string Keyword in the stream name used to identify screen sharing streams on the canvas. For example, if the keyword is "desktop", a stream named "user1-desktop" will be treated as screen sharing |
| mixerVideoGridLayoutPadding | integer <int32> Padding around and between rows of participant video frames on the canvas in pixels |
| mixerVideoGridLayoutMiddlePadding | integer <int32> Padding between participant video frames within a row on the canvas in pixels |
| mixerVideoDesktopLayoutPadding | integer <int32> Padding between the screen sharing area and the participant video area on the canvas in pixels |
| mixerVideoDesktopLayoutInlinePadding | integer <int32> Padding between participant video frames in the row adjacent to the screen sharing area in pixels |
| mixerTextDisplayRoom | boolean Whether to keep the mixer name suffix in the text label on the participant video frame. Only applies when the mixer is auto-created by publishing a stream with the format stream1#mixer1. When false, the #mixer1 suffix is removed from the displayed label |
| mixerTextCutTop | integer <int32> Number of pixels to reduce from the top of the text label area. Used to adjust font metrics so that the lower parts of characters (descenders) fit within the label. Default: 3 |
| mixerDisplayStreamName | boolean Whether to display text on the participant video frame. The displayed text is either the stream label (if set) or the stream name |
| labelReplaceRegex | string Regex applied to the stream name to transform the displayed text on the participant video frame. Matched groups are concatenated as the result. Used together with labelReplaceWith |
| labelReplaceWith | string Replacement string used with labelReplaceRegex to transform the displayed text on the participant video frame. For example, with labelReplaceRegex "^stream_\d+" and labelReplaceWith "s_", the stream name "stream_123_user" becomes "s__user" |
| mixerTextAutoscale | boolean Whether to automatically scale the font size of text labels based on the participant video frame size. The font will not be scaled below mixerMinimalFontSize |
| mixerVoiceActivityFramePositionInner | boolean Whether to draw the voice activity frame inside the participant video frame. If false, the frame is drawn around the outside |
| mixerTextOutsideFramePadding | integer <int32> Padding in pixels for the text label placed outside the participant video frame |
| mixerTextAlign | string Enum: "TOP_LEFT" "TOP_CENTER" "TOP_RIGHT" "CENTER" "BOTTOM_LEFT" "BOTTOM_CENTER" "BOTTOM_RIGHT" "EXTERNAL_TOP_CENTER" "EXTERNAL_BOTTOM_CENTER" Position of the text label on the participant video frame: TOP_LEFT, TOP_CENTER, TOP_RIGHT, CENTER, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT, EXTERNAL_TOP_CENTER, EXTERNAL_BOTTOM_CENTER |
| mixerVideoDesktopFullscreen | boolean Whether to display the screen sharing stream in fullscreen mode on the canvas |
| mixerLayoutDir | string Directory containing custom XML layout files for arranging participant video frames on the canvas. Files must have .mix extension (or .desktopmix for screen sharing layouts) and be named as {number_of_participants}_{description}.mix (e.g. 2_side_by_side.mix). Path is relative to {WCS_HOME}/conf |
| mixerLinearSmoothingAudio | boolean Whether to smoothly fade-in and fade-out audio when participants start or stop speaking in the mixer. Eliminates audio clicks at transitions. 20ms of audio is lost during fade-in |
| mixerSeparateBufferingAudioVideo | boolean Whether to buffer audio and video independently for each input stream in the mixer. When enabled, audio and video can start playing as soon as their own buffer is full, without waiting for the other. When disabled, both must be buffered before playback starts |
| mixerMaintainStreamsDelayWhileBuffered | boolean Whether to drop audio and video frames to maintain the target buffer delay. When enabled, frames are dropped on buffer overflow to keep the delay close to the configured buffering time. When disabled, the buffer may grow beyond the target delay |
{- "uri": "mixer://m1",
- "hasVideo": true,
- "hasAudio": true,
- "mixerVideoWidth": 640,
- "mixerVideoHeight": 480,
- "mixerVideoFps": 24,
- "videoPositionId": "desktop",
- "mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
- "mixerMinimalFontSize": 17,
- "mixerFontSize": 18,
- "mixerFontSizeAudioOnly": 18,
- "mixerTextFont": "Roboto",
- "mixerShowSeparateAudioFrame": true,
- "mixerAudioSilenceThreshold": -50,
- "mixerVoiceActivitySwitchDelay": 1500,
- "mixerAutoScaleDesktop": true,
- "mixerDesktopAlign": "TOP",
- "mixerTextColour": "#AABBCC",
- "mixerTextBulkWriteWithBuffer": true,
- "mixerTextBulkWrite": true,
- "textBackgroundOpacity": 30,
- "mixerTextBackgroundColour": "#DDCCBB",
- "mixerFrameBackgroundColour": "#443322",
- "mixerTextPaddingLeft": 20,
- "mixerTextPaddingRight": 20,
- "mixerTextPaddingTop": 20,
- "mixerTextPaddingBottom": 20,
- "mixerVoiceActivityFrameThickness": 3,
- "mixerVoiceActivityColour": "#998877",
- "mixerVoiceActivity": true,
- "mixerVideoLayoutDesktopKeyWord": "desktop_stream",
- "mixerVideoGridLayoutPadding": 0,
- "mixerVideoGridLayoutMiddlePadding": 0,
- "mixerVideoDesktopLayoutPadding": 0,
- "mixerVideoDesktopLayoutInlinePadding": 0,
- "mixerTextDisplayRoom": true,
- "mixerTextCutTop": 3,
- "mixerDisplayStreamName": true,
- "labelReplaceRegex": "^stream_\\d+",
- "labelReplaceWith": "s_",
- "mixerTextAutoscale": true,
- "mixerVoiceActivityFramePositionInner": true,
- "mixerTextOutsideFramePadding": 30,
- "mixerTextAlign": "TOP_LEFT",
- "mixerVideoDesktopFullscreen": true,
- "mixerLayoutDir": "path/to/layouts/",
- "mixerLinearSmoothingAudio": true,
- "mixerSeparateBufferingAudioVideo": true,
- "mixerMaintainStreamsDelayWhileBuffered": true
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/mixer/set_parameter",
- "params": {
- "uri": "mixer://m1",
- "hasVideo": true,
- "hasAudio": true,
- "mixerVideoWidth": 640,
- "mixerVideoHeight": 480,
- "mixerVideoFps": 24,
- "videoPositionId": "desktop",
- "mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
- "mixerMinimalFontSize": 17,
- "mixerFontSize": 18,
- "mixerFontSizeAudioOnly": 18,
- "mixerTextFont": "Roboto",
- "mixerShowSeparateAudioFrame": true,
- "mixerAudioSilenceThreshold": -50,
- "mixerVoiceActivitySwitchDelay": 1500,
- "mixerAutoScaleDesktop": true,
- "mixerDesktopAlign": "TOP",
- "mixerTextColour": "#AABBCC",
- "mixerTextBulkWriteWithBuffer": true,
- "mixerTextBulkWrite": true,
- "textBackgroundOpacity": 30,
- "mixerTextBackgroundColour": "#DDCCBB",
- "mixerFrameBackgroundColour": "#443322",
- "mixerTextPaddingLeft": 20,
- "mixerTextPaddingRight": 20,
- "mixerTextPaddingTop": 20,
- "mixerTextPaddingBottom": 20,
- "mixerVoiceActivityFrameThickness": 3,
- "mixerVoiceActivityColour": "#998877",
- "mixerVoiceActivity": true,
- "mixerVideoLayoutDesktopKeyWord": "desktop_stream",
- "mixerVideoGridLayoutPadding": 0,
- "mixerVideoGridLayoutMiddlePadding": 0,
- "mixerVideoDesktopLayoutPadding": 0,
- "mixerVideoDesktopLayoutInlinePadding": 0,
- "mixerTextDisplayRoom": true,
- "mixerTextCutTop": 3,
- "mixerDisplayStreamName": true,
- "labelReplaceRegex": "^stream_\\d+",
- "labelReplaceWith": "s_",
- "mixerTextAutoscale": true,
- "mixerVoiceActivityFramePositionInner": true,
- "mixerTextOutsideFramePadding": 30,
- "mixerTextAlign": "TOP_LEFT",
- "mixerVideoDesktopFullscreen": true,
- "mixerLayoutDir": "path/to/layouts/",
- "mixerLinearSmoothingAudio": true,
- "mixerSeparateBufferingAudioVideo": true,
- "mixerMaintainStreamsDelayWhileBuffered": true
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/mixer/set_position
Assigns a layout position to a stream in the mixer. This defines where the stream is rendered in the final mixed video layout.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the target stream in the mixer |
| remoteMediaSessionId | string Media session ID of the target stream in the mixer |
| videoPositionId required | string Assigns this stream to a fixed position in the custom XML layout. Only one stream can occupy a position at a time |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "videoPositionId": "desktop"
}/rest-api/v3/mixer/set_stream_avatar
Assigns an avatar to a stream in the mixer. The avatar is displayed ensuring visual representation of the participant.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the target stream in the mixer |
| remoteMediaSessionId | string Media session ID of the target stream in the mixer |
| avatar required | string Avatar image displayed when the participant has no video. Supports local path (relative to {WCS_HOME}), file:// URI, or http/https URL |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "avatar": "path/to/avatar.png"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/mixer/set_stream_avatar",
- "params": {
- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "avatar": "path/to/avatar.png"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/mixer/set_stream_label
Sets a label for a specific stream in the mixer. The label is displayed in the final mixed output, typically as an overlay near the stream, and can be used to identify participants or provide additional context.
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| remoteStreamName required | string Name of the target stream in the mixer |
| remoteMediaSessionId | string Media session ID of the target stream in the mixer |
| streamLabel | string Text label displayed on the mixer canvas for this stream (e.g. participant name) |
{- "uri": "mixer://m1",
- "remoteStreamName": "remote_stream",
- "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "streamLabel": "Label"
}/rest-api/v3/mixer/set_stream_watermark
Applies a watermark to a specific stream within the mixer. The watermark is rendered on top of the selected stream in the mixed output.
Only the first mixer matching the request criteria is affected.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| mediaSessionId required | string Media session ID of the target stream in the mixer |
| text required | string Text string to overlay on the participant video frame as a watermark. Used as an alternative to an image watermark |
| textFont | string Font family for the text watermark |
| textColour | string Color of the text watermark in hex format |
| textAlign | string Enum: "TOP_LEFT" "TOP_CENTER" "TOP_RIGHT" "CENTER" "BOTTOM_LEFT" "BOTTOM_CENTER" "BOTTOM_RIGHT" "EXTERNAL_TOP_CENTER" "EXTERNAL_BOTTOM_CENTER" Position of the text watermark on the participant video frame: TOP_LEFT, TOP_CENTER, TOP_RIGHT, CENTER, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT, EXTERNAL_TOP_CENTER, EXTERNAL_BOTTOM_CENTER |
| textBackgroundOpacity | integer <int32> Opacity of the text watermark background in percentage (0 = transparent, 100 = opaque) |
| fontSize | integer <int32> Font size in pixels for the text watermark |
| textBackgroundColour | string Background color of the text watermark in hex format |
{- "uri": "mixer://m1",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "text": "Watermark text",
- "textFont": "Arial",
- "textColour": "#ABCDEF",
- "textAlign": "TOP_LEFT",
- "textBackgroundOpacity": 30,
- "fontSize": 17,
- "textBackgroundColour": "#AABBCC"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/mixer/set_stream_watermark",
- "params": {
- "uri": "mixer://m1",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "text": "Watermark text",
- "textFont": "Arial",
- "textColour": "#ABCDEF",
- "textAlign": "TOP_LEFT",
- "textBackgroundOpacity": 30,
- "fontSize": 17,
- "textBackgroundColour": "#AABBCC"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/mixer/startup
Creates a new mixer and starts producing a combined output stream. The mixer aggregates multiple input streams into a single resulting stream that can be consumed by clients. The resulting stream becomes available after the mixer is initialized and at least one input stream is added.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse mixer/find_all, stream/find, stream/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier. Format: mixer://{name} |
| localStreamName required | string Name of the mixer output stream |
| hasVideo | boolean Whether the mixer output stream includes video |
| hasAudio | boolean Whether the mixer output stream includes audio |
| background | string Background image rendered behind all participant video frames on the mixer canvas. Local file path: absolute or relative to {WCS_HOME}/conf |
| mixerVideoWidth | integer <int32> Canvas width in pixels |
| mixerVideoHeight | integer <int32> Canvas height in pixels |
| mixerVideoFps | integer <int32> Frames per second of the mixer output stream |
| watermark | string PNG watermark image overlaid on top of the mixer canvas. Local file path (relative to {WCS_HOME}/conf) or http/https URL |
| videoPositionId | string Assigns this stream to a fixed position in the custom XML layout. Only one stream can occupy a position at a time |
| mixerLayoutClass | string Java class name defining the video layout strategy for arranging participant frames on the canvas (e.g. GridLayout, ScreenSharingLayout) |
| mixerMinimalFontSize | integer <int32> Minimum font size in pixels when text autoscaling is enabled. Text will not be scaled below this value |
| mixerFontSize | integer <int32> Base font size in pixels for text labels on the mixer canvas (e.g. participant name) |
| mixerFontSizeAudioOnly | integer <int32> Font size in pixels for text labels when the stream has audio only (no video) |
| mixerTextFont | string Font family for text labels on the mixer canvas |
| mixerShowSeparateAudioFrame | boolean Whether to show a placeholder frame on the canvas for streams added with hasVideo: false |
| mixerAudioSilenceThreshold | number <double> Audio silence threshold in dB for voice activity indicator. When a participant's audio level is below this value, the colored frame around their video is not shown. Default: -50.0 |
| mixerVoiceActivitySwitchDelay | integer <int32> Delay in milliseconds before the voice activity frame disappears after the participant stops speaking. Prevents flickering during short pauses |
| mixerAutoScaleDesktop | boolean Whether to scale font size for screen sharing frames independently from regular participant frames |
| mixerDesktopAlign | string Enum: "TOP" "BOTTOM" "LEFT" "RIGHT" "CENTER" Position of the screen sharing stream on the canvas: TOP (participants below) or BOTTOM (participants above) |
| mixerTextColour | string Color of text labels on the mixer canvas in hex format |
| mixerTextBulkWriteWithBuffer | boolean Whether to cache rendered text as a single frame for better performance. Only works when textBackgroundOpacity is 100% |
| mixerTextBulkWrite | boolean Whether to use optimized bulk text rendering. Required for textBulkWriteWithBuffer. Only works when textBackgroundOpacity is 100% |
| textBackgroundOpacity | integer <int32> Opacity of the text label background in percentage (0 = transparent, 100 = opaque) |
| mixerTextBackgroundColour | string Background color of text labels on the mixer canvas in hex format |
| mixerFrameBackgroundColour | string Background color of each participant frame on the canvas in hex format. Visible when no video is displayed |
| mixerTextPaddingLeft | integer <int32> Inner left padding of the text label block in pixels |
| mixerTextPaddingRight | integer <int32> Inner right padding of the text label block in pixels |
| mixerTextPaddingTop | integer <int32> Inner top padding of the text label block in pixels |
| mixerTextPaddingBottom | integer <int32> Inner bottom padding of the text label block in pixels |
| mixerVoiceActivityFrameThickness | integer <int32> Thickness of the voice activity frame around the participant video in pixels |
| mixerVoiceActivityColour | string Color of the voice activity frame around the participant video in hex format |
| mixerVoiceActivity | boolean Whether to display the voice activity frame around the participant video when speaking |
| mixerVideoLayoutDesktopKeyWord | string Keyword in the stream name used to identify screen sharing streams on the canvas. For example, if the keyword is "desktop", a stream named "user1-desktop" will be treated as screen sharing |
| mixerVideoGridLayoutPadding | integer <int32> Padding around and between rows of participant video frames on the canvas in pixels |
| mixerVideoGridLayoutMiddlePadding | integer <int32> Padding between participant video frames within a row on the canvas in pixels |
| mixerVideoDesktopLayoutPadding | integer <int32> Padding between the screen sharing area and the participant video area on the canvas in pixels |
| mixerVideoDesktopLayoutInlinePadding | integer <int32> Padding between participant video frames in the row adjacent to the screen sharing area in pixels |
| mixerTextDisplayRoom | boolean Whether to keep the mixer name suffix in the text label on the participant video frame. Only applies when the mixer is auto-created by publishing a stream with the format stream1#mixer1. When false, the #mixer1 suffix is removed from the displayed label |
| mixerTextCutTop | integer <int32> Number of pixels to reduce from the top of the text label area. Used to adjust font metrics so that the lower parts of characters (descenders) fit within the label. Default: 3 |
| mixerDisplayStreamName | boolean Whether to display text on the participant video frame. The displayed text is either the stream label (if set) or the stream name |
| labelReplaceRegex | string Regex applied to the stream name to transform the displayed text on the participant video frame. Matched groups are concatenated as the result. Used together with labelReplaceWith |
| labelReplaceWith | string Replacement string used with labelReplaceRegex to transform the displayed text on the participant video frame. For example, with labelReplaceRegex "^stream_\d+" and labelReplaceWith "s_", the stream name "stream_123_user" becomes "s__user" |
| mixerTextAutoscale | boolean Whether to automatically scale the font size of text labels based on the participant video frame size. The font will not be scaled below mixerMinimalFontSize |
| mixerVoiceActivityFramePositionInner | boolean Whether to draw the voice activity frame inside the participant video frame. If false, the frame is drawn around the outside |
| mixerTextOutsideFramePadding | integer <int32> Padding in pixels for the text label placed outside the participant video frame |
| mixerTextAlign | string Enum: "TOP_LEFT" "TOP_CENTER" "TOP_RIGHT" "CENTER" "BOTTOM_LEFT" "BOTTOM_CENTER" "BOTTOM_RIGHT" "EXTERNAL_TOP_CENTER" "EXTERNAL_BOTTOM_CENTER" Position of the text label on the participant video frame: TOP_LEFT, TOP_CENTER, TOP_RIGHT, CENTER, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT, EXTERNAL_TOP_CENTER, EXTERNAL_BOTTOM_CENTER |
| mixerVideoDesktopFullscreen | boolean Whether to display the screen sharing stream in fullscreen mode on the canvas |
| mixerLayoutDir | string Directory containing custom XML layout files for arranging participant video frames on the canvas. Files must have .mix extension (or .desktopmix for screen sharing layouts) and be named as {number_of_participants}_{description}.mix (e.g. 2_side_by_side.mix). Path is relative to {WCS_HOME}/conf |
| mixerLinearSmoothingAudio | boolean Whether to smoothly fade-in and fade-out audio when participants start or stop speaking in the mixer. Eliminates audio clicks at transitions. 20ms of audio is lost during fade-in |
| mixerSeparateBufferingAudioVideo | boolean Whether to buffer audio and video independently for each input stream in the mixer. When enabled, audio and video can start playing as soon as their own buffer is full, without waiting for the other. When disabled, both must be buffered before playback starts |
| mixerMaintainStreamsDelayWhileBuffered | boolean Whether to drop audio and video frames to maintain the target buffer delay. When enabled, frames are dropped on buffer overflow to keep the delay close to the configured buffering time. When disabled, the buffer may grow beyond the target delay |
{- "uri": "mixer://m1",
- "localStreamName": "local_stream",
- "hasVideo": true,
- "hasAudio": true,
- "background": "path/to/background.png",
- "mixerVideoWidth": 640,
- "mixerVideoHeight": 480,
- "mixerVideoFps": 24,
- "watermark": "path/to/watermark.png",
- "videoPositionId": "desktop",
- "mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
- "mixerMinimalFontSize": 17,
- "mixerFontSize": 18,
- "mixerFontSizeAudioOnly": 18,
- "mixerTextFont": "Roboto",
- "mixerShowSeparateAudioFrame": true,
- "mixerAudioSilenceThreshold": -50,
- "mixerVoiceActivitySwitchDelay": 1500,
- "mixerAutoScaleDesktop": true,
- "mixerDesktopAlign": "TOP",
- "mixerTextColour": "#AABBCC",
- "mixerTextBulkWriteWithBuffer": true,
- "mixerTextBulkWrite": true,
- "textBackgroundOpacity": 30,
- "mixerTextBackgroundColour": "#DDCCBB",
- "mixerFrameBackgroundColour": "#443322",
- "mixerTextPaddingLeft": 20,
- "mixerTextPaddingRight": 20,
- "mixerTextPaddingTop": 20,
- "mixerTextPaddingBottom": 20,
- "mixerVoiceActivityFrameThickness": 3,
- "mixerVoiceActivityColour": "#998877",
- "mixerVoiceActivity": true,
- "mixerVideoLayoutDesktopKeyWord": "desktop_stream",
- "mixerVideoGridLayoutPadding": 0,
- "mixerVideoGridLayoutMiddlePadding": 0,
- "mixerVideoDesktopLayoutPadding": 0,
- "mixerVideoDesktopLayoutInlinePadding": 0,
- "mixerTextDisplayRoom": true,
- "mixerTextCutTop": 3,
- "mixerDisplayStreamName": true,
- "labelReplaceRegex": "^stream_\\d+",
- "labelReplaceWith": "s_",
- "mixerTextAutoscale": true,
- "mixerVoiceActivityFramePositionInner": true,
- "mixerTextOutsideFramePadding": 30,
- "mixerTextAlign": "TOP_LEFT",
- "mixerVideoDesktopFullscreen": true,
- "mixerLayoutDir": "path/to/layouts/",
- "mixerLinearSmoothingAudio": true,
- "mixerSeparateBufferingAudioVideo": true,
- "mixerMaintainStreamsDelayWhileBuffered": true
}{- "uri": "mixer://m1",
- "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "localStreamName": "local_stream",
- "status": "NEW",
- "mediaSessions": [
- {
- "localMediaSessionId": "string",
- "streamLabel": "string",
- "audioLevel": 0,
- "videoMutedInStream": true,
- "videoMutedInMixer": true,
- "localStreamName": "string",
- "boundStream": true,
- "avatar": "string"
}
], - "hasVideo": true,
- "hasAudio": true,
- "background": "path/to/background.png",
- "mixerVideoWidth": 640,
- "mixerVideoHeight": 480,
- "mixerVideoFps": 24,
- "watermark": "path/to/watermark.png",
- "videoPositionId": "desktop",
- "mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
- "mixerMinimalFontSize": 17,
- "mixerFontSize": 18,
- "mixerFontSizeAudioOnly": 18,
- "mixerTextFont": "Roboto",
- "mixerShowSeparateAudioFrame": true,
- "mixerAudioSilenceThreshold": -50,
- "mixerVoiceActivitySwitchDelay": 1500,
- "mixerAutoScaleDesktop": true,
- "mixerDesktopAlign": "TOP",
- "mixerTextColour": "#AABBCC",
- "mixerTextBulkWriteWithBuffer": true,
- "mixerTextBulkWrite": true,
- "textBackgroundOpacity": 30,
- "mixerTextBackgroundColour": "#DDCCBB",
- "mixerFrameBackgroundColour": "#443322",
- "mixerTextPaddingLeft": 20,
- "mixerTextPaddingRight": 20,
- "mixerTextPaddingTop": 20,
- "mixerTextPaddingBottom": 20,
- "mixerVoiceActivityFrameThickness": 3,
- "mixerVoiceActivityColour": "#998877",
- "mixerVoiceActivity": true,
- "mixerVideoLayoutDesktopKeyWord": "desktop_stream",
- "mixerVideoGridLayoutPadding": 0,
- "mixerVideoGridLayoutMiddlePadding": 0,
- "mixerVideoDesktopLayoutPadding": 0,
- "mixerVideoDesktopLayoutInlinePadding": 0,
- "mixerTextDisplayRoom": true,
- "mixerTextCutTop": 3,
- "mixerDisplayStreamName": true,
- "labelReplaceRegex": "^stream_\\d+",
- "labelReplaceWith": "s_",
- "mixerTextAutoscale": true,
- "mixerVoiceActivityFramePositionInner": true,
- "mixerTextOutsideFramePadding": 30,
- "mixerTextAlign": "TOP_LEFT",
- "mixerVideoDesktopFullscreen": true,
- "mixerLayoutDir": "path/to/layouts/",
- "mixerLinearSmoothingAudio": true,
- "mixerSeparateBufferingAudioVideo": true,
- "mixerMaintainStreamsDelayWhileBuffered": true
}/rest-api/v3/mixer/terminate
Stops the mixer and terminates the resulting mixed stream. All input streams are detached from the mixer and the output stream becomes unavailable for playback. This operation fully releases mixer resources.
| uri required | string^mixer://.*$ Unique mixer identifier. Format: mixer://{name} |
{- "uri": "mixer://m1"
}/rest-api/v3/mixer/set_background
Set a background for the mixer. Apply the background only to the first mixer that matches the query. If the mixer is not found, returns an error.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceeded
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^mixer://.+$ Unique mixer identifier |
| background required | string Background file URI |
{- "uri": "mixer://m1",
- "background": "path/to/background.png"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/mixer/set_background",
- "params": {
- "uri": "mixer://m1",
- "background": "path/to/background.png"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/mpegts
The MPEGTS endpoint manages ingestion of MPEG-TS streams. A startup request opens a port on the server for receiving MPEG-TS traffic over UDP or SRT. The server returns the port number, and an external encoder (e.g. ffmpeg) sends the stream to that port. The received stream is converted into an internal stream available for playback and processing.
Available methods:
/rest-api/v3/mpegts/find
Search for active MPEG-TS sessions by filter criteria. Returns an empty list if no sessions match.
| uri required | string^(srt|udp)://.+$ MPEG-TS session URI (e.g. udp://127.0.0.1:31006 or srt://127.0.0.1:31004) |
| localStreamName | string Name of the stream published on the server from the received MPEG-TS data |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "uri": "srt://127.0.0.1:31004",
- "localStreamName": "s0",
- "limit": 1000,
- "offset": 0
}[- {
- "uri": "udp://127.0.0.1:31006",
- "localStreamName": "s0",
- "localMediaSessionId": "c1549269-8070-4e8d-9528-2e4a70afeac1",
- "hasVideo": true,
- "hasAudio": true,
- "timeout": 1000,
- "maxTimestampDiff": 1,
- "allowedList": [
- "192.168.100.0/24"
], - "transport": "UDP",
- "port": 31006
}
]/rest-api/v3/mpegts/find_all
Returns a list of all active MPEG-TS sessions. Returns an empty list if none are active.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "udp://127.0.0.1:31006",
- "localStreamName": "s0",
- "localMediaSessionId": "c1549269-8070-4e8d-9528-2e4a70afeac1",
- "hasVideo": true,
- "hasAudio": true,
- "timeout": 1000,
- "maxTimestampDiff": 1,
- "allowedList": [
- "192.168.100.0/24"
], - "transport": "UDP",
- "port": 31006
}
]/rest-api/v3/mpegts/startup
Open a port on the server for receiving an MPEG-TS stream. The response contains the URI to send the stream to. Supported codecs: H264, H265, AAC. Supported transport protocols: UDP, SRT.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse mpegts/find, mpegts/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| localStreamName required | string Name of the stream to be published on the server from the received MPEG-TS data | ||||||
| transport required | string (transport) Default: "UDP"
Transport protocol used for receiving MPEG-TS data: UDP or SRT | ||||||
| streams required | Array of strings (stream) non-empty unique
| ||||||
| allowedSubnets | Array of strings List of subnets in CIDR notation allowed to send MPEG-TS data to this port | ||||||
| timeout | integer <int64> Inactivity timeout in milliseconds. The stream is terminated if no data is received within this period | ||||||
| maxTimestampDiff | integer <int64> Maximum allowed PTS difference in seconds between consecutive packets. If exceeded, the MPEG-TS session is terminated |
{- "localStreamName": "s0",
- "transport": "UDP",
- "streams": [
- "AUDIO"
], - "allowedSubnets": [
- "192.168.100.0/24"
], - "timeout": 1000,
- "maxTimestampDiff": 1
}{- "uri": "udp://127.0.0.1:31006",
- "localStreamName": "s0",
- "localMediaSessionId": "c1549269-8070-4e8d-9528-2e4a70afeac1",
- "hasVideo": true,
- "hasAudio": true,
- "timeout": 1000,
- "maxTimestampDiff": 1,
- "allowedList": [
- "192.168.100.0/24"
], - "transport": "UDP",
- "port": 31006
}/rest-api/v3/mpegts/terminate
Stop receiving the MPEG-TS stream and close the port.
| uri required | string^(srt|udp)://.+$ MPEG-TS session URI (e.g. udp://127.0.0.1:31006 or srt://127.0.0.1:31004) |
{- "uri": "srt://127.0.0.1:31004"
}/rest-api/v3/multi_recorder
The Multi Recorder endpoint manages recording of multiple streams into a single file with multiple tracks.
Available methods:
/rest-api/v3/multi_recorder/add
Add a stream to the multi-recorder. The stream is written as two tracks (audio and video) into the output file. Multiple streams can be added to the same multi-recorder, each producing its own pair of tracks.
| uri required | string^multi-recorder://.+$ Multi-recorder identifier (e.g. multi-recorder://mr0) |
| mediaSessionId required | string Media session ID of the stream to add to the recording |
{- "uri": "multi-recorder://mr0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/multi_recorder/find_all
Returns a list of all active multi-recorders.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "multi-recorder://mr0",
- "mediaSessions": [
- "string"
], - "fileName": "s0.mp4"
}
]/rest-api/v3/multi_recorder/remove
Remove a stream from the multi-recorder.
| uri required | string^multi-recorder://.+$ Multi-recorder identifier (e.g. multi-recorder://mr0) |
| mediaSessionId required | string Media session ID of the stream to remove from the recording |
{- "uri": "multi-recorder://mr0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/multi_recorder/startup
Starts a new multi-recorder with the provided parameters
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse multi_recorder/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^multi-recorder://.+$ Multi-recorder identifier (e.g. multi-recorder://mr0) |
{- "uri": "multi-recorder://mr0"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/multi_recorder/startup",
- "params": {
- "uri": "multi-recorder://mr0"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/multi_recorder/terminate
Stop the multi-recorder and finalize the output file.
| uri required | string^multi-recorder://.+$ Multi-recorder identifier (e.g. multi-recorder://mr0) |
{- "uri": "multi-recorder://mr0"
}/rest-api/v3/pcap
The PCAP endpoint replays recorded network traffic from PCAP files as internal streams, simulating real-time packet flow.
Available methods:
/rest-api/v3/pcap/find
Search for active PCAP sessions by filter criteria. Returns an empty list if no sessions match.
| uri | string^pcap://.+$ PCAP session URI (e.g. pcap://config.yaml). The path specifies the PCAP configuration file | ||||||||||||||
| localStreamName | string Name of the stream published on the server from the PCAP data | ||||||||||||||
| state | string
Status | ||||||||||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||||||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "uri": "pcap://config.yaml",
- "localStreamName": "s0",
- "state": "NEW",
- "limit": 1000,
- "offset": 0
}[- {
- "uri": "pcap://config.yaml",
- "localStreamName": "s0",
- "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "state": "NEW"
}
]/rest-api/v3/pcap/find_all
Returns a list of all active PCAP sessions. Returns an empty list if none are active.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "pcap://config.yaml",
- "localStreamName": "s0",
- "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "state": "NEW"
}
]/rest-api/v3/pcap/startup
Start replaying a PCAP file as a published stream. The stream becomes available for playback and processing as if it were published to the server.
WCS reads the PCAP file, converts the recorded network traffic into a stream, and makes it available for playback by a Client.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse pcap/find, pcap/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^pcap://.+$ PCAP session URI (e.g. pcap://config.yaml). The path specifies the PCAP configuration file |
| localStreamName required | string Name of the stream to be published on the server from the PCAP data |
{- "uri": "pcap://config.yaml",
- "localStreamName": "s0"
}{- "uri": "pcap://config.yaml",
- "localStreamName": "s0",
- "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "state": "NEW"
}/rest-api/v3/pcap/terminate
Stop replaying a PCAP file.
| uri required | string^pcap://.+$ PCAP session URI (e.g. pcap://config.yaml). The path specifies the PCAP configuration file |
{- "uri": "pcap://config.yaml"
}/rest-api/v3/process
The Process API controls the lifecycle of the WCS server process itself. Use it to stop or restart the server, for example from automation or orchestration tooling.
The response is always sent to the client before the process terminates: the exit is deferred until the HTTP response has been written to the connection.
SECURITY: these endpoints are disabled by default. Set process_control_enabled=true to enable them. While disabled they return 403.
Available methods:
Exit code 54 is reserved as the restart request: when the server is launched by the blocking startup script (systemctl start webcallserver or webcallserver start standalone), the script relaunches the server on this code instead of exiting.
/rest-api/v3/process/restart
Restart the server process. The JVM exits with the reserved code 54 once the response has been sent; the blocking startup script detects this code and launches a new server process. Under systemd the unit stays active the whole time: the main PID (the startup script) keeps running, so systemd restart limits are not consumed.
Requires the server to be launched by the blocking startup script (systemctl start webcallserver or webcallserver start standalone); otherwise there is no supervisor to relaunch the process and the method returns 501.
/rest-api/v3/publisher
The Publisher endpoint generates (renders) a stream on the server with the specified audio/video codecs and canvas drawing. The resulting stream becomes available as if it were published to the server.
Available methods:
/rest-api/v3/publisher/change_painter_strategy
Change the drawing strategy on the canvas of an active publisher. The change is applied immediately.
The Client continues receiving the stream with the updated painter strategy without reconnecting.
| uri required | string^publisher://.+$ Publisher identifier (e.g. publisher://p0) |
required | object (PublisherPainterStrategyFactory) Video rendering strategy for the generated stream |
{- "uri": "publisher://p0",
- "painterStrategyFactory": {
- "type": "RECTANGLE",
- "x": 10,
- "y": 20,
- "width": 200,
- "height": 150,
- "color": {
- "y": 76,
- "u": 84,
- "v": 255
}
}
}/rest-api/v3/publisher/find_all
Returns a list of all active publishers.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "publisher://p0",
- "localStreamName": "s0"
}
]/rest-api/v3/publisher/startup
Start generating a new stream on the server with the provided configuration. If a publisher for the given URI already exists, returns 409 Conflict.
WCS starts rendering the stream. A Client can then request playback and receive the generated stream.
| uri required | string^publisher://.+$ Publisher identifier (e.g. publisher://p0) |
| localStreamName required | string Name of the stream to be generated and published on the server |
object (PublisherVideo) Video track configuration | |
object (PublisherAudio) Audio track configuration |
{- "uri": "publisher://p0",
- "localStreamName": "s0",
- "video": {
- "width": 400,
- "height": 300,
- "codec": "H264",
- "painterStrategyFactory": {
- "type": "RECTANGLE",
- "x": 10,
- "y": 20,
- "width": 200,
- "height": 150,
- "color": {
- "y": 76,
- "u": 84,
- "v": 255
}
}, - "canvasColor": {
- "red": 255,
- "green": 255,
- "blue": 255
}
}, - "audio": {
- "codec": "Alaw",
- "soundType": "SILENCE",
- "advertiseRedInSdp": true
}
}/rest-api/v3/publisher/terminate
Stop generating the stream and remove the publisher associated with the specified URI.
| uri required | string^publisher://.+$ Publisher identifier (e.g. publisher://p0) |
{- "uri": "publisher://p0"
}/rest-api/v3/pull/rtmp
WCS can capture on demand an RTMP stream published on another server. The captured stream becomes available for playback over all supported protocols.
Available methods:
/rest-api/v3/pull/rtmp/find_all
Returns a list of all active RTMP pull sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "rtmp://myserver.com/live/myStream",
- "localStreamName": "string",
- "localMediaSessionId": "string",
- "status": "NEW",
- "record": true,
- "hasAudio": true,
- "hasVideo": true
}
]/rest-api/v3/pull/rtmp/startup
Start pulling an RTMP stream from the specified URL. WCS 1 requests the stream from WCS 2 (or another RTMP server), and the captured stream becomes available for playback by a Client.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse stream/find, stream/find_all, rtmp/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^rtmp:\/\/.*$ RTMP URL of the source stream to pull (e.g. rtmp://server/live/stream) |
| localStreamName | string Name of the stream to be published on the server from the pulled RTMP source. If not set, derived from the URI |
| record | boolean Whether to record the pulled stream |
| hasAudio | boolean Whether to include audio from the pulled stream |
| hasVideo | boolean Whether to include video from the pulled stream |
{- "uri": "rtmp://p19.flashphoner.com:1935/live/myStream",
- "localStreamName": "string",
- "record": true,
- "hasAudio": true,
- "hasVideo": true
}{- "uri": "rtmp://myserver.com/live/myStream",
- "localStreamName": "string",
- "localMediaSessionId": "string",
- "status": "NEW",
- "record": true,
- "hasAudio": true,
- "hasVideo": true
}/rest-api/v3/pull/rtmp/terminate
Stop pulling the RTMP stream.
| uri required | string^rtmp:\/\/.*$ RTMP URL of the stream to terminate (e.g. rtmp://server/live/stream) |
{- "uri": "rtmp://p19.flashphoner.com:1935/live/myStream"
}/rest-api/v3/pull/webrtc
WCS can capture on demand a WebRTC stream published on another WCS server. The captured stream becomes available for playback over all supported protocols.
Available methods:
/rest-api/v3/pull/webrtc/find_all
Returns a list of all active WebRTC pull sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "localStreamName": "string",
- "remoteStreamName": "string",
- "localMediaSessionId": "string",
- "remoteMediaSessionId": "string",
- "status": "NEW"
}
]/rest-api/v3/pull/webrtc/startup
Start pulling a WebRTC stream from another WCS server. WCS 1 requests the stream from WCS 2, and the captured stream becomes available for playback by a Client.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse stream/find, stream/find_all, pull/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string WebSocket URL of the remote WCS server to pull the stream from (e.g. wss://server:8443/websocket) |
| remoteStreamName required | string Name of the stream on the remote WCS server |
| localStreamName | string Default: "Same as remoteStreamName field" Name of the stream to be published locally from the pulled WebRTC source. If not set, the remoteStreamName is used |
object (turnConfig) TURN server configuration for relaying media traffic between the two WCS servers |
{- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "remoteStreamName": "string",
- "localStreamName": "Same as remoteStreamName field",
- "turnConfig": {
- "uri": "turn:turn.example.com:3478?transport=tcp",
- "username": "turnUser",
- "password": "securePassword123"
}
}{- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "localStreamName": "string",
- "remoteStreamName": "string",
- "localMediaSessionId": "string",
- "remoteMediaSessionId": "string",
- "status": "NEW"
}/rest-api/v3/pull/webrtc/terminate
Stop pulling the WebRTC stream.
| uri required | string WebSocket URL of the remote WCS server (e.g. wss://server:8443/websocket) |
| remoteStreamName | string Name of the stream on the remote WCS server |
| localStreamName | string Name of the locally published stream |
{- "uri": "wss://demo.flashphoner.com:8443",
- "remoteStreamName": "string",
- "localStreamName": "string"
}/rest-api/v3/push/rtmp
The Push RTMP endpoint converts a stream published on WCS into RTMP and forwards it to a specified RTMP server (YouTube, Twitch, another WCS, etc.). Audio can be muted or replaced with a WAV file during the push.
Available methods:
/rest-api/v3/push/rtmp/find
Search for active push sessions by filter.
| streamName | string Name of the source stream being pushed to the RTMP server |
| rtmpUrl | string^rtmp://.+$ RTMP URL of the target server (e.g. rtmp://server:1935/live/stream) |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "streamName": "stream_01",
- "rtmpUrl": "rtmp://wcs.com:1935/live/test",
- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "streamName": "stream_01",
- "rtmpUrl": "rtmp://wcs.com:1935/live/test",
- "width": 640,
- "height": 480,
- "fps": 30,
- "bitrate": 1200000,
- "keyFrameInterval": 60,
- "muted": false,
- "soundEnabled": true,
- "options": {
- "property1": { },
- "property2": { }
}
}
]/rest-api/v3/push/rtmp/find_all
Returns a list of all active RTMP push sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "streamName": "stream_01",
- "rtmpUrl": "rtmp://wcs.com:1935/live/test",
- "width": 640,
- "height": 480,
- "fps": 30,
- "bitrate": 1200000,
- "keyFrameInterval": 60,
- "muted": false,
- "soundEnabled": true,
- "options": {
- "property1": { },
- "property2": { }
}
}
]/rest-api/v3/push/rtmp/sound_off
Stop the audio injection previously started via sound_on.
| mediaSessionId required | string Media session ID of the RTMP push session |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/push/rtmp/sound_on
Inject audio from a WAV file on the WCS server into the pushed RTMP stream. The RTMP server and its Player (viewer) receive the stream with injected sound.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| mediaSessionId required | string Media session ID of the RTMP push session |
| soundFile required | string Path to the WAV sound file relative to {WCS_HOME}/media |
| loop | boolean Whether to loop the sound file continuously |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "soundFile": "sound.wav",
- "loop": false
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/push/rtmp/sound_on",
- "params": {
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "soundFile": "sound.wav",
- "loop": false
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/push/rtmp/startup
Start pushing a published stream as RTMP to a remote server.
Option 1. Push to a remote RTMP server
A Client publishes a stream on WCS, which converts it to RTMP and sends to an RTMP server (YouTube, Twitch, Telegram, etc.). A Player (viewer on the external service) plays the stream from that server.
Option 2. Push to another WCS
The RTMP stream is directed to another WCS instance, where it becomes available for playback.
Option 3. Push with transcoding
The source stream is transcoded to the desired parameters (resolution, GOP, etc.) before being pushed as RTMP.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse push/find, push/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| streamName required | string Name of the source stream to push to the RTMP server |
| rtmpUrl required | string^rtmp://.+$ RTMP URL of the target server (e.g. rtmp://server:1935/live/stream) |
| rtmpTransponderFullUrl | boolean Whether to use the full rtmpUrl as the RTMP stream path. When true, streamName is ignored and the path from rtmpUrl is used as-is. When false, the stream name is derived from streamName with the optional prefix |
| rtmpFlashVersion | string Flash version string sent in the RTMP handshake to the target server |
| rtmpTransponderStreamNamePrefix | string Prefix added to the stream name on the RTMP server. For example, with prefix "rtmp_" a stream named "stream1" becomes "rtmp_stream1" |
| width | integer <int32> Target video width in pixels for transcoding the outgoing stream |
| height | integer <int32> Target video height in pixels for transcoding the outgoing stream |
| fps | integer <int32> Target video frames per second for transcoding the outgoing stream |
| bitrate | integer <int64> Target outgoing video bitrate in bits per second |
| keyFrameInterval | integer <int32> Target keyframe interval (GOP size) in frames |
| rtmpTransponderForceKframeInterval | boolean Whether to enforce the keyframe interval by sending RTCP PLI requests to the source stream publisher |
object (optionsRecord) Audio settings to apply at startup: mute audio or inject sound from a WAV file |
{- "streamName": "stream_01",
- "rtmpUrl": "rtmp://wcs.com:1935/live/test",
- "rtmpTransponderFullUrl": true,
- "rtmpFlashVersion": "LNX 76.219.189.0",
- "rtmpTransponderStreamNamePrefix": "rtmp_",
- "width": 640,
- "height": 480,
- "fps": 30,
- "bitrate": 1200000,
- "keyFrameInterval": 60,
- "rtmpTransponderForceKframeInterval": true,
- "options": {
- "action": "sound_on",
- "soundFile": "sound.wav",
- "loop": false
}
}{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "streamName": "stream_01",
- "rtmpUrl": "rtmp://wcs.com:1935/live/test",
- "rtmpFlashVersion": "LNX 76.219.189.0",
- "rtmpTransponderStreamNamePrefix": "rtmp_",
- "width": 640,
- "height": 480,
- "fps": 30,
- "bitrate": 1200000,
- "keyFrameInterval": 60,
- "muted": false,
- "soundEnabled": true,
- "rtmpTransponderForceKframeInterval": true,
- "rtmpTransponderFullUrl": true,
- "options": {
- "property1": { },
- "property2": { }
}
}/rest-api/v3/push/rtmp/unmute
Unmute audio in the pushed RTMP stream.
| mediaSessionId required | string Media session ID of the RTMP push session |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/push/webrtc
WCS can push a published stream via WebRTC to another WCS server on demand. The pushed stream becomes available for playback on the remote server.
Available methods:
/rest-api/v3/push/webrtc/find_all
Returns a list of all active WebRTC push sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "localStreamName": "string",
- "remoteStreamName": "string",
- "localMediaSessionId": "string",
- "remoteMediaSessionId": "string",
- "status": "NEW"
}
]/rest-api/v3/push/webrtc/startup
Start pushing a published stream via WebRTC to another WCS server. A Client publishes a stream on WCS 1, which pushes it to WCS 2 where it becomes available for playback.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse stream/find, stream/find_all, webrtc/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string WebSocket URL of the remote WCS server to push the stream to (e.g. wss://server:8443/websocket) |
| localStreamName required | string Name of the local source stream to push to the remote WCS server |
| remoteStreamName | string Name to assign to the stream on the remote WCS server. If not set, the localStreamName is used |
{- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "localStreamName": "string",
- "remoteStreamName": "string"
}{- "uri": "wss://demo.flashphoner.com:8443/websocket",
- "localStreamName": "string",
- "remoteStreamName": "string",
- "localMediaSessionId": "string",
- "remoteMediaSessionId": "string",
- "status": "NEW"
}/rest-api/v3/push/webrtc/terminate
Stop pushing the WebRTC stream.
| uri required | string WebSocket URL of the remote WCS server the stream is pushed to (e.g. wss://server:8443/websocket) |
| remoteStreamName | string Name assigned to the stream on the remote WCS server |
| localStreamName | string Name of the local source stream being pushed |
{- "uri": "wss://demo.flashphoner.com:8443",
- "remoteStreamName": "string",
- "localStreamName": "string"
}/rest-api/v3/recorder
The Recorder endpoint records a published stream to a file. Supported source protocols: WebRTC, RTMP, RTSP, MPEG-TS. Supported output formats: MP4 (H.264 + AAC), WebM (VP8 + Opus, H264 + Opus), TS (H.264 + ADTS), MKV.
Available methods:
/rest-api/v3/recorder/find_all
Returns a list of all active recording sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}/rest-api/v3/recorder/startup
Start recording a published stream to the file system. A Client publishes a stream on WCS, and the server writes the media data to a file.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse recorder/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| mediaSessionId required | string Media session ID of the stream to record |
object (Config) Recording configuration: file name template and rotation settings |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "config": {
- "fileTemplate": "{streamName}-{startTime}-{endTime}",
- "rotation": "20M"
}
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/recorder/startup",
- "params": {
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "config": {
- "fileTemplate": "{streamName}-{startTime}-{endTime}",
- "rotation": "20M"
}
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/recorder/terminate
Stop recording and finalize the output file.
| mediaSessionId required | string Media session ID of the stream to stop recording |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/rels
The Remote Event Logging System (RELS) tracks events within a WCS instance. Tracking is configured per event type (e.g. MIXER, PACKET_EVENT) and can be enabled for one or more session IDs at once. Use terminate_all to disable all sessions of a given event type.
Available methods:
/rest-api/v3/rels/find_all
Returns all tracked RELS entities and database IO statistics.
{- "MEDIA_SESSION": {
- "ids": [
- {
- "id": "83591975-96c6-4c6b-9b7f-bbc5b72560f0",
- "frequency": "1000ms"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "HLS_SEGMENTER": {
- "ids": [
- {
- "id": "72cb3d3d-2483-4149-8c4c-c4f96291a590"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "HLS_CLIENT": {
- "ids": [
- {
- "id": "3b75eda2-3f96-45c9-98e9-ba1d2960cf57"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "MIXER_STREAMS": {
- "ids": [
- {
- "id": "0a339c3c-5753-4637-a6ac-724f6e18356f",
- "frequency": "1000ms"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "MIXER": {
- "ids": [
- {
- "id": "41a15dcb-a40d-4c38-9909-0d01307588a8"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "PACKET_EVENT": {
- "ids": [
- {
- "id": "3a940564-d05e-486f-80e3-c4a441401dba"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "PLAYER_PACKET_EVENT": {
- "ids": [
- {
- "id": "a1cccb0e-3d86-417a-b933-e36f686d8f98"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTMP_IN_BUFFER": {
- "ids": [
- {
- "id": "a592ace6-db89-4f6b-b58a-a72d83417643",
- "frequency": "1000ms"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTMP_OUT_BUFFER": {
- "ids": [
- {
- "id": "e1f26b24-dc84-4be3-9a4a-fd6cd6b17655",
- "frequency": "1000ms"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTP_SYNCHRONIZATION": {
- "ids": [
- {
- "id": "bd7479ee-5ef6-4313-ab8d-b3462811f510"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "STUN": {
- "ids": [
- {
- "id": "52c46eee-6a1e-4db1-9ff8-b9b66ffebb76"
}
], - "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "CONNECTION": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "STREAM": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "CDN": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "HLS_STREAM": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "AUDIO_RECOVERY": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "REST_HOOKS": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_CODEC_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_INBOUND_RTP_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_OUTBOUND_RTP_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_REMOTE_INBOUND_RTP_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_REMOTE_OUTBOUND_RTP_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_MEDIA_SOURCE_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_MEDIA_PLAYOUT_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_PEER_CONNECTION_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_DATA_CHANNEL_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_TRANSPORT_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_CANDIDATE_PAIR_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_LOCAL_CANDIDATE_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_REMOTE_CANDIDATE_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "RTC_CERTIFICATE_EVENT": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "REST_HOOKS_BODY": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "SESSION_METADATA": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "sfuSessionsMetadata": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "CDN_MESSAGE": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "CDN_PING": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}, - "CDN_ROUTE_MONITOR": {
- "sentBytes": 4800,
- "bitrate": 10,
- "sentEvents": 30,
- "queuedEvents": 3
}
}/rest-api/v3/rels/startup
Enable RELS tracking for specified sessions. Depending on the rels_client_type setting in flashphoner.properties, metrics are either written to the file system or sent to ClickHouse.
Option 1. Writing metrics to the file system
WCS writes tracked event data to local files.
Option 2. Sending metrics to ClickHouse
WCS sends tracked event data to a ClickHouse database.
object (MediaSessions) If the field "MEDIA_SESSION" exists, it will be created. Otherwise, the field "mediaSessions" will be ignored. | |
object (HlsSegmenters) If the field "HLS_SEGMENTER" exists, it will be created. Otherwise, the field "hlsSegmenters" will be ignored. | |
object (HlsClients) If the field "HLS_CLIENT" exists, it will be created. Otherwise, the field "hlsClients" will be ignored. | |
object (MixerStreams) If the field "MIXER_STREAMS" exists, it will be created. Otherwise, the field "mixerStreams" will be ignored. | |
object (Mixers) If the field "MIXER" exists, it will be created. Otherwise, the field "mixers" will be ignored. | |
object (PacketEvents) If the field "PACKET_EVENT" exists, it will be created. Otherwise, the field "packetEvents" will be ignored. | |
object (PlayerPacketEvents) If the field "PLAYER_PACKET_EVENT" exists, it will be created. Otherwise, the field "playerPacketEvents" will be ignored. | |
object (RtmpInBuffers) If the field "RTMP_IN_BUFFER" exists, it will be created. Otherwise, the field "rtmpInBuffers" will be ignored. | |
object (RtmpOutBuffers) If the field "RTMP_OUT_BUFFER" exists, it will be created. Otherwise, the field "rtmpOutBuffers" will be ignored. | |
object (RtpSynchronizations) If the field "RTP_SYNCHRONIZATION" exists, it will be created. Otherwise, the field "rtpSynchronizations" will be ignored. | |
object (Stuns) If the field "STUN" exists, it will be created. Otherwise, the field "stuns" will be ignored. |
{- "MEDIA_SESSION": {
- "ids": [
- "fb336a94-4ff5-4f58-bc74-7bf204f2a778"
], - "frequency": "1000ms"
}, - "HLS_SEGMENTER": {
- "ids": [
- "79d69ccc-9c5a-4b00-93dc-6e9dcbf355de"
]
}, - "HLS_CLIENT": {
- "ids": [
- "2e73c604-b5e0-4e5d-b052-b03f7d5deb93"
], - "allowedIpSubnets": [
- "127.0.0.0/24"
]
}, - "MIXER_STREAMS": {
- "ids": [
- "1a7c3bcf-d17e-41ee-a20a-924682a8d5d9"
], - "frequency": "1000ms"
}, - "MIXER": {
- "ids": [
- "552f2087-9b7d-4fa2-b7c3-54881efce535"
]
}, - "PACKET_EVENT": {
- "ids": [
- "6cce246b-ed79-4541-b14c-38bbea69ef3d"
]
}, - "PLAYER_PACKET_EVENT": {
- "ids": [
- "4338d18f-af0d-4a38-8038-457de5f1f2bf"
]
}, - "RTMP_IN_BUFFER": {
- "ids": [
- "3dac01ae-2a3e-45f1-b7d0-63d9adf81215"
], - "frequency": "1000ms"
}, - "RTMP_OUT_BUFFER": {
- "ids": [
- "2d4de564-d98c-40b3-b12a-aca68e4f09aa"
], - "frequency": "1000ms"
}, - "RTP_SYNCHRONIZATION": {
- "ids": [
- "19255102-7abe-459a-a6a1-1601cdcff7ae"
]
}, - "STUN": {
- "ids": [
- "42ecd3ed-d71f-4e64-9442-34ce7551900f"
]
}
}{- "succeedOperationIds": {
- "MEDIA_SESSION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_SEGMENTER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_CLIENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER_STREAMS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PLAYER_PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_IN_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_OUT_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTP_SYNCHRONIZATION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STUN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CONNECTION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN_MESSAGE": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "REST_HOOKS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}
}
}/rest-api/v3/rels/terminate
Disable RELS tracking for specified sessions.
| MEDIA_SESSION | Array of strings unique List of tracked media session IDs with event logging enabled |
| HLS_SEGMENTER | Array of strings unique List of tracked HLS segmenter IDs with event logging enabled |
| HLS_CLIENT | Array of strings unique List of tracked HLS client IDs with event logging enabled |
| MIXER_STREAMS | Array of strings unique List of tracked mixer input stream media session IDs with event logging enabled |
| MIXER | Array of strings unique List of tracked mixer output stream media session IDs with event logging enabled |
| PACKET_EVENT | Array of strings unique List of tracked SFU stream media session IDs with event logging enabled |
| PLAYER_PACKET_EVENT | Array of strings unique List of tracked player media session IDs with event logging enabled |
| RTMP_IN_BUFFER | Array of strings unique List of tracked RTMP inbound stream media session IDs with event logging enabled |
| RTMP_OUT_BUFFER | Array of strings unique List of tracked RTMP outbound stream media session IDs with event logging enabled |
| RTP_SYNCHRONIZATION | Array of strings unique List of media session IDs with tracked RTP synchronization events |
| STUN | Array of strings unique List of media session IDs with tracked STUN events |
{- "MEDIA_SESSION": [
- "3854bfcd-a198-48d2-9412-1b20a66a5595"
], - "HLS_SEGMENTER": [
- "abd9e247-4247-4b0d-826f-867791c36580"
], - "HLS_CLIENT": [
- "1fdf7df0-817a-4844-a84f-3010a93002eb"
], - "MIXER_STREAMS": [
- "ebaa8fc4-2522-4131-8690-1b327ddb2fe9"
], - "MIXER": [
- "12df4aec-5cd4-46ca-8181-cb66fd478a46"
], - "PACKET_EVENT": [
- "c0462b7c-cf11-4e79-af78-05914ff9dbe3"
], - "PLAYER_PACKET_EVENT": [
- "766fd49b-ff73-4fde-a8e8-fa8a4eda706b"
], - "RTMP_IN_BUFFER": [
- "15df316b-0210-41e0-9831-7c09e7b20c66"
], - "RTMP_OUT_BUFFER": [
- "eac5b5bc-4d18-47c0-9d21-b2f6f774426c"
], - "RTP_SYNCHRONIZATION": [
- "d62ade82-5735-4c76-b16d-770b3640aba0"
], - "STUN": [
- "f8dad822-a881-4518-9d23-cb5d7d7886be"
]
}{- "succeedOperationIds": {
- "MEDIA_SESSION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_SEGMENTER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_CLIENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER_STREAMS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PLAYER_PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_IN_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_OUT_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTP_SYNCHRONIZATION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STUN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CONNECTION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN_MESSAGE": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "REST_HOOKS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}
}
}/rest-api/v3/rels/terminate_all
Disable RELS tracking for all session IDs of the specified event types.
| eventTypes required | Array of strings non-empty unique Items Enum: "CONNECTION" "STREAM" "CDN" "MEDIA_SESSION" "HLS_SEGMENTER" "HLS_STREAM" "HLS_CLIENT" "MIXER" "MIXER_STREAMS" "AUDIO_RECOVERY" "RTMP_IN_BUFFER" "RTMP_OUT_BUFFER" "RTP_SYNCHRONIZATION" "REST_HOOKS" "STUN" "PLAYER_PACKET_EVENT" "PACKET_EVENT" "RTC_CODEC_EVENT" "RTC_INBOUND_RTP_EVENT" "RTC_OUTBOUND_RTP_EVENT" "RTC_REMOTE_INBOUND_RTP_EVENT" "RTC_REMOTE_OUTBOUND_RTP_EVENT" "RTC_MEDIA_SOURCE_EVENT" "RTC_MEDIA_PLAYOUT_EVENT" "RTC_PEER_CONNECTION_EVENT" "RTC_DATA_CHANNEL_EVENT" "RTC_TRANSPORT_EVENT" "RTC_CANDIDATE_PAIR_EVENT" "RTC_LOCAL_CANDIDATE_EVENT" "RTC_REMOTE_CANDIDATE_EVENT" "RTC_CERTIFICATE_EVENT" "REST_HOOKS_BODY" "SESSION_METADATA" "SFU_SESSION_METADATA" "CDN_MESSAGE" "CDN_PING" "CDN_ROUTE_MONITOR" |
{- "eventTypes": [
- "CONNECTION"
]
}{- "succeedOperationIds": {
- "MEDIA_SESSION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_SEGMENTER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_CLIENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER_STREAMS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "MIXER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "PLAYER_PACKET_EVENT": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_IN_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTMP_OUT_BUFFER": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "RTP_SYNCHRONIZATION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STUN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CONNECTION": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "CDN_MESSAGE": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "HLS_STREAM": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}, - "REST_HOOKS": {
- "ids": [
- {
- "id": "1e689423-ee80-4199-8bce-132f95b04eb8",
- "reason": "Success"
}
]
}
}
}/rest-api/v3/rtsp
WCS can pull an RTSP stream from an IP camera or another RTSP source on demand. The captured stream becomes available for playback over all supported protocols.
Available methods:
/rest-api/v3/rtsp/find
Search for active RTSP sessions by filter criteria.
| uri required | string^rtsp://.*$ RTSP URL of the IP camera or stream source (e.g. rtsp://server:554/stream) | ||||||||||||||||||||||||
| status | string
RTSP session status | ||||||||||||||||||||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||||||||||||||||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "uri": "rtsp://demo.flashphoner.com:5554/stream1",
- "status": "PLAYING",
- "limit": 1000,
- "offset": 0
}[- {
- "uri": "rtsp://demo.flashphoner.com:5554/stream1",
- "localStreamName": "local_stream",
- "status": "PLAYING",
- "headers": {
- "Range": "clock=20151019T113705.3657-",
- "Rate-Control": "none"
}
}
]/rest-api/v3/rtsp/find_all
Returns a list of all active RTSP sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "rtsp://demo.flashphoner.com:5554/stream1",
- "localStreamName": "local_stream",
- "status": "PLAYING",
- "headers": {
- "Range": "clock=20151019T113705.3657-",
- "Rate-Control": "none"
}
}
]/rest-api/v3/rtsp/startup
Start pulling an RTSP stream from the specified URI. WCS connects to the IP Camera (or other RTSP source), captures the stream, and makes it available for playback by a Client.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse rtsp/find, rtsp/find_all, stream/find, stream/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^rtsp://.*$ RTSP URL of the IP camera or stream source (e.g. rtsp://server:554/stream) |
| localStreamName required | string Name of the stream to be published on the server from the pulled RTSP source |
object (Key-Value map/dictionary) Custom RTSP headers to send to the RTSP server (e.g. Range, Rate-Control) |
{- "uri": "rtsp://demo.flashphoner.com:5554/stream1",
- "localStreamName": "stream1",
- "headers": {
- "Range": "clock=20151019T113705.3657-",
- "Rate-Control": "none"
}
}{- "uri": "rtsp://demo.flashphoner.com:5554/stream1",
- "localStreamName": "local_stream",
- "status": "PLAYING",
- "headers": {
- "Range": "clock=20151019T113705.3657-",
- "Rate-Control": "none"
}
}/rest-api/v3/rtsp/terminate
Stop pulling the RTSP stream.
| uri required | string^rtsp://.*$ RTSP URL of the session to terminate (e.g. rtsp://server:554/stream) |
{- "uri": "rtsp://demo.flashphoner.com:5554/stream1"
}/rest-api/v3/settings
The Settings endpoint exposes the server-side configuration parameters defined in WCS_HOME/conf/flashphoner.properties. Each setting has a name, current value, default value, type, and a flag indicating whether the change can be applied at runtime (dynamic) or requires a restart.
Two response representations are supported:
FULL — name, description, currentValue, defaultValue, dynamic, typeONLY_NAME — only the nameAvailable methods:
/rest-api/v3/settings/about
Get a single setting by name or alias. Response is always in FULL representation.
| name required | string non-empty Setting name or alias |
{- "name": "ws.port"
}{- "name": "ws.port",
- "description": "WebSocket connection port",
- "currentValue": "8080",
- "defaultValue": "8080",
- "dynamic": false,
- "type": "Integer"
}/rest-api/v3/settings/find_all
Returns a list of all server settings, sorted alphabetically by name.
| type | string Default: "FULL" Enum: "FULL" "ONLY_NAME" Response representation: FULL — all fields; ONLY_NAME — only the name |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "type": "FULL",
- "limit": 1000,
- "offset": 0
}[- {
- "name": "ws.port",
- "description": "WebSocket connection port",
- "currentValue": "8080",
- "defaultValue": "8080",
- "dynamic": false,
- "type": "Integer"
}
]/rest-api/v3/settings/find_by_description
Search for settings whose description contains the given substring (case-insensitive). Sorted alphabetically by name.
| query required | string non-empty Substring to search for in setting descriptions (case-insensitive) |
| type | string Default: "FULL" Enum: "FULL" "ONLY_NAME" Response representation: FULL — all fields; ONLY_NAME — only the name |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "query": "WebSocket",
- "type": "FULL",
- "limit": 1000,
- "offset": 0
}[- {
- "name": "ws.port",
- "description": "WebSocket connection port",
- "currentValue": "8080",
- "defaultValue": "8080",
- "dynamic": false,
- "type": "Integer"
}
]/rest-api/v3/settings/find_by_name
Search for settings whose name contains the given substring (case-insensitive). Sorted alphabetically by name.
| query required | string non-empty Substring to search for in setting names (case-insensitive) |
| type | string Default: "FULL" Enum: "FULL" "ONLY_NAME" Response representation: FULL — all fields; ONLY_NAME — only the name |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "query": "ws.port",
- "type": "FULL",
- "limit": 1000,
- "offset": 0
}[- {
- "name": "ws.port",
- "description": "WebSocket connection port",
- "currentValue": "8080",
- "defaultValue": "8080",
- "dynamic": false,
- "type": "Integer"
}
]/rest-api/v3/settings/update
Update a setting by name or alias. The provided value is parsed according to the setting type.
If persist=true (default), the change is written to WCS_HOME/conf/flashphoner.properties:
name=value is appended to the end of the file.For dynamic settings, the new value takes effect immediately. For non-dynamic settings, a server restart is required.
The combination persist=false with a non-dynamic setting is rejected with 400 Bad Request: such an update would not affect the running server (the setting is not re-read at runtime) and would not survive a restart (the file is not written), so the call has no observable effect.
| name required | string non-empty Setting name or alias |
| value required | string New value as string; will be parsed according to the setting type |
| persist | boolean Default: true If true, persist the change to flashphoner.properties. Must be true for non-dynamic settings: persist=false on a non-dynamic setting is rejected with 400, because the change would neither apply at runtime nor survive a restart. |
{- "name": "ws.port",
- "value": "9090",
- "persist": true
}/rest-api/v3/sfu
Endpoint for managing SFU rooms.
Available methods:
/rest-api/v3/sfu/stats
Get room statistics by name. An SFU Client establishes a WebSocket connection to WCS by sending a connection message, then joins a room via joinRoom. This method returns the current state of the room, including participants, their tracks, codecs, and feedback counters.
| roomName required | string Unique SFU Room name |
{- "roomName": "ROOM1"
}{- "participants": [
- {
- "userId": "95a61486-5e36-4b47-96c1-fd22c7124ba2",
- "nickName": "Bob",
- "mediaSessionId": "53c05928-21f8-4431-80e2-58d115cde0db",
- "outgoingTracks": [ ],
- "incomingTracks": [
- {
- "id": "9cebe6a5-d3ca-4507-a543-2220338d8e62",
- "mid": "1",
- "remoteTrackId": "f7b5bfba-1478-4256-b09b-48bd669e68e2",
- "remoteTrackOwner": "d813d2ce-7435-498b-93d2-5770af6a55ce",
- "content": "camera",
- "codec": "VP8",
- "framesReceived": 24199,
- "width": 1280,
- "height": 720,
- "feedbackStats": {
- "receivedPLI": 0,
- "receivedFIR": 0,
- "receivedNACK": 0,
- "sentPLI": 0,
- "sentFIR": 0,
- "sentNACK": 0
}
}, - {
- "id": "5df1b7bc-6800-4722-8e0d-7fc13b7c3315",
- "mid": "12",
- "remoteTrackId": "4b5787af-13e1-4253-ac4e-4518eed31eaf",
- "remoteTrackOwner": "d813d2ce-7435-498b-93d2-5770af6a55ce",
- "content": "mic",
- "codec": "red",
- "packetsReceived": 374
}
]
}, - {
- "userId": "d813d2ce-7435-498b-93d2-5770af6a55ce",
- "nickName": "Alice",
- "mediaSessionId": "07d4a0fb-4c7d-4528-a34b-2be609e985b6",
- "outgoingTracks": [
- {
- "id": "4b5787af-13e1-4253-ac4e-4518eed31eaf",
- "mid": "13",
- "content": "mic",
- "codec": "red",
- "bitrate": 48840,
- "sampleRate": 48000,
- "channels": 2,
- "alive": true,
- "type": "AUDIO"
}, - {
- "id": "f7b5bfba-1478-4256-b09b-48bd669e68e2",
- "mid": "0",
- "content": "camera",
- "codec": "VP8",
- "width": 1280,
- "height": 720,
- "fps": 30,
- "bitrate": 2860312,
- "feedbackStats": {
- "receivedPLI": 27,
- "receivedFIR": 0,
- "receivedNACK": 0,
- "sentPLI": 0,
- "sentFIR": 0,
- "sentNACK": 0
}, - "alive": true,
- "type": "VIDEO"
}
], - "incomingTracks": [ ]
}
]
}/rest-api/v3/sfu/rtc_metrics
The SFU RTC Metrics endpoint controls WebRTC metrics collection for SFU sessions. WCS sends a metrics configuration (description) to SFU clients, telling them which metrics to collect. The configuration includes the ingestPoint — the destination where clients send their metrics. Clients can report metrics either to WCS over the existing WebSocket signaling connection, or to an external HTTP Ingest endpoint over HTTP/HTTPS. The configuration can be set via update_batch/update_all methods, or delivered to the client on initial WebSocket connect.
Available methods:
/rest-api/v3/sfu/rtc_metrics/find
Find metrics descriptions for SFU sessions matching the filter criteria.
| collect | string (collect)
Filter by metrics collection status | ||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "collect": "off",
- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d14s-ddrp-a42d-bg24",
- "client": {
- "headers": "outbound-rtp.C013ADFS.ssrc,codec.COT01_103.transportId",
- "compression": "gzip",
- "collect": "on"
}, - "server": {
- "collect": "on"
}
}
]/rest-api/v3/sfu/rtc_metrics/find_all
Returns metrics descriptions for all active SFU sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d14s-ddrp-a42d-bg24",
- "client": {
- "headers": "outbound-rtp.C013ADFS.ssrc,codec.COT01_103.transportId",
- "compression": "gzip",
- "collect": "on"
}, - "server": {
- "collect": "on"
}
}
]/rest-api/v3/sfu/rtc_metrics/update_all
Send the specified metrics configuration to all active SFU sessions. Every connected SFU Client receives the updated configuration (including ingestPoint) and starts collecting and sending the requested WebRTC metrics.
Option 1. Metrics ingested by WCS over WebSocket
Clients send metrics to WCS over the existing signaling connection.
Option 2. Metrics ingested by an external HTTP Ingest endpoint
Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.
| collect required | string (collect)
Whether the server accepts metrics from the client. When off, metrics sent by the client are ignored |
{- "collect": "on"
}{- "mediaSessionUpdatedCount": 2
}/rest-api/v3/sfu/rtc_metrics/update_batch
Send the specified metrics configuration to matching SFU sessions. WCS delivers the configuration (including ingestPoint) to each matching SFU Client, which then starts collecting and sending the requested WebRTC metrics.
Option 1. Metrics ingested by WCS over WebSocket
Clients send metrics to WCS over the existing signaling connection.
Option 2. Metrics ingested by an external HTTP Ingest endpoint
Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.
required | object (description) Describes specific parameters of client metrics collection to update |
required | object (filter) A set of filters used to find SFU client sessions for the update. A logical AND is applied between different fields of the filter. Within each array field (roomIds, roomNames, mediaSessionIds, userIds, nickNames), a logical OR is applied between elements. |
{- "description": {
- "collect": "on"
}, - "filter": {
- "roomIds": [
- "ROOM_T1"
], - "roomNames": [
- "ROOM1",
- "Conference"
], - "mediaSessionIds": [ ],
- "userIds": [
- "ca497a8b-e984-4fff-8ffe-e39960dbb527"
], - "nickNames": [
- "Bob",
- "Alice"
]
}
}Multi-status response
{- "mediaSessionUpdatedCount": 1,
- "roomIds": [ ],
- "roomNames": [
- {
- "roomName": "ROOM1",
- "status": "OK"
}
], - "mediaSessionIds": [ ],
- "userIds": [ ],
- "nickNames": [
- {
- "nickName": "Alice",
- "status": "OK",
- "room": {
- "id": "ROOM1",
- "name": "ROOM1"
}
}, - {
- "nickName": "Alice",
- "status": "CONFLICT",
- "room": {
- "id": "work",
- "name": "work"
}
}, - {
- "nickName": "Bob",
- "status": "NOT_FOUND"
}
]
}/rest-api/v3/stream
The Stream endpoint manages all streams on the server — both published (Publish, status PUBLISHING) and played (Subscribe, status PLAYING). Use this API to discover active streams, take snapshots, send events to subscribers, and terminate streams.
Available methods:
/rest-api/v3/stream/send_event
Send a custom event to all subscribers of a stream. The event is delivered as a WebSocket message notifyStreamEvent.
Option 1. Single node
The event is broadcast to all subscribers connected to WCS.
Option 2. CDN (Origin + Edge)
The event is also delivered to subscribers receiving the stream from an Edge node.
| streamName required | string Name of the published stream whose subscribers will receive the event |
required | object Custom JSON data to deliver to all subscribers of the stream via WebSocket notifyStreamEvent message |
{- "streamName": "s0",
- "payload": {
- "number": 33,
- "string": "hello",
- "boolean": true
}
}/rest-api/v3/stream/snapshot
Take a snapshot of a published stream. The snapshot is returned either as a download link or as a Base64-encoded string.
A Client publishes a stream on WCS. On request, WCS decodes a video frame from the stream, encodes it as PNG or JPEG, and returns the resulting image.
INFO
The snapshot will be returned either as a link or as a Base64-encoded string in the `result` parameterAsynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse jobs/find, jobs/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| streamName required | string Name of the published stream to take a snapshot from |
| format | string Default: "PNG" Enum: "PNG" "JPG" Image format for the snapshot: PNG or JPG |
| delivery | string Default: "LINK" Enum: "LINK" "ATTACHMENT" Snapshot delivery method. LINK — saved on the server, returns a download URL. ATTACHMENT — returned as Base64-encoded string, not saved on the server |
{- "streamName": "s0",
- "format": "PNG",
- "delivery": "LINK"
}{- "snapshot": "string"
}/rest-api/v3/stream/start_recording
Start recording a stream. Deprecated, use recorder/startup instead.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse recorder/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| mediaSessionId required | string Media session ID of the stream to record |
| fileTemplate | string Template for the recording file name. Available variables: {streamName}, {startTime}, {endTime}, {sessionId}, {mediaSessionId}, {login}, {audioCodec}, {videoCodec}, {duration} |
| rotation | string File rotation threshold. A number for duration in seconds (e.g. "60"), a number with M suffix for file size in megabytes (e.g. "20M"), or "disabled" |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "fileTemplate": "{streamName}-{startTime}-{endTime}",
- "rotation": "20M"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/stream/start_recording",
- "params": {
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "fileTemplate": "{streamName}-{startTime}-{endTime}",
- "rotation": "20M"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/stream/stop_recording
Stop recording a stream. Deprecated, use recorder/terminate instead.
| mediaSessionId required | string Media session ID of the stream to stop recording |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/stream/terminate
Terminate a stream by its media session ID.
| mediaSessionId required | string Media session ID of the stream to terminate |
{- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}/rest-api/v3/stream/find
Search for streams by filter criteria. Returns all streams if no criteria are specified, or an empty list if none match.
| appKey | string REST hook application key. Determines the webhook URL for event notifications, as configured in database.yml |
| name | string Stream name to search for |
| mediaSessionId | string Media session ID of the stream to search for |
| sessionId | string Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types |
| status | string Enum: "NEW" "PENDING" "PUBLISHING" "PLAYING" "PAUSED" "UNPUBLISHED" "STOPPED" "FAILED" "RESIZE" "SNAPSHOT_COMPLETE" "NOT_ENOUGH_BANDWIDTH" Filter by stream status |
| published | boolean Whether to filter by published (true) or played (false) streams |
| elements | Array of strings Items Enum: "metrics" "red" "audio" Additional data to include in the response: metrics, red, audio |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "appKey": "defaultApp",
- "name": "s0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "sessionId": "/192.168.1.102:13252/192.168.1.101:8443",
- "status": "NEW",
- "published": true,
- "elements": [
- "metrics"
], - "limit": 1000,
- "offset": 0
}[- {
- "name": "s0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "published": true,
- "hasVideo": true,
- "hasAudio": true,
- "status": "NEW",
- "lastStatus": "NEW",
- "mediaProvider": "HLS",
- "mediaType": "play",
- "sdp": "v=0\r\no=- 82374628 2 IN IP4 192.168.100.20\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS\r\nm=audio 49170 RTP/AVP 0\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:0 PCMU/8000\r\na=sendrecv\r\nm=video 51372 RTP/AVP 96\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:96 VP8/90000\r\na=sendrecv\r\n",
- "audioCodec": "opus",
- "videoCodec": "H264",
- "gop": 60,
- "info": "Failed by HLS writer error",
- "record": true,
- "recordName": "s0.mp4",
- "width": 720,
- "height": 480,
- "bitrate": 1000,
- "quality": 23,
- "rtmpUrl": "rtmp://example.com:1935/live",
- "creationDate": "2026-04-12 10:30:15.123000+00:00",
- "shiftTime": 1000,
- "transport": "UDP",
- "profile": 66,
- "level": 52,
- "preset": "medium",
- "custom": {
- "example": 0
}, - "appKey": "defaultApp",
- "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
- "sessionId": "/192.168.1.102:13252/192.168.1.101:8443",
- "displayElements": {
- "audio": {
- "totalPackets": 10,
- "lostPackets": 6
}
}
}
]/rest-api/v3/stream/find_all
Returns a list of all active streams. Returns an empty list if none are active.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}{- "name": "s0",
- "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "published": true,
- "hasVideo": true,
- "hasAudio": true,
- "status": "NEW",
- "lastStatus": "NEW",
- "mediaProvider": "HLS",
- "mediaType": "play",
- "sdp": "v=0\r\no=- 82374628 2 IN IP4 192.168.100.20\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS\r\nm=audio 49170 RTP/AVP 0\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:0 PCMU/8000\r\na=sendrecv\r\nm=video 51372 RTP/AVP 96\r\nc=IN IP4 192.168.100.20\r\na=rtpmap:96 VP8/90000\r\na=sendrecv\r\n",
- "audioCodec": "opus",
- "videoCodec": "H264",
- "gop": 60,
- "info": "Failed by HLS writer error",
- "record": true,
- "recordName": "s0.mp4",
- "width": 720,
- "height": 480,
- "bitrate": 1000,
- "quality": 23,
- "rtmpUrl": "rtmp://example.com:1935/live",
- "creationDate": "2026-04-12 10:30:15.123000+00:00",
- "shiftTime": 1000,
- "transport": "UDP",
- "profile": 66,
- "level": 52,
- "preset": "medium",
- "custom": {
- "example": 0
}, - "appKey": "defaultApp",
- "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
- "sessionId": "/192.168.1.102:13252/192.168.1.101:8443"
}/rest-api/v3/stream/rtc_metrics
The Streaming RTC Metrics endpoint controls WebRTC metrics collection for streaming sessions (Publish/Subscribe). WCS sends a metrics configuration (description) to clients, telling them which metrics to collect. The configuration includes the ingestPoint — the destination where clients send their metrics. Clients can report metrics either to WCS over the existing WebSocket signaling connection, or to an external HTTP Ingest endpoint over HTTP/HTTPS.
Available methods:
/rest-api/v3/stream/rtc_metrics/find
Find metrics descriptions for streaming sessions matching the filter criteria.
| collect | string (collect)
Filter by metrics collection status | ||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "collect": "off",
- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d14s-ddrp-a42d-bg24",
- "client": {
- "headers": "outbound-rtp.C013ADFS.ssrc,codec.COT01_103.transportId",
- "compression": "gzip",
- "collect": "on"
}, - "server": {
- "collect": "on"
}
}
]/rest-api/v3/stream/rtc_metrics/find_all
Returns metrics descriptions for all active streaming sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "mediaSessionId": "d14s-ddrp-a42d-bg24",
- "client": {
- "headers": "outbound-rtp.C013ADFS.ssrc,codec.COT01_103.transportId",
- "compression": "gzip",
- "collect": "on"
}, - "server": {
- "collect": "on"
}
}
]/rest-api/v3/stream/rtc_metrics/update_all
Send the specified metrics configuration to all active streaming sessions. Every connected Client receives the updated configuration and starts collecting and sending the requested WebRTC metrics.
Option 1. Metrics ingested by WCS over WebSocket
Clients send metrics to WCS over the existing signaling connection.
Option 2. Metrics ingested by an external HTTP Ingest endpoint
Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.
| collect required | string (collect)
Whether the server accepts metrics from the client. When off, metrics sent by the client are ignored |
{- "collect": "on"
}{- "mediaSessionUpdatedCount": 2
}/rest-api/v3/stream/rtc_metrics/update_batch
Send the specified metrics configuration to matching streaming sessions. WCS delivers the configuration to each matching Client, which then starts collecting and sending the requested WebRTC metrics.
Option 1. Metrics ingested by WCS over WebSocket
Clients send metrics to WCS over the existing signaling connection.
Option 2. Metrics ingested by an external HTTP Ingest endpoint
Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.
required | object (description) Metrics collection parameters to update |
required | object (filter) A set of filters used to find streaming client sessions for the update. A logical AND is applied between different fields of the filter. Within each array field (mediaSessionIds, sessionIds, streamNames), a logical OR is applied between elements. |
{- "description": {
- "collect": "on"
}, - "filter": {
- "mediaSessionIds": [ ],
- "sessionIds": [
- "/127.0.0.1:34430/127.0.0.1:8443-f3cb15be-3bb2-4c2f-81d2-c3e82b186a48"
], - "streamNames": [
- "stream1",
- "stream3"
], - "streamPublished": false
}
}Multi-status response
{- "mediaSessionUpdatedCount": 1,
- "sessionIds": [
- {
- "sessionId": "/127.0.0.1:34668/127.0.0.1:8443-ce46acf6-93ee-456a-9b40-5c68277ab907",
- "status": "OK"
}
], - "mediaSessionIds": [ ],
- "streamNames": [
- {
- "streamName": "test_1",
- "status": "OK"
}, - {
- "streamName": "test_3",
- "status": "NOT_FOUND"
}
]
}/rest-api/v3/stream_composite
The Stream Composite endpoint provides information about composite streams — streams composed of multiple transcoding profiles produced by a Transcoder node and pulled by an Edge node. Composite streams are used for HLS ABR, WebRTC ABR, and on-demand transcoded playback by profile (e.g. stream1_720p). In all cases the Edge receives a ready set of tracks from the Transcoder as a composite stream. This endpoint is separated from the CDN API to allow composite streams outside of CDN in the future.
Available methods:
/rest-api/v3/stream_composite/find
Get composite stream information by name, including profiles and synchronization logs.
| name required | string Name of the source stream on the Transcoder. Used to identify the composite stream containing one or more transcoding profiles |
| logCount | integer <int32> >= 0 Number of most recent log entries to return. Omit the field to return the last 50 entries. Set it to 0 to return all collected entries (up to composite_validator_log_size). A positive value returns the last N entries, capped at what is collected. |
{- "name": "test",
- "logCount": 50
}{- "name": "test",
- "profiles": [
- "0x240-500 Kbps",
- "0x360-1000 Kbps",
- "0x480-1.5 Mbps"
], - "logs": [
- "2025-12-10T18:42:12.123 WARNING: Profiles out of sync",
- [
- "0x480-1.5 Mbps, 0, 0, 0, 0",
- "0x360-1000 Kbps, -7, +7, -35, +101",
- "0x240-500 Kbps, -4, +4, -31, +101"
], - "2025-12-10T18:42:17.124 WARNING: Profiles out of sync",
- [
- "0x480-1.5 Mbps, 0, 0, 0, 0",
- "0x360-1000 Kbps, -3, +3, -32, +68",
- "0x240-500 Kbps, -7, +7, -68, +68"
]
]
}/rest-api/v3/stream_composite/find_all
Returns a list of all composite streams with their profiles and logs.
| logCount | integer <int32> >= 0 Number of most recent log entries to return per composite stream. Omit the field to return the last 50 entries. Set it to 0 to return all collected entries (up to composite_validator_log_size). A positive value returns the last N entries, capped at what is collected. |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "logCount": 50,
- "limit": 1000,
- "offset": 0
}[- {
- "name": "test",
- "profiles": [
- "0x240-500 Kbps",
- "0x360-1000 Kbps",
- "0x480-1.5 Mbps"
], - "logs": [
- "2025-12-10T18:42:12.123 WARNING: Profiles out of sync",
- [
- "0x480-1.5 Mbps, 0, 0, 0, 0",
- "0x360-1000 Kbps, -7, +7, -35, +101",
- "0x240-500 Kbps, -4, +4, -31, +101"
], - "2025-12-10T18:42:17.124 WARNING: Profiles out of sync",
- [
- "0x480-1.5 Mbps, 0, 0, 0, 0",
- "0x360-1000 Kbps, -3, +3, -32, +68",
- "0x240-500 Kbps, -7, +7, -68, +68"
]
]
}
]/rest-api/v3/stream_analyzer
The Stream Analyzer endpoint automates visual testing of video streams. A reference image is submitted, and the server continuously compares it against decoded frames of the stream, reporting whether the content matches. This is used to verify that a stream is alive and producing expected content — for example, confirming that a stream generated by Publisher still shows a red square, or that the result of transcoding still matches the reference. Requires OpenCV on the server.
/rest-api/v3/stream_analyzer/request
Submit a stream for frame-by-frame comparison against a Base64-encoded reference PNG image.
INFO
The comparison result (algorithm name and similarity value in [0, 1] range) will be returned in the `result` parameterAsynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse jobs/find, jobs/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
Request a stream analyze
| streamName required | string Name of the published stream to compare against the reference image |
| base64EncodedReference required | string Base64-encoded PNG reference image. Decoded frames of the stream will be compared against this image to produce a similarity score |
| considerColor required | boolean Whether to compare frames in color. When false, frames are converted to grayscale before comparison |
required | object (StreamAnalyzerComparisonAlgorithmFactory) Comparison algorithm to use for frame similarity evaluation. Currently supported: SSIM (Structural Similarity Index). Set type to SSIM |
required | object (StreamAnalyzerRescalerAlgorithmFactory) Rescaling strategy used when the stream frame and reference image have different resolutions. SMALLEST downscales both to the smaller size before comparison. Set type to SMALLEST |
{- "streamName": "s0",
- "base64EncodedReference": "iVBORw0KGgoAAAANSUhEUgAAAoAAA...",
- "considerColor": true,
- "comparisonAlgorithmFactory": {
- "type": "SSIM"
}, - "rescalerAlgorithmFactory": {
- "type": "SMALLEST"
}
}{- "algorithmName": "SSIM",
- "value": 0.9991907314622465
}/rest-api/v3/transcoder2
The Transcoder2 endpoint manages advanced on-demand transcoding of published streams. A transcoding session decodes the source stream and re-encodes it with the specified codec, resolution, or bitrate, producing a new output stream. Watermarks can be applied to the output.
Available methods:
/rest-api/v3/transcoder2/find
Search for active transcoding sessions by filter criteria. Returns all sessions if no criteria are specified, or an empty list if none match.
| uri | string^transcoder2://.*$ Unique transcoder identifier. Format: transcoder2://{name} | ||||||||||||||
| localStreamName | string Name of the transcoded output stream published locally | ||||||||||||||
| remoteStreamName | string Name of the published source stream to be transcoded | ||||||||||||||
| status | string
Transcoding session status filter | ||||||||||||||
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting | ||||||||||||||
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "uri": "transcoder2://t1",
- "localStreamName": "local_stream",
- "remoteStreamName": "remote_stream",
- "status": "NEW",
- "limit": 1000,
- "offset": 0
}[- {
- "uri": "transcoder2://t1",
- "localStreamName": "local_stream",
- "remoteStreamName": "remote_stream",
- "status": "NEW",
- "localMediaSessionId": "06844ffd-1dce-4a77-a2c2-37629f0e4d13",
- "encoder": {
- "width": 720,
- "height": 480,
- "keyFrameInterval": 60,
- "fps": 24,
- "bitrate": 1000,
- "videoCodec": "H264",
- "type": "FF",
- "audioRate": 44100,
- "audioBitrate": 64000,
- "audioCodec": "mpeg4-generic",
- "audioChannels": 1
}
}
]/rest-api/v3/transcoder2/find_all
Returns a list of all active transcoding sessions. Returns an empty list if none are active.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "uri": "transcoder2://t1",
- "localStreamName": "local_stream",
- "remoteStreamName": "remote_stream",
- "status": "NEW",
- "localMediaSessionId": "06844ffd-1dce-4a77-a2c2-37629f0e4d13",
- "encoder": {
- "width": 720,
- "height": 480,
- "keyFrameInterval": 60,
- "fps": 24,
- "bitrate": 1000,
- "videoCodec": "H264",
- "type": "FF",
- "audioRate": 44100,
- "audioBitrate": 64000,
- "audioCodec": "mpeg4-generic",
- "audioChannels": 1
}
}
]/rest-api/v3/transcoder2/set_watermark
Overlays a watermark on the transcoded output stream. The watermark can be a PNG image, a text string, or both. It is rendered on top of the video frames and becomes part of the encoded output visible to all viewers. A previously running transcoding session must exist for the specified URI.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an error
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| uri required | string^transcoder2://.*$ Unique transcoder identifier. Format: transcoder2://{name} |
| watermark required | string PNG watermark image file path (relative to {WCS_HOME}/conf) or http/https URL |
| x | integer <int32> X coordinate of the watermark top-left corner on the video frame in pixels. If a margin value is larger, the margin takes precedence |
| y | integer <int32> Y coordinate of the watermark top-left corner on the video frame in pixels. If a margin value is larger, the margin takes precedence |
| marginRight | integer <int32> Minimum right margin from the frame edge in pixels. The watermark is shifted inward if it would exceed this boundary |
| marginBottom | integer <int32> Minimum bottom margin from the frame edge in pixels. The watermark is shifted inward if it would exceed this boundary |
| marginLeft | integer <int32> Minimum left margin from the frame edge in pixels. Overrides x if the margin is larger |
| marginTop | integer <int32> Minimum top margin from the frame edge in pixels. Overrides y if the margin is larger |
object (dimension) Watermark image dimensions in pixels | |
object (size) Reference frame dimensions in pixels. Watermark position, margins, and size are specified relative to this frame size and proportionally scaled when the actual frame size differs. If not set, the actual frame size is used |
{- "uri": "transcoder2://t1",
- "watermark": "path/to/watermark.png",
- "x": 30,
- "y": 10,
- "marginRight": 20,
- "marginBottom": 50,
- "marginLeft": 150,
- "marginTop": 15,
- "watermarkSize": {
- "width": 30,
- "height": 50
}, - "frameSize": {
- "width": 640,
- "height": 480
}
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/transcoder2/set_watermark",
- "params": {
- "uri": "transcoder2://t1",
- "watermark": "path/to/watermark.png",
- "x": 30,
- "y": 10,
- "marginRight": 20,
- "marginBottom": 50,
- "marginLeft": 150,
- "marginTop": 15,
- "watermarkSize": {
- "width": 30,
- "height": 50
}, - "frameSize": {
- "width": 640,
- "height": 480
}
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/transcoder2/startup
Creates a new transcoding session for a published stream. The source stream is decoded and re-encoded with the specified codec, resolution, or bitrate, producing a new output stream that becomes available for playback. An optional encoder configuration controls the output parameters; if omitted, the stream is re-encoded with the source stream parameters.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse transcoder2/find, transcoder2/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^transcoder2://.*$ Unique transcoder identifier. Format: transcoder2://{name} |
| localStreamName required | string Name of the transcoded output stream to be published locally |
| remoteStreamName required | string Name of the published source stream to be transcoded |
object (encoder) Encoder configuration for the transcoded output stream. If omitted, the stream is re-encoded with the source stream parameters (resolution, bitrate, codec) |
{- "uri": "transcoder2://t1",
- "localStreamName": "local_stream",
- "remoteStreamName": "remote_stream",
- "encoder": {
- "width": 720,
- "height": 480,
- "keyFrameInterval": 60,
- "fps": 24,
- "bitrate": 1000,
- "videoCodec": "H264",
- "type": "FF",
- "audioRate": 44100,
- "audioBitrate": 64000,
- "audioCodec": "mpeg4-generic",
- "audioChannels": 1
}
}{- "uri": "transcoder2://t1",
- "localStreamName": "local_stream",
- "remoteStreamName": "remote_stream",
- "status": "NEW",
- "localMediaSessionId": "06844ffd-1dce-4a77-a2c2-37629f0e4d13",
- "encoder": {
- "width": 720,
- "height": 480,
- "keyFrameInterval": 60,
- "fps": 24,
- "bitrate": 1000,
- "videoCodec": "H264",
- "type": "FF",
- "audioRate": 44100,
- "audioBitrate": 64000,
- "audioCodec": "mpeg4-generic",
- "audioChannels": 1
}
}/rest-api/v3/transcoder2/terminate
Stops the transcoding session and terminates the output stream. The source stream is detached and the output stream becomes unavailable for playback. This operation fully releases transcoder resources.
| uri required | string^transcoder2://.*$ Unique transcoder identifier. Format: transcoder2://{name} |
{- "uri": "transcoder2://t1"
}/rest-api/v3/transcoder-stat
The Transcoder Stat endpoint provides runtime statistics for active video encoders, decoders, and mixers, including codec, resolution, FPS, bitrate, processing time, and uptime.
Decoders are created when:
streaming_video_decoder_fast_start=true in flashphoner.propertiesEncoders are created when:
transcoder2/startup is called via RESTstream1-720p) — the encoder is created on the Transcoder nodeMixers are created when:
mixer/startup is called via RESTstream1#mixer1)Available methods:
/rest-api/v3/transcoder-stat/find_all
Returns all active encoders and decoders, sorted by height.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "name": "NVENC/H264",
- "type": "ENCODER",
- "width": 1280,
- "height": 720,
- "resampling": "1920x1080->1280x720",
- "firstTs": 755820,
- "fpsIn": "30.0",
- "fpsOut": "30.0",
- "bitrateIn": "2.62 Mbps",
- "bitrateOut": "2.68 Mbps",
- "processedDataInCnt": 70752,
- "processedDataOutCnt": 70750,
- "processedDataInSize": "218.62 GB",
- "processedDataOutSize": "698.79 MB",
- "currentProcessingTime": "323 us 697 ns",
- "uptime": "39 m 18 s"
}
]/rest-api/v3/transcoder-stat/find_decoders
Returns active decoders only, sorted by height.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}{- "name": "NVDEC/H264",
- "type": "DECODER",
- "width": 1920,
- "height": 1080,
- "firstTs": 755820,
- "fpsIn": "30.00",
- "fpsOut": "30.00",
- "bitrateIn": "2.45 Mbps",
- "processedDataInCnt": 70758,
- "processedDataOutCnt": 70753,
- "processedDataInSize": "702.12 MB",
- "processedDataOutSize": "218.62 GB",
- "currentProcessingTime": "242 us 15 ns",
- "uptime": "39 m 18 s"
}/rest-api/v3/transcoder-stat/find_encoders
Returns active encoders only, sorted by height.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}{- "name": "NVENC/H264",
- "type": "ENCODER",
- "width": 1920,
- "height": 1080,
- "resampling": false,
- "firstTs": 755820,
- "fpsIn": "30.00",
- "fpsOut": "30.00",
- "bitrateOut": "4.2 Mbps",
- "processedDataInCnt": 70752,
- "processedDataOutCnt": 70750,
- "processedDataInSize": "218.62 GB",
- "processedDataOutSize": "1.08 GB",
- "currentProcessingTime": "237 us 285 ns",
- "uptime": "39 m 18 s"
}/rest-api/v3/user
The User endpoint exposes CRUD operations over the users stored in WCS_HOME/conf/database.yml. A user has a name, a password and an active flag.
Users are server access accounts. Their credentials are used for HTTP Basic authentication of the REST API (authentication is disabled by default and enabled by setting disable_rest_auth=false) and to sign in to the WCS Admin web UI and the CLI shell. A fresh installation is seeded with the default admin and demo accounts.
Passwords are accepted in plaintext, stored hashed and are never returned in any response.
The active flag enables or disables an account without deleting it. An inactive (active=false) user is kept in the configuration but treated as disabled: sign-in to the Admin web UI and password sign-in to the CLI shell are rejected. The built-in demo account is special — its active flag additionally gates public access to the bundled demo content. While demo is active, the demo client pages, the embed player, recorded media and the Swagger UI are served directly, and the Admin UI demo-link endpoints return their direct URLs. Once the demo account is deactivated, direct requests to that content are answered with an HTTP redirect to the Admin login page (/admin/), and the demo-link endpoints instead return tokenized /shared links, so the demo content stays reachable only through those generated links.
Available methods:
/rest-api/v3/user/create
Create a new user. The password is accepted in plaintext and stored hashed.
| username required | string non-empty User name |
| password required | string non-empty User password in plaintext; it is stored hashed and never returned |
| active | boolean Default: true Whether the account is enabled. An inactive account is kept but treated as disabled and denied sign-in to the Admin web UI and password sign-in to the CLI shell |
{- "username": "user1",
- "password": "secret",
- "active": true
}/rest-api/v3/user/find
Get a single user by name. The password is never included.
| username required | string non-empty User name |
{- "username": "user1"
}{- "username": "user1",
- "active": true
}/rest-api/v3/user/find_all
Returns a list of all users, sorted alphabetically by name. Passwords are never included.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "username": "user1",
- "active": true
}
]/rest-api/v3/user/update
Update an existing user.
password is provided (non-blank), it is treated as plaintext and stored hashed.password is omitted or blank, the existing password is preserved.active is omitted, the existing value is preserved.| username required | string non-empty User name |
| password | string New password in plaintext; if omitted or blank, the existing password is preserved. Never returned |
| active | boolean Whether the account is enabled. An inactive account is kept but treated as disabled and denied sign-in to the Admin web UI and password sign-in to the CLI shell; if omitted, the existing value is preserved |
{- "username": "user1",
- "password": "secret",
- "active": true
}/rest-api/v3/video_interceptor
The Video Interceptor endpoint attaches custom video processing code to decoded stream frames. A Java class implementing IDecodedFrameInterceptor receives decoded frames in YUV format via the frameDecoded() callback. Only one interceptor can be set per stream at a time.
Available methods:
/rest-api/v3/video_interceptor/find
Get the interceptor attached to the specified stream. Returns an empty list if none is set.
| streamName required | string Name of the published stream to find the interceptor for |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "streamName": "test",
- "limit": 1000,
- "offset": 0
}[- {
- "streamName": "test",
- "className": "com.flashphoner.frameInterceptor.TestInterceptor",
- "status": "WAITING",
- "processedFrames": 3,
- "hash": 689232309
}
]/rest-api/v3/video_interceptor/find_all
Returns a list of all active interceptors.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "streamName": "test",
- "className": "com.flashphoner.frameInterceptor.TestInterceptor",
- "status": "WAITING",
- "processedFrames": 3,
- "hash": 689232309
}
]/rest-api/v3/video_interceptor/set
Attach an interceptor to a stream. The interceptor receives decoded frames when the stream is being decoded (e.g. when the stream is being transcoded or mixed).
In this example, WCS applies a blur filter during transcoding. The interceptor processes each decoded frame before it is re-encoded into the output stream.
| streamName required | string Name of the published stream to attach the interceptor to |
| className required | string Fully qualified Java class name of the interceptor to set. The class must be in a JAR file located in {WCS_HOME}/lib |
{- "streamName": "test",
- "className": "com.flashphoner.frameInterceptor.TestInterceptor"
}/rest-api/v3/vod
The VOD endpoint converts an MP4 file into a published stream using the vod-live:// scheme. The file can be located on the server's local disk, on a remote HTTP/HTTPS server, or in S3-compatible storage. The resulting stream is shared among all viewers as a live broadcast — viewers who connect later will join the stream at its current playback position, not from the beginning.
Available methods:
/rest-api/v3/vod/find
Search for active VOD sessions by filter criteria. With an empty body, returns all active sessions.
| localStreamName | string Name of the stream published on the server from the VOD file |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "localStreamName": "string",
- "limit": 1000,
- "offset": 0
}[- {
- "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
- "localStreamName": "test",
- "uri": "vod-live://sample.mp4",
- "status": "NEW",
- "hasAudio": true,
- "hasVideo": true,
- "record": true,
- "loop": true
}
]/rest-api/v3/vod/find_all
Returns a list of all active VOD sessions.
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "limit": 1000,
- "offset": 0
}[- {
- "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
- "localStreamName": "test",
- "uri": "vod-live://sample.mp4",
- "status": "NEW",
- "hasAudio": true,
- "hasVideo": true,
- "record": true,
- "loop": true
}
]/rest-api/v3/vod/startup
Start playing an MP4 file as a published stream on WCS.
Option 1. Local file
The file is read from the server's local disk.
Option 2. Remote file
The file is fetched from a remote HTTP server (e.g. S3).
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorCANCELED— Job was canceled by the user via /jobs/cancelTIMED_OUT— Job was automatically canceled because the timeout was exceededUse vod/find, vod/find_all, stream/find, stream/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Max execution time in seconds. If the job does not complete within this time, it is automatically canceled. Default: 60.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
● JOB CANCELLABLE
| uri required | string^vod-live://.+$ VOD file URI. Local file: vod-live://sample.mp4 (from {WCS_HOME}/media). HTTP/HTTPS: vod-live://http://server/file.mp4. Amazon S3: vod-live://s3/bucket/file.mp4 (resolves to https://bucket.s3.amazonaws.com/file.mp4). S3-compatible provider: vod-live://https://endpoint/bucket/file.mp4. All S3 variants use AWS Signature V4 and require aws_s3_credentials setting (region;accessKey;secretKey) |
| localStreamName | string Default: "Same as uri field" Name of the stream to be published on the server from the VOD file. If not set, the URI is used |
| loop | boolean Whether playback restarts from the beginning after it finishes |
{- "uri": "vod-live://sample.mp4",
- "localStreamName": "Same as uri field",
- "loop": true
}{- "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
- "localStreamName": "test",
- "uri": "vod-live://sample.mp4",
- "status": "NEW",
- "hasAudio": true,
- "hasVideo": true,
- "record": true,
- "loop": true
}/rest-api/v3/vod/terminate
Stop VOD playback. With an empty body, stops all active VOD sessions.
| uri required | string^(vod://|vod-live://).+$ VOD file URI of the session to terminate. Supports local files, HTTP/HTTPS URLs, and S3-compatible storage (e.g. vod-live://s3/bucket/file.mp4) |
| localStreamName | string Name of the stream published on the server from the VOD file |
{- "uri": "vod-live://sample.mp4",
- "localStreamName": "string"
}/rest-api/v3/webrtc_abr
The WebRTC ABR endpoint manages adaptive bitrate streaming over WebRTC. A published stream is transcoded into multiple quality profiles (either locally or by a dedicated Transcoder node). The resulting tracks are placed into an SFU room on WCS and delivered to an SFU Client, which automatically switches between quality levels based on frame loss statistics and network conditions.
Available methods:
/rest-api/v3/webrtc_abr/find_all
Returns a list of all active WebRTC ABR sessions.
| logCount | integer <int32> >= 0 Number of most recent log entries to return per session. Omit the field or set it to 0 to return all collected entries (up to webrtc_abr_metrics_log_size). A positive value returns the last N entries, capped at what is collected. |
| limit | integer <int32> >= 0 Default: 1000 Maximum number of items to return. Omit the field or set it to 0 to use the server setting |
| offset | integer <int32> >= 0 Default: 0 Number of items to skip from the beginning of the collection. Default: 0. |
{- "logCount": 50,
- "limit": 1000,
- "offset": 0
}{- "streamName": "testName",
- "state": "NEW",
- "profiles": [
- "-720p",
- "-240p"
], - "createdDate": "2026-04-12 10:30:15.123000+00:00",
- "logs": [
- "Video resolution changed from 1280x720 to 854x480, pts 1234"
]
}/rest-api/v3/webrtc_abr/startup
Start a new WebRTC ABR session for the specified stream.
Option 1. Single node
The stream is transcoded into multiple quality profiles on WCS, placed into an SFU room, and delivered to the SFU Client.
Option 2. CDN with Edge transcoding
The stream is pulled from Origin, transcoded on the Edge, placed into an SFU room, and delivered to the SFU Client.
Option 3. CDN with dedicated Transcoder
The stream is transcoded on a dedicated Transcoder node, the composite stream is pulled by Edge, placed into an SFU room, and delivered to the SFU Client.
INFO
Asynchronous job details (click to expand)
This method initiates an asynchronous Job.
- If the job completes within the wait time, it returns 200 OK with the result in the response body.
- If the job continues in the background, it returns 202 Accepted with a
jobId. The result can be retrieved later using /jobs/find — it will be available in theresultfield of the Job object.Job statuses
PENDING— Job created, waiting to startRUNNING— Job is in progressDONE— Job completed successfullyFAILED— Job failed with an errorUse webrtc_abr/find_all to check the result directly.
PreferHTTP header
Controls synchronous wait time and execution timeout. Pass as an HTTP header:Prefer: wait=5, timeout=60
wait=5— Sync wait time in seconds. Returns200 OKif the job finishes within the specified time, otherwise202 Accepted. Default: 5.timeout=60— Not applicable for this endpoint. The job will continue running until completion.Server-side settings (
WCS_HOME/conf/flashphoner.properties)
jobs_max_prefer_wait_time— Default and upper limit forwait(default: 5 seconds).jobs_max_prefer_timeout— Default and upper limit fortimeout(default: 60 seconds).
If thePreferheader value is omitted or exceeds these limits, the server setting value is used.
○ JOB NOT CANCELLABLE
| streamName required | string Name of the published stream that is transcoded into ABR profiles |
{- "streamName": "testName"
}{- "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
- "startTime": "1762984422789",
- "finishTime": "1762984422795",
- "status": "RUNNING",
- "info": "string",
- "requestInfo": {
- "method": "/rest-api/v3/webrtc_abr/startup",
- "params": {
- "streamName": "testName"
}
}, - "timeout": {
- "total": 60,
- "remaining": 32
}, - "isCancellable": true
}/rest-api/v3/webrtc_abr/subscribers
Get information about viewers currently subscribed to a WebRTC ABR session.
| streamName required | string Name of the published stream that is transcoded into ABR profiles |
{- "streamName": "testName"
}{- "subscriberCount": 1,
- "subscribersInfo": [
- {
- "clientId": "/127.0.0.1:46734/127.0.0.1:8443-381b9100-60b7-4831-ab9b-cd8a7ca90105",
- "port": 30000,
- "quality": "-1080p"
}
]
}