Flashphoner Web Call Server 5.3 REST API (3.0.0)

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:

  • HTTP port 8081 — http://host:8081/rest-api/v3
  • HTTPS port 8444 — https://host:8444/rest-api/v3

Use HTTP POST for all requests unless explicitly specified otherwise.

Available sections:

  • Call — SIP calls, conversion to RTMP/WebRTC, re-streaming
  • CDN — multi-node WCS cluster control
  • Certificate — replacing the server's TLS certificate at runtime
  • Connection — WebSocket connection management
  • Data — sending arbitrary data over WebSocket
  • GPU — GPU monitoring and control
  • HLS — converting streams to HLS
  • Inject2 — injecting one stream into another
  • Inject3 — injecting audio/video/image files into a stream
  • Jobs — tracking and managing asynchronous background jobs
  • Logger — WebSocket session-level logging control
  • Mixer — stream mixing and mixer output management
  • MPEGTS — ingesting MPEG-TS streams
  • Multi Recorder — recording multiple streams into a single MP4 with multiple tracks
  • PCAP — restoring traffic from PCAP dump into an internal stream
  • Publisher — generating test video streams on the server
  • Pull RTMP — pulling RTMP streams and converting to internal streams
  • Pull WebRTC — pulling WebRTC streams from another WCS server
  • Push RTMP — pushing a stream to an external RTMP server
  • Push WebRTC — pushing a stream to another WCS server via WebRTC
  • Recorder — controlling stream recording
  • RELS — real-time event logging system
  • RTSP — pulling RTSP streams and converting to internal streams
  • SFU — SFU control for rooms and SFU SDK
  • SFU RTC Metrics — RTC metric collection for SFU streams
  • Stream — stream management, discovery, termination
  • Stream RTC Metrics — RTC metric collection for streams
  • Stream Composite — compositing multiple streams into one
  • Stream Analyzer — automated visual testing of video streams
  • Transcoder2 — advanced transcoding and enhancements
  • Transcoder Stat — active encoder/decoder list and statistics
  • Video Interceptor — custom video processing filters (e.g. blur)
  • VOD — converting MP4 files to internal streams
  • WebRTC ABR — adaptive bitrate streaming over WebRTC

Application

/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:

create

/rest-api/v3/app/create

Create a new application. The application is seeded with the default set of allowed REST hook methods.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "key": "myApp",
  • "name": "My Application",
  • "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
  • "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}

delete

/rest-api/v3/app/delete

Delete an application by key. Its allowed REST hook methods are removed as well.

Request Body schema: application/json
key
required
string non-empty

Application key

Responses

Request samples

Content type
application/json
{
  • "key": "myApp"
}

find

/rest-api/v3/app/find

Get a single application by key.

Request Body schema: application/json
key
required
string non-empty

Application key

Responses

Request samples

Content type
application/json
{
  • "key": "myApp"
}

Response samples

Content type
application/json
{
  • "name": "My Application",
  • "key": "myApp",
  • "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
  • "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}

find_all

/rest-api/v3/app/find_all

Returns a list of all applications, sorted alphabetically by key.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

rest_methods/add

/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.

Request Body schema: application/json
key
required
string non-empty

Application key

method
required
string non-empty

REST method name

Responses

Request samples

Content type
application/json
{
  • "key": "myApp",
  • "method": "publishStream"
}

rest_methods/find

/rest-api/v3/app/rest_methods/find

Returns the set of REST hook methods allowed for the application, sorted alphabetically.

Request Body schema: application/json
key
required
string non-empty

Application key

Responses

Request samples

Content type
application/json
{
  • "key": "myApp"
}

Response samples

Content type
application/json
[
  • "string"
]

rest_methods/remove

/rest-api/v3/app/rest_methods/remove

Disallow a REST hook method for the application.

Request Body schema: application/json
key
required
string non-empty

Application key

method
required
string non-empty

REST method name

Responses

Request samples

Content type
application/json
{
  • "key": "myApp",
  • "method": "publishStream"
}

update

/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.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "key": "myApp",
  • "name": "My Application",
  • "handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler",
  • "callback": "com.flashphoner.server.client.handler.wcs4.WCS4CallbackHandler"
}

Call

/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:

Call startup

find

/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.

Request Body schema: application/json
callId
string

Unique SIP Call-ID of the active call

status
string
Enum Description
BUSY

Call rejected by the remote SIP endpoint (e.g. SIP 486 Busy Here)

ESTABLISHED

SIP 200 OK received, call is active

FINISH

Call ended by the server or the remote SIP endpoint

HOLD

Call placed on hold by the server or the remote SIP endpoint

RING

SIP 180 Ringing received on outgoing call

RINGING

Not used

SESSION_PROGRESS

SIP 183 Session Progress received on outgoing call

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660",
  • "status": "RING",
  • "caller": "10001",
  • "callee": "10002",
  • "rtmpUrl": "rtmp://localhost:1935/live",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

inject_sound Job

/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.

Call inject sound

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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 media_dir directory on the server (default: {WCS_HOME}/media)

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660",
  • "fileName": "test.wav"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

inject_stream/startup

/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.

Call inject stream

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660",
  • "streamName": "stream1"
}

inject_stream/terminate

/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.

Terminate stream injection

Request Body schema: application/json
callId
required
string

Unique SIP Call-ID of the active call

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660"
}

send_dtmf

/rest-api/v3/call/send_dtmf

Send a DTMF tone to the SIP party (via SIP or RTP).

Call send DTMF

Request Body schema: application/json
callId
required
string

Unique SIP Call-ID of the active call

type
required
string
Enum Description
INFO

SIP INFO with application/dtmf content type

INFO_RELAY

SIP INFO with application/dtmf-relay content type (Asterisk-compatible)

RFC2833

In-band DTMF via RTP (RFC 2833)

DTMF transmission method

dtmf
required
string

DTMF characters to send. Supports sequences of multiple characters. Allowed: 0-9, *, #, A-D

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660",
  • "type": "RFC2833",
  • "dtmf": "9"
}

startup Job

/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.

Call startup with rtmpUrl param

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.).

Call startup with toStream param

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.

Call startup without rtmpUrl or toStream params

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use call/find, call/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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 rtmpUrl=rtmp://localhost:1935/live and rtmpStream=test, the final RTMP target will be rtmp://localhost:1935/live/test.

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 toStream=stream1 the stream stream1 becomes available for playback and further processing including HLS, transcoding, mixing, etc.

callType
string (callType)
Default: "AUDIO"
Enum Description
AUDIO

Audio only call

VIDEO

Video only call

VIDEO_AUDIO

Audio + Video call

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. sip:bob@mypbx.flashphoner.com) or just a username (e.g. bob) — in this case the domain is taken from sipDomain. Also used as sipAuthenticationName if the latter is not set.

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

Responses

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

terminate

/rest-api/v3/call/terminate

Terminate the SIP call by sending a SIP BYE or SIP CANCEL

Call terminate with callId param

Request Body schema: application/json
callId
required
string

Unique SIP Call-ID of the active call

Responses

Request samples

Content type
application/json
{
  • "callId": "6d62f660"
}

CDN

/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.

CDN Overview Topology

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.

CDN Stream Distribution

Available methods:

Topology management

Applies to any node

  • show_nodes — List all visible nodes (Origin, Edge, Transcoder, Recorder)
  • remove_node — Remove a specific node
  • show_state — Display the current operational state of the node
  • enforce_state — Forcefully override the node state
  • show_groups — List configured node groups

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

stream/access_list/add

/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.

ACL Success Flow

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json

Add ACL Keys Example

{
  • "name": "live_stream_01",
  • "keys": [
    ]
}

stream/access_list/delete

/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.

Request Body schema: application/json
name
required
string

Name of the published stream to which the ACL entries will be applied

Responses

Request samples

Content type
application/json

Delete All ACL Entries

{
  • "name": "test_stream"
}

stream/access_list/print

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json

Print ACL Example

{
  • "name": "live_stream_01"
}

Response samples

Content type
application/json

Active ACL Keys

[
  • "key1",
  • "key2",
  • "token_xyz"
]

stream/access_list/remove

/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.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json

Remove ACL Key Example

{
  • "name": "live_stream_01",
  • "keys": [
    ]
}

connection/reset_all

/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.

Restore Signaling

Responses

connection/reset_inbound

/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.

Reset Inbound Flow

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json

Reset Inbound Example

{
  • "nodeId": "origin-node-01.internal"
}

connection/reset_outbound

/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.

Reset Outbound Flow

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json

Reset Outbound Example

{
  • "nodeId": "edge-node-05.internal"
}

show_channels

/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).

Show Channels Flow

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json

Channel List Example

[
  • {
    },
  • {
    }
]

profile/add Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use profile/print to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "name": "-720p",
  • "profile": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

profile/modify Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use profile/print to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "name": "-720p",
  • "profile": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

profile/print

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

profile/remove Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use profile/print to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
name
required
string

Unique transcoding profile name to remove (e.g. -720p, -480p)

Responses

Request samples

Content type
application/json
{
  • "name": "-720p"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

recorder/show_active

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • "live_stream_01 origin.internal",
  • "news_feed_hd edge-02.internal"
]

recorder/trap/add Job

/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.

Recorder trap add

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use recorder/trap/show to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream.*",
  • "serverIps": [
    ],
  • "serverNames": [
    ],
  • "profile": "-240p",
  • "profiles": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

recorder/trap/remove Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use recorder/trap/show to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
id
required
string

Recording trap ID to remove. Obtained from recorder/trap/show response

Responses

Request samples

Content type
application/json
{
  • "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

recorder/trap/show

/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.

Responses

Response samples

Content type
application/json
{
  • "streams": [
    ],
  • "defaultProfile": "-360p"
}

show_routes

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json

Routes Example

[
  • {
    }
]

show_redundant_transcodings

/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.

Redundant Transcoding Diagram

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json

Redundant Transcoding Example

[
  • {
    }
]

stream/show_routes

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream123",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    }
]

trace_route

/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.

Trace Route Flow

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream1",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json

Trace Route Example

[
  • {
    }
]

enforce_state

/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).

Request Body schema: application/json
state
required
string
Enum Description
CONNECTIONS_ALLOWED

New transcoding connections are allowed, but no new streams

GROUP_CONNECTIONS_ALLOWED

Only connections to existing transcoding chains are allowed

NEW_STREAMS_ALLOWED

Node is fully available, accepts new streams and connections

PASSIVE

Node refuses new media requests, existing streams continue (drain mode)

UNKNOWN

Initial state, node has not yet been initialized

CDN node state to enforce. Typically PASSIVE (drain mode) or NEW_STREAMS_ALLOWED (fully available)

Responses

Request samples

Content type
application/json
{
  • "state": "UNKNOWN"
}

remove_node

/rest-api/v3/cdn/remove_node

Remove a specific node (Origin, Edge, Transcoder, or Recorder) from the network.

Remove Node Flow

A node in an ACTIVE state cannot be removed directly. First, change its state to PASSIVE using enforce_state to drain active sessions.

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "nodeId": "vm1.localhost.com"
}

show_groups

/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.

Logical Group Topology

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json

Standard Response

[
  • {
    },
  • {
    }
]

show_nodes

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

show_state

/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).

Responses

Response samples

Content type
application/json
"UNKNOWN"

warmup/show_active

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • "live_hd_01 192.168.1.10",
  • "promo_video 10.0.0.5"
]

warmup/trap/add Job

/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.

Warmup trap add

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use warmup/trap/show to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream.*",
  • "serverIps": [
    ],
  • "serverNames": [
    ],
  • "profile": "-240p",
  • "profiles": [
    ],
  • "abr": true
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

warmup/trap/remove Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use warmup/trap/show to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
id
required
string

Warmup trap ID to remove. Obtained from warmup/trap/show response

Responses

Request samples

Content type
application/json
{
  • "id": "aa5498dd91e312ff5f88e7eb26d0c019"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

warmup/trap/show

/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.

Responses

Response samples

Content type
application/json
{
  • "streams": [
    ],
  • "defaultProfile": "-360p"
}

Certificate

/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:

  • upload — Upload a certificate chain together with its private key
  • reset — Restore the default bundled certificate

reset

/rest-api/v3/certificate/reset

Restore the default bundled certificate, discarding any previously uploaded certificate. The default certificate is applied immediately to all of the server's TLS connections (HTTPS, WSS, HLS, secure SIP, CDN, RTC metrics).

Responses

upload

/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.

Request Body schema: application/json

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

Responses

Request samples

Content type
application/json
{
  • "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-----"
}

Connection

/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:

  • set_log_level — Change log verbosity for a specific session
  • terminate — Forcefully close a connection and release associated resources
  • find — Search for connections by filter
  • find_all — List all active connections

find_all

/rest-api/v3/connection/find_all

Get all active connections. Returns an empty list if no clients are connected.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find

/rest-api/v3/connection/find

Search for connections by criteria. If no criteria are specified, returns all connections.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "appKey": "defaultApp",
  • "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
  • "clientVersion": "2.0",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

set_log_level

/rest-api/v3/connection/set_log_level

Set the logger level for a specific connection for real-time debugging.

Connection set log level

Request Body schema: application/json
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
Enum Description
ALL

All log messages

DEBUG

Debug messages and above

ERROR

Error messages and above

FATAL

Fatal errors only

INFO

Informational messages and above

OFF

No logging

TRACE

Trace messages and above

WARN

Warning messages and above

Per-connection logging level to set. Controls the log verbosity for this specific client without affecting other connections or global server logs

Responses

Request samples

Content type
application/json
{
  • "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3",
  • "logLevel": "DEBUG"
}

terminate

/rest-api/v3/connection/terminate

Forcefully terminate a connection. All associated media streams will be closed.

Request Body schema: application/json
sessionId
required
string

Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types

Responses

Request samples

Content type
application/json
{
  • "sessionId": "1f6f5570-96aa-403c-9499-d46e738e79e3"
}

Data

/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:

  • send — Send a message to one or more sessions
  • batch_send — Send multiple independent messages in a single request

batch_send

/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.

Data batch send

Request Body schema: application/json
Array
Any of
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

Responses

Request samples

Content type
application/json

batch_example

[
  • {
    },
  • {
    }
]

Response samples

Content type
application/json
[
  • {
    }
]

send

/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.

Data send

Request Body schema: */*
Any of
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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

File System

/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.

allowed_paths

/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.

Responses

Response samples

Content type
application/json
{
  • "workdir": "/usr/local/FlashphonerWebCallServer",
  • "absolutePathsEnabled": false,
  • "rules": [
    ]
}

file/create_anchor

/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.

Request Body schema: application/json
path
required
string non-empty

Workdir-relative path of the file to anchor

Responses

Request samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log"
}

Response samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log",
  • "anchor": "NDI=",
  • "line": 42
}

directory/create

/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.

Request Body schema: application/json
path
required
string non-empty

Workdir-relative path of the directory to create

parents
boolean
Default: false

Create any missing parent directories as well

Responses

Request samples

Content type
application/json
{
  • "path": "records/scratch",
  • "parents": false
}

Response samples

Content type
application/json
{
  • "path": "records/scratch",
  • "created": true
}

directory/delete

/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.

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "path": "records/scratch",
  • "recursive": false
}

Response samples

Content type
application/json
{
  • "path": "records/scratch",
  • "deleted": true
}

directory/read

/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.

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "path": "logs",
  • "recursive": false
}

Response samples

Content type
application/json
{
  • "path": "logs",
  • "entries": [
    ]
}

file/create

/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.

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "path": "records/scratch/new.txt",
  • "content": "string"
}

Response samples

Content type
application/json
{
  • "path": "records/scratch/new.txt",
  • "created": true,
  • "size": 0
}

file/delete

/rest-api/v3/file-system-controller/file/delete

Deletes a file under the workdir. Requires the delete permission. Use /directory/delete for directories.

Request Body schema: application/json
path
required
string non-empty

Workdir-relative path of the file to delete

Responses

Request samples

Content type
application/json
{
  • "path": "records/scratch/old.txt"
}

Response samples

Content type
application/json
{
  • "path": "records/scratch/old.txt",
  • "deleted": true
}

file/read

/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.

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log",
  • "encoding": "UTF-8",
  • "maxBytes": 65536
}

Response samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log",
  • "content": "...log lines...",
  • "size": 1048576,
  • "encoding": "UTF-8",
  • "truncated": true
}

file/write

/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.

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "path": "records/scratch/notes.txt",
  • "content": "hello world\n",
  • "mode": "OVERWRITE",
  • "createIfMissing": false
}

Response samples

Content type
application/json
{
  • "path": "records/scratch/notes.txt",
  • "bytesWritten": 12,
  • "size": 12
}

file/stream

/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).

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log",
  • "anchor": "NDI=",
  • "maxLines": 100
}

Response samples

Content type
application/json
{
  • "path": "logs/flashphoner_manager.log",
  • "fromLine": 42,
  • "toLine": 52,
  • "lines": [
    ],
  • "nextAnchor": "NTI=",
  • "eof": false
}

GPU

/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:

  • info — Retrieve GPU statistics and hardware information

info

/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.

Responses

Response samples

Content type
application/json
{
  • "cudaVersion": "12.4",
  • "nvencVersion": "12.2",
  • "driverVersion": "550.163.01",
  • "nvmlVersion": "12.550.163.01",
  • "numOfAvailableDevices": 1,
  • "numOfDecodingSessions": 1,
  • "numOfEncodingSessions": 5,
  • "numOfHostEncodingSessions": 6,
  • "deviceList": [
    ]
}

HLS

/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:

connections

/rest-api/v3/hls/connections

Returns information about active HLS network connections.

This endpoint provides low-level connection data related to HLS delivery.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/hls/find_all

Returns a list of active HLS streams. Returns an empty list if no streams are active.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "logCount": 50,
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

profile

/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.

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "hlsId": "stream1",
  • "profileName": "v_stream1"
}

Response samples

Content type
application/json
{
  • "stream": {
    },
  • "keyFrameReceived": true,
  • "audioProfile": {
    },
  • "videoProfile": {
    },
  • "metrics": {
    },
  • "subscribers": 3
}

start_recording Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
hlsIds
required
Array of strings unique

List of HLS segmenter identifiers to record

Responses

Request samples

Content type
application/json
{
  • "hlsIds": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

startup Job

/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.

HLS single node

Option 2. HLS with CDN

The stream is published to Origin, pulled by Edge, and converted to HLS on the Edge.

HLS CDN

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.

HLS ABR single node

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.

HLS ABR Edge transcoding

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.

HLS ABR Transcoder node

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use hls/find_all, stream/find, stream/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
streamName
required
string

Name of the published stream to start HLS segmenting for

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream1"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

stop_recording

/rest-api/v3/hls/stop_recording

Stops HLS recording and finalizes output files.

This operation is used to complete recording started via /start_recording.

Request Body schema: application/json
hlsIds
required
Array of strings unique

List of HLS segmenter identifiers to stop recording

Responses

Request samples

Content type
application/json
{
  • "hlsIds": [
    ]
}

subscribers

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "hlsId": "stream1",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

terminate

/rest-api/v3/hls/terminate

Stops an active HLS stream.

This operation immediately terminates HLS generation and releases associated resources.

Request Body schema: application/json
name
required
string

Name of the published stream to stop HLS segmenting for

Responses

Request samples

Content type
application/json
{
  • "name": "stream1"
}

Inject2

/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.

Inject2 overview

Available methods:

  • startup — Start injecting external media into a stream
  • terminate — Stop injection and restore the original stream
  • find_all — List all active injections

find_all

/rest-api/v3/inject2/find_all

Returns a list of all active media injections currently processed by the server.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use inject2/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "localStreamName": "stream1",
  • "remoteStreamName": "overlay",
  • "audio": true,
  • "video": true,
  • "muteIfAbsent": true
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

terminate

/rest-api/v3/inject2/terminate

Stop the specified media injection and restore the original stream. All injected content is removed and resources are released.

Request Body schema: application/json
localStreamName
required
string

Name of the stream into which the injection occurs

remoteStreamName
required
string

Name of the stream providing media for this injection

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "stream1",
  • "remoteStreamName": "overlay"
}

Inject3

/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:

  • startup — Start injecting a file into a published stream
  • update — Update injection parameters at runtime
  • terminate — Stop injection
  • find_all — List all active injections

find_all

/rest-api/v3/inject3/find_all

Returns a list of all active injections.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

Inject3 startup local file

Option 2. Injection from a remote file

The file is fetched from a remote URL before injection.

Inject3 startup remote file

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use /inject3/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "test",
  • "resources": [
    ],
  • "audio": {
    },
  • "video": {
    },
  • "speed": 1,
  • "loop": true,
  • "duration": 0,
  • "fps": 0,
  • "gop": 0
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

terminate

/rest-api/v3/inject3/terminate

Stop the specified injection and restore the original stream.

Request Body schema: application/json
localStreamName
required
string

Name of the stream into which the injection occurs

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "stream1"
}

update

/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.

Inject3 update

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "stream1",
  • "speed": 1.5,
  • "loop": false,
  • "duration": 96,
  • "fps": 30,
  • "gop": 10
}

Jobs

/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.

Job sync response

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 async response

Job statuses:

  • PENDING — queued, not yet started
  • RUNNING — currently executing
  • DONE — completed successfully
  • FAILED — completed with error
  • CANCELED — canceled by the user
  • TIMED_OUT — automatically canceled because the timeout was exceeded

Prefer 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:

  • find — Get detailed status of a specific job
  • find_all — List all registered jobs
  • cancel — Terminate a pending or running job

find

/rest-api/v3/jobs/find/{id}

Path-parameter version of the job lookup.

Responses

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

cancel

/rest-api/v3/jobs/cancel

Terminate a pending or running job. Only jobs marked as cancellable can be stopped.

Job cancel

Request Body schema: application/json
id
required
string

Job identifier (UUID), returned in the 202 Accepted response of an asynchronous operation

Responses

Request samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

find

/rest-api/v3/jobs/find

Retrieve detailed information about a single job by its ID.

Request Body schema: application/json
id
required
string

Job identifier (UUID), returned in the 202 Accepted response of an asynchronous operation

Responses

Request samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

find_all

/rest-api/v3/jobs/find_all

Returns a list of all currently registered jobs.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

Logger

/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:

disable_client_log

/rest-api/v3/logger/disable_client_log

Disable logging for a specific client session and return it to the default logging behavior.

Request Body schema: application/json
sessionId
required
string

Signaling session ID (Connection ID). For WebSocket connections the format is /remoteIP:port/localIP:port. Format varies for other connection types

Responses

Request samples

Content type
application/json
{
  • "sessionId": "/127.0.0.1:57539/192.168.1.101:8443"
}

enable_client_log

/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.

Enable client log

Request Body schema: application/json
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
Enum Description
ALL

All log messages

DEBUG

Debug messages and above

ERROR

Error messages and above

FATAL

Fatal errors only

INFO

Informational messages and above

OFF

No logging

TRACE

Trace messages and above

WARN

Warning messages and above

Per-connection logging level to set. Controls the log verbosity for this specific client without affecting other connections or global server logs

Responses

Request samples

Content type
application/json
{
  • "sessionId": "/127.0.0.1:57539/192.168.1.101:8443",
  • "logLevel": "DEBUG"
}

Mixer

/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.

Mixer overview

Available methods:

add

/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.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream",
  • "streamLabel": "Label",
  • "hasVideo": true,
  • "hasAudio": true,
  • "videoPositionId": "desktop",
  • "avatar": "/opt/avatar.png"
}

find_all

/rest-api/v3/mixer/find_all

Returns a list of all active mixers. Each entry contains the current state, configuration, and associated streams.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

remove

/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.

Request Body schema: application/json
uri
required
string^mixer://.+$

Unique mixer identifier. Format: mixer://{name}

remoteStreamName
required
string

Name of the published stream to remove from the mixer

Responses

Request samples

Content type
application/json
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream"
}

remove_stream_avatar

/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.

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream",
  • "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

setAudioVideo

/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.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "mixer://m1",
  • "query": {
    },
  • "settings": {
    }
}

set_body_watermark Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "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": {
    },
  • "frameSize": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

set_parameter Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

set_position

/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.

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream",
  • "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "videoPositionId": "desktop"
}

set_stream_avatar Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream",
  • "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "avatar": "path/to/avatar.png"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

set_stream_label

/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.

Request Body schema: application/json
Any of
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)

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "mixer://m1",
  • "remoteStreamName": "remote_stream",
  • "remoteMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "streamLabel": "Label"
}

set_stream_watermark Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "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"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

startup Job

/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.

Mixer startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use mixer/find_all, stream/find, stream/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json
{
  • "uri": "mixer://m1",
  • "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "localStreamName": "local_stream",
  • "status": "NEW",
  • "mediaSessions": [
    ],
  • "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
}

terminate

/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.

Request Body schema: application/json
uri
required
string^mixer://.*$

Unique mixer identifier. Format: mixer://{name}

Responses

Request samples

Content type
application/json
{
  • "uri": "mixer://m1"
}

set_background Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
uri
required
string^mixer://.+$

Unique mixer identifier

background
required
string

Background file URI

Responses

Request samples

Content type
application/json
{
  • "uri": "mixer://m1",
  • "background": "path/to/background.png"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

MPEGTS

/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:

  • startup — Open a port and start receiving an MPEG-TS stream
  • terminate — Stop receiving and close the port
  • find — Search for active sessions by filter
  • find_all — List all active sessions

find

/rest-api/v3/mpegts/find

Search for active MPEG-TS sessions by filter criteria. Returns an empty list if no sessions match.

Request Body schema: application/json
Any of
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "srt://127.0.0.1:31004",
  • "localStreamName": "s0",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/mpegts/find_all

Returns a list of all active MPEG-TS sessions. Returns an empty list if none are active.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

MPEGTS startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use mpegts/find, mpegts/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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"
Enum Description
SRT

Secure Reliable Transport protocol

UDP

User Datagram Protocol transport

Transport protocol used for receiving MPEG-TS data: UDP or SRT

streams
required
Array of strings (stream) non-empty unique
Items Enum Description
AUDIO

Include audio track

VIDEO

Include video track

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

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "s0",
  • "transport": "UDP",
  • "streams": [
    ],
  • "allowedSubnets": [
    ],
  • "timeout": 1000,
  • "maxTimestampDiff": 1
}

Response samples

Content type
application/json
{
  • "uri": "udp://127.0.0.1:31006",
  • "localStreamName": "s0",
  • "localMediaSessionId": "c1549269-8070-4e8d-9528-2e4a70afeac1",
  • "hasVideo": true,
  • "hasAudio": true,
  • "timeout": 1000,
  • "maxTimestampDiff": 1,
  • "allowedList": [
    ],
  • "transport": "UDP",
  • "port": 31006
}

terminate

/rest-api/v3/mpegts/terminate

Stop receiving the MPEG-TS stream and close the port.

Request Body schema: application/json
uri
required
string^(srt|udp)://.+$

MPEG-TS session URI (e.g. udp://127.0.0.1:31006 or srt://127.0.0.1:31004)

Responses

Request samples

Content type
application/json
{
  • "uri": "srt://127.0.0.1:31004"
}

Multi Recorder

/rest-api/v3/multi_recorder

The Multi Recorder endpoint manages recording of multiple streams into a single file with multiple tracks.

Available methods:

  • startup — Start a new multi-recorder
  • add — Add a stream to the multi-recorder
  • remove — Remove a stream from the multi-recorder
  • terminate — Stop the multi-recorder
  • find_all — List all active multi-recorders

add

/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.

Multi Recorder add

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "multi-recorder://mr0",
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

find_all

/rest-api/v3/multi_recorder/find_all

Returns a list of all active multi-recorders.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

remove

/rest-api/v3/multi_recorder/remove

Remove a stream from the multi-recorder.

Multi Recorder remove

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "multi-recorder://mr0",
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

startup Job

/rest-api/v3/multi_recorder/startup

Starts a new multi-recorder with the provided parameters

Multi Recorder startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use multi_recorder/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
uri
required
string^multi-recorder://.+$

Multi-recorder identifier (e.g. multi-recorder://mr0)

Responses

Request samples

Content type
application/json
{
  • "uri": "multi-recorder://mr0"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

terminate

/rest-api/v3/multi_recorder/terminate

Stop the multi-recorder and finalize the output file.

Request Body schema: application/json
uri
required
string^multi-recorder://.+$

Multi-recorder identifier (e.g. multi-recorder://mr0)

Responses

Request samples

Content type
application/json
{
  • "uri": "multi-recorder://mr0"
}

PCAP

/rest-api/v3/pcap

The PCAP endpoint replays recorded network traffic from PCAP files as internal streams, simulating real-time packet flow.

Available methods:

  • startup — Start replaying a PCAP file as a stream
  • terminate — Stop replaying
  • find — Search for active sessions by filter
  • find_all — List all active sessions

find

/rest-api/v3/pcap/find

Search for active PCAP sessions by filter criteria. Returns an empty list if no sessions match.

Request Body schema: application/json
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
Enum Description
CONNECTED

Connected to the media engine

FAILED

An error occurred during PCAP playback

NEW

PCAP session created, not yet started

PROCESSED_LOCAL

Stream is active, publishing from local PCAP file

PROCESSED_REMOTE

Not used by PCAP (reserved for other types)

STOPPED

PCAP session stopped

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "uri": "pcap://config.yaml",
  • "localStreamName": "s0",
  • "state": "NEW",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/pcap/find_all

Returns a list of all active PCAP sessions. Returns an empty list if none are active.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

PCAP startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use pcap/find, pcap/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "pcap://config.yaml",
  • "localStreamName": "s0"
}

Response samples

Content type
application/json
{
  • "uri": "pcap://config.yaml",
  • "localStreamName": "s0",
  • "localMediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "state": "NEW"
}

terminate

/rest-api/v3/pcap/terminate

Stop replaying a PCAP file.

Request Body schema: application/json
uri
required
string^pcap://.+$

PCAP session URI (e.g. pcap://config.yaml). The path specifies the PCAP configuration file

Responses

Request samples

Content type
application/json
{
  • "uri": "pcap://config.yaml"
}

Process

/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:

  • shutdown — Stop the server (exit code 0)
  • restart — Restart the server process (exit code 54, relaunched by the startup script)

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.

restart

/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.

Responses

shutdown

/rest-api/v3/process/shutdown

Gracefully stop the server. The JVM exits with code 0 once the response has been sent, which systemd treats as a clean stop (no restart).

Responses

Publisher

/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:

change_painter_strategy

/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.

Publisher change painter strategy

Request Body schema: application/json
uri
required
string^publisher://.+$

Publisher identifier (e.g. publisher://p0)

required
object (PublisherPainterStrategyFactory)

Video rendering strategy for the generated stream

Responses

Request samples

Content type
application/json
{
  • "uri": "publisher://p0",
  • "painterStrategyFactory": {
    }
}

find_all

/rest-api/v3/publisher/find_all

Returns a list of all active publishers.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup

/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.

Publisher startup

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "publisher://p0",
  • "localStreamName": "s0",
  • "video": {
    },
  • "audio": {
    }
}

terminate

/rest-api/v3/publisher/terminate

Stop generating the stream and remove the publisher associated with the specified URI.

Request Body schema: application/json
uri
required
string^publisher://.+$

Publisher identifier (e.g. publisher://p0)

Responses

Request samples

Content type
application/json
{
  • "uri": "publisher://p0"
}

Pull RTMP

/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:

  • startup — Start pulling an RTMP stream from a remote server
  • terminate — Stop pulling
  • find_all — List all active pull sessions

find_all

/rest-api/v3/pull/rtmp/find_all

Returns a list of all active RTMP pull sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

Pull RTMP startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use stream/find, stream/find_all, rtmp/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "rtmp://p19.flashphoner.com:1935/live/myStream",
  • "localStreamName": "string",
  • "record": true,
  • "hasAudio": true,
  • "hasVideo": true
}

Response samples

Content type
application/json
{
  • "uri": "rtmp://myserver.com/live/myStream",
  • "localStreamName": "string",
  • "localMediaSessionId": "string",
  • "status": "NEW",
  • "record": true,
  • "hasAudio": true,
  • "hasVideo": true
}

terminate

/rest-api/v3/pull/rtmp/terminate

Stop pulling the RTMP stream.

Request Body schema: application/json
uri
required
string^rtmp:\/\/.*$

RTMP URL of the stream to terminate (e.g. rtmp://server/live/stream)

Responses

Request samples

Content type
application/json
{
  • "uri": "rtmp://p19.flashphoner.com:1935/live/myStream"
}

Pull WebRTC

/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:

  • startup — Start pulling a WebRTC stream from another WCS server
  • terminate — Stop pulling
  • find_all — List all active pull sessions

find_all

/rest-api/v3/pull/webrtc/find_all

Returns a list of all active WebRTC pull sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

Pull WebRTC startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use stream/find, stream/find_all, pull/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "wss://demo.flashphoner.com:8443/websocket",
  • "remoteStreamName": "string",
  • "localStreamName": "Same as remoteStreamName field",
  • "turnConfig": {
    }
}

Response samples

Content type
application/json
{
  • "uri": "wss://demo.flashphoner.com:8443/websocket",
  • "localStreamName": "string",
  • "remoteStreamName": "string",
  • "localMediaSessionId": "string",
  • "remoteMediaSessionId": "string",
  • "status": "NEW"
}

terminate

/rest-api/v3/pull/webrtc/terminate

Stop pulling the WebRTC stream.

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "wss://demo.flashphoner.com:8443",
  • "remoteStreamName": "string",
  • "localStreamName": "string"
}

Push RTMP

/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:

  • startup — Start pushing a stream as RTMP to a remote server
  • terminate — Stop pushing
  • mute — Mute audio in the pushed stream
  • unmute — Unmute audio
  • sound_on — Inject audio from a WAV file
  • sound_off — Stop audio injection
  • find — Search for active push sessions by filter
  • find_all — List all active push sessions

find

/rest-api/v3/push/rtmp/find

Search for active push sessions by filter.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "streamName": "stream_01",
  • "rtmpUrl": "rtmp://wcs.com:1935/live/test",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/push/rtmp/find_all

Returns a list of all active RTMP push sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

mute

/rest-api/v3/push/rtmp/mute

Mute audio in the pushed RTMP stream.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the RTMP push session

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

sound_off

/rest-api/v3/push/rtmp/sound_off

Stop the audio injection previously started via sound_on.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the RTMP push session

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

sound_on Job

/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.

Push RTMP sound on

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "soundFile": "sound.wav",
  • "loop": false
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

startup Job

/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.

Push RTMP startup

Option 2. Push to another WCS

The RTMP stream is directed to another WCS instance, where it becomes available for playback.

Push RTMP to WCS

Option 3. Push with transcoding

The source stream is transcoded to the desired parameters (resolution, GOP, etc.) before being pushed as RTMP.

Push RTMP with transcoding

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use push/find, push/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "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": {
    }
}

Response samples

Content type
application/json
{
  • "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": {
    }
}

terminate

/rest-api/v3/push/rtmp/terminate

Stop pushing the RTMP stream.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the RTMP push session

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

unmute

/rest-api/v3/push/rtmp/unmute

Unmute audio in the pushed RTMP stream.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the RTMP push session

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

Push WebRTC

/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:

  • startup — Start pushing a stream via WebRTC to another WCS server
  • terminate — Stop pushing
  • find_all — List all active push sessions

find_all

/rest-api/v3/push/webrtc/find_all

Returns a list of all active WebRTC push sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

Push WebRTC startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use stream/find, stream/find_all, webrtc/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "wss://demo.flashphoner.com:8443/websocket",
  • "localStreamName": "string",
  • "remoteStreamName": "string"
}

Response samples

Content type
application/json
{
  • "uri": "wss://demo.flashphoner.com:8443/websocket",
  • "localStreamName": "string",
  • "remoteStreamName": "string",
  • "localMediaSessionId": "string",
  • "remoteMediaSessionId": "string",
  • "status": "NEW"
}

terminate

/rest-api/v3/push/webrtc/terminate

Stop pushing the WebRTC stream.

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "wss://demo.flashphoner.com:8443",
  • "remoteStreamName": "string",
  • "localStreamName": "string"
}

Recorder

/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:

find_all

/rest-api/v3/recorder/find_all

Returns a list of all active recording sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

startup Job

/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.

Recorder startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use recorder/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the stream to record

object (Config)

Recording configuration: file name template and rotation settings

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "config": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

terminate

/rest-api/v3/recorder/terminate

Stop recording and finalize the output file.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the stream to stop recording

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

RELS

/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:

  • startup — Enable RELS tracking for a session
  • terminate — Disable RELS tracking for a session
  • terminate_all — Disable RELS tracking for all sessions
  • find_all — List all active RELS sessions

find_all

/rest-api/v3/rels/find_all

Returns all tracked RELS entities and database IO statistics.

Responses

Response samples

Content type
application/json
{
  • "MEDIA_SESSION": {
    },
  • "HLS_SEGMENTER": {
    },
  • "HLS_CLIENT": {
    },
  • "MIXER_STREAMS": {
    },
  • "MIXER": {
    },
  • "PACKET_EVENT": {
    },
  • "PLAYER_PACKET_EVENT": {
    },
  • "RTMP_IN_BUFFER": {
    },
  • "RTMP_OUT_BUFFER": {
    },
  • "RTP_SYNCHRONIZATION": {
    },
  • "STUN": {
    },
  • "CONNECTION": {
    },
  • "STREAM": {
    },
  • "CDN": {
    },
  • "HLS_STREAM": {
    },
  • "AUDIO_RECOVERY": {
    },
  • "REST_HOOKS": {
    },
  • "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": {
    },
  • "sfuSessionsMetadata": {
    },
  • "CDN_MESSAGE": {
    },
  • "CDN_PING": {
    },
  • "CDN_ROUTE_MONITOR": {
    }
}

startup

/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.

RELS startup to file

Option 2. Sending metrics to ClickHouse

WCS sends tracked event data to a ClickHouse database.

RELS startup to ClickHouse

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "MEDIA_SESSION": {
    },
  • "HLS_SEGMENTER": {
    },
  • "HLS_CLIENT": {
    },
  • "MIXER_STREAMS": {
    },
  • "MIXER": {
    },
  • "PACKET_EVENT": {
    },
  • "PLAYER_PACKET_EVENT": {
    },
  • "RTMP_IN_BUFFER": {
    },
  • "RTMP_OUT_BUFFER": {
    },
  • "RTP_SYNCHRONIZATION": {
    },
  • "STUN": {
    }
}

Response samples

Content type
application/json
{
  • "succeedOperationIds": {
    }
}

terminate

/rest-api/v3/rels/terminate

Disable RELS tracking for specified sessions.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "MEDIA_SESSION": [
    ],
  • "HLS_SEGMENTER": [
    ],
  • "HLS_CLIENT": [
    ],
  • "MIXER_STREAMS": [
    ],
  • "MIXER": [
    ],
  • "PACKET_EVENT": [
    ],
  • "PLAYER_PACKET_EVENT": [
    ],
  • "RTMP_IN_BUFFER": [
    ],
  • "RTMP_OUT_BUFFER": [
    ],
  • "RTP_SYNCHRONIZATION": [
    ],
  • "STUN": [
    ]
}

Response samples

Content type
application/json
{
  • "succeedOperationIds": {
    }
}

terminate_all

/rest-api/v3/rels/terminate_all

Disable RELS tracking for all session IDs of the specified event types.

Request Body schema: application/json
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"

Responses

Request samples

Content type
application/json
{
  • "eventTypes": [
    ]
}

Response samples

Content type
application/json
{
  • "succeedOperationIds": {
    }
}

RTSP

/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:

  • startup — Start pulling an RTSP stream
  • terminate — Stop pulling
  • find — Search for active RTSP sessions by filter
  • find_all — List all active RTSP sessions

find

/rest-api/v3/rtsp/find

Search for active RTSP sessions by filter criteria.

Request Body schema: application/json
Any of
uri
required
string^rtsp://.*$

RTSP URL of the IP camera or stream source (e.g. rtsp://server:554/stream)

status
string
Enum Description
CONNECTING

Connecting to RTSP server, waiting for response

DESCRIBE

DESCRIBE request sent, waiting for SDP response

DISCONNECTED

Disconnected from RTSP server, TCP connection closed

NEW

Session has just been created

PLAYING

Received 200 OK on PLAY request, media streams are active

PLAY_SENT

PLAY request sent, waiting for server response and RTP packets

REDIRECT

Received redirect from RTSP server

SETUP_AUDIO

SETUP request sent for audio stream, waiting for response

SETUP_VIDEO

SETUP request sent for video stream, waiting for response

SWITCHING_TRANSPORT

No RTP packets received, switching transport protocol to TCP

TEARDOWN_SENT

TEARDOWN request sent, waiting for TCP connection termination

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "rtsp://demo.flashphoner.com:5554/stream1",
  • "status": "PLAYING",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/rtsp/find_all

Returns a list of all active RTSP sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

RTSP startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use rtsp/find, rtsp/find_all, stream/find, stream/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "uri": "rtsp://demo.flashphoner.com:5554/stream1",
  • "localStreamName": "stream1",
  • "headers": {
    }
}

Response samples

Content type
application/json
{
  • "uri": "rtsp://demo.flashphoner.com:5554/stream1",
  • "localStreamName": "local_stream",
  • "status": "PLAYING",
  • "headers": {
    }
}

terminate

/rest-api/v3/rtsp/terminate

Stop pulling the RTSP stream.

Request Body schema: application/json
uri
required
string^rtsp://.*$

RTSP URL of the session to terminate (e.g. rtsp://server:554/stream)

Responses

Request samples

Content type
application/json
{
  • "uri": "rtsp://demo.flashphoner.com:5554/stream1"
}

Settings

/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, type
  • ONLY_NAME — only the name

Available methods:

  • find_all — List all settings (paginated)
  • find_by_name — Search by setting name (case-insensitive contains, paginated)
  • find_by_description — Search by description (case-insensitive contains, paginated)
  • about — Get a single setting by name or alias (always FULL)
  • update — Update a setting; optionally persist to flashphoner.properties

about

/rest-api/v3/settings/about

Get a single setting by name or alias. Response is always in FULL representation.

Request Body schema: application/json
name
required
string non-empty

Setting name or alias

Responses

Request samples

Content type
application/json
{
  • "name": "ws.port"
}

Response samples

Content type
application/json
{
  • "name": "ws.port",
  • "description": "WebSocket connection port",
  • "currentValue": "8080",
  • "defaultValue": "8080",
  • "dynamic": false,
  • "type": "Integer"
}

find_all

/rest-api/v3/settings/find_all

Returns a list of all server settings, sorted alphabetically by name.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "type": "FULL",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_by_description

/rest-api/v3/settings/find_by_description

Search for settings whose description contains the given substring (case-insensitive). Sorted alphabetically by name.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "query": "WebSocket",
  • "type": "FULL",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_by_name

/rest-api/v3/settings/find_by_name

Search for settings whose name contains the given substring (case-insensitive). Sorted alphabetically by name.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "query": "ws.port",
  • "type": "FULL",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

update

/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:

  • If the file already contains an entry for the setting (under primary name or any alias), the value is replaced in place — comments and formatting are preserved.
  • Otherwise, a new line 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.

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "name": "ws.port",
  • "value": "9090",
  • "persist": true
}

SFU

/rest-api/v3/sfu

Endpoint for managing SFU rooms.

Available methods:

  • stats — Get room statistics by name

stats

/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.

SFU stats

Request Body schema: application/json
roomName
required
string

Unique SFU Room name

Responses

Request samples

Content type
application/json
{
  • "roomName": "ROOM1"
}

Response samples

Content type
application/json
{
  • "participants": [
    ]
}

SFU RTC Metrics

/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:

  • update_batch — Update metrics description for specific sessions
  • update_all — Update metrics description for all sessions
  • find — Find metrics descriptions by filter
  • find_all — List all metrics descriptions

find

/rest-api/v3/sfu/rtc_metrics/find

Find metrics descriptions for SFU sessions matching the filter criteria.

Request Body schema: application/json
collect
string (collect)
Enum Description
off

Server ignores metrics from the client

on

Server accepts metrics from the client

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "collect": "off",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/sfu/rtc_metrics/find_all

Returns metrics descriptions for all active SFU sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

update_all

/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.

SFU RTC Metrics update all via WCS

Option 2. Metrics ingested by an external HTTP Ingest endpoint

Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.

SFU RTC Metrics update all via HTTP Ingest

Request Body schema: application/json
collect
required
string (collect)
Enum Description
off

Server ignores metrics from the client

on

Server accepts metrics from the client

Whether the server accepts metrics from the client. When off, metrics sent by the client are ignored

Responses

Request samples

Content type
application/json
{
  • "collect": "on"
}

Response samples

Content type
application/json
{
  • "mediaSessionUpdatedCount": 2
}

update_batch

/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.

SFU RTC Metrics update batch via WCS

Option 2. Metrics ingested by an external HTTP Ingest endpoint

Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.

SFU RTC Metrics update batch via HTTP Ingest

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "description": {
    },
  • "filter": {
    }
}

Response samples

Content type
application/json

Multi-status response

{
  • "mediaSessionUpdatedCount": 1,
  • "roomIds": [ ],
  • "roomNames": [
    ],
  • "mediaSessionIds": [ ],
  • "userIds": [ ],
  • "nickNames": [
    ]
}

Stream

/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:

send_event

/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.

Stream send event

Option 2. CDN (Origin + Edge)

The event is also delivered to subscribers receiving the stream from an Edge node.

Stream send event with CDN

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "streamName": "s0",
  • "payload": {
    }
}

snapshot Job

/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.

Stream snapshot

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use jobs/find, jobs/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

The snapshot will be returned either as a link or as a Base64-encoded string in the `result` parameter
Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "streamName": "s0",
  • "format": "PNG",
  • "delivery": "LINK"
}

Response samples

Content type
application/json
{
  • "snapshot": "string"
}

start_recording Deprecated Job

/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.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use recorder/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
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"

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "fileTemplate": "{streamName}-{startTime}-{endTime}",
  • "rotation": "20M"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

stop_recording Deprecated

/rest-api/v3/stream/stop_recording

Stop recording a stream. Deprecated, use recorder/terminate instead.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the stream to stop recording

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

terminate

/rest-api/v3/stream/terminate

Terminate a stream by its media session ID.

Request Body schema: application/json
mediaSessionId
required
string

Media session ID of the stream to terminate

Responses

Request samples

Content type
application/json
{
  • "mediaSessionId": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60"
}

find

/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.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "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": [
    ],
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/stream/find_all

Returns a list of all active streams. Returns an empty list if none are active.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
{
  • "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": {
    },
  • "appKey": "defaultApp",
  • "nodeId": "7aoC1Q9IkTCn4zEsNAKvl1P1QMnXfnKE@192.168.100.1",
  • "sessionId": "/192.168.1.102:13252/192.168.1.101:8443"
}

Stream RTC Metrics

/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:

  • update_batch — Update metrics description for specific sessions
  • update_all — Update metrics description for all sessions
  • find — Find metrics descriptions by filter
  • find_all — List all metrics descriptions

find

/rest-api/v3/stream/rtc_metrics/find

Find metrics descriptions for streaming sessions matching the filter criteria.

Request Body schema: application/json
collect
string (collect)
Enum Description
off

Server ignores metrics from the client

on

Server accepts metrics from the client

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "collect": "off",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/stream/rtc_metrics/find_all

Returns metrics descriptions for all active streaming sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

update_all

/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.

Streaming RTC Metrics update all via WCS

Option 2. Metrics ingested by an external HTTP Ingest endpoint

Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.

Streaming RTC Metrics update all via HTTP Ingest

Request Body schema: application/json
collect
required
string (collect)
Enum Description
off

Server ignores metrics from the client

on

Server accepts metrics from the client

Whether the server accepts metrics from the client. When off, metrics sent by the client are ignored

Responses

Request samples

Content type
application/json
{
  • "collect": "on"
}

Response samples

Content type
application/json
{
  • "mediaSessionUpdatedCount": 2
}

update_batch

/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.

Streaming RTC Metrics update batch via WCS

Option 2. Metrics ingested by an external HTTP Ingest endpoint

Clients send metrics to an external HTTP/HTTPS endpoint specified in ingestPoint.

Streaming RTC Metrics update batch via HTTP Ingest

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "description": {
    },
  • "filter": {
    }
}

Response samples

Content type
application/json

Multi-status response

{
  • "mediaSessionUpdatedCount": 1,
  • "sessionIds": [
    ],
  • "mediaSessionIds": [ ],
  • "streamNames": [
    ]
}

Stream Composite

/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.

Composite stream overview

Available methods:

  • find — Get composite stream info by name
  • find_all — List all composite streams

find

/rest-api/v3/stream_composite/find

Get composite stream information by name, including profiles and synchronization logs.

Request Body schema: application/json
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.

Responses

Request samples

Content type
application/json
{
  • "name": "test",
  • "logCount": 50
}

Response samples

Content type
application/json
{
  • "name": "test",
  • "profiles": [
    ],
  • "logs": [
    ]
}

find_all

/rest-api/v3/stream_composite/find_all

Returns a list of all composite streams with their profiles and logs.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "logCount": 50,
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

Stream Analyzer

/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.

request Job

/rest-api/v3/stream_analyzer/request

Submit a stream for frame-by-frame comparison against a Base64-encoded reference PNG image.

Stream Analyzer overview

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use jobs/find, jobs/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

The comparison result (algorithm name and similarity value in [0, 1] range) will be returned in the `result` parameter
Request Body schema: application/json

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

Responses

Request samples

Content type
application/json
{
  • "streamName": "s0",
  • "base64EncodedReference": "iVBORw0KGgoAAAANSUhEUgAAAoAAA...",
  • "considerColor": true,
  • "comparisonAlgorithmFactory": {
    },
  • "rescalerAlgorithmFactory": {
    }
}

Response samples

Content type
application/json
{
  • "algorithmName": "SSIM",
  • "value": 0.9991907314622465
}

Transcoder2

/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:

  • startup — Start transcoding a stream
  • terminate — Stop transcoding
  • set_watermark — Apply a watermark to the output stream
  • find — Search for active transcoding sessions by filter
  • find_all — List all active transcoding sessions

find

/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.

Request Body schema: application/json
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
Enum Description
CONNECTED

Connected to the media engine, transcoding not yet active

FAILED

An error occurred during transcoding

NEW

Transcoding session created, not yet started

PROCESSED_LOCAL

Transcoding is active, output stream is publishing

PROCESSED_REMOTE

Not used by Transcoder2 (reserved for other agent types)

STOPPED

Transcoding session stopped

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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "uri": "transcoder2://t1",
  • "localStreamName": "local_stream",
  • "remoteStreamName": "remote_stream",
  • "status": "NEW",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/transcoder2/find_all

Returns a list of all active transcoding sessions. Returns an empty list if none are active.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

set_watermark Job

/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.

Transcoder2 set watermark

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "transcoder2://t1",
  • "watermark": "path/to/watermark.png",
  • "x": 30,
  • "y": 10,
  • "marginRight": 20,
  • "marginBottom": 50,
  • "marginLeft": 150,
  • "marginTop": 15,
  • "watermarkSize": {
    },
  • "frameSize": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

startup Job

/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.

Transcoder2 startup

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use transcoder2/find, transcoder2/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "uri": "transcoder2://t1",
  • "localStreamName": "local_stream",
  • "remoteStreamName": "remote_stream",
  • "encoder": {
    }
}

Response samples

Content type
application/json
{
  • "uri": "transcoder2://t1",
  • "localStreamName": "local_stream",
  • "remoteStreamName": "remote_stream",
  • "status": "NEW",
  • "localMediaSessionId": "06844ffd-1dce-4a77-a2c2-37629f0e4d13",
  • "encoder": {
    }
}

terminate

/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.

Request Body schema: application/json
uri
required
string^transcoder2://.*$

Unique transcoder identifier. Format: transcoder2://{name}

Responses

Request samples

Content type
application/json
{
  • "uri": "transcoder2://t1"
}

Transcoder Stat

/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:

  • A subscriber requests specific parameters (width, height, bitrate, codec, fps) that differ from the published stream
  • Server-wide forced decoding is enabled via streaming_video_decoder_fast_start=true in flashphoner.properties
  • A stream is added to a Mixer — all input streams must be decoded
  • HLS ABR or WebRTC ABR is started — the source stream is decoded for multi-profile transcoding
  • A CDN Transcoder node decodes a stream pulled from Origin for composite ABR transcoding
  • A snapshot is taken — the stream is decoded to extract a video frame
  • A watermark or avatar image (JPEG, PNG) is decoded to YUV for overlay into the stream

Encoders are created when:

  • A subscriber requires a different codec or resolution than the publisher
  • transcoder2/startup is called via REST
  • HLS ABR or WebRTC ABR produces multiple quality profiles — each profile has its own encoder
  • A CDN Transcoder node encodes streams into transcoding profiles for composite stream delivery to Edge
  • An Edge node requests a single transcoding profile (e.g. stream1-720p) — the encoder is created on the Transcoder node
  • A Mixer produces its output stream — the mixed canvas is encoded
  • A snapshot is taken — the decoded frame is encoded to PNG or JPEG

Mixers are created when:

  • mixer/startup is called via REST
  • A stream is published with a mixer URI format (e.g. stream1#mixer1)

Available methods:

find_all

/rest-api/v3/transcoder-stat/find_all

Returns all active encoders and decoders, sorted by height.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_decoders

/rest-api/v3/transcoder-stat/find_decoders

Returns active decoders only, sorted by height.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
{
  • "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"
}

find_encoders

/rest-api/v3/transcoder-stat/find_encoders

Returns active encoders only, sorted by height.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
{
  • "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"
}

User

/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:

  • find_all — List all users (paginated)
  • find — Get a single user by name
  • create — Create a new user
  • update — Update an existing user
  • delete — Delete a user

create

/rest-api/v3/user/create

Create a new user. The password is accepted in plaintext and stored hashed.

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "username": "user1",
  • "password": "secret",
  • "active": true
}

delete

/rest-api/v3/user/delete

Delete a user by name.

Request Body schema: application/json
username
required
string non-empty

User name

Responses

Request samples

Content type
application/json
{
  • "username": "user1"
}

find

/rest-api/v3/user/find

Get a single user by name. The password is never included.

Request Body schema: application/json
username
required
string non-empty

User name

Responses

Request samples

Content type
application/json
{
  • "username": "user1"
}

Response samples

Content type
application/json
{
  • "username": "user1",
  • "active": true
}

find_all

/rest-api/v3/user/find_all

Returns a list of all users, sorted alphabetically by name. Passwords are never included.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

update

/rest-api/v3/user/update

Update an existing user.

  • If password is provided (non-blank), it is treated as plaintext and stored hashed.
  • If password is omitted or blank, the existing password is preserved.
  • If active is omitted, the existing value is preserved.
Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "username": "user1",
  • "password": "secret",
  • "active": true
}

Video Interceptor

/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:

  • set — Attach an interceptor to a stream
  • remove — Remove an interceptor from a stream
  • find — Get the interceptor for a specific stream
  • find_all — List all active interceptors

find

/rest-api/v3/video_interceptor/find

Get the interceptor attached to the specified stream. Returns an empty list if none is set.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "streamName": "test",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/video_interceptor/find_all

Returns a list of all active interceptors.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

remove

/rest-api/v3/video_interceptor/remove

Remove the interceptor from the stream.

Request Body schema: application/json
streamName
required
string

Name of the published stream to remove the interceptor from

Responses

Request samples

Content type
application/json
{
  • "streamName": "test"
}

set

/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.

Video Interceptor set with blur

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "streamName": "test",
  • "className": "com.flashphoner.frameInterceptor.TestInterceptor"
}

VOD

/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:

  • startup — Start playing a VOD file as a stream
  • terminate — Stop VOD playback
  • find — Search for active VOD sessions by filter
  • find_all — List all active VOD sessions

find

/rest-api/v3/vod/find

Search for active VOD sessions by filter criteria. With an empty body, returns all active sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "localStreamName": "string",
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

find_all

/rest-api/v3/vod/find_all

Returns a list of all active VOD sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
[
  • {
    }
]

startup Job

/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.

VOD startup local file

Option 2. Remote file

The file is fetched from a remote HTTP server (e.g. S3).

VOD startup remote file

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error
  • CANCELED — Job was canceled by the user via /jobs/cancel
  • TIMED_OUT — Job was automatically canceled because the timeout was exceeded

Use vod/find, vod/find_all, stream/find, stream/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

● JOB CANCELLABLE

Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "uri": "vod-live://sample.mp4",
  • "localStreamName": "Same as uri field",
  • "loop": true
}

Response samples

Content type
application/json
{
  • "localMediaSessionId": "29ec3236-1093-42bb-88d6-d4ac37af3ac0",
  • "localStreamName": "test",
  • "uri": "vod-live://sample.mp4",
  • "status": "NEW",
  • "hasAudio": true,
  • "hasVideo": true,
  • "record": true,
  • "loop": true
}

terminate

/rest-api/v3/vod/terminate

Stop VOD playback. With an empty body, stops all active VOD sessions.

Request Body schema: application/json
Any of
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

Responses

Request samples

Content type
application/json
Example
{
  • "uri": "vod-live://sample.mp4",
  • "localStreamName": "string"
}

WebRTC ABR

/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:

  • startup — Start a WebRTC ABR session
  • terminate — Stop a WebRTC ABR session
  • subscribers — Get subscriber info for a session
  • find_all — List all active WebRTC ABR sessions

find_all

/rest-api/v3/webrtc_abr/find_all

Returns a list of all active WebRTC ABR sessions.

Request Body schema: application/json
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 rest_api_implicit_limit. Capped by rest_api_max_limit if that setting is non-zero.

offset
integer <int32> >= 0
Default: 0

Number of items to skip from the beginning of the collection. Default: 0.

Responses

Request samples

Content type
application/json
{
  • "logCount": 50,
  • "limit": 1000,
  • "offset": 0
}

Response samples

Content type
application/json
{
  • "streamName": "testName",
  • "state": "NEW",
  • "profiles": [
    ],
  • "createdDate": "2026-04-12 10:30:15.123000+00:00",
  • "logs": [
    ]
}

startup Job

/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.

WebRTC ABR single node

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.

WebRTC ABR CDN Edge transcoding

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.

WebRTC ABR CDN Transcoder

INFO

Asynchronous job details (click to expand)

This method initiates an asynchronous Job.

  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. The result can be retrieved later using /jobs/find — it will be available in the result field of the Job object.

Job statuses

  • PENDING — Job created, waiting to start
  • RUNNING — Job is in progress
  • DONE — Job completed successfully
  • FAILED — Job failed with an error

Use webrtc_abr/find_all to check the result directly.

Prefer HTTP 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. Returns 200 OK if the job finishes within the specified time, otherwise 202 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 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.

○ JOB NOT CANCELLABLE

Request Body schema: application/json
streamName
required
string

Name of the published stream that is transcoded into ABR profiles

Responses

Request samples

Content type
application/json
{
  • "streamName": "testName"
}

Response samples

Content type
application/json
{
  • "id": "d1ddc1ce-90e7-40dd-93b7-fff0e4438a60",
  • "startTime": "1762984422789",
  • "finishTime": "1762984422795",
  • "status": "RUNNING",
  • "info": "string",
  • "requestInfo": {
    },
  • "timeout": {
    },
  • "isCancellable": true
}

subscribers

/rest-api/v3/webrtc_abr/subscribers

Get information about viewers currently subscribed to a WebRTC ABR session.

Request Body schema: application/json
streamName
required
string

Name of the published stream that is transcoded into ABR profiles

Responses

Request samples

Content type
application/json
{
  • "streamName": "testName"
}

Response samples

Content type
application/json
{
  • "subscriberCount": 1,
  • "subscribersInfo": [
    ]
}

terminate

/rest-api/v3/webrtc_abr/terminate

Stop a WebRTC ABR session.

Request Body schema: application/json
streamName
required
string

Name of the published stream that is transcoded into ABR profiles

Responses

Request samples

Content type
application/json
{
  • "streamName": "testName"
}