get /openapi.yaml
This OpenAPI document
Responses
- 200
The embedded docs/openapi.yaml.
string - 401
Errorunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Everything the web UI does goes through this API. The contract is OpenAPI 3.1; every server also serves it at GET /api/v1/openapi.yaml for code generators and Postman.
/api/v1; JSON with snake_case fields. Unknown request fields are rejected, so typos never silently do nothing.Authorization: Bearer <key>), user (Basic) or the web UI session. Roles admin (everything) and viewer (all reads; secrets redacted)."2s", "6000k"); measured values are plain numbers.{"error":{"code","message","details":[…]}}.GET /events.Alteox Media Server REST API, version 1 · 74 operations in 17 groups.
Human-readable reference with all rules: docs/API.md. Curl and Python recipes: docs/API-EXAMPLES.md.
/config (YAML), /events (server-sent events), /health?format=nagios (plain text) and this document.400 bad_request).Error body."2s", "500ms"), configured bitrates "6000k"/"6M" or an integer (bit/s); measured values are plain numbers (bit/s, seconds).Create a key with alteoxms gen-key -name automation -role admin and put the printed entry into api.keys.
export AMS=http://media.example:8080
export AMS_KEY='…key printed by alteoxms gen-key…'
H="Authorization: Bearer $AMS_KEY"
# create a channel with failover inputs and HLS
curl -sS --fail-with-body -X POST "$AMS/api/v1/channels" -H "$H" \
-H 'Content-Type: application/json' --data '{
"name": "sport1",
"inputs": [ { "url": "srt://encoder-a.example:9000?mode=caller&latency=200" },
{ "url": "udp://239.1.1.1:1234?iface=eth1" } ],
"failover": { "loss_timeout": "2s", "return_after": "30s", "standby": "hot" },
"outputs": { "srt": true, "http_ts": true, "hls": { "segment": "4s", "window": 6 } }
}'
# playback URLs and state
curl -sS -H "$H" "$AMS/api/v1/channels/sport1/status" | jq '.outputs.hls.url'
# change one setting (JSON Merge Patch), restart, health for monitoring
curl -sS -X PATCH "$AMS/api/v1/channels/sport1" -H "$H" \
-H 'Content-Type: application/merge-patch+json' --data '{"failover":{"loss_timeout":"1s"}}'
curl -sS -X POST -H "$H" "$AMS/api/v1/channels/sport1/restart"
curl -sS -H "$H" "$AMS/api/v1/health?format=nagios"Identity and server
/openapi.yamlThis OpenAPI document
The embedded docs/openapi.yaml.
stringunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/meWho am I
The authenticated identity.
Identityunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
too_many_requests: too many failed logins; Retry-After in seconds.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/serverVersion, uptime, node, CPU/memory and totals
Server information.
ServerInfounauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Web UI sessions (cookie login
/auth/loginLog in (web UI) and get a session cookie
Exchanges a user/password (api.users) or an API key (api.keys) for the session cookie alteoxms_session (opaque, HttpOnly, SameSite=Strict, Secure on HTTPS, Path=/). Nothing secret has to be kept by the browser. No credentials are needed for this call; failed attempts are throttled like other logins (429). A browser request from another origin is rejected (403). The response carries the CSRF token that cookie-authenticated POST, PUT, PATCH and DELETE requests must send as X-CSRF-Token.
Logged in; Set-Cookie carries the session.
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
too_many_requests: too many failed logins; Retry-After in seconds.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/auth/logoutEnd the current UI session
Deletes the session of the alteoxms_session cookie (on every cluster node) and clears the cookie. Needs X-CSRF-Token while the session is valid; without a (valid) session it only clears the cookie (204).
| Name | In | Type | Description |
|---|---|---|---|
X-CSRF-Token | header | string |
Logged out (cookie cleared).
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/auth/sessionsRevoke UI sessions (all, or one user's)
Ends the web UI sessions of user (a user or API key name), or of everyone without user. Sessions also end automatically when their user/key is removed or gets another role or password.
| Name | In | Type | Description |
|---|---|---|---|
user | query | string |
Sessions revoked.
object| Field | Type | Description |
|---|---|---|
revoked* | integer | min: 0 |
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Health and readiness for monitoring
/healthzLiveness probe (no authentication)
200 while the process serves HTTP. Plain text: ok, version, uptime, channel count.
Alive.
string/readyzReadiness probe (no authentication)
200 when the node can do its job: configuration loaded, HTTP (and SRT) listeners bound, channels applied and, in cluster mode, joined with a known leader and a replicated configuration. 503 with the failing checks otherwise, also while shutting down.
/healthAggregated health for monitoring (JSON or Nagios)
status is critical when a channel failed, a critical alarm is active or the cluster has no leader; degraded when a channel is degraded (or starting), a warning alarm is active, or a transcoder restarted / an input failed over in the last 10 minutes; else ok. Stopped channels (disabled, or running on another cluster node) are counted but are not problems.
?format=nagios returns one Nagios/Icinga plugin line (ALTEOXMS <STATE> - <text> | <perfdata>). State → exit code → HTTP status: OK → 0 → 200, WARNING → 1 → 200, CRITICAL → 2 → 503, UNKNOWN → 3 → 503; the exit code is also in X-Nagios-Exit-Code. The JSON form always answers 200.
| Name | In | Type | Description |
|---|---|---|---|
format | query | string |
Health report (JSON), or a Nagios line with state OK or WARNING.
Healthbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Nagios format with state CRITICAL (or UNKNOWN); or the API is disabled (JSON error).
stringChannel configuration and control
/channelsChannels with status summary
| Name | In | Type | Description |
|---|---|---|---|
label | query | array of string | Label filter, repeatable (all must match): |
template | query | array of string | Channels using one of these templates (repeatable); empty = channels without template. |
Channels sorted by name.
object| Field | Type | Description |
|---|---|---|
channels* | array of ChannelSummary |
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/channelsCreate a channel (starts immediately unless enabled is false)
| Name | In | Type | Description |
|---|---|---|---|
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Created; body is the stored configuration.
ChannelResponsebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/actionsRestart, start or stop many channels
Targets either an explicit channels list or a selector (name_prefix and/or label, both must match; an empty selector is rejected). start/stop change enabled of all targets in one configuration write (persisted / replicated once); if that write fails the request fails as a whole and nothing changed. restart restarts the running channels on this node (up to 8 in parallel).
The response is always 200 when the request itself was valid (multi-status semantics without HTTP 207): see results[].status and the succeeded / failed counts. Names in channels that do not exist are reported with code: not_found. A channel that is itself named actions keeps working with GET/PUT/PATCH/DELETE on this path.
| Name | In | Type | Description |
|---|---|---|---|
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Per-channel results.
BulkActionResponsebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}Channel configuration
Secrets in URLs are verbatim for admins and redacted (***) for viewers or with ?redact=true. A channel with a template is returned in its stored form: only the fields it sets itself (overrides lists their paths), plus the read-only effective channel (template ⊕ channel) the runtime uses.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
redact | query | boolean |
The channel configuration.
ChannelResponseunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
/channels/{name}Replace the channel configuration
Full replacement; name may be omitted (renaming is not supported). Omitted enabled, labels, failover.node_standby and outputs.hls.ts_segments keep their stored values. A URL secret of exactly *** keeps the stored value. With template the body is the channel's stored form: omitted fields are inherited from the template, sent fields are stored as overrides; without template a templated channel keeps its template and stores the fields that differ from it; template: null detaches it (docs/API.md 4.14).
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored configuration.
ChannelResponsebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}Delete the channel (closes its sessions)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Deleted.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}Change parts of the channel configuration (JSON Merge Patch)
RFC 7386 JSON Merge Patch over the configuration as an admin's GET returns it: objects merge, null removes a field (it takes its default; for a templated channel: the template's value again), arrays (inputs, outputs.udp) are replaced as a whole. The result is validated exactly like a PUT (same details), with If-Match, dry_run and *** secrets. Content-Type application/merge-patch+json (or application/json).
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored configuration.
ChannelResponsebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unsupported_media_type: PATCH body is not application/merge-patch+json / application/json.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}/statusFull live status
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
Live status (refreshed at least once per second).
ChannelStatusunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
/channels/{name}/startStart a stopped channel (enabled = true, persisted)
Idempotent (changed: false when it already was enabled). The body is ignored.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
New state.
EnabledResultunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}/stopStop a channel without deleting it (enabled = false, persisted)
Stops inputs, transcoder and outputs and closes the channel's sessions; the configuration is kept and the status shows state: stopped. Idempotent. The body is ignored.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
New state.
EnabledResultunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}/make-staticStore a dynamic channel as a configured channel
Copies the configuration a dynamic channel (server.config_lookup) currently runs with into the configuration (persisted like a POST /channels); from then on the configured channel wins and the lookup server is no longer asked for it. The running channel keeps running. Names with "/" cannot be configured channels (422).
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored configuration.
ChannelResponseunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channels/{name}/restartRestart the channel runtime
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
Restarting.
object| Field | Type | Description |
|---|---|---|
status* | "restarting" |
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
/channels/{name}/switch-inputManual failover (index) or back to automatic (null)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
object
| Field | Type | Description |
|---|---|---|
index* | integer | null | min: 0 |
Switch requested (happens at the next keyframe).
object| Field | Type | Description |
|---|---|---|
active_input* | integer | null | |
failover_mode* | FailoverMode |
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
/channels/{name}/tracks/previewResolve a track selection against the live source (nothing is applied)
Any role. Resolves tracks (null = no selection) against the source program of input (default: the active input). A channel that does not run on this node resolves against no source (every slot missing, input null).
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
object
| Field | Type | Description |
|---|---|---|
tracks | null | TracksRequest | |
input | integer | null | min: 0 |
Resolution.
TrackMapbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
validation_failed: semantically invalid; details per field.
/channels/{name}/preview-tokenShort-lived token to play the channel without the auth hook
Admins; viewers only with api.viewer_preview: true.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
object
| Field | Type | Description |
|---|---|---|
ttl | Duration | 10s..15m, default 5m |
Token and playback URLs ("" for disabled outputs).
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Live updates (server-sent events)
/eventsServer-sent events (live status)
text/event-stream. Events (event: → data: schema): snapshot → EventSnapshot, status → EventStatus (changed channels only), channel_status → ChannelStatus (for ?channel=), channel_added → ChannelSummary, channel_removed → EventChannelRemoved, switch → EventSwitch, alarm_raised / alarm_cleared → AlarmEvent. Keepalive comment every 15 s, retry: 3000, no replay after reconnect.
| Name | In | Type | Description |
|---|---|---|---|
channel | query | array of string | Also stream the full status of these channels (repeatable). |
Event stream.
stringunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Transcode profiles
/profilesTranscode profiles
/profilesCreate a transcode profile
| Name | In | Type | Description |
|---|---|---|---|
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Created.
Profilebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/profiles/{name}One profile
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name |
/profiles/{name}Replace a profile (channels using it restart their transcoder)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored profile.
Profilebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/profiles/{name}Delete a profile (409 in_use when channels use it)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Deleted.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/profiles/{name}Change parts of a profile (JSON Merge Patch)
Like PATCH /channels/{name}; video and audio arrays are replaced as a whole.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored profile.
Profilebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unsupported_media_type: PATCH body is not application/merge-patch+json / application/json.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Channel templates (shared channel settings with per-channel overrides)
/channel-templatesChannel templates
Templates sorted by name.
object| Field | Type | Description |
|---|---|---|
templates* | array of ChannelTemplate |
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/channel-templatesCreate a channel template
| Name | In | Type | Description |
|---|---|---|---|
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Created.
ChannelTemplatebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channel-templates/{name}One channel template
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name |
The template.
ChannelTemplateunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
/channel-templates/{name}Replace a template (re-applied to its channels; only channels whose effective configuration changed restart)
The body is the complete set of the template's settings (omitted = not set). Every channel using the template keeps its overrides and gets the new effective configuration; a change that makes one of them invalid is 422 with details under channels[i]... naming the channel.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored template.
ChannelTemplatebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channel-templates/{name}Delete a template (409 in_use with the channels using it)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Deleted.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/channel-templates/{name}Change parts of a template (JSON Merge Patch)
Like PATCH /channels/{name}; null removes a setting from the template.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name | |
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
Stored template.
ChannelTemplatebad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
unsupported_media_type: PATCH body is not application/merge-patch+json / application/json.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
FFmpeg / hardware probe
/capabilitiesHardware and encoders available for transcoding
Probe result (without FFmpeg everything is unavailable, still 200).
Capabilitiesunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/capabilities/probeRe-run the FFmpeg/hardware probe
New probe result.
Capabilitiesunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
Client sessions
/sessionsClient sessions (newest first)
| Name | In | Type | Description |
|---|---|---|---|
channel | query | string | |
protocol | query | string | |
mode | query | string | |
limit | query | integer | |
offset | query | integer |
/sessionsKick every session of a user, token or client IP (all protocols, cluster-wide), optionally block it
Selectors are combined (all given ones must match); at least one of user, token, ip is required. Kicks SRT (shared listener and dedicated ports), HTTP-TS and HLS/DASH sessions and drops the auth hook's cached decisions for the selector, so reconnects ask the hook again. With block the selector is blocked first: matching clients are rejected before the auth hook is asked (SRT reject 1403, HTTP 403) until the block expires or is removed. In a cluster the kick is forwarded to every node and the block is replicated.
| Name | In | Type | Description |
|---|---|---|---|
user | query | string | |
token | query | string | |
ip | query | string | Client IP address or CIDR prefix. |
channel | query | string | Only this channel (default all). |
block | query | string | Also block the client(s) for this long (Go duration, 1s..24h, e.g. |
Kicked sessions (possibly none) and the block.
KickResultbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/sessions/{id}Kick a session (optionally block its user/token/IP on its channel)
Drops the auth hook's cached decisions for the session's channel, user, token and IP so a reconnect asks the hook again. In a cluster a session that is not on this node is looked up on the other nodes. With block the session's user (else token, else client IP) is blocked on the session's channel.
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string | |
block | query | string | Also block the client(s) for this long (Go duration, 1s..24h, e.g. |
Kicked and blocked (with block).
Closed.
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/blocksActive temporary blocks (newest first)
/blocks/{id}Remove a block (cluster-wide)
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string |
Removed.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Configuration import/export (YAML)
/configExport the full configuration (JSON or YAML)
| Name | In | Type | Description |
|---|---|---|---|
redact | query | boolean | Redact secrets (always for viewers). |
format | query | string | Output format; default: the format of the server's config file. |
/configImport the full configuration (JSON or YAML, detected from the content)
| Name | In | Type | Description |
|---|---|---|---|
If-Match | header | string | ETag from a GET; on mismatch |
dry_run | query | boolean | Validate and answer as usual, but store and apply nothing. |
object
Applied (or, with dry_run, what would change).
ConfigImportResultbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
precondition_failed: If-Match does not match the current ETag.
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/config/validateValidate a configuration (JSON or YAML) without applying it
object
Validation result.
ConfigValidationunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
/config/import/flussonicImport a Flussonic configuration (dry run by default)
Converts a Flussonic flussonic.conf (request body) into channels and transcode profiles and merges them into the current configuration (docs/MIGRATION-FLUSSONIC.md). By default nothing is stored (dry_run=true): the response shows the resulting configuration (config in format, plus the commented yaml), the import report and what would change. With dry_run=false the result is stored and applied like PUT /config. Existing channels are never replaced unless overwrite=true; problems of single streams are reported (severity error) and those parts left out.
| Name | In | Type | Description |
|---|---|---|---|
dry_run | query | boolean | Default true: only report. false: store and apply. |
overwrite | query | boolean | Replace existing channels (and differing profiles) of the same name. |
disable_all | query | boolean | Import every channel disabled (label flussonic_state keeps the Flussonic state). |
no_dash | query | boolean | Do not enable DASH output. |
no_hls | query | boolean | Do not enable HLS output. |
no_http_ts | query | boolean | Do not enable HTTP MPEG-TS output. |
format | query | string | Format of the response's |
string
Import result (applied or dry run).
FlussonicImportResultbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
license_limit: the change would exceed the license's channel limit (enabled configured channels plus running dynamic ones; in a cluster limit × seats). A configuration already above the limit (downgrade) can still be edited while the count does not grow.
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Cluster membership and placement
/clusterCluster nodes, roles, health, capacity and placement
Cluster view (standalone nodes return the short form).
ClusterStatus | StandaloneStatusunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/cluster/placementChannel placement
Placement.
object| Field | Type | Description |
|---|---|---|
placement* | Placement | |
unplaced* | array of string | |
unplaced_reasons* | map of string | |
strategy* | string | one of: "spread", "pack" |
max_channels_per_node* | integer | min: 0 |
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/eventsCluster events (newest first, last 256)
| Name | In | Type | Description |
|---|---|---|---|
after | query | integer |
Events.
object| Field | Type | Description |
|---|---|---|
events* | array of ClusterEvent |
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/channels/{name}Where a channel is served
| Name | In | Type | Description |
|---|---|---|---|
name* | path | ChannelNameAny | A channel name; dynamic channels (server.config_lookup) may contain "/" (send it as %2F). |
Location.
ChannelLocationunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/nodesAdd a node (raft voter)
Added.
ClusterNodeRefbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/nodes/{id}Remove a node (its channels move)
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string |
Removed.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/nodes/{id}/drainDrain a node (maintenance)
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string |
Draining.
DrainResultunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/cluster/nodes/{id}/drainEnd draining (nothing moves back automatically)
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string |
No longer draining.
DrainResultunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
GPU monitoring
/gpusGPU monitoring, admission state and policy of this node (WP 6.3)
Without monitoring configured monitor.state is off and the lists are empty (still 200). Unreported driver values are null.
/gpus/capacityHow many more channels of a profile fit on the GPUs
| Name | In | Type | Description |
|---|---|---|---|
profile* | query | string |
Capacity per GPU, node total and (cluster mode) per node. total -1 when the profile does not use an NVIDIA GPU here or monitoring is off.
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
not_found: channel/profile/session/node does not exist.
/alarmsActive alarms and the last raise/clear events of this node
| Name | In | Type | Description |
|---|---|---|---|
after | query | integer | Only events with a larger seq. |
Alarms (sorted by name and labels) and events (newest first, at most 256).
object| Field | Type | Description |
|---|---|---|
node* | string | |
alarms* | array of Alarm | |
events* | array of AlarmEvent | |
last_seq* | integer | min: 0 |
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Licensing: status, license key, EULA, deactivation (docs/LICENSING.md, API.md §16)
/licenseLicense status of this server (admin)
Status, tier, limits, expiry, lease age, install id, fingerprint, EULA, warnings and the license server's messages (docs/LICENSING.md §5). mode: dev = a build without embedded license keys: nothing is enforced (status: dev, serving: true).
License status.
LicenseStatusunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/licenseEnter a license key (activate) (admin)
Verifies the key (AMS1.…, signed by the license server), activates it at the license server (POST /activate; not for offline licenses) and stores it. Errors: 400 invalid_license (does not verify, offline license for another machine), 409 with the license server's code (seats_exhausted, revoked, expired) or dev_build, 502 license_server_unavailable (the key is stored and activation is retried in the background).
object
| Field | Type | Description |
|---|---|---|
license* | string | The license key text (AMS1.<payload>.<signature>). max length: 16384 |
Activated; the new status.
LicenseStatusbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
The license server refused the key (seats_exhausted, revoked, expired), or dev_build (a build without license keys cannot verify keys).
bad_request: request body too large (JSON 1 MiB, YAML 4 MiB).
validation_failed: semantically invalid; details per field.
license_server_unavailable: the key verified and is stored, but the license server could not be reached; activation is retried in the background.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/license/eulaAccept the EULA (admin)
version must be the eula.version of GET /license (the text the admin was shown); another version is 409 eula_version. The server serves no viewers and outputs before the EULA is accepted (server.license.accept_eula: true accepts it for automated installs).
object
| Field | Type | Description |
|---|---|---|
version* | string |
Accepted; the new status.
LicenseStatusbad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
already_exists, in_use (details list the users) or conflict (impossible in the current state, or a cluster write raced; retry).
validation_failed: semantically invalid; details per field.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
/license/deactivateRelease the seat and remove the license from this server (admin)
Tells the license server (POST /deactivate, online licenses) and removes the license here. released: false: the license server could not be told — release the seat in the license portal. The server stops serving viewers and outputs.
Removed.
object| Field | Type | Description |
|---|---|---|
released* | boolean | |
message | string | |
license* | LicenseStatus |
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
unavailable: API disabled (no credentials configured), clustering disabled, no cluster leader / quorum, preview tokens or FFmpeg not available.
Operator notifications via Mattermost and e-mail (WP 6.9)
/notificationsNotification targets (secrets redacted), delivery status and queue of this node
Targets come from the node-local notifications: section. Webhook keys are redacted (https://mm.example/hooks/***), SMTP passwords never shown. state: ok (last attempt succeeded), failing, idle (nothing sent yet). Failures of a target are reported here, in the log and in alteoxms_notification_up — not as alarms.
Notifier status.
Notificationsunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
/notifications/testSend a test message to one target or all (admin)
Sends right away (no hold-down, filter, batching or retry) and waits for the outcome. 200 also when the delivery failed: see ok and results[].error.
object
| Field | Type | Description |
|---|---|---|
target* | string | Target name or "all". |
Outcome per target.
object| Field | Type | Description |
|---|---|---|
ok* | boolean | Every target accepted the message. |
results* | array of object | |
target* | string | |
type* | string | one of: "mattermost", "email" |
ok* | boolean | |
error | string | |
duration_ms* | number | min: 0 |
bad_request: malformed JSON/YAML, unknown field, wrong type, bad query parameter.
unauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
forbidden: the role does not allow the action, a cookie-authenticated write failed the CSRF check, or a PUT /config tries to change api.allow_extra_args (detail code read_only). extra_args_disabled: the write would set or change a transcode profile's extra_args while api.allow_extra_args is off (details name the field paths).
not_found: channel/profile/session/node does not exist.
validation_failed: semantically invalid; details per field.
Flussonic-style event sinks (play_closed
/event-sinksEvent sinks of this node (Flussonic event_sink) with delivery status
Sinks come from the node-local event_sinks: section (or PUT /streamer/api/v3/event_sinks/{name}). URLs are redacted. state: idle (nothing sent yet), ok (last POST succeeded), retrying (last POST failed; the batch is retried with backoff 1 s .. 1 min), rejected (the sink answered 4xx: batch dropped). Events and the mapping: docs/API.md §15.2.
Sink status.
EventSinksunauthorized: missing or invalid credentials (WWW-Authenticate: Bearer realm="alteoxms").
Flussonic HTTP API v3 compatibility subset under /streamer/api/v3 (docs/API.md §15.3)
/streamsFlussonic API v3: streams (compatibility subset)
Every channel as a Flussonic stream, sorted by name. select keeps only the given dotted paths (comma separated, name is always included; a path through a list applies to every element, e.g. inputs.url). Input URLs are complete for admins, redacted for viewers. Errors use Flussonic's {"errors":[...]} body.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
select | query | string | |
name | query | string | Only the stream with this name. |
Streams.
object| Field | Type | Description |
|---|---|---|
streams* | array of FluStream | |
estimated_count* | integer | Streams before min: 0 |
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/streams/{name}Flussonic API v3: one stream
| Name | In | Type | Description |
|---|---|---|---|
name* | path | string | |
select | query | string |
/config/statsFlussonic API v3: server statistics
transcoder_devices are the GPUs of the GPU monitor (type: nvenc for NVIDIA); utilization in percent (0 when not measured).
Server statistics.
FluServerStatsFlussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/event_sinksFlussonic API v3: event sinks
Event sinks.
object| Field | Type | Description |
|---|---|---|
event_sinks* | array of FluEventSink | |
estimated_count* | integer | min: 0 |
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/event_sinks/{name}Flussonic API v3: one event sink
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name |
The event sink.
FluEventSinkFlussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/event_sinks/{name}Flussonic API v3: create or update an event sink (admin)
Creates the sink or changes the given fields of an existing one; persisted in the config file (event_sinks, node-local, also in a cluster) and applied at once. Unknown fields (other Flussonic event_sink settings) are ignored.
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name |
object
| Field | Type | Description |
|---|---|---|
url | string | http(s) URL the events are POSTed to (required for a new sink). |
events | array of string | Only these events (empty = all). |
format | string | one of: "flussonic", "ndjson" |
The stored event sink.
FluEventSinkFlussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/event_sinks/{name}Flussonic API v3: delete an event sink (admin)
| Name | In | Type | Description |
|---|---|---|---|
name* | path | Name |
Deleted.
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
Flussonic API v3 error body (401 carries WWW-Authenticate: Basic realm="alteoxms").
/analyticsPer-channel and per-source history (bitrate, viewers, errors, TR 101 290) and node CPU/GPU of the last hour, day or week
In-memory history since the server started (docs/API.md 14): totals per time bucket, per-channel sums ranked by operational errors, and with channel= that channel's full series.
| Name | In | Type | Description |
|---|---|---|---|
range | query | string | 1h: 10 s buckets, 24h: 1 min, 7d: 10 min. |
channel | query | string | Also return this channel's full series. |
ActiveAlarm object| Field | Type | Description |
|---|---|---|
id* | string | |
severity* | string | one of: "critical", "warning", "info" |
source* | string | |
subject | string | |
message* | string | |
since* | Time |
AdmissionState stringAlarm objectAlarmEvent object| Field | Type | Description |
|---|---|---|
seq* | integer | min: 1 |
type* | string | one of: "alarm_raised", "alarm_cleared" |
at* | Time | |
alarm* | Alarm | |
duration_s | number | How long it was active (clears). min: 0 |
notifications* | array of NotificationDelivery | What the notifier did with this event, per target ( |
Analytics object| Field | Type | Description |
|---|---|---|
range* | string | one of: "1h", "24h", "7d" |
step_s* | integer | |
from* | string (date-time) | |
to* | string (date-time) | |
totals* | array of AnalyticsPoint | All channels per bucket. |
sums* | AnalyticsCounters | |
channels* | array of object | Channels with data in the range, by error_total (descending), then name. |
name* | string | |
bitrate_in_avg* | integer | min: 0 |
bitrate_out_avg* | integer | min: 0 |
bitrate_out_max* | integer | min: 0 |
viewers_peak* | integer | min: 0 |
errors* | AnalyticsCounters | |
error_total* | integer | min: 0 |
spark* | array of integer | Bitrate out, at most 60 averages. |
series | array of AnalyticsPoint | The channel's buckets (with channel=). |
sources* | array of object | Sources (input URLs, redacted) over all channel inputs using them, worst first: error_total, then TR 101 290 P1+P2, then URL. Errors often belong to a source shared by several channels. |
url* | string | Redacted input URL; publish inputs are publish://<channel>. |
used_by* | array of string | Channel inputs that used the source in the range: <channel>#<n>, n from 1. |
bitrate_in_avg* | integer | Highest per-input average. min: 0 |
errors* | AnalyticsCounters | |
error_total* | integer | min: 0 |
system* | array of object | The node per bucket: averages, GPU temperature the peak; null: not measured (no procfs, no GPU monitor). |
t* | string (date-time) | |
cpu_pct* | number | null | Whole machine (FFmpeg included), %. |
process_cpu_pct* | number | null | This server process, % of all cores. |
memory_pct* | number | null | System memory used, %. |
load1* | number | null | |
gpus* | array of object | |
index* | integer | min: 0 |
util* | number | null | |
encoder* | number | null | NVENC utilisation, %. |
decoder* | number | null | NVDEC utilisation, %. |
memory_pct* | number | null | |
temperature_c* | number | null | |
power_w* | number | null | |
gpus* | array of object | GPUs seen since the server started. |
index* | integer | min: 0 |
name* | string |
AnalyticsCounters objectError events of a bucket or range (deltas of the status counters). degraded_s / failed_s: seconds in that health. tr_p1..tr_p3: ETSI TR 101 290 errors of all inputs (not part of error_total).
| Field | Type | Description |
|---|---|---|
cc_errors* | integer | min: 0 |
input_errors* | integer | min: 0 |
reconnects* | integer | min: 0 |
transcoder_restarts* | integer | min: 0 |
transcoder_stalls* | integer | min: 0 |
failovers* | integer | min: 0 |
degraded_s* | integer | min: 0 |
failed_s* | integer | min: 0 |
tr_p1* | integer | min: 0 |
tr_p2* | integer | min: 0 |
tr_p3* | integer | min: 0 |
AnalyticsPoint objectOne time bucket: bitrates are averages, viewers the peak, the rest as in AnalyticsCounters.
| Field | Type | Description |
|---|---|---|
t* | string (date-time) | Bucket start. |
bitrate_in* | integer | min: 0 |
bitrate_out* | integer | min: 0 |
viewers* | integer | min: 0 |
cc_errors* | integer | min: 0 |
input_errors* | integer | min: 0 |
reconnects* | integer | min: 0 |
transcoder_restarts* | integer | min: 0 |
transcoder_stalls* | integer | min: 0 |
failovers* | integer | min: 0 |
degraded_s* | integer | min: 0 |
failed_s* | integer | min: 0 |
tr_p1* | integer | min: 0 |
tr_p2* | integer | min: 0 |
tr_p3* | integer | min: 0 |
Block objectBulkActionRequest objectExactly one of channels or selector.
| Field | Type | Description |
|---|---|---|
action* | string | one of: "restart", "start", "stop" |
channels | array of string | max items: 1000 |
selector | object | |
name_prefix | string | |
label | string |
|
BulkActionResponse object| Field | Type | Description |
|---|---|---|
action* | string | one of: "restart", "start", "stop" |
dry_run* | boolean | |
matched* | integer | Existing channels targeted. min: 0 |
succeeded* | integer | min: 0 |
failed* | integer | min: 0 |
results* | array of object | Matched channels (sorted for selectors, request order for |
name* | string | |
status* | string | one of: "ok", "unchanged", "error" |
code | string | Error code (e.g. not_found, conflict, internal) for status error. |
message | string |
Capabilities object| Field | Type | Description |
|---|---|---|
ffmpeg* | object | |
available* | boolean | |
path* | string | |
version* | string | |
probed_at* | Time | |
hardware* | map of object | |
auto* | string | What hardware "auto" resolves to ("" if nothing works). |
encoders* | array of string |
ChannelConfig objectOne entry of channels: in the YAML config (defaults filled in).
| Field | Type | Description |
|---|---|---|
name* | ChannelNameAny | |
dynamic | boolean | Read-only: a dynamic channel from the lookup server (server.config_lookup), not stored in the configuration; omitted for configured channels. |
inputs* | array of object | Array order is priority (index 0 = primary). min items: 1 · max items: 16 |
url* | string | srt, udp, rtp, http(s) (HLS when .m3u8), hls(s), publish:// or copy://<channel>[/<rendition>] |
headers* | map of string | Extra HTTP request headers (http/https/hls/hlss inputs); values are secrets ("***" when redacted). |
user_agent* | string | User-Agent override (http/https/hls/hlss); "" = default. |
srt_publish* | null | SRTPort | Dedicated SRT publish port of the publish:// input. |
failover* | object | |
loss_timeout* | Duration | |
return_after* | Duration | |
standby* | string | one of: "hot", "cold" |
select* | FailoverSelect | |
max_connected* | MaxConnected | |
node_standby | string | one of: "cold", "hot" |
transcode* | string | null | InlineProfile | Name of a profile, the channel's own inline profile (object), or null = passthrough. |
outputs* | object | |
srt* | boolean | |
srt_play* | null | SRTPort | Dedicated SRT play port (callers need no streamid). |
http_ts* | boolean | |
hls* | null | object | |
dash* | null | object | |
udp* | array of object | max items: 16 |
url* | string | |
auth* | object | |
publish* | boolean | |
read* | boolean | |
enabled* | boolean | false = configured but not running (state stopped). |
labels* | Labels | |
tracks | null | TracksConfig | Output track selection (ARCHITECTURE 4.4a); null = every source track. |
on_demand | boolean | The whole channel (input pulls included) runs only while it has consumers. |
transcode_on_demand | boolean | The transcoder runs only while a transcoded output has consumers (needs transcode). |
on_demand_idle | Duration | Time without consumers before it sleeps (default 30s). |
ChannelConfigRequest objectChannel configuration in requests. Omitted optional fields take their defaults (PUT: enabled, labels, failover.node_standby, outputs.hls.ts_segments keep the stored values). outputs.hls / outputs.dash also accept true (defaults) and false (off).
| Field | Type | Description |
|---|---|---|
name | Name | |
inputs | array of object | |
url* | string | |
headers | map of string | null | |
user_agent | string | null | |
srt_publish | null | SRTPortRequest | |
failover | object | null | |
loss_timeout | Duration | |
return_after | Duration | |
standby | string | one of: "hot", "cold" |
select | FailoverSelect | |
max_connected | MaxConnected | |
node_standby | string | one of: "cold", "hot" |
transcode | string | null | InlineProfileRequest | Profile name, inline profile object, or null = passthrough. |
outputs | object | null | |
srt | boolean | |
srt_play | null | SRTPortRequest | |
http_ts | boolean | |
hls | SegmentedRequest | |
dash | SegmentedRequest | |
udp | array of object | |
url* | string | |
auth | object | null | |
publish | boolean | |
read | boolean | |
enabled | boolean | |
labels | map of string | null | null | A null value removes a label the channel's template sets. |
tracks | null | TracksRequest | Omitted in a PUT = keep; null = none. |
on_demand | boolean | Omitted in a PUT = keep. |
transcode_on_demand | boolean | Omitted in a PUT = keep; needs transcode. |
on_demand_idle | string | Duration 1s..24h ("0" = default 30s); omitted in a PUT = keep. |
template | string | null | Channel template (§4.14): the body is then the channel's stored form (omitted = inherited). null detaches a templated channel. |
overrides | array of string | Read only (ignored). |
effective | object | Read only (ignored). |
ChannelLocation object| Field | Type | Description |
|---|---|---|
channel* | string | |
configured* | boolean | |
primary* | string | |
standby | string | |
local* | boolean | |
primary_up* | boolean | |
url | string | |
srt_address | string |
ChannelNameAny stringA configured channel name (Name) or a dynamic channel name: up to 8 such elements joined by "/" (128 characters at most).
ChannelPatch objectJSON Merge Patch (RFC 7386) of ChannelConfig; null removes a field (default), arrays replace.
| Field | Type | Description |
|---|---|---|
name | Name | |
inputs | array of object | null | |
failover | object | null | |
transcode | string | null | InlineProfileRequest | Profile name, inline profile object, or null = passthrough. |
outputs | object | null | |
auth | object | null | |
enabled | boolean | null | |
labels | map of string | null | null | |
tracks | object | null | |
on_demand | boolean | null | |
transcode_on_demand | boolean | null | |
on_demand_idle | string | null | |
template | string | null | Attach (only the fields that differ from the template stay the channel's own) or, with null, detach. |
ChannelResponse ChannelConfig | TemplatedChannelA channel without template (ChannelConfig) or the stored form of a templated channel (TemplatedChannel).
ChannelState stringsleeping = on-demand channel without consumers (inputs stopped; not a failure). license_limit = enabled but not started: the license's channel limit is reached (docs/LICENSING.md §5).
ChannelStatus object| Field | Type | Description |
|---|---|---|
name* | string | |
state* | ChannelState | |
health* | HealthValue | |
started_at* | Time | |
uptime_s* | number | min: 0 |
active_input* | integer | null | |
pending_input* | integer | null | |
failover_mode* | FailoverMode | |
bitrate_in* | integer | min: 0 |
inputs* | array of InputStatus | |
failover* | object | |
loss_timeout* | Duration | |
return_after* | Duration | |
standby* | string | one of: "hot", "cold" |
select* | FailoverSelect | |
max_connected* | MaxConnected | |
connected* | integer | Pull inputs connected now. min: 0 |
preferred* | integer | null | Rank 1 of the selection order (best priority; with select quality the best-ranked input). null = none yet. |
switches* | integer | min: 0 |
last_switch* | null | SwitchEvent | |
history* | array of SwitchEvent | max items: 50 |
source* | null | SourceStatus | |
track_map* | null | TrackMap | |
transcoder* | null | TranscoderStatus | |
on_demand | OnDemandStatus | |
dynamic | DynamicStatus | |
outputs* | object | |
srt* | StreamOutput | |
srt_play | SRTPortStatus | |
http_ts* | StreamOutput | |
hls* | StreamOutput | |
dash* | StreamOutput | |
udp* | array of object | |
url* | string | |
bitrate_out* | integer | min: 0 |
packets* | integer | min: 0 |
errors* | integer | min: 0 |
viewers* | integer | min: 0 |
bitrate_out* | integer | min: 0 |
ChannelSummary object| Field | Type | Description |
|---|---|---|
name* | string | |
transcode* | string | null | Profile name, "(inline)" for a channel's own profile, null = passthrough. |
outputs* | array of string | |
input_count* | integer | min: 0 |
enabled* | boolean | |
labels* | Labels | |
template | string | Channel template (omitted when none). |
dynamic | boolean | A dynamic channel from the lookup server (omitted for configured channels). |
status* | object | |
state* | ChannelState | |
health* | HealthValue | |
uptime_s* | number | min: 0 |
active_input* | integer | null | |
active_input_url* | string | |
failover_mode* | FailoverMode | |
bitrate_in* | integer | min: 0 |
bitrate_out* | integer | min: 0 |
viewers* | integer | min: 0 |
switches* | integer | min: 0 |
last_switch* | null | SwitchEvent | |
transcoder_state* | string | null | one of: "starting", "running", "backoff", "stopped", "sleeping", null |
transcoder_gpu | string | Where the transcoder was admitted ("nvidia:1", "cpu" for a fallback); omitted without admission control. |
transcoder_admission | AdmissionState | |
video* | string | |
bitrate_history* | array of integer | max items: 60 |
tracks* | object | Source tracks of the active input by kind (all 0 without a source). |
video* | integer | min: 0 |
audio* | integer | min: 0 |
subtitle* | integer | min: 0 |
teletext* | integer | min: 0 |
scte35* | integer | min: 0 |
data* | integer | min: 0 |
service_name* | string | SDT service name of the source ("" if none). |
output_viewers* | map of integer | Viewers per output kind, one entry per item of outputs (udp is always 0). |
on_demand | object | On-demand channels only. |
state* | OnDemandState | |
transcoder | string | one of: "sleeping", "waking", "running" |
ChannelTemplate PartialChannel & objectA channel template (docs/API.md 4.14): the channel fields it sets (a template never sets name, enabled, inputs or outputs.srt_play), the channels using it and the read-only effective settings (the template applied to a default channel).
| Field | Type | Description |
|---|---|---|
name* | Name | |
used_by* | array of string | |
effective* | object | |
failover* | object | |
transcode* | string | null | InlineProfile | |
outputs* | object | |
auth* | object | |
labels* | Labels | |
tracks* | null | TracksConfig | |
on_demand* | boolean | |
transcode_on_demand* | boolean | |
on_demand_idle* | Duration |
ChannelTemplatePatch objectJSON Merge Patch (RFC 7386) of a ChannelTemplate; null removes a setting from the template.
| Field | Type | Description |
|---|---|---|
name | Name | |
failover | object | null | |
transcode | string | null | InlineProfileRequest | |
outputs | object | null | |
auth | object | null | |
labels | map of string | null | null | |
tracks | object | null | |
on_demand | boolean | null | |
transcode_on_demand | boolean | null | |
on_demand_idle | string | null |
ChannelTemplateRequest objectA template in requests: the fields of a channel request it sets (omitted = not set by the template); used_by and effective are read only and ignored. inputs, enabled, template and outputs.srt_play are rejected (422).
| Field | Type | Description |
|---|---|---|
name | Name | |
failover | object | null | |
transcode | string | null | InlineProfileRequest | |
outputs | object | null | |
auth | object | null | |
labels | map of string | null | |
tracks | null | TracksRequest | |
on_demand | boolean | |
transcode_on_demand | boolean | |
on_demand_idle | string | |
used_by | array of string | |
effective | object |
ClusterEvent object| Field | Type | Description |
|---|---|---|
seq* | integer | min: 1 |
at* | Time | |
type* | string | one of: "node_joined", "node_up", "node_down", "node_removed", "node_drain", "node_undrain", "config_changed", "channel_placed", "channel_moved", "channel_promoted", "standby_assigned", "channel_unplaced" |
node | string | |
channel | string | |
from | string | |
to | string | |
detail | string | |
duration_s | number | min: 0 |
ClusterNodeRef object| Field | Type | Description |
|---|---|---|
id* | string | |
address* | string | Cluster (raft/RPC) address host:port. |
ClusterStatus object| Field | Type | Description |
|---|---|---|
enabled* | true | |
mode* | "cluster" | |
node* | string | |
leader* | string | |
term* | integer | |
config_index* | integer | |
strategy* | string | one of: "spread", "pack" |
max_channels_per_node* | integer | min: 0 |
nodes* | array of object | |
id* | string | |
address* | string | |
api_url* | string | |
srt_address | string | |
role* | string | one of: "leader", "follower" |
suffrage* | string | one of: "voter", "nonvoter", "removed" |
state* | string | one of: "up", "down", "joining" |
draining* | boolean | |
channels* | array of string | |
standby_channels* | array of string | |
running* | array of string | |
capacity* | object | |
cpu_cores* | integer | |
gpus* | array of string | |
transcode* | boolean | |
gpu | GPUNodeReport | |
last_seen* | Time | |
since* | Time | |
version* | string | |
placement* | Placement | |
unplaced* | array of string | |
unplaced_reasons* | map of string | Channel → why it is unplaced ("no_gpu_capacity: …"). |
ConfigChanges object| Field | Type | Description |
|---|---|---|
channels_added* | array of string | |
channels_removed* | array of string | |
channels_changed* | array of string | Effective configuration or stored form changed (a template change lists its channels whose effective configuration changed). |
profiles_added* | array of string | |
profiles_removed* | array of string | |
profiles_changed* | array of string | |
templates_added* | array of string | |
templates_removed* | array of string | |
templates_changed* | array of string |
ConfigImportResult object| Field | Type | Description |
|---|---|---|
applied* | boolean | |
changes* | ConfigChanges | |
restart_required* | array of string |
ConfiguredBitrate string | integer"6000k", "6M" or an integer (bit/s); returned in the stored form.
ConfigValidation objectDetail object| Field | Type | Description |
|---|---|---|
field* | string | Path into the request ("outputs.udp[0].url"); "" = whole object. |
line | integer | YAML line (config endpoints). min: 1 |
code* | string | one of: "required", "invalid", "out_of_range", "duplicate", "unknown_field", "not_found", "unavailable", "redacted_secret", "in_use", "extra_args_disabled", "read_only", "license_limit", "invalid_license" |
message* | string |
DrainResult object| Field | Type | Description |
|---|---|---|
id* | string | |
draining* | boolean |
Duration stringGo duration string.
DynamicStatus objectA dynamic channel from the lookup server (server.config_lookup, docs/API.md §4.15); omitted for configured channels.
| Field | Type | Description |
|---|---|---|
source* | string | The lookup server URL, secrets masked (***). |
title | string | |
provider | string | |
comment | string | |
static_list* | boolean | From the lookup server's static stream list (runs while listed) rather than a request for its name. |
created_at* | Time | |
refreshed_at* | Time | |
last_error | string | The last refresh failed (the channel keeps its last good configuration); omitted after a successful one. |
on_play* | boolean | The lookup server gave a play authorization URL (on_play): viewers are authorized by the auth hook (auth.read). |
notes* | array of object | Remarks of the mapping (unsupported inputs, ignored transcoder options). |
severity* | string | one of: "info", "warning", "error" |
message* | string |
EnabledResult object| Field | Type | Description |
|---|---|---|
name* | string | |
enabled* | boolean | |
changed* | boolean | false when the channel already was in that state. |
dry_run | boolean |
Error object| Field | Type | Description |
|---|---|---|
error* | object | |
code* | string | one of: "bad_request", "unauthorized", "forbidden", "not_found", "method_not_allowed", "already_exists", "in_use", "conflict", "precondition_failed", "unsupported_media_type", "validation_failed", "too_many_requests", "internal", "unavailable", "extra_args_disabled", "license_limit", "invalid_license", "dev_build", "seats_exhausted", "revoked", "expired", "license_server_unavailable", "eula_version" |
message* | string | |
details* | array of Detail |
EventChannelRemoved object| Field | Type | Description |
|---|---|---|
name* | string |
EventSinks object| Field | Type | Description |
|---|---|---|
event_sinks* | array of object | |
name* | string | |
url* | string | Redacted. |
format* | string | one of: "flussonic", "ndjson" |
events* | array of string | Event filter (empty = all). |
state* | string | one of: "idle", "ok", "retrying", "rejected" |
queued* | integer | min: 0 |
queue_size* | integer | min: 0 |
sent* | integer | Events delivered. min: 0 |
dropped* | integer | Events lost: queue full, batch rejected (4xx), shutdown while retrying. min: 0 |
batches* | integer | Successful POSTs. min: 0 |
failures* | integer | Failed POST attempts. min: 0 |
last_error* | string | |
last_success* | Time | |
last_failure* | Time |
EventSnapshot object| Field | Type | Description |
|---|---|---|
ts* | Time | |
server* | ServerInfo | |
channels* | array of ChannelSummary | |
alarms | array of Alarm | Active alarms (snapshot only). |
EventStatus EventSnapshotSame shape; channels holds only changed summaries.
EventSwitch object| Field | Type | Description |
|---|---|---|
channel* | string | |
at* | Time | |
from* | integer | null | |
to* | integer | null | |
reason* | SwitchReason | |
detail | string |
FailoverMode stringFailoverSelect stringInput selection: priority (default) or quality (docs/API.md 4.7b).
FluError object| Field | Type | Description |
|---|---|---|
errors* | array of object | |
status* | string | |
code* | string | |
title* | string |
FluEventSink object| Field | Type | Description |
|---|---|---|
name* | string | |
url* | string | Complete for admins, redacted for viewers. |
events* | array of string | |
format* | string | one of: "flussonic", "ndjson" |
stats | object | |
name* | string | |
url* | string | |
format* | string | |
events* | array of string | |
state* | string | one of: "idle", "ok", "retrying", "rejected" |
queued* | integer | |
queue_size* | integer | |
sent* | integer | |
dropped* | integer | |
batches* | integer | |
failures* | integer | |
last_error | string | |
last_success* | string | null | |
last_failure* | string | null |
FluMediaInfo object| Field | Type | Description |
|---|---|---|
tracks | array of FluTrack |
FluServerStats object| Field | Type | Description |
|---|---|---|
server_version* | string | |
hostname* | string | |
uptime* | integer | seconds |
cpu_usage* | integer | percent |
memory_usage* | integer | percent of system memory |
total_clients* | integer | |
total_streams* | integer | |
online_streams* | integer | Streams with stats.alive. |
transcoder_devices* | array of object | |
id* | integer | |
type* | string | |
name* | string | |
gpu_enc* | integer | Encoder utilization %. |
gpu_dec* | integer | Decoder utilization %. |
gpu_sm* | integer | GPU (SM) utilization %. |
mem_usage* | integer | Memory used %. |
FlussonicImportResult object| Field | Type | Description |
|---|---|---|
applied* | boolean | |
yaml* | string | The complete resulting configuration as YAML with comments on the imported parts (contains secrets; admin only). Always present; |
format* | string | The format of one of: "json", "yaml" |
config* | string | The complete resulting configuration in |
summary* | object | |
streams* | integer | min: 0 |
templates* | integer | min: 0 |
channels* | integer | min: 0 |
channels_enabled* | integer | min: 0 |
channels_disabled* | integer | min: 0 |
channels_skipped* | integer | min: 0 |
channels_overwritten* | integer | min: 0 |
profiles* | integer | min: 0 |
profiles_reused* | integer | min: 0 |
channel_templates* | integer | Channel templates imported (one per Flussonic template used by a stream with only that template). min: 0 |
inputs* | integer | min: 0 |
inputs_skipped* | integer | min: 0 |
infos* | integer | min: 0 |
warnings* | integer | min: 0 |
errors* | integer | min: 0 |
report* | array of object | |
severity* | string | one of: "info", "warning", "error" |
stream | string | Flussonic stream name. |
channel | string | Channel the stream became. |
template | string | Set for entries about a Flussonic template (reported once). |
directive | string | |
line | integer | min: 1 |
message* | string | |
channels* | array of string | Channels imported (added or overwritten). |
profiles* | array of string | Transcode profiles imported. |
templates* | array of string | Channel templates imported (added or replaced). |
changes* | ConfigChanges |
FluStream objectA channel as a Flussonic stream. With select only the selected paths are present.
| Field | Type | Description |
|---|---|---|
name* | string | |
static | boolean | false for on-demand channels. |
media_info | FluMediaInfo | |
inputs | array of object | |
url | string | Complete for admins, redacted for viewers. |
priority | integer | |
stats | object | |
active | boolean | |
status | string | Our input state: idle, connecting, receiving, error. |
bitrate | integer | kbit/s |
retry_count | integer | Reconnects. |
errors_lost_packets | integer | Continuity-counter errors. |
media_info | FluMediaInfo | |
stats | object | |
alive | boolean | The active input delivers data. |
status | string | one of: "running", "starting", "failed", "sleeping", "stopped" |
url | string | The active input's URL ("" = none). |
lifetime | integer | ms since the channel started. |
bitrate | integer | kbit/s of the active input. |
online_clients | integer | |
input | object | |
proto | string | Flussonic proto of the active input: tshttp, hls, srt, udp, rtp, publish, copy. |
retries | integer | |
input_switches | integer | |
errors_lost_packets | integer | |
retry_count | integer | Reconnects of all inputs. |
errors | integer | Errors of all inputs. |
no_audio | boolean | The source program has no audio track. |
audio_lost | boolean | The program has audio tracks but none carries data. |
media_info | FluMediaInfo |
FluTrack object| Field | Type | Description |
|---|---|---|
track_id | string | |
content | string | one of: "video", "audio", "text", "metadata" |
codec | string | |
pid | integer | |
width | integer | |
height | integer | |
fps | number | |
bitrate | integer | kbit/s |
lang | string | |
channels | integer | |
sample_rate | integer |
GPUCapacity object| Field | Type | Description |
|---|---|---|
node* | string | |
profile* | string | |
hardware* | string | |
uses_gpu* | boolean | |
enforced* | boolean | |
pinned_gpu* | integer | null | |
load* | GPULoad | |
gpus* | array of object | null | |
index* | integer | |
uuid* | string | |
name* | string | |
fits* | integer | |
reason | string | |
total* | integer | -1 = no estimate |
note* | string | |
cluster | object | |
total* | integer | |
nodes* | array of object | |
node* | string | |
state* | string | |
reported* | boolean | |
enforced* | boolean | |
fits* | integer | |
best_gpu* | integer | |
gpus* | integer |
GPUCapacityModel object| Field | Type | Description |
|---|---|---|
encode_mpix_s* | number | |
decode_mpix_s* | number | |
max_sessions* | integer | |
memory_per_channel_mb* | number |
GPUDevice object| Field | Type | Description |
|---|---|---|
kind* | "nvidia" | |
index* | integer | |
uuid* | string | |
name* | string | |
driver_version* | string | |
available* | boolean | false when no sample for 5 s (alarm gpu_unavailable). |
last_sample* | Time | |
utilization* | object | |
gpu* | Metric | |
memory* | Metric | |
encoder* | Metric | |
decoder* | Metric | |
memory* | object | |
total_mb* | Metric | |
used_mb* | Metric | |
used_pct* | Metric | |
temperature_c* | Metric | |
power_w* | Metric | |
power_limit_w* | Metric | |
clock_sm_mhz* | Metric | |
fan_pct* | Metric | |
pstate* | string | |
encoder* | object | |
sessions* | Metric | |
avg_fps* | Metric | |
throttle* | object | |
active* | boolean | |
mask* | string | |
reasons* | array of string | null | |
capacity* | GPUCapacityModel | |
model* | object | |
known* | boolean | |
arch* | string | |
nvenc* | integer | |
nvdec* | integer | |
memory_mb* | integer | |
consumer* | boolean | |
verified* | boolean | |
capacity_source* | string | |
committed* | object | |
encode_mpix_s* | number | |
decode_mpix_s* | number | |
sessions* | integer | |
effective* | object | |
encode_pct* | number | |
decode_pct* | number | |
memory_pct* | Metric | |
session_limit* | integer | 0 = none |
session_limit_source* | string | |
headroom* | GPUFree | |
full* | boolean | |
channels* | array of object | null | |
channel* | string | |
profile* | string | |
pid* | integer | |
memory_mb* | Metric | |
encode_mpix_s* | number | |
decode_mpix_s* | number | |
sessions* | integer | |
since* | Time |
GPUFree object| Field | Type | Description |
|---|---|---|
encode_mpix_s* | number | |
decode_mpix_s* | number | |
memory_mb* | number | -1 = unknown |
sessions* | integer | -1 = unlimited |
GPUInfo object| Field | Type | Description |
|---|---|---|
node* | string | |
monitor* | object | |
state* | string | one of: "off", "not_found", "starting", "running", "no_devices", "failed" |
reason* | string | |
path* | string | |
last_error* | string | |
restarts* | integer | |
parse_errors* | integer | |
samples* | integer | |
last_sample* | Time | |
dropped_fields* | array of string | null | |
apps_at* | Time | |
apps_error* | string | |
enforced* | boolean | Admission control active. |
policy* | object | |
max_encoder_util* | number | |
max_decoder_util* | number | |
max_memory_used* | number | |
max_temperature* | number | |
max_sessions* | string | "auto" or a number |
reserve* | number | |
hysteresis* | number | |
on_full* | string | |
retry_interval* | string | |
capacity* | GPUCapacityModel | |
models* | map of GPUCapacityModel | null | |
assume_source* | string | |
gpus* | array of GPUDevice | null | |
waiting* | array of object | null | |
channel* | string | |
profile* | string | |
reason* | string | |
since* | Time | |
cpu_fallback* | boolean | |
queued* | boolean | |
admissions* | object | |
admitted* | integer | |
rejected* | integer | |
cpu_fallbacks* | integer | |
queued* | integer | |
unenforced* | integer | |
session_limits_learned* | integer | |
moves* | integer | |
intel* | null | object |
GPULoad object| Field | Type | Description |
|---|---|---|
decode_mpix_s* | number | |
encode_mpix_s* | number | |
sessions* | integer | |
memory_mb* | number |
GPUNodeReport objectGPU inventory and free capacity a node publishes to the cluster (WP 6.3).
| Field | Type | Description |
|---|---|---|
monitor* | string | |
enforced* | boolean | |
gpus* | array of object | null | |
index* | integer | |
uuid* | string | |
name* | string | |
free* | GPUFree | |
encode_mpix_s* | number | |
decode_mpix_s* | number | |
mem_per_channel_mb* | number | |
load* | number | |
channels | array of string | |
waiting | array of string |
Health object| Field | Type | Description |
|---|---|---|
status* | string | one of: "ok", "degraded", "critical" |
node* | string | |
ts* | Time | |
reasons* | array of string | Why the status is not ok. |
channels* | object | |
total* | integer | min: 0 |
ok* | integer | min: 0 |
degraded* | integer | min: 0 |
failed* | integer | min: 0 |
stopped* | integer | Disabled or running on another cluster node. min: 0 |
sleeping* | integer | On-demand channels without consumers (not a problem). min: 0 |
problems* | array of object | |
channel* | string | |
state* | ChannelState | |
health* | string | one of: "degraded", "failed" |
reason* | string | |
transcoder_restarts_10m* | integer | min: 0 |
input_failovers_10m* | integer | Switches with reason input_lost. min: 0 |
alarms_available* | boolean | An alarm source (e.g. GPU monitoring) is registered. |
alarms* | array of ActiveAlarm | |
cluster* | object | |
enabled* | boolean | |
leader* | string | Raft leader ("" = none: critical); standalone: this node. |
HealthValue stringIdentity object| Field | Type | Description |
|---|---|---|
user* | string | |
method* | string |
one of: "basic", "api_key", "session" |
role* | string | one of: "admin", "viewer" |
allow_extra_args* | boolean | Server capability |
csrf_token | string | Cookie sessions only: send as |
expires_at | Time | Cookie sessions only: absolute end of the session (idle timeout applies earlier). |
InlineProfile objectA channel's own transcode profile (channel.transcode as an object): the fields of a Profile without its name and used_by.
| Field | Type | Description |
|---|---|---|
hardware* | string | |
deinterlace* | string | one of: "auto", "on", "off" |
deinterlace_rate | string | Omitted = frame. field: one frame per field (25i -> 50p). one of: "frame", "field" |
deinterlacer | string | Omitted = auto (bwdif if available). one of: "auto", "yadif", "bwdif" |
decode | string | NVIDIA decode location (docs/TRANSCODING.md 2.3). Omitted = auto. one of: "auto", "gpu", "cpu" |
cpu_decode_codecs | array of string | Source codecs decode=auto decodes on the CPU. |
crop | string | x:y:w:h in source display pixels. pattern: ^[0-9]+:[0-9]+:[0-9]+:[0-9]+$ |
scaler | string | one of: "bicubic", "bilinear", "lanczos" |
separate_audio | boolean | true = encode audio per rendition (default: once, shared via the tee muxer). |
video* | array of object | |
name* | string | |
codec* | string | none = audio-only rendition (Flussonic add_audio_only). one of: "h264", "hevc", "copy", "none" |
width* | integer | 0 or -1 = keep aspect ratio. min: -1 |
height* | integer | min: -1 |
bitrate* | ConfiguredBitrate | |
max_rate | ConfiguredBitrate | |
buf_size | ConfiguredBitrate | |
gop* | Duration | |
preset* | string | |
profile | string | |
level | string | |
fps* | number | min: 0 |
resize | string | one of: "scale", "fit", "crop" |
background | string | Letterbox background for fit: blur or a colour. |
sar | string | |
pix_fmt | string | one of: "yuv420p", "nv12" |
rc | string | one of: "cbr", "vbr" |
gop_frames | integer | Keyframe interval in frames (Flussonic gop=N); gop is then "0". min: 0 · max: 1000 |
bframes | integer | min: 0 · max: 4 |
open_gop | boolean | |
tune | string | one of: "hq", "ll", "ull" |
multipass | string | one of: "disabled", "qres", "fullres" |
spatial_aq | boolean | |
temporal_aq | boolean | |
lookahead | integer | min: 0 · max: 32 |
audio* | array of object | |
tracks* | string | |
codec* | string | one of: "aac", "ac3", "mp2", "copy" |
bitrate* | ConfiguredBitrate | |
channels* | integer | min: 0 |
sample_rate* | integer | min: 0 |
subtitles* | object | |
copy* | boolean | |
copy_teletext* | boolean | |
copy_dvbsub* | boolean | |
copy_scte35* | boolean | |
copy_data* | boolean | |
extra_args | array of string | Raw FFmpeg output options (omitted when empty). Read only unless |
InlineProfileRequest objectchannel.transcode as an object in a channel write: the fields of a ProfileRequest without its name and used_by.
| Field | Type | Description |
|---|---|---|
hardware | string | |
deinterlace | string | |
deinterlace_rate | string | |
deinterlacer | string | |
decode | string | |
cpu_decode_codecs | array of string | |
crop | string | |
scaler | string | |
separate_audio | boolean | |
video | array of object | |
name | string | |
codec | string | |
width | integer | |
height | integer | |
bitrate | ConfiguredBitrate | |
max_rate | ConfiguredBitrate | |
buf_size | ConfiguredBitrate | |
gop | Duration | |
preset | string | |
profile | string | |
level | string | |
fps | number | |
resize | string | |
background | string | |
sar | string | |
pix_fmt | string | |
rc | string | |
gop_frames | integer | |
bframes | integer | |
open_gop | boolean | |
tune | string | |
multipass | string | |
spatial_aq | boolean | |
temporal_aq | boolean | |
lookahead | integer | |
audio | array of object | |
tracks | string | |
codec | string | |
bitrate | ConfiguredBitrate | |
channels | integer | |
sample_rate | integer | |
subtitles | object | |
copy | boolean | |
copy_teletext | boolean | |
copy_dvbsub | boolean | |
copy_scte35 | boolean | |
copy_data | boolean | |
extra_args | array of string | null | Omitted or null = keep the stored ones (PUT). Setting or changing them needs |
InputAnalysis objectMedia analysis of an input (docs/API.md 4.7b); the last one (live false) while it is disconnected.
| Field | Type | Description |
|---|---|---|
live* | boolean | |
measured_at* | Time | |
video_codec* | string | "" = no video. |
width* | integer | min: 0 |
height* | integer | min: 0 |
scan* | string | one of: "", "interlaced", "progressive" |
fps* | number | min: 0 |
class* | string | one of: "uhd", "hd", "sd", "audio", "unknown" |
bitrate* | integer | min: 0 |
video_tracks* | integer | min: 0 |
audio_tracks* | integer | min: 0 |
subtitle_tracks* | integer | min: 0 |
teletext_tracks* | integer | min: 0 |
audio_languages* | array of string | |
missing_required* | integer | Required track-map slots this input cannot fill. min: 0 |
window* | object | |
window_s* | number | min: 0 |
observed_s* | number | min: 0 |
errored_s* | integer | Seconds with TR 101 290 P1 or CC errors, a gap or a reconnect. min: 0 |
p1* | integer | min: 0 |
p2* | integer | min: 0 |
p1_per_min* | number | min: 0 |
cc_errors* | integer | min: 0 |
reconnects* | integer | min: 0 |
gaps* | integer | min: 0 |
InputPool objectThe input's rank, quality score and connection slot (failover.select, failover.max_connected).
| Field | Type | Description |
|---|---|---|
rank* | integer | min: 1 |
score* | integer | null | null = never measured. min: 0 · max: 100 |
erroring* | boolean | |
stable_for_s* | number | min: 0 |
slot* | string | one of: "active", "switching", "pinned", "requested", "pool", "probing", "cooldown", "standby", "connected", "push" |
reason* | string | |
failures* | integer | min: 0 |
cooldown_until* | Time | |
last_failure* | string |
InputStatus object| Field | Type | Description |
|---|---|---|
index* | integer | min: 0 |
url* | string | Secrets redacted. |
state* | string | one of: "idle", "connecting", "receiving", "error" |
connected* | boolean | |
active* | boolean | |
health* | HealthValue | |
bitrate* | integer | min: 0 |
bytes* | integer | min: 0 |
packets* | integer | min: 0 |
errors* | integer | min: 0 |
cc_errors* | integer | min: 0 |
reconnects* | integer | min: 0 |
last_data* | Time | |
last_error* | string | |
remote* | string | Peer address; "channel:<source>[/<rendition>]" for copy:// inputs. |
healthy_for_s* | number | min: 0 |
srt_publish | SRTPortStatus | |
tr101290 | TR101290Status | |
analysis | null | InputAnalysis | |
pool | null | InputPool |
KickResult objectLabels map of stringFree key/value tags (at most 32). Keys ^[A-Za-z0-9][A-Za-z0-9_./-]{0,62}$, values ^[A-Za-z0-9_./-]{0,63}$.
LicenseMode stringdev = build without embedded license keys: nothing enforced.
LicenseStatus object| Field | Type | Description |
|---|---|---|
mode* | LicenseMode | |
status* | LicenseStatusValue | |
serving* | boolean | Viewers and outputs are served (valid license and EULA accepted, or dev mode). |
reason | string | Why the server does not serve. |
install_id* | string | |
fingerprint* | string | |
license* | null | object | |
lease* | null | object | |
limits* | object | |
max_channels* | integer | In force (0 = unlimited; also 0 without a valid license). min: 0 |
cluster* | boolean | |
channels* | integer | Enabled configured channels plus running dynamic ones. min: 0 |
eula* | object | |
version* | string | |
accepted* | boolean | |
accepted_at* | null | string | |
accepted_by | string | |
text* | string | |
warnings* | array of LicenseWarning | |
messages* | array of object | Messages of the license server (last heartbeat). |
level* | string | one of: "info", "warning" |
text* | string | |
cms* | object | |
url* | string | |
last_heartbeat* | null | string | |
heartbeat_error | string | |
lease_error | string | |
activation_pending* | boolean | |
build_date | string |
LicenseStatusValue stringLicenseWarning object| Field | Type | Description |
|---|---|---|
code* | string | one of: "lease_stale", "license_expiring", "eula_required", "cluster_not_licensed" |
message* | string | |
days | integer | Days until expires_at (license_expiring). min: 1 |
LoginRequest objectEither user and password, or api_key.
| Field | Type | Description |
|---|---|---|
user | string | |
password | string | |
api_key | string |
MaxConnected integerPull inputs connected at once (hot standby only; 0 = all).
Metric number | nullMeasured value; null = not reported by the driver ([N/A]).
Name stringNotificationDelivery object| Field | Type | Description |
|---|---|---|
target* | string | |
type* | string | one of: "mattermost", "email", "" |
status* | string | one of: "sent", "failed", "dropped", "suppressed" |
at* | Time | |
digest* | boolean | Sent as part of a summary message. |
error | string |
Notifications object| Field | Type | Description |
|---|---|---|
node* | string | |
enabled* | boolean | At least one target is configured. |
queue_length* | integer | Alarm events and messages waiting. min: 0 |
queue_capacity* | integer | min: 0 |
pending_hold_down* | integer | Raises waiting for the hold-down. min: 0 |
hold_down_s* | number | min: 0 |
digest_threshold* | integer | min: 0 |
digest_window_s* | number | min: 0 |
rate_limit_per_minute* | integer | min: 0 |
resolved* | boolean | Resolved messages are sent. |
sends_cluster_alarms* | boolean | This node sends cluster-wide alarms (standalone, or the cluster leader). |
dropped* | integer | Alarm events dropped (queue full). min: 0 |
flaps_suppressed* | integer | min: 0 |
skipped_not_leader* | integer | min: 0 |
unmatched* | integer | Raises no target's filter selected. min: 0 |
targets* | array of object | |
name* | string | |
type* | string | one of: "mattermost", "email" |
destination* | string | Redacted: webhook URL with the key masked, or smtp://host:port (tls) → recipients. |
min_severity* | string | one of: "info", "warning", "critical" |
events* | array of string | |
labels* | map of string | |
state* | string | one of: "ok", "failing", "idle" |
last_attempt* | Time | |
last_success* | Time | |
last_error* | string | |
last_error_at* | Time | |
sent* | integer | min: 0 |
failed* | integer | min: 0 |
dropped* | integer | min: 0 |
digests* | integer | min: 0 |
attempts* | integer | min: 0 |
queue_length* | integer | min: 0 |
batched* | integer | Events waiting for the next summary. min: 0 |
OnDemandState stringOnDemandStatus objectOn-demand state of a channel (docs/API.md 4.3); present when on_demand or transcode_on_demand is configured.
| Field | Type | Description |
|---|---|---|
on_demand* | boolean | |
transcode_on_demand* | boolean | |
idle* | Duration | |
state* | OnDemandState | The channel (its inputs); always awake without on_demand. |
transcoder | string | Omitted for channels without transcoding. one of: "sleeping", "waking", "running" |
consumers* | integer | Connected consumers (SRT, HTTP-TS, copy://). min: 0 |
transcode_consumers* | integer | Of these, consumers of a transcoded rendition. min: 0 |
always_on | string | Why it never sleeps, e.g. "1 UDP output" (UDP outputs are permanent consumers). |
last_consumer_at* | Time | |
sleeping_since* | Time | |
wakeups* | integer | min: 0 |
last_wake_at* | Time | |
last_wake_latency_ms* | integer | null | Wake-up until the first data. |
transcoder_wakeups* | integer | min: 0 |
transcoder_last_wake_at* | Time | |
transcoder_last_wake_latency_ms* | integer | null | |
error | string | Why the current wake-up fails (e.g. "transcoder not admitted (...)", no data in time). |
PackagerStatus object| Field | Type | Description |
|---|---|---|
segments* | integer | min: 0 |
last_segment* | Time | |
status* | string | |
unpackaged_audio* | array of object | Source audio tracks missing from the CMAF HLS (index.m3u8) and DASH output because CMAF cannot carry their codec (MP2, AAC-LATM); |
index* | integer | n-th audio track of the program (0-based) min: 0 |
pid* | integer | min: 0 · max: 8191 |
codec* | string | mp2, aac_latm |
language* | string | |
in_ts_segments* | boolean | |
reason* | string | |
renditions* | array of object | |
name* | string | |
running* | boolean | |
segments* | integer | min: 0 |
last_segment* | Time | |
restarts* | integer | min: 0 |
status* | string | |
last_error* | string |
PartialChannel objectThe fields of a channel object (§4.1) that a template or a templated channel sets itself; every field is optional and has the shape of ChannelConfig (a label may be null: the channel removes the template's label).
| Field | Type | Description |
|---|---|---|
failover | object | |
loss_timeout | Duration | |
return_after | Duration | |
standby | string | one of: "hot", "cold" |
node_standby | string | one of: "cold", "hot" |
transcode | string | null | InlineProfile | |
outputs | object | |
srt | boolean | |
srt_play | null | SRTPort | |
http_ts | boolean | |
hls | null | object | |
dash | null | object | |
udp | array of object | |
url* | string | |
auth | object | |
publish | boolean | |
read | boolean | |
labels | map of string | null | |
tracks | null | TracksConfig | |
on_demand | boolean | |
transcode_on_demand | boolean | |
on_demand_idle | Duration |
Placement map of objectPreviewToken object| Field | Type | Description |
|---|---|---|
token* | string | |
expires_at* | Time | |
hls_url* | string | |
dash_url* | string | |
http_ts_url* | string |
Profile object| Field | Type | Description |
|---|---|---|
name* | Name | |
hardware* | string | |
deinterlace* | string | one of: "auto", "on", "off" |
deinterlace_rate | string | Omitted = frame. field: one frame per field (25i -> 50p). one of: "frame", "field" |
deinterlacer | string | Omitted = auto (bwdif if available). one of: "auto", "yadif", "bwdif" |
decode | string | NVIDIA decode location (docs/TRANSCODING.md 2.3). Omitted = auto. one of: "auto", "gpu", "cpu" |
cpu_decode_codecs | array of string | Source codecs decode=auto decodes on the CPU. |
crop | string | x:y:w:h in source display pixels. pattern: ^[0-9]+:[0-9]+:[0-9]+:[0-9]+$ |
scaler | string | one of: "bicubic", "bilinear", "lanczos" |
separate_audio | boolean | true = encode audio per rendition (default: once, shared via the tee muxer). |
video* | array of object | |
name* | string | |
codec* | string | none = audio-only rendition (Flussonic add_audio_only). one of: "h264", "hevc", "copy", "none" |
width* | integer | 0 or -1 = keep aspect ratio. min: -1 |
height* | integer | min: -1 |
bitrate* | ConfiguredBitrate | |
max_rate | ConfiguredBitrate | |
buf_size | ConfiguredBitrate | |
gop* | Duration | |
preset* | string | |
profile | string | |
level | string | |
fps* | number | min: 0 |
resize | string | one of: "scale", "fit", "crop" |
background | string | Letterbox background for fit: blur or a colour. |
sar | string | |
pix_fmt | string | one of: "yuv420p", "nv12" |
rc | string | one of: "cbr", "vbr" |
gop_frames | integer | Keyframe interval in frames (Flussonic gop=N); gop is then "0". min: 0 · max: 1000 |
bframes | integer | min: 0 · max: 4 |
open_gop | boolean | |
tune | string | one of: "hq", "ll", "ull" |
multipass | string | one of: "disabled", "qres", "fullres" |
spatial_aq | boolean | |
temporal_aq | boolean | |
lookahead | integer | min: 0 · max: 32 |
audio* | array of object | |
tracks* | string | |
codec* | string | one of: "aac", "ac3", "mp2", "copy" |
bitrate* | ConfiguredBitrate | |
channels* | integer | min: 0 |
sample_rate* | integer | min: 0 |
subtitles* | object | |
copy* | boolean | |
copy_teletext* | boolean | |
copy_dvbsub* | boolean | |
copy_scte35* | boolean | |
copy_data* | boolean | |
extra_args | array of string | Raw FFmpeg output options (omitted when empty). Read only unless |
used_by* | array of string | Read only. |
ProfilePatch objectJSON Merge Patch (RFC 7386) of Profile.
| Field | Type | Description |
|---|---|---|
name | Name | |
hardware | string | null | |
deinterlace | string | null | |
deinterlace_rate | string | null | |
deinterlacer | string | null | |
decode | string | null | |
cpu_decode_codecs | array of string | null | |
crop | string | null | |
scaler | string | null | |
separate_audio | boolean | null | |
video | array of object | null | |
audio | array of object | null | |
subtitles | object | null | |
extra_args | array of string | null | null removes them; changing them needs api.allow_extra_args. |
used_by | array of any | null |
ProfileRequest object| Field | Type | Description |
|---|---|---|
name | Name | |
hardware | string | |
deinterlace | string | |
deinterlace_rate | string | |
deinterlacer | string | |
decode | string | |
cpu_decode_codecs | array of string | |
crop | string | |
scaler | string | |
separate_audio | boolean | |
video | array of object | |
name | string | |
codec | string | |
width | integer | |
height | integer | |
bitrate | ConfiguredBitrate | |
max_rate | ConfiguredBitrate | |
buf_size | ConfiguredBitrate | |
gop | Duration | |
preset | string | |
profile | string | |
level | string | |
fps | number | |
resize | string | |
background | string | |
sar | string | |
pix_fmt | string | |
rc | string | |
gop_frames | integer | |
bframes | integer | |
open_gop | boolean | |
tune | string | |
multipass | string | |
spatial_aq | boolean | |
temporal_aq | boolean | |
lookahead | integer | |
audio | array of object | |
tracks | string | |
codec | string | |
bitrate | ConfiguredBitrate | |
channels | integer | |
sample_rate | integer | |
subtitles | object | |
copy | boolean | |
copy_teletext | boolean | |
copy_dvbsub | boolean | |
copy_scte35 | boolean | |
copy_data | boolean | |
extra_args | array of string | null | Omitted or null = keep the stored ones (PUT). Setting or changing them needs |
used_by | array of string | Ignored. |
Readiness object| Field | Type | Description |
|---|---|---|
ready* | boolean | |
checks* | array of object | |
name* | string | one of: "config", "http_listener", "srt_listener", "channels", "cluster", "shutdown" |
ok* | boolean | |
detail | string | |
reasons* | array of string |
RemuxStatus object| Field | Type | Description |
|---|---|---|
copy_teletext* | boolean | |
copy_dvbsub* | boolean | |
copy_scte35* | boolean | |
copy_data* | boolean | |
locked* | boolean | |
offset* | integer | |
offset_ms* | integer | |
packets_remuxed* | integer | |
late_drops* | integer | |
overflow_drops* | integer | |
resyncs* | integer | |
renditions* | array of object | null | |
name* | string | |
locked* | boolean | |
offset* | integer | |
offset_ms* | integer | |
max_residual_ms* | number | |
resyncs* | integer | |
packets_remuxed* | integer | |
pes_remuxed* | integer | |
sections_remuxed* | integer | |
late_drops* | integer | |
overflow_drops* | integer | |
broken_drops* | integer | |
bad_pts* | integer | |
no_pts* | integer | |
queued* | integer | |
pmt_version* | integer | |
pids* | array of object | null | |
source_pid* | integer | |
pid* | integer | |
type* | string | one of: "teletext", "subtitle", "data" |
codec* | string | |
language | string |
SegmentedRequest boolean | null | objectServerInfo object| Field | Type | Description |
|---|---|---|
version* | string | |
commit* | string | |
build_date* | string | |
node* | string | |
started_at* | Time | |
uptime_s* | number | min: 0 |
go_version* | string | |
license | object | License summary for every role (UI banner); details in GET /license (admin). |
mode* | LicenseMode | |
status* | LicenseStatusValue | |
serving* | boolean | |
reason | string | |
warnings* | array of LicenseWarning | |
ffmpeg* | object | |
available* | boolean | |
version* | string | |
cpu* | object | |
cores* | integer | |
usage_pct* | number | |
load1* | number | |
memory* | object | |
rss_bytes* | integer | |
system_total_bytes* | integer | |
system_used_pct* | number | |
totals* | object | |
channels* | integer | |
channels_by_health* | object | |
ok* | integer | |
degraded* | integer | |
failed* | integer | |
sleeping* | integer | |
inputs* | integer | |
sessions* | integer | |
bitrate_in* | integer | |
bitrate_out* | integer |
Session object| Field | Type | Description |
|---|---|---|
id* | string | |
protocol* | string | one of: "srt", "http-ts", "hls", "dash" |
channel* | string | |
mode* | string | one of: "read", "publish" |
rendition | string | SRT / HTTP-TS readers of one rendition: "source" or a rendition name (omitted for the default read bus). |
remote_addr* | string | |
user* | string | |
preview | boolean | |
port | integer | Dedicated SRT port the session arrived on (omitted for the shared listener). |
node | string | Kick responses only: the cluster node the session was kicked on (omitted for this node). |
start* | Time | |
duration_s* | number | min: 0 |
bytes* | integer | min: 0 |
bitrate* | integer | min: 0 |
rtt_ms | number | |
packets_lost | integer | |
packets_retrans | integer | |
packets_dropped | integer |
SourceStatus object| Field | Type | Description |
|---|---|---|
tracks* | array of Track | |
pcr_pid* | integer | |
service_name* | string | |
provider* | string |
SRTPort objectDedicated per-channel SRT listener (outputs.srt_play, inputs[].srt_publish). Callers connect without streamid; the port identifies the channel. Unique across the configuration.
| Field | Type | Description |
|---|---|---|
port* | integer | min: 1 · max: 65535 |
passphrase* | string | "" (unencrypted) or 10..79 characters; "***" when redacted. |
pbkeylen* | integer | 0 = 16. one of: 0, 16, 24, 32 |
latency* | Duration | |
max_clients* | integer | srt_play only; 0 = unlimited. min: 0 |
auth* | boolean | null | null = like the channel's auth.read / auth.publish. |
rendition | string | srt_play only (omitted when ""): what viewers get — "" = the read bus (first rendition when transcoding), "source" = the untranscoded source, or a rendition of the channel's transcode profile. A caller's streamid may name another rendition ("720p", "read:720p", "<channel>/720p"). |
SRTPortRequest object| Field | Type | Description |
|---|---|---|
port* | integer | |
passphrase | string | |
pbkeylen | integer | |
latency | Duration | |
max_clients | integer | |
auth | boolean | null | |
rendition | string | srt_play only: "", "source" or a rendition name. |
SRTPortStatus objectState of a dedicated SRT port on this node.
| Field | Type | Description |
|---|---|---|
port* | integer | min: 1 · max: 65535 |
url* | string | srt://host:port (no streamid, no passphrase). |
encrypted* | boolean | |
bound* | boolean | Listening on this node (false on cluster nodes not serving the channel, or while the bind fails). |
clients* | integer | min: 0 |
error* | string | Last bind error. |
viewers* | integer | min: 0 |
bitrate_out* | integer | min: 0 |
rendition | string | srt_play: the configured rendition (omitted for the default read bus). |
StandaloneStatus object| Field | Type | Description |
|---|---|---|
enabled* | false | |
mode* | "standalone" | |
leader* | string | |
nodes* | array of object | |
id* | string | |
address* | string | |
role* | "standalone" | |
state* | "up" | |
channels* | array of string | |
last_seen* | Time | |
version* | string |
StreamOutput object| Field | Type | Description |
|---|---|---|
enabled* | boolean | |
viewers* | integer | min: 0 |
bitrate_out* | integer | min: 0 |
url* | string | "" when disabled. |
ts_url | string | HLS with ts_segments. |
rendition_urls | map of string | SRT and HTTP-TS of a transcoded channel: URL per rendition name, plus "source" (the untranscoded source). Omitted when the output is disabled or the channel is not transcoded. |
packager | PackagerStatus |
SwitchEvent object| Field | Type | Description |
|---|---|---|
at* | Time | |
from* | integer | null | |
to* | integer | null | |
reason* | SwitchReason | |
detail | string |
SwitchReason stringTemplatedChannel PartialChannel & objectStored form of a channel with a template (docs/API.md 4.14): name, template, enabled and inputs, plus only the fields the channel sets itself; overrides lists their paths, effective is the complete channel (read only).
| Field | Type | Description |
|---|---|---|
name* | Name | |
template* | Name | |
enabled* | boolean | |
inputs* | array of object | |
overrides* | array of string | Paths of the fields the channel sets itself, e.g. "outputs.hls.window", "labels.tier". |
effective* | ChannelConfig |
Time string (date-time) | nullRFC 3339 UTC with milliseconds; null = never.
TR101290Status objectETSI TR 101 290 errors of an input since it started (docs/API.md 14.1). Intervals are measured in stream time (PCR); pcr_accuracy_error is not measurable over IP (measured: false).
| Field | Type | Description |
|---|---|---|
p1* | integer | Priority 1 errors (sync, PAT, CC, PMT, PID). min: 0 |
p2* | integer | Priority 2 errors (transport, CRC, PCR, PTS, CAT). min: 0 |
p3* | integer | Priority 3 errors (NIT/SDT repetition, unreferenced PID). min: 0 |
indicators* | array of object | |
name* | string | one of: "ts_sync_loss", "sync_byte_error", "pat_error", "continuity_count_error", "pmt_error", "pid_error", "transport_error", "crc_error", "pcr_repetition_error", "pcr_discontinuity_indicator_error", "pcr_accuracy_error", "pts_error", "cat_error", "nit_actual_error", "sdt_actual_error", "unreferenced_pid" |
priority* | integer | one of: 1, 2, 3 |
count* | integer | min: 0 |
last | Time | |
measured* | boolean |
Track object| Field | Type | Description |
|---|---|---|
pid* | integer | |
input_pid* | integer | |
stream_type* | integer | |
type* | string | one of: "video", "audio", "subtitle", "teletext", "data" |
codec* | string | |
profile | string | |
width | integer | |
height | integer | |
fps | number | |
interlaced | boolean | |
bitrate* | integer | min: 0 |
language | string | |
channels | integer | |
sample_rate | integer | |
hearing_impaired | boolean | |
teletext_pages | array of object | |
page* | integer | |
language* | string | |
kind* | string | one of: "initial", "subtitle", "hearing_impaired", "info", "schedule" |
TrackKind stringTrackMap objectResolved track mapping (status.track_map, tracks preview).
| Field | Type | Description |
|---|---|---|
configured* | boolean | false: no tracks section, every source track passes (selector all). |
keep_empty_slots* | boolean | |
input* | integer | null | Input resolved against (null = no source program known). |
sources* | array of TrackSource | |
slots* | array of TrackSlot | |
warnings* | array of string | Unmatched required slots. |
TrackMatch objectAll given fields must match; {} matches any stream of the kind. pid = fixed binding, anything else = lookup rule.
| Field | Type | Description |
|---|---|---|
pid | integer | min: 16 · max: 8190 |
lang | string | ISO 639 (deu = ger = de). |
codec | string | |
index | integer | n-th stream of the kind in source PMT order. min: 1 · max: 64 |
page | integer | Teletext page. min: 100 · max: 899 |
hearing_impaired | boolean | |
stream_type | integer | min: 1 · max: 255 |
name_regex | string | max length: 256 |
TracksConfig objectOutput track selection per kind (docs/API.md 4.1 "tracks"): null = all (default), "all", "none", "first" or an ordered array of selectors (array order = output order; each selector chain is one slot with a fixed output PID).
TrackSelector object| Field | Type | Description |
|---|---|---|
match* | TrackMatch | |
fallback* | string | next: if nothing matches, the next selector is tried for the same slot. one of: "skip", "next" |
required* | boolean | Unmatched: status warning and track_missing alarm. |
all_matches* | boolean | Take every match (up to 8 PIDs) instead of the first. |
also* | boolean | The slot may take a source track another slot takes too (e.g. the same audio once copied, once transcoded); it does not claim the track either. Applies to the whole slot (any selector of a fallback chain). Shorthand term also. |
out* | object | |
lang* | string | Language override (3-letter ISO 639-2); "" = keep. |
label* | string | HLS/DASH audio rendition name; "" = from the language. |
text* | string | Shorthand string form (read-only), e.g. lang:deu,required. |
TrackSet null | string | array of TrackSelectorTrackSetRequest null | string | array of string | objectTrackSlot object| Field | Type | Description |
|---|---|---|
kind* | TrackKind | |
slot* | integer | min: 0 |
selector* | string | Shorthand, "all" or "first". |
fixed* | boolean | Fixed PID binding (else lookup rule). |
required* | boolean | |
also* | boolean | Selector also: the source may be shared with other slots (then several slots show the same matched_source_pid). |
state* | string | one of: "matched", "missing", "empty" |
matched_source_pid* | integer | null | |
source* | null | TrackSource | |
output_pid* | integer | |
lang | string | |
label | string |
TrackSource object| Field | Type | Description |
|---|---|---|
pid* | integer | Source (input) PID. |
kind* | TrackKind | |
index* | integer | min: 1 |
stream_type* | integer | |
codec* | string | |
lang | string | |
langs | array of string | |
pages | array of integer | |
hearing_impaired | boolean | |
description* | string | What name_regex matches: kind, codec, languages, pages, registration, service. |
TracksRequest object| Field | Type | Description |
|---|---|---|
video | TrackSetRequest | |
audio | TrackSetRequest | |
subtitles | TrackSetRequest | |
teletext | TrackSetRequest | |
scte35 | TrackSetRequest | |
data | TrackSetRequest | |
keep_empty_slots | boolean |
TranscoderStatus object| Field | Type | Description |
|---|---|---|
profile* | string | |
state* | string | sleeping = on-demand transcoder without consumers (no FFmpeg, no GPU lease). one of: "starting", "running", "backoff", "stopped", "sleeping" |
hardware* | string | |
fps* | number | |
speed* | number | |
uptime_s* | number | min: 0 |
restarts* | integer | min: 0 |
stall_restarts* | integer | min: 0 |
last_exit* | string | |
last_errors* | array of string | |
error | string | |
gpu | string | GPU admission (WP 6.3); omitted without admission control. |
admission | AdmissionState | |
admission_detail | string | |
renditions* | array of object | |
name* | string | |
bitrate_out* | integer | min: 0 |
remux | RemuxStatus | |
gpu_device | integer | GPU index (nvidia-smi order) FFmpeg uses; omitted = none / default GPU. min: 0 |
decode | string | Where the source video is decoded. one of: "gpu", "cpu" |
decode_reason | string | Why a GPU plan decodes on the CPU (decode: cpu, cpu_decode_codecs, fallback, source not NVDEC-decodable on this GPU generation / FFmpeg build), or, with decode gpu, that Blackwell NVDEC 4:2:2 frames go through system memory. |
shared_audio | boolean | Audio encoded once and shared by all renditions. |
fallbacks | array of string | Hardware fallbacks applied after FFmpeg errors (sticky until the transcoder restarts). |
error_class | string | Class of the last GPU-related FFmpeg error. one of: "nvdec_unsupported", "nvdec_surfaces", "nvenc_unsupported_feature", "nvenc_session_limit", "gpu_out_of_memory", "gpu_unavailable" |
source | object | Source video sniffed from the input (PMT, SPS / sequence header, pictures); followed while the transcoder runs when its plan depends on it. |
video_codec* | string | |
width* | integer | |
height* | integer | |
chroma_format* | integer | 1 = 4:2:0, 2 = 4:2:2, 3 = 4:4:4, 0 unknown |
bit_depth* | integer | |
interlaced* | boolean | The source carries (or may carry) interlaced pictures. |
progressive* | boolean | The source is known to be progressive (interlaced and progressive both false: unknown). |
sar | string | Sample aspect ratio as the decoder reports it (unspecified = 1:1); omitted when unknown. |
frame_rate* | number | |
audio_tracks* | integer | |
load | object | Estimated cost of the current plan (transcode.EstimateLoadFor). |
gpu* | boolean | |
decode_on_gpu* | boolean | |
encode_sessions* | integer | |
decode_mpix_s* | number | |
encode_mpix_s* | number | Preset-weighted (p4 = 1). |
gpu_memory_mb* | integer | |
host_copies_per_s* | number | |
cpu_cores* | number | |
units* | number | |
filters | array of string | Source-dependent filter decisions of the current plan (docs/TRANSCODING.md §2.5): deinterlacer skipped for a progressive source or run on interlaced frames only, fps moved first, fit/crop/background skipped when the source has the rendition's aspect ratio. A source change that alters them restarts FFmpeg with a new plan. |