{
  "openapi": "3.1.0",
  "info": {
    "contact": {
      "email": "support@flussonic.com",
      "name": "Support team",
      "url": "https://flussonic.com/"
    },
    "description": "This document is a comprehensive API specification for the Flussonic Media Server.\n\nThe Flussonic Media Server API lets you manage the server configuration: retrieving the data about the streams, DVRs, templates, and others, \ncreating/updating, and removing them.\nTo know more about our API's design principles, see [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/).\n\nPermanent [download link](https://flussonic.com/doc/api/reference.json) to JSON schema file.\n\nThis API Reference provides you with all the methods, fields, values, and endpoints currently accessible in Flussonic.\n\nBefore you proceed, read the following information:\n\n* `server_config` represents the server configuration file. Our built-in config parser validates the configuration file structure \naccording to this specification.\n* Some API methods may send extra fields in responses, so your application must be ready to drop them;\n* Do not rely on undocumented fields in the responses as we may modify them at any moment.\n* In further updates of this document, some fields may become deprecated. Such fields will be scheduled for deletion with \n`x-delete-at` property with year and month, after which it will no longer exist.\n* To disable a feature, provide the corresponding property with the `null` value. Learn more about the upsert method in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-upsert).\n",
    "title": "Flussonic Media Server API",
    "version": "26.03-428"
  },
  "components": {
    "schemas": {
      "program_id": {
        "type": "integer",
        "minimum": 1,
        "maximum": 65535,
        "x-notice": "mpegts program number"
      },
      "ts_pid": {
        "maximum": 8191,
        "minimum": 0,
        "type": "integer"
      },
      "iso8601": {
        "type": "integer",
        "x-notice": "2016-07-08T09:04:46Z"
      },
      "psi_version": {
        "type": "integer",
        "minimum": 0,
        "maximum": 31
      },
      "loglevel": {
        "type": "string",
        "description": "The level of logging according to event importance. Several values separated by comma.",
        "example": "debug",
        "enum": [
          "none",
          "debug",
          "info",
          "notice",
          "warning",
          "error",
          "alert",
          "critical"
        ]
      },
      "auth_token": {
        "type": "string",
        "format": "auth_token",
        "default": "token",
        "example": "token",
        "description": "Configure key name of query string key-value pair for token authentication\n",
        "x-format-description": "auth_token"
      },
      "collection_response": {
        "type": "object",
        "properties": {
          "estimated_count": {
            "description": "Estimated total number of records for the query (regardless of the cursors).\n",
            "type": "integer",
            "example": 5
          },
          "next": {
            "description": "Next cursor: a properly encoded equivalent of offset allowing to read the next bunch of items.\nLearn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "example": "JTI0cG9zaXRpb25fZ3Q9MA==",
            "type": "string"
          },
          "prev": {
            "description": "Previous cursor: a properly encoded equivalent of offset allowing to read the previous bunch of items.\nLearn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "example": "JTI0cG9zaXRpb25fbHQ9MSYlMjRyZXZlcnNlZD10cnVl",
            "type": "string"
          },
          "timing": {
            "description": "An object with a list of different timings measured during this API call.",
            "type": "object"
          }
        }
      },
      "error_response": {
        "type": "object",
        "properties": {
          "errors": {
            "description": "List of structured errors",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/error"
            }
          }
        }
      },
      "error": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "a unique identifier for this particular occurrence of the problem\n"
          },
          "status": {
            "type": "string",
            "description": "the HTTP status code applicable to this problem, expressed as a string value\n"
          },
          "code": {
            "type": "string",
            "description": "an application-specific error code, expressed as a string value\n"
          },
          "title": {
            "type": "string",
            "description": "a short, human-readable summary of the problem that SHOULD NOT change from\noccurrence to occurrence of the problem, except for purposes of localization\n"
          },
          "source": {
            "description": "an object containing references to the source of the error\n",
            "type": "object",
            "properties": {
              "pointer": {
                "type": "string",
                "description": "a JSON Pointer [RFC6901] to the associated entity in the request document\n[e.g. `\"/data\"` for a primary data object, or `\"/data/attributes/title\"` for a specific attribute].\n"
              },
              "parameter": {
                "type": "string",
                "description": "a string indicating which URI query parameter caused the error."
              }
            }
          },
          "meta": {
            "type": "object",
            "description": "a meta object containing non-standard meta-information about the error.\n",
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            }
          }
        }
      },
      "thumbnails_spec": {
        "type": "object",
        "properties": {
          "url": {
            "description": "*Flussonic* takes a thumbnail from the specified URL on each keyframe.\nMay reduce CPU usage on IP cameras.\n",
            "type": "string",
            "example": "http://10.115.23.45/isapi/thumbnail.jpg"
          },
          "enabled": {
            "description": "Whether to generate thumbnails from the video stream.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/thumbnails_enabled_spec"
              }
            ]
          },
          "sizes": {
            "description": "What sizes will be used for thumbnails generation.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/thumbnails_size_spec"
            }
          },
          "hw": {
            "$ref": "#/components/schemas/transcoder_device"
          },
          "deviceid": {
            "$ref": "#/components/schemas/tc_deviceid"
          }
        }
      },
      "thumbnails_enabled_spec": {
        "oneOf": [
          {
            "type": "boolean",
            "enum": [
              true,
              false
            ],
            "description": "Configures thumbnails behaviour.\n- true : \n\n    In case of Stream: \n      Thumbnails are created and stored in DVR during the recording. If thumbnail is requested then it will be returned from DVR.\n\n    In case of VOD:\n      Thumbnails are created and stored in VOD location at thumbnails folder during the VOD opening if they are not created yet.\n      If VOD location is `readonly` then it will be used only for thumbnails searching. Nothing will be created and stored.  \n\n      If thumbnail is requested then it will be returned from thumbnails folder in VOD location.\n\n- false : thumbnails are not stored at all. If thumbnail is requested then 403 'Forbidden' error will be returned.\n"
          },
          {
            "type": "string",
            "enum": [
              "ondemand"
            ],
            "description": "- ondemand : thumbnails are not stored at all. If thumbnail is requested then it will be generated from corresponding video frame.\n"
          }
        ]
      },
      "thumbnails_size_spec": {
        "type": "object",
        "properties": {
          "width": {
            "type": "integer",
            "description": "The thumbnail width."
          },
          "height": {
            "type": "integer",
            "description": "The thumbnail height."
          }
        }
      },
      "ad_placement": {
        "type": "string",
        "description": "The advertising placement type.",
        "enum": [
          "preroll",
          "midroll"
        ]
      },
      "session_key": {
        "description": "Session key used to build a session ID.\n  Known key names:\n  - `ip` — IP address\n  - `name` — Stream name\n  - `token` — Token",
        "type": "string"
      },
      "protocol": {
        "type": "string",
        "enum": [
          "copy",
          "fake",
          "rtp",
          "rtmp",
          "rtmps",
          "rtmpe",
          "rtsp",
          "rtsp-udp",
          "rtsp2",
          "rtsps",
          "est",
          "srt",
          "mseld",
          "shoutcast",
          "shoutcasts",
          "webrtc",
          "hls",
          "hlss",
          "hls2",
          "hlss2",
          "llhls",
          "cmaf",
          "dash",
          "mss",
          "m4s",
          "m4ss",
          "m4f",
          "m4fs",
          "tshttp",
          "tshttps",
          "tstcp",
          "tsssl",
          "flv",
          "annexb",
          "udp",
          "udp1",
          "udp2",
          "udp3",
          "mpts-udp",
          "mpts-http",
          "mpts-https",
          "mpts-dvb",
          "dvb",
          "decklink",
          "dektec",
          "dektec-asi",
          "v4l",
          "v4l2",
          "playlist",
          "mixer",
          "mosaic",
          "mosaic2",
          "timeshift",
          "file",
          "download",
          "mbr",
          "mp4",
          "logo",
          "jpeg",
          "mjpeg",
          "h323",
          "ad_injector",
          "ffmpeg",
          "transponder",
          "api",
          "json_manifest",
          "player",
          "ndi",
          "frip",
          "st2110",
          "backup",
          "mxl"
        ]
      },
      "security_protocol": {
        "type": "string",
        "enum": [
          "tlsv1",
          "tlsv1.1",
          "tlsv1.2",
          "tlsv1.3"
        ]
      },
      "segments_container": {
        "type": "string",
        "enum": [
          "cmaf",
          "fmp4",
          "mpegts"
        ]
      },
      "session_generic": {
        "type": "object",
        "description": "Ancestor for all session-like entities. Something like a generic report for a flow.\nCan be suitable for an input, push or play\n",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier (or UUID) of the session.",
            "example": "61942414-8c15-4809-8bb6-adf1ae846027",
            "x-format-description": "uuid"
          },
          "ip": {
            "type": "string",
            "description": "IP address of the connected peer.",
            "example": "172.16.25.73"
          },
          "proto": {
            "$ref": "#/components/schemas/protocol"
          },
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this session was created.",
            "example": 1637094994000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "started_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the frames transmission started in the session.",
            "example": 1637095014000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "updated_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the session was last updated.",
            "example": 1637098611000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "closed_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the session was closed.",
            "example": 1637098821000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "segments_container": {
            "$ref": "#/components/schemas/segments_container"
          },
          "secure": {
            "type": "boolean",
            "description": "This flag indicates that TLS (SSL) was used to serve this session.\nIt may be either input (ingest, publish) or output (push, play) session, this flag will be\nfilled for any of them.\n"
          },
          "security_protocol": {
            "$ref": "#/components/schemas/security_protocol"
          },
          "manifest_type": {
            "$ref": "#/components/schemas/manifest_type"
          },
          "named_by": {
            "$ref": "#/components/schemas/named_by"
          },
          "media_info": {
            "$ref": "#/components/schemas/media_info"
          },
          "ts_delay": {
            "type": "number",
            "format": "ticks",
            "example": 1284,
            "description": "The time period during which no frames were received from the stream's input.\n",
            "openmetrics_metric": "ts_delay",
            "x-format-description": "ticks"
          },
          "ts_delay_per_tracks": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "ticks",
              "x-format-description": "ticks"
            },
            "example": [
              1284
            ],
            "description": "The time period during which no frames were received per each track according to `media_info`\n",
            "openmetrics_metric": "ts_delay"
          }
        }
      },
      "session_details": {
        "type": "object",
        "description": "This fields can deanonymise user and thus can be sent to telemetry only if allowed.\n",
        "properties": {
          "name": {
            "type": "string",
            "format": "media_name",
            "description": "File used in the streaming session.",
            "example": "hockey1",
            "x-format-description": "media_name"
          },
          "token": {
            "type": "string",
            "format": "session_token",
            "description": "Token provided by the client.",
            "example": "zGAFxLkoWluO1pG7_nJmQAbCnM5",
            "x-format-description": "session_token"
          },
          "country": {
            "type": "string",
            "format": "iso3166",
            "description": "Peer's IP geolocation (country).",
            "example": "us",
            "x-format-description": "iso3166"
          },
          "user_id": {
            "type": "string",
            "description": "User ID provided by the Middleware authorization backend.",
            "example": "5435"
          },
          "user_name": {
            "type": "string",
            "format": "media_name",
            "description": "User-provided original stream or VOD name before the rewrite of a media [aliaser](https://flussonic.com/doc/hide-publisher-stream-name-from-viewers/).",
            "x-format-description": "media_name"
          },
          "referer": {
            "type": "string",
            "format": "uri",
            "description": "Referer HTTP header or its analog for other protocols.",
            "example": "http://my-tv-portal.local/hockey1",
            "x-format-description": "uri"
          },
          "query_string": {
            "type": "string",
            "description": "Full query string for the initial request of the session."
          },
          "current_time": {
            "type": "number",
            "format": "milliseconds",
            "description": "The current time value of the playback session.",
            "x-format-description": "milliseconds"
          },
          "user_agent": {
            "type": "string",
            "description": "Client's user agent for selected protocol.",
            "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36"
          },
          "allowed_dvr_from": {
            "type": "integer",
            "format": "utc",
            "description": "This field indicates that session has allowed_dvr_ranges delivered from authorization backend and shows where allowed content starts.\n",
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "allowed_dvr_to": {
            "type": "integer",
            "format": "utc",
            "description": "This field indicates that session has allowed_dvr_ranges delivered from authorization backend and shows where allowed content ends.\n",
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          }
        }
      },
      "session_playback": {
        "type": "object",
        "description": "Playback specific fields\n",
        "properties": {
          "hls_separate_audio": {
            "type": "boolean",
            "description": "The flag shows if the HLS separate_audio mode is enabled for the session."
          },
          "filter_tracks": {
            "type": "boolean",
            "description": "The flag shows if the track filtering is applied for the session."
          },
          "dvr": {
            "type": "boolean",
            "description": "This flag indicates that this session was using DVR.\n"
          },
          "advertising": {
            "type": "boolean",
            "description": "This flag indicates that advertising was shown in this session.\n"
          },
          "max_sessions": {
            "type": "integer",
            "description": "The maximum number of sessions allowed for the given `user_id` by the middleware authorization backend."
          },
          "soft_limitation": {
            "type": "boolean",
            "default": false,
            "description": "The flag shows if the soft limitation mode is enabled for the sessions with the given `user_id`."
          }
        }
      },
      "session_counters": {
        "type": "object",
        "properties": {
          "bytes": {
            "type": "integer",
            "format": "bytes",
            "default": 0,
            "description": "Number of bytes sent in the session.",
            "openmetrics_metric": "bytes",
            "x-format-description": "bytes"
          },
          "disk_bytes": {
            "type": "integer",
            "format": "bytes",
            "description": "Number of bytes read from disk in the session.\n",
            "x-format-description": "bytes"
          },
          "disk_orig_bytes": {
            "type": "integer",
            "format": "bytes",
            "description": "The total number of bytes the media occupies on disk, all track including.\n",
            "x-format-description": "bytes"
          }
        }
      },
      "session": {
        "allOf": [
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/session_details"
          },
          {
            "$ref": "#/components/schemas/session_counters"
          },
          {
            "$ref": "#/components/schemas/session_player"
          },
          {
            "$ref": "#/components/schemas/session_playback"
          }
        ]
      },
      "session_player": {
        "type": "object",
        "properties": {}
      },
      "manifest_type": {
        "type": "string",
        "enum": [
          "index",
          "archive",
          "event",
          "rewind",
          "timeshiftAbs",
          "timeshiftRel"
        ]
      },
      "playback_headers": {
        "type": "object",
        "properties": {
          "playback": {
            "type": "string",
            "description": "Playback type for which the HTTP headers apply.",
            "example": "live",
            "enum": [
              "live",
              "dvr"
            ]
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "headers": {
            "additionalProperties": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "type": "object",
            "maxItems": 10,
            "x-key-type": "string",
            "description": "HTTP headers in name-value format for manifest requests.",
            "example": {
              "Cache-Control": "max-age=3600"
            }
          },
          "segment_headers": {
            "additionalProperties": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "type": "object",
            "maxItems": 10,
            "x-key-type": "string",
            "description": "HTTP headers in name-value format for segment requests.",
            "example": {
              "Cache-Control": "max-age=3600"
            }
          }
        }
      },
      "frame_codec": {
        "enum": [
          "h264",
          "hevc",
          "mp2v",
          "vp9",
          "mjpeg",
          "screen",
          "jpeg",
          "av1",
          "j2k",
          "aac",
          "mp3",
          "mp2a",
          "opus",
          "ac3",
          "eac3",
          "pcma",
          "pcmu",
          "pcm_s24be",
          "pcm_s24le",
          "yuv",
          "uyvy422",
          "yuyv422",
          "yuv422p10",
          "argb",
          "rgb48",
          "v210",
          "pcm",
          "r210",
          "ttxt",
          "text",
          "wvtt",
          "ttml",
          "subtitle",
          "id3t",
          "onvif",
          "tx3g",
          "mpegts",
          "object",
          "eit",
          "scte27",
          "scte35",
          "klv",
          "empty",
          "scte104"
        ],
        "type": "string"
      },
      "frame_content": {
        "type": "string",
        "enum": [
          "audio",
          "video",
          "text",
          "metadata",
          "application"
        ]
      },
      "frame_video_pix_fmt": {
        "type": "string",
        "enum": [
          "yuv420p",
          "yuvj420p",
          "yuv422p",
          "yuv444p",
          "yuv420p10",
          "yuv422p10",
          "yuv444p10",
          "yuv420p12",
          "yuv422p12",
          "yuv444p12",
          "gray8",
          "gray10",
          "gray12",
          "nv12",
          "p016",
          "v210",
          "uyvy422",
          "yuyv422",
          "rgb48",
          "argb",
          "x2rgb10be"
        ]
      },
      "track_info": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/track_info_video"
          },
          {
            "$ref": "#/components/schemas/track_info_audio"
          },
          {
            "$ref": "#/components/schemas/track_info_text"
          },
          {
            "$ref": "#/components/schemas/track_info_metadata"
          },
          {
            "$ref": "#/components/schemas/track_info_application"
          }
        ],
        "discriminator": {
          "propertyName": "content",
          "mapping": {
            "video": "#/components/schemas/track_info_video",
            "audio": "#/components/schemas/track_info_audio",
            "text": "#/components/schemas/track_info_text",
            "metadata": "#/components/schemas/track_info_metadata",
            "application": "#/components/schemas/track_info_application"
          }
        }
      },
      "track_info_base": {
        "type": "object",
        "properties": {
          "track_id": {
            "description": "Track identifier assigned by Flussonic.",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "example": "v1"
          },
          "frame_duration": {
            "description": "For video track, it is the time between the beginning of a frame and the beginning of the next frame.\n\nThis parameter is important for some protocols. Normally, frame duration is a difference between timestamps of two neighbouring frames.\nHowever, sometimes (when the connection is broken) video breakups are possible.\nAs result, the delta between two consequent frame timestamps will not be equal to the frame duration.\nThis situation is considered as a frame gap and is handled differently across different protocols.\n",
            "type": "number",
            "format": "ticks",
            "x-format-description": "ticks"
          },
          "avg_fps": {
            "description": "Actual average FPS - the number of frames diplayed per second (calculated for the last 200 frames).\nThe higher FPS is, the smoother the video playback is. \nUsually, standard values of FPS for films and video are used in different countries (for example, in Russia and Europe it is 25 FPS).\n",
            "type": "number",
            "x-notice": "calculated fps for statistic"
          },
          "bandwidth": {
            "description": "Bandwidth necessary to transfer this track.\nThis is slightly grater than bitrate because transport (e.g. MPEG TS) adds some overhead\n",
            "type": "integer",
            "format": "speed",
            "example": 2600,
            "x-format-description": "speed"
          }
        }
      },
      "track_info_base_configurable": {
        "type": "object",
        "required": [
          "content"
        ],
        "properties": {
          "content": {
            "$ref": "#/components/schemas/frame_content"
          },
          "title": {
            "description": "Human-readable localized title of the track.",
            "type": "string",
            "x-notice": "Human-readable localized title for HDS/HLS",
            "example": "Video1"
          },
          "bitrate": {
            "description": "Bitrate of the track in kbit/s.\nWhen using sdtv/hdtv/uhdtv transcoder target, for video tracks\nthis field sets the desired transport bandwidth instead of raw video bitrate.\n",
            "type": "integer",
            "format": "speed",
            "example": 2543,
            "x-api-allow": [
              "smartcam",
              "iris-hal"
            ],
            "x-format-description": "speed"
          },
          "pid": {
            "$ref": "#/components/schemas/ts_pid"
          }
        }
      },
      "track_info_video": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_video_specific"
          },
          {
            "$ref": "#/components/schemas/track_info_video_configurable"
          }
        ]
      },
      "track_info_video_specific": {
        "type": "object",
        "properties": {
          "last_gop": {
            "description": "Last GOP size (expressed in number of frames).\nThis parameter is used to monitor the quality of encoding: normally, average GOP size should be equal to the last GOP size.\nIf this value is floating, this means that your transcoder is working in a flexible GOP size mode and some players may have problems.\nThis is not acceptable by most ABR usecases and it will not pass DVB validation protocol.\n",
            "type": "integer",
            "example": 28
          },
          "avg_gop": {
            "type": "integer",
            "description": "Average GOP size (expressed in number of frames) of the last 1000-2000 frames.\nThis parameter is used to monitor the quality of encoding: normally, average GOP size should be equal to the last GOP size.\nIf this value is floating, this means that your transcoder is working in flexible GOP size mode and some players may have problems.\nThis is not acceptable by most ABR usecases and it will not pass DVB validation protocol.\n",
            "example": 25
          },
          "length_size": {
            "enum": [
              2,
              4
            ],
            "default": 4,
            "type": "integer",
            "x-notice": "H264 private option",
            "description": "The size of the length field for H264 bitstream without start codes."
          },
          "is_progressive": {
            "description": "Indicates if progressive scanning method is used for all frames of the track\n",
            "type": "boolean",
            "default": true
          },
          "closed_captions": {
            "description": "Parameters of closed captions.",
            "items": {
              "$ref": "#/components/schemas/closed_captions"
            },
            "type": "array"
          }
        }
      },
      "track_info_video_configurable": {
        "type": "object",
        "properties": {
          "width": {
            "description": "The picture width in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\n",
            "type": "integer",
            "format": "pixels",
            "x-api-allow": [
              "smartcam"
            ],
            "x-format-description": "pixels"
          },
          "height": {
            "description": "The picture height in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\n",
            "type": "integer",
            "format": "pixels",
            "x-api-allow": [
              "smartcam"
            ],
            "x-format-description": "pixels"
          },
          "fps": {
            "description": "Frame rate (frames per second) - the speed at which a sequence of images is displayed on a screen.\nHigher frame rates capture more images per second, which makes for smoother video.\nThe standard frame rate for color television in the Phase Alternating Line (PAL) format is 25 fps.\nThe standard frame rate for color television in the National Television System Committee (NTSC) format is 29,97 fps\n(a little bit lower than the original frame rate of black and white NTSC television, equal to 30 fps.)\nIf interlaced TV is used, two fields of each frame (with odd-numbered lines and with even-numbered lines) are displayed consequently,\nbut the frame rate is actually not doubled (50 half-frames are still equal to 25 original frames). \n",
            "type": "number",
            "x-api-allow": [
              "smartcam"
            ]
          },
          "pix_fmt": {
            "$ref": "#/components/schemas/frame_video_pix_fmt",
            "default": "yuv420p"
          },
          "num_refs_frames": {
            "type": "integer",
            "maximum": 32,
            "minimum": 0,
            "description": "The number of I-frames to be used for encoding."
          },
          "sar_width": {
            "description": "The first number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\nSAR is used for creating non-anamorphic video from anamorphic video.\n",
            "default": 1,
            "type": "integer",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar"
            }
          },
          "sar_height": {
            "description": "The second number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\nSAR is used for creating non-anamorphic video from anamorphic video.\n",
            "default": 1,
            "type": "integer",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar"
            }
          },
          "pixel_width": {
            "description": "The picture width in pixels of the original video before transcoding.",
            "type": "integer",
            "format": "pixels",
            "x-format-description": "pixels"
          },
          "pixel_height": {
            "description": "The picture width in pixels of the original video before transcoding.",
            "type": "integer",
            "format": "pixels",
            "x-format-description": "pixels"
          },
          "level": {
            "type": "string",
            "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n",
            "x-api-allow": [
              "smartcam"
            ]
          },
          "profile": {
            "description": "A specific codec-dependent profile of the output video.\nThe profile allows to assume if the track can be played on a particular device.\n",
            "type": "string",
            "x-api-allow": [
              "smartcam"
            ]
          },
          "bframes": {
            "description": "Average number of B-frames in a GOP. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n",
            "type": "integer",
            "x-notice": "calculated number of bframes for statistic",
            "example": 3
          },
          "gop_size": {
            "description": "The number of frames in a group of pictures (GOP). \nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\nA bigger GOP can be good for video compression but it can result in big zap-time (the duration of time between changing a channel and displaying a new channel.)\n",
            "type": "integer",
            "x-api-allow": [
              "smartcam"
            ]
          }
        }
      },
      "track_info_audio": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_audio_specific"
          }
        ]
      },
      "track_info_audio_specific": {
        "type": "object",
        "properties": {
          "channels": {
            "description": "The number of audio channels.",
            "type": "integer",
            "example": 2,
            "x-api-allow": [
              "smartcam"
            ]
          },
          "sample_rate": {
            "description": "Sample rate, in hertz -\nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\n",
            "type": "integer",
            "example": 8000,
            "x-api-allow": [
              "smartcam"
            ]
          },
          "language": {
            "description": "Language value of the track, if applicable.",
            "type": "string",
            "example": "eng"
          }
        }
      },
      "ti_audio_aac_spec": {
        "type": "object",
        "title": "AAC codec",
        "properties": {
          "sample_rate": {
            "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n",
            "type": "integer",
            "example": 48000,
            "enum": [
              96000,
              88200,
              64000,
              48000,
              44100,
              32000,
              24000,
              22050,
              16000,
              12000,
              11025,
              8000,
              0
            ]
          },
          "channels": {
            "description": "The number of audio channels in an output stream.",
            "type": "integer",
            "example": 2,
            "enum": [
              1,
              2,
              3,
              4,
              5,
              6,
              7
            ]
          }
        }
      },
      "track_info_text": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_text_specific"
          }
        ]
      },
      "track_info_text_specific": {
        "type": "object",
        "properties": {
          "language": {
            "description": "Language value of the track, if applicable.",
            "type": "string",
            "example": "eng"
          }
        }
      },
      "track_info_application": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_application_specific"
          }
        ]
      },
      "track_info_application_specific": {
        "type": "object",
        "properties": {
          "language": {
            "description": "Language value of the track, if applicable.",
            "type": "string",
            "example": "eng"
          }
        }
      },
      "track_info_metadata": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          }
        ]
      },
      "track_info_full": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base"
          },
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_audio_specific"
          },
          {
            "$ref": "#/components/schemas/track_info_video_specific"
          },
          {
            "$ref": "#/components/schemas/track_info_video_configurable"
          }
        ]
      },
      "closed_captions": {
        "type": "object",
        "properties": {
          "language": {
            "description": "Language of closed captions.",
            "type": "string",
            "example": "eng"
          },
          "name": {
            "description": "Under what name the audio track will be displayed on the player.",
            "type": "string",
            "example": "English"
          }
        }
      },
      "media_info": {
        "allOf": [
          {
            "$ref": "#/components/schemas/media_info_specific"
          },
          {
            "$ref": "#/components/schemas/media_info_common"
          }
        ]
      },
      "media_info_specific": {
        "type": "object",
        "properties": {
          "flow_type": {
            "description": "Whether it is a file with a finite start and end time or a live stream.",
            "type": "string",
            "example": "stream",
            "enum": [
              "file",
              "stream",
              "dvr_file",
              "dvr_stream"
            ]
          },
          "tracks": {
            "description": "Information about available tracks (video, audio, or text).",
            "items": {
              "$ref": "#/components/schemas/track_info"
            },
            "type": "array",
            "x-api-allow": [
              "smartcam"
            ]
          },
          "duration": {
            "type": "number",
            "format": "ticks",
            "description": "Duration of the media, if applicable.",
            "x-format-description": "ticks"
          }
        }
      },
      "media_info_common": {
        "type": "object",
        "properties": {
          "provider": {
            "description": "The media provider of this content.",
            "type": "string",
            "example": "Netflix"
          },
          "title": {
            "description": "Human-readable title of the media.",
            "type": "string",
            "example": "Bunny"
          },
          "stream_id": {
            "type": "integer",
            "example": 253,
            "description": "The identifier of the transport stream for MPEG TS streams."
          },
          "program_id": {
            "type": "integer",
            "example": 110,
            "description": "The program ID for MPEG TS streams."
          }
        }
      },
      "transcoder_track_info": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/transcoder_track_info_audio"
          },
          {
            "$ref": "#/components/schemas/transcoder_track_info_video"
          }
        ],
        "discriminator": {
          "propertyName": "content",
          "mapping": {
            "video": "#/components/schemas/transcoder_track_info_video",
            "audio": "#/components/schemas/transcoder_track_info_audio"
          }
        }
      },
      "transcoder_track_info_audio": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "$ref": "#/components/schemas/transcoder_track_info_audio_spec"
          },
          {
            "$ref": "#/components/schemas/ti_audio_aac_spec"
          }
        ]
      },
      "transcoder_track_info_video": {
        "allOf": [
          {
            "$ref": "#/components/schemas/track_info_base_configurable"
          },
          {
            "type": "object",
            "properties": {
              "codec": {
                "$ref": "#/components/schemas/frame_codec"
              },
              "preset": {
                "$ref": "#/components/schemas/tc_preset",
                "default": "veryfast"
              },
              "profile": {
                "$ref": "#/components/schemas/tc_profile"
              },
              "level": {
                "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n",
                "x-api-allow": [
                  "iris-hal",
                  "smartcam"
                ],
                "enum": [
                  "1",
                  "1b",
                  "1.1",
                  "1.2",
                  "1.3",
                  "2",
                  "2.1",
                  "2.2",
                  "3",
                  "3.0",
                  "3.1",
                  "3.2",
                  "4",
                  "4.0",
                  "4.1",
                  "4.2",
                  "5",
                  "5.1",
                  "5.2",
                  "6",
                  "6.1",
                  "6.2",
                  "low",
                  "main",
                  "high",
                  "high1440"
                ],
                "type": "string"
              },
              "size": {
                "$ref": "#/components/schemas/tc_size"
              },
              "sar": {
                "$ref": "#/components/schemas/tc_sar"
              },
              "logo": {
                "$ref": "#/components/schemas/tc_logo"
              },
              "alogo": {
                "$ref": "#/components/schemas/tc_logo"
              },
              "fps": {
                "$ref": "#/components/schemas/tc_fps"
              },
              "bframes": {
                "description": "Number of B-frames between I and P-frames. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n\nWhen set to 0, this option disables b-frames. This may be necessary, for example, when broadcasting to RTSP.\n",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4
                ],
                "type": "integer",
                "example": 3
              },
              "refs": {
                "description": "The number of reference frames in a GOP.\nReference frames are frames of a compressed video that are used to define other frames (P-frames and B-frames).\n",
                "maximum": 6,
                "minimum": 1,
                "type": "integer"
              },
              "gop": {
                "description": "Sets the number of frames in a GOP.\nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\n",
                "x-api-allow": [
                  "smartcam"
                ],
                "type": "integer",
                "example": 150
              },
              "qp_range": {
                "$ref": "#/components/schemas/tc_qp_range"
              },
              "threads": {
                "description": "Number of threads used by the encoder when transcoding with CPU (it is not used for other types of transcoder).\nThis parameter allows to increase performance by adding new threads. By default, it is autodetected.\n",
                "type": "integer"
              },
              "open_gop": {
                "description": "Whether open GOP is used. Open GOP contains P-frames that refer to the frames before the keyframe.\nIt allows to decrease bitrate to 5-7%, but can result in breaking the picture.\n\nDo not enable this option if the track will be played over segment-based protocols (HLS, DASH, etc.) because \nabsence of keyframes or IDR frames in the same segment with P-frames may prevent playback. \n[Read more about tracks, GOP and segments](https://flussonic.com/doc/live-stream-internals/).\n",
                "default": false,
                "type": "boolean"
              },
              "interlace": {
                "$ref": "#/components/schemas/interlace_settings"
              },
              "rc_method": {
                "$ref": "#/components/schemas/rc_method"
              },
              "temporal_tradeoff": {
                "description": "Drop some frames in dynamic scenes when the transcoder does not have time to code all frames.\nThe allowed values are:\n\n* `15` - drop 1 from 5\n* `13` - drop 1 from 3\n* `12` - drop 1 from 2\n* `23` - drop 2 from 3\n* `0` - do not drop frames\n",
                "type": "integer"
              },
              "vbv_bufsize": {
                "description": "Virtual buffer size, it bits. The default value is `gop / fps * bitrate`.\n",
                "type": "integer"
              },
              "resize_mode": {
                "$ref": "#/components/schemas/transcoder_resize_mode"
              },
              "burn": {
                "$ref": "#/components/schemas/tc_burn"
              },
              "extra": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object",
                "description": "Some additional options."
              }
            }
          }
        ]
      },
      "transcoder_track_info_audio_spec": {
        "type": "object",
        "properties": {
          "codec": {
            "description": "Audio codec (the AAC codec is used by default).",
            "type": "string",
            "example": "opus",
            "default": "aac",
            "x-api-allow": [
              "smartcam",
              "iris-hal"
            ],
            "enum": [
              "aac",
              "mp3",
              "mp2a",
              "opus",
              "ac3",
              "eac3",
              "pcma",
              "pcmu",
              "pcm_s24be",
              "pcm_s24le"
            ]
          },
          "language": {
            "description": "Language value of the track, if applicable.",
            "type": "string",
            "example": "eng"
          },
          "input_track": {
            "description": "Input audio track to be transcoded.\n",
            "anyOf": [
              {
                "type": "integer"
              }
            ],
            "example": 1
          },
          "volume": {
            "description": "Output audio volume. The value can be specified in decibels (dB) or it can be an integer/float (3, 0.5, etc.).\n\nIf it is just an integer or a float, the output audio volume is calculated by this formula:\n\n`output_volume = volume * input_volume`\n\nIf specified in decibels (dB), the output audio volume is calculated as follows:\n\n`output_volume = input_volume +/- volume`\n\ndepending whether it is a positive (+9dB) or a negative value (-6dB).\n\nBy default it equals to 1 (the input audio volume).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/change-stream-volume/"
            },
            "type": "string",
            "pattern": "^([0-9]+(\\.[0-9]+)?|(\\+|\\-)[0-9]+(\\.[0-9]+)?dB)$",
            "example": "-6dB"
          },
          "split_channels": {
            "description": "This option allows to split each audio track with multiple channels into several mono tracks.\n",
            "type": "boolean",
            "default": false
          }
        }
      },
      "transcoder_stats": {
        "type": "object",
        "properties": {
          "hw": {
            "$ref": "#/components/schemas/transcoder_device"
          },
          "qualities": {
            "description": "Number of output video tracks.",
            "type": "integer"
          },
          "target": {
            "$ref": "#/components/schemas/transcoder_target"
          },
          "burn_logo": {
            "description": "Logo is burned at transcoded frames.",
            "type": "boolean"
          },
          "burn_text": {
            "description": "Subtitles (or custom text e.g. date and time) is burned at transcoded frames.",
            "type": "boolean"
          },
          "frames": {
            "description": "Output frames counter (at all tracks).",
            "type": "integer"
          },
          "restarts": {
            "description": "How many times transcoder has been restarted.",
            "type": "integer"
          },
          "tracks": {
            "description": "Per output track counters",
            "items": {
              "$ref": "#/components/schemas/transcoder_track_stats"
            },
            "type": "array"
          },
          "input_ad_announces": {
            "type": "integer",
            "description": "Number of ads announces at the input of transcoder"
          },
          "output_ad_announces": {
            "type": "integer",
            "description": "Number of ads announces at the output of transcoder"
          },
          "output_shifted_ad_announces": {
            "type": "integer",
            "description": "Number of ad announcements displaced from target frame to subsequent frame in output stream due to processing constraints"
          },
          "input_ad_immediate": {
            "type": "integer",
            "description": "Number of immediate ads at the input of transcoder"
          },
          "output_ad_immediate": {
            "type": "integer",
            "description": "Number of immediate ads at the output of transcoder"
          },
          "last_error": {
            "type": "string",
            "description": "Human-readable description of the most recent transcoder failure.",
            "example": "Unsupported pixel format for hardware encoder: gbrp (supported: argb, uyvy422, yuv422p10)"
          }
        }
      },
      "transcoder_track_stats": {
        "type": "object",
        "properties": {
          "track_id": {
            "description": "Track identifier",
            "type": "string",
            "example": "v1"
          },
          "dup_frames_added": {
            "type": "integer",
            "description": "Duplicate frames generated by transcoder when input FPS falls below target"
          },
          "overlimit_frames_removed": {
            "type": "integer",
            "description": "Frames discarded by transcoder to maintain target FPS"
          }
        }
      },
      "webrtc_prefer_video_codec": {
        "type": "string",
        "enum": [
          "h264",
          "av1"
        ]
      },
      "webrtc_transport": {
        "type": "string",
        "enum": [
          "udp",
          "tcp"
        ]
      },
      "output_audio": {
        "type": "string",
        "enum": [
          "keep",
          "aac",
          "add_aac",
          "aac_silence",
          "keep_silence"
        ]
      },
      "transcoder_target": {
        "enum": [
          "uhdtv",
          "hdtv",
          "sdtv_pal",
          "sdtv_ntsc"
        ],
        "type": "string"
      },
      "transcoder_device": {
        "type": "string",
        "enum": [
          "cpu",
          "nvenc",
          "coder"
        ]
      },
      "transcoder_device_stats": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/transcoder_device"
          },
          "id": {
            "$ref": "#/components/schemas/tc_deviceid"
          },
          "name": {
            "type": "string",
            "description": "The name of the transcoder device."
          },
          "uuid": {
            "type": "string",
            "description": "The UUID of the transcoder device."
          },
          "can_logo": {
            "type": "boolean",
            "description": "Shows if the device can put a logo on the image."
          },
          "can_interlace": {
            "type": "boolean",
            "description": "Shows if the device can make an interlaced stream from a progressive one."
          },
          "can_internal": {
            "type": "boolean",
            "description": "Shows if the transcoder with this device can run in the same process as Flussonic Media Server."
          },
          "memTotal": {
            "type": "integer",
            "description": "Total RAM on the device."
          },
          "memFree": {
            "type": "integer",
            "description": "Free RAM."
          },
          "memUsed": {
            "type": "integer",
            "description": "Utilized RAM."
          },
          "reconfig_support": {
            "$ref": "#/components/schemas/tc_reconfig_support"
          },
          "gpu_temp": {
            "type": "integer",
            "description": "GPU temperature, C."
          },
          "gpu_enc": {
            "type": "integer",
            "description": "GPU encoder load percentage."
          },
          "gpu_dec": {
            "type": "integer",
            "description": "GPU decoder load percentage."
          },
          "gpu_sm": {
            "type": "integer",
            "description": "GPU shared memory amount."
          }
        }
      },
      "transcoder_resize_mode": {
        "type": "string",
        "enum": [
          "vic",
          "cuda"
        ]
      },
      "tc_bitrate": {
        "anyOf": [
          {
            "enum": [
              "copy"
            ],
            "type": "string"
          },
          {
            "type": "integer"
          }
        ]
      },
      "tc_reconfig_support": {
        "anyOf": [
          {
            "type": "string",
            "enum": [
              "full",
              "decoder",
              "encoder"
            ]
          },
          {
            "type": "boolean",
            "enum": [
              false
            ]
          }
        ]
      },
      "tc_deviceid": {
        "anyOf": [
          {
            "enum": [
              "auto"
            ],
            "type": "string"
          },
          {
            "type": "integer"
          }
        ]
      },
      "tc_fps": {
        "anyOf": [
          {
            "enum": [
              "any",
              "auto",
              "ntsc25",
              "ntsc30",
              "ntsc60"
            ],
            "type": "string"
          },
          {
            "type": "integer"
          }
        ]
      },
      "tc_preset": {
        "type": "string",
        "enum": [
          "slow",
          "medium",
          "fast",
          "veryfast",
          "ultrafast"
        ]
      },
      "tc_profile": {
        "type": "string",
        "enum": [
          "simple",
          "baseline",
          "main",
          "main10",
          "high",
          "high10",
          "high422",
          "high444"
        ]
      },
      "rc_method": {
        "type": "string",
        "enum": [
          "vbr",
          "cbr",
          "cbr2pass"
        ]
      },
      "tc_label_box": {
        "type": "object",
        "properties": {
          "borderw": {
            "description": "The width, in pixel, of the border to be drawn around the text, timestamp, or subtitles.",
            "type": "integer",
            "example": 10
          },
          "color": {
            "description": "Box color.",
            "type": "string"
          },
          "alpha": {
            "description": "Box opacity (use values from 0.1 to 1.0, 0.0 - completely transparent, 1.0 - completely opaque).",
            "maximum": 1,
            "minimum": 0,
            "type": "number",
            "example": 0
          }
        }
      },
      "tc_label_font": {
        "type": "object",
        "properties": {
          "file": {
            "description": "The subpath to the `.ttf` font file in the `font` subdirectory of the `/etc/flussonic/` directory. \nThis means you can place the font file like `/etc/flussonic/font/SomeFont.ttf`.\n\nIf the font file specified is missing in `/etc/flussonic/font/`, the default `FiraCode-Regular.ttf` font will be used, which is included in Flussonic.\n\nYou can also specify the full path to a font file. Make sure you put the font file in the directory you specified. \n",
            "type": "string",
            "example": "/usr/share/fonts/truetype/freefont/FONT_NAME.ttf"
          },
          "size": {
            "description": "The font size in pixel.",
            "type": "integer",
            "example": 24
          },
          "color": {
            "description": "Font color.",
            "type": "string"
          },
          "alpha": {
            "description": "Font opacity (use values from 0.1 to 1.0, 0.0 - completely transparent, 1.0 - completely opaque).",
            "maximum": 1,
            "minimum": 0,
            "type": "number",
            "example": 1
          }
        }
      },
      "tc_label": {
        "type": "object",
        "properties": {
          "text": {
            "description": "Text, time, or subtitles to burn-in to video frames.\n\n* For text - it is the text\n* For subtitles - it is the subtitles track, e.g., `t1`.\n* For time - it is the time in one of the formats:\n** `%T` - the time in 24-hour notation (`%H:%M:%S`).\n** `%F` - equivalent to `%Y-%m-%d` (the ISO 8601 date format).\n",
            "type": "string"
          },
          "x": {
            "description": "The offset of the text, timestamp, or subtitles position, in pixel, to the right or left to the center of the screen.",
            "type": "integer"
          },
          "y": {
            "description": "The offset of the text, timestamp, or subtitles position, in pixel, up or down to the center of the screen.",
            "type": "integer"
          },
          "position": {
            "description": "Position to burn text.",
            "type": "string",
            "enum": [
              "tl",
              "bl",
              "tr",
              "br",
              "c",
              "ct",
              "cb"
            ]
          },
          "font": {
            "$ref": "#/components/schemas/tc_label_font"
          },
          "box": {
            "$ref": "#/components/schemas/tc_label_box"
          }
        }
      },
      "tc_burn": {
        "type": "object",
        "properties": {
          "text": {
            "$ref": "#/components/schemas/tc_label"
          },
          "time": {
            "$ref": "#/components/schemas/tc_label"
          },
          "sub": {
            "$ref": "#/components/schemas/tc_label"
          }
        }
      },
      "tc_global": {
        "type": "object",
        "properties": {
          "target": {
            "$ref": "#/components/schemas/transcoder_target"
          },
          "hw": {
            "$ref": "#/components/schemas/transcoder_device"
          },
          "deviceid": {
            "$ref": "#/components/schemas/tc_deviceid"
          },
          "external": {
            "description": "If this parameter is se to `true` (by default), the transcoder runs in a separate process from Flussonic.\n\nIf it is set to `false`, the transcoder will run in the same process as Flussonic. \nThis mode speeds up encoding, especially when encoding audio or when using an Nvidia device. \nHowever, a transcoder error may cause Flussonic to crash.\n",
            "type": "boolean"
          },
          "gop": {
            "description": "GOP (group of pictures) size (in frames) to be applied for any video track in the stream.\nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\nMay be overridden for a track. \n",
            "type": "integer",
            "example": 150
          },
          "burn": {
            "$ref": "#/components/schemas/tc_burn"
          }
        }
      },
      "tc_crop": {
        "type": "object",
        "properties": {
          "left": {
            "description": "The `x` coordinate of the upper-left corner of the output video withing the input video.",
            "type": "integer"
          },
          "top": {
            "description": "The `y` coordinate of the upper-left corner of the output video withing the input video.",
            "type": "integer"
          },
          "width": {
            "description": "The width of the output video.",
            "type": "integer"
          },
          "height": {
            "description": "The height of the output video.",
            "type": "integer"
          }
        },
        "required": [
          "left",
          "top",
          "width",
          "height"
        ]
      },
      "deinterlace_settings": {
        "anyOf": [
          {
            "type": "boolean",
            "enum": [
              true,
              false
            ]
          },
          {
            "type": "string",
            "enum": [
              "adaptive",
              "yadif"
            ]
          }
        ]
      },
      "tc_decoder": {
        "type": "object",
        "properties": {
          "pix_fmt": {
            "$ref": "#/components/schemas/frame_video_pix_fmt"
          },
          "deinterlace": {
            "$ref": "#/components/schemas/deinterlace_settings"
          },
          "deinterlace_rate": {
            "description": "This parameter is used when encoding with Nvidia NVENC.\nYou can remove duplicate frames that were produced after deinterlacing, preventing increased bitrate, by one of two methods.\n",
            "type": "string",
            "example": "frame",
            "enum": [
              "frame",
              "field"
            ]
          },
          "crop": {
            "$ref": "#/components/schemas/tc_crop"
          },
          "drop_frame_interval": {
            "description": "This parameter is applicable for NVIDIA Jetson transcoder only.\nThis is the number of frames after wich the decoder skips a frame and, thus, allows to save the resources. For example:\n\n* 1 - sip each frame\n* 2 - skip each second frame\n* 3 - skip each third frame, etc.\n\nThis option can be useful for streams with high FPS (e.g., 60) as it allows to increase the bandwidth.\n",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer",
            "example": 3
          },
          "no_dpb": {
            "description": "Switch off the decoded picture buffer. Works for the streams with 1 reference frame.\nThe default value is `false`.\n",
            "type": "boolean",
            "example": false
          },
          "streaming_frame": {
            "description": "Allow receiving incomplete frames from the input buffer.\nIf it is set to `true`, the decoder can start decoding before the complete frame is received.\n",
            "type": "boolean",
            "example": false
          }
        }
      },
      "tc_audio_opts": {
        "$ref": "#/components/schemas/tc_audio_base"
      },
      "tc_audio_base": {
        "type": "object",
        "properties": {
          "codec": {
            "description": "Audio codec (the AAC codec is used by default).",
            "type": "string",
            "example": "opus",
            "default": "aac",
            "enum": [
              "aac",
              "mp3",
              "mp2a",
              "opus",
              "ac3",
              "eac3",
              "pcma",
              "pcmu",
              "pcm_s24be",
              "pcm_s24le",
              "pcm"
            ]
          },
          "bitrate": {
            "$ref": "#/components/schemas/tc_bitrate"
          },
          "avol": {
            "description": "Output audio volume. The value can be specified in decibels (dB) or it can be an integer/float (3, 0.5, etc.).\n\nIf it is just an integer or a float, the output audio volume is calculated by this formula:\n\n`output_volume = avol * input_volume`\n\nIf specified in decibels (dB), the output audio volume is calculated as follows:\n\n`output_volume = input_volume +/- avol`\n\ndepending whether it is a positive (+9dB) or a negative value (-6dB).\n\nBy default it equals to 1 (the input audio volume).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/change-stream-volume/"
            },
            "type": "string",
            "pattern": "^([0-9]+(\\.[0-9]+)?|(\\+|\\-)[0-9]+(\\.[0-9]+)?dB)$",
            "example": "-6dB"
          },
          "split_channels": {
            "description": "This option allows to split each audio track with multiple channels into several mono tracks.\n",
            "type": "boolean",
            "default": false
          }
        }
      },
      "tc_size": {
        "type": "object",
        "properties": {
          "width": {
            "description": "The picture width in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\nA value of -1 means that the heigth will be used to calculate the actual width with maintaining the aspect ratio.\nOnly one of width or height may have value -1.\nZero value (0) is not allowed.\n",
            "type": "integer",
            "minimum": -1
          },
          "height": {
            "description": "The picture height in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\nA value of -1 means that the width will be used to calculate the actual height with maintaining the aspect ratio.\nOnly one of width or height may have value -1.\nZero value (0) is not allowed.\n",
            "type": "integer",
            "minimum": -1
          },
          "strategy": {
            "description": "The algorithm of the picture resizing: crop, scale, or fit.\n",
            "default": "fit",
            "type": "string",
            "example": "crop",
            "enum": [
              "crop",
              "scale",
              "fit"
            ]
          },
          "background": {
            "description": "The color of the area in the player that is not occupied by the video after resizing. \nIt is used only with the 'fit' strategy.\n",
            "type": "string",
            "pattern": "^(#([0-9a-fA-F]{6})|blur)$",
            "example": "#000000"
          }
        }
      },
      "tc_sar": {
        "type": "object",
        "properties": {
          "x": {
            "description": "The first number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar"
            },
            "type": "integer"
          },
          "y": {
            "description": "The second number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar"
            },
            "type": "integer"
          }
        }
      },
      "tc_logo": {
        "type": "object",
        "properties": {
          "path": {
            "description": "Path to the logo image.",
            "type": "string",
            "pattern": "^.+\\.png$",
            "example": "@chan.png"
          },
          "x": {
            "description": "The offset of the logo position, in pixel, to the right or left to the center of the screen.",
            "type": "integer",
            "example": 10
          },
          "y": {
            "description": "The offset of the logo position, in pixel, up or down to the center of the screen.",
            "type": "integer",
            "example": 10
          },
          "position": {
            "description": "Position to place the logo.\n",
            "type": "string",
            "example": "tl",
            "enum": [
              "tl",
              "tr",
              "bl",
              "br",
              "c"
            ]
          }
        }
      },
      "tc_qp_range": {
        "type": "object",
        "properties": {
          "qpmini": {
            "description": "Minimal quantization parameter for I-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "qpmaxi": {
            "description": "Maximal quantization parameter for I-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "qpminp": {
            "description": "Minimal quantization parameter for P-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "qpmaxp": {
            "description": "Maximal quantization parameter for P-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "qpminb": {
            "description": "Minimal quantization parameter for B-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "qpmaxb": {
            "description": "Maximal quantization parameter for B-frames.",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          }
        }
      },
      "interlace_settings": {
        "anyOf": [
          {
            "type": "string",
            "enum": [
              "tff",
              "bff",
              "mbaff"
            ]
          },
          {
            "type": "boolean",
            "description": "Enables encoding into interlaced video by using the default method for the encoder specified\n(`mbaff` is the default method for `hw=cpu`, `tff` is the default method for `hw=nvenc`)\n"
          }
        ]
      },
      "tc_video_opts": {
        "type": "object",
        "required": [
          "track"
        ],
        "properties": {
          "track": {
            "description": "Number of a video track.",
            "type": "integer",
            "example": 1
          },
          "bitrate": {
            "$ref": "#/components/schemas/tc_bitrate"
          },
          "codec": {
            "description": "The video codec.",
            "default": "h264",
            "type": "string",
            "enum": [
              "h264",
              "hevc",
              "av1",
              "mp2v"
            ]
          },
          "preset": {
            "$ref": "#/components/schemas/tc_preset",
            "default": "veryfast"
          },
          "profile": {
            "$ref": "#/components/schemas/tc_profile"
          },
          "level": {
            "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n",
            "enum": [
              "1",
              "1b",
              "1.1",
              "1.2",
              "1.3",
              "2",
              "2.1",
              "2.2",
              "3",
              "3.0",
              "3.1",
              "3.2",
              "4",
              "4.0",
              "4.1",
              "4.2",
              "5",
              "5.1",
              "5.2",
              "6",
              "6.1",
              "6.2",
              "low",
              "main",
              "high",
              "high1440"
            ],
            "type": "string"
          },
          "size": {
            "$ref": "#/components/schemas/tc_size"
          },
          "sar": {
            "$ref": "#/components/schemas/tc_sar"
          },
          "logo": {
            "$ref": "#/components/schemas/tc_logo"
          },
          "alogo": {
            "$ref": "#/components/schemas/tc_logo"
          },
          "fps": {
            "$ref": "#/components/schemas/tc_fps"
          },
          "bframes": {
            "description": "Number of B-frames in a GOP. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n\nWhen set to 0, this option disables b-frames. This may be necessary, for example, when broadcasting to RTSP.\n",
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "example": 3
          },
          "refs": {
            "description": "The number of reference frames in a GOP.\nReference frames are frames of a compressed video that are used to define other frames (P-frames and B-frames).\n",
            "maximum": 6,
            "minimum": 1,
            "type": "integer"
          },
          "gop": {
            "description": "Sets the number of frames in a GOP. \nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\n",
            "type": "integer",
            "example": 150
          },
          "qp_range": {
            "$ref": "#/components/schemas/tc_qp_range"
          },
          "threads": {
            "description": "Number of threads used by the encoder when transcoding with CPU (it is not used for other types of transcoder).\nThis parameter allows to increase performance by adding new threads. By default, it is autodetected.\n",
            "type": "integer"
          },
          "open_gop": {
            "description": "Whether open GOP is used. Open GOP contains P-frames that refer to the frames before the keyframe.\nIt allows to decrease bitrate to 5-7%, but can result in breaking the picture.\n",
            "default": false,
            "type": "boolean"
          },
          "interlace": {
            "$ref": "#/components/schemas/interlace_settings"
          },
          "rc_method": {
            "$ref": "#/components/schemas/rc_method"
          },
          "temporal_tradeoff": {
            "description": "Drop some frames in dynamic scenes when the transcoder does not have time to code all frames.\nThe allowed values are: \n\n* `15` - drop 1 from 5\n* `13` - drop 1 from 3\n* `12` - drop 1 from 2\n* `23` - drop 2 from 3\n* `0` - do not drop frames\n",
            "type": "integer"
          },
          "vbv_bufsize": {
            "description": "Virtual buffer size, it bits. The default value is `gop / fps * bitrate`.\n",
            "type": "integer"
          },
          "resize_mode": {
            "$ref": "#/components/schemas/transcoder_resize_mode"
          },
          "burn": {
            "$ref": "#/components/schemas/tc_burn"
          },
          "extra": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Some additional options."
          }
        }
      },
      "transcoder_opts": {
        "type": "object",
        "properties": {
          "global": {
            "$ref": "#/components/schemas/tc_global",
            "x-default": {
              "$ref": "#/components/schemas/tc_global"
            }
          },
          "decoder": {
            "$ref": "#/components/schemas/tc_decoder",
            "x-default": {
              "$ref": "#/components/schemas/tc_decoder"
            }
          },
          "audio": {
            "$ref": "#/components/schemas/tc_audio_opts",
            "x-default": {
              "$ref": "#/components/schemas/tc_audio_opts"
            }
          },
          "video": {
            "description": "List of video tracks the stream video track will be transcoded into. \n",
            "items": {
              "$ref": "#/components/schemas/tc_video_opts"
            },
            "type": "array",
            "deprecated": true,
            "x-delete-at": 24.08
          },
          "tracks": {
            "description": "Info on the tracks. In the case of iris-hal, the first video track must be\nhigh-resolution track, second one (if present) must be lower-resolution\n",
            "items": {
              "$ref": "#/components/schemas/transcoder_track_info"
            },
            "type": "array",
            "x-api-allow": [
              "smartcam",
              "iris-hal"
            ]
          }
        }
      },
      "dvr_schedule_range": {
        "items": {
          "type": "integer"
        },
        "type": "array"
      },
      "dvr_range": {
        "type": "object",
        "properties": {
          "from": {
            "description": "The beginning of the recorded DVR range. Use opened_at instead.\nMention that opened_at has milliseconds\n",
            "type": "integer",
            "format": "utc",
            "example": 1525186456,
            "deprecated": true,
            "x-delete-at": 24.11,
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "duration": {
            "description": "The duration of the recorded DVR range.\nUse closed_at instead of this field. \n",
            "type": "integer",
            "format": "seconds",
            "example": 28800,
            "deprecated": true,
            "x-delete-at": 24.11,
            "x-format-description": "seconds"
          },
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this range was started. Naming is standard for whole flussonic ecosystem.\n\nIs a replacement for field `from`\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "closed_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The the of the last recorded data.\n\nPlease notice that closed_at could be changed. There are two reasons.\n- Cleaner process reduced data. Read [more](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_get/response%7Cdvr%7Cepisodes_url).\n- Recording is still working. Near real-time value means that DVR is active at the moment.\n\nThis is a replacement for `duration` field\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          }
        }
      },
      "dvr_raid_level": {
        "type": "integer",
        "enum": [
          0
        ]
      },
      "dvr_storage_stats": {
        "type": "object",
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/dvr_storage_errors"
          }
        }
      },
      "dvr_storage_errors": {
        "type": "object",
        "properties": {
          "read_errors": {
            "description": "Total number of errors while reading the archive.",
            "type": "integer"
          },
          "write_errors": {
            "description": "Total number of errors while writing to the archive.",
            "type": "integer"
          },
          "delete_errors": {
            "description": "Total number of errors while deleting from the archive.",
            "type": "integer"
          },
          "collapsed_write_count": {
            "description": "Total number of collapsed segments while writing to the archive. Collapsed segments are pack of segments written together occur due to lack of storage performance.",
            "type": "integer"
          },
          "drop_write_count": {
            "description": "Total number of dropped segments while writing to the archive.",
            "type": "integer"
          }
        }
      },
      "dvr_config": {
        "type": "object",
        "properties": {
          "name": {
            "description": "DVR configuration name.",
            "type": "string",
            "format": "dvr_name",
            "openmetrics_label": "dvr_name",
            "x-primary-key": true,
            "readOnly": true,
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "dvr_name"
          },
          "root": {
            "description": "A path where the DVR archive is stored.",
            "type": "string",
            "format": "dvr_url",
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "dvr_url"
          },
          "raid": {
            "$ref": "#/components/schemas/dvr_raid_level"
          },
          "check_mount": {
            "description": "If this parameter is set to 'true' (by default), \nFlussonic will check if the disks were mounted properly before writing to them.\n",
            "type": "boolean"
          },
          "active": {
            "description": "The number of disks to write the archive.",
            "type": "integer"
          },
          "index": {
            "description": "A directory on an SSD disk where the data will be cached.",
            "type": "string",
            "format": "disk_path",
            "x-format-description": "disk_path"
          },
          "disks": {
            "description": "RAID disks mounted on the server.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/raid_disk_config"
            }
          },
          "stats": {
            "description": "The runtime statistics about DVR.\n",
            "allOf": [
              {
                "$ref": "#/components/schemas/dvr_storage_stats"
              },
              {
                "$ref": "#/components/schemas/dvr_capacity_stats"
              }
            ],
            "readOnly": true,
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "storage_limit": {
            "description": "Maximum disk consumption in bytes. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nThis option affects both continuous recording and locked episodes (see `episodes_url`).\n\nIf `episodes_url` does not respond, the archive clean-up by `storage_limit` is not performed\nto avoid deleting the recordings that should not be deleted.\n",
            "type": "integer",
            "format": "bytes",
            "example": 400000000000,
            "x-format-description": "bytes"
          },
          "disk_usage_limit": {
            "description": "Maximum disk consumption in percents. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nIt important to understand that this is not a \"per-stream\" option, this option means\nthat cleaning of this stream will be triggered if overall disk usage reaches this number.\n\nIf you have all streams with configuration 98% and one stream with 95%, it will be permanently\nempty.\n",
            "type": "integer",
            "format": "percent",
            "example": 98,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "expiration": {
            "description": "Archive depth - a period (in seconds) back from the current moment during which the \ncontigious part of archive is stored. \nAs time goes, the parts of the recording which are older than the archive depth are deleted.\n\nIf you have option `episodes_expiration` enabled, then some parts of DVR that are \nlocked by episode signalling mechanism may be kept more than this `expiration` depth.\n\nIf `episodes_url` does not respond, the archive clean-up by `expiration` is not performed;\nonly the archive with expired episodes (`episodes_expiration`) is cleaned up until the `episodes_url` restores.\n",
            "type": "integer",
            "format": "seconds",
            "examples": {
              "default": {
                "value": 604800
              }
            },
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "seconds"
          },
          "episodes_expiration": {
            "description": "Additional archive depth in seconds for episodes. If set, episodes and their corresponding DVR record\nwill be saved for `expiration + episodes_expiration` seconds.\n\nThe archive clean-up within `[expiration, expiration+episodes_expiration]` seconds of the\nrecording performed depending on [external_episodes_list](https://flussonic.com/doc/api/config-external/#tag/dvr/operation/external_episodes_list)\nresponse of `episodes_url`.\n\nAnything older than `expiration+episodes_expiration` seconds will\nbe cleaned even if `episodes_url` does not respond.\n",
            "type": "integer",
            "format": "seconds",
            "examples": {
              "default": {
                "value": 6048000
              }
            },
            "x-api-allow": [
              "central-layouter"
            ],
            "x-api-description": {
              "central-layouter": "Additional archive depth in seconds for episodes. If set, episodes and their corresponding DVR record\nwill be saved for `expiration + episodes_expiration` seconds.\n\nThe archive clean-up within `[expiration, expiration+episodes_expiration]` seconds of the\nrecording performed depending on [external_episodes_list](https://flussonic.com/doc/api/config-external/#tag/dvr/operation/external_episodes_list)\nresponse of `episodes_url`.\n\nAnything older than `expiration+episodes_expiration` seconds will\nbe cleaned even if `episodes_url` does not respond.\n\nLayouter uses this field to calculate the potential archive size of the stream when\n[episodes_density](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Cstats%7Cepisodes_density)\nis set and greater than 0.\n"
            },
            "x-format-description": "seconds"
          },
          "episodes_url": {
            "description": "External URL that will be triggered for fetching episodes list.\nTake a look at config_external API for method `external_episodes_list`.\n\nIf the `episodes_url` not set or responds with any HTTP code other than `200` or `501` or does not respond within a timeout,\nthe archive clean-up is only performed by `episodes_expiration` time while `expiration` and `storage_limit` are ignored until the `episodes_url` restores.\n\n\nIf `episodes_url` is a blank string, then current config_external API endpoint will be used to request episodes.\nIt is most common usage of this field.\n",
            "type": "string",
            "examples": {
              "default": {
                "value": "http://central-host.local/config-external/episodes"
              },
              "simple": {
                "value": ""
              }
            }
          },
          "dvr_replicate": {
            "description": "Whether DVR replication is used. Replication means that a DVR archive is stored on two (or more) Flussonic servers.\nIt can be used for reliability or for broadcasting with a time shift. Learn more in [Flussonic documentation](https://flussonic.com/doc/scale-dvr-playback-with-new-server/).\n",
            "type": "boolean",
            "example": true
          },
          "replication_port": {
            "$ref": "#/components/schemas/network_port"
          },
          "schedule": {
            "description": "One or several time intervals for recording by schedule.\nThe beginning and the end of each interval are set in \"hhmm\" format (without leading zeros ) according to UTC standard. \nFor example, `2330` is for 23:30, `800` - for 08:00. The interval can go over midnight, e.g. 22:00-1:30. In this case it is set as follows: `[2200,130]`.\n\nScheduled recording can be useful for the channels with part-time broadcasting. \nIt allows to save disk space significantly.\n",
            "items": {
              "$ref": "#/components/schemas/dvr_schedule_range"
            },
            "type": "array",
            "example": [
              [
                800,
                1600
              ],
              [
                2200,
                130
              ]
            ]
          },
          "dvr_offline": {
            "description": "If this option is enabled, Flussonic detects DVR at the start of the stream,\nbut does not start recording immediately and waits for external API request.\n",
            "type": "boolean"
          },
          "copy": {
            "description": "The URL of another storage to copy the blobs (hours of the archive) into. \nCopying is done when a blob is complete (i.e., once an hour), and therefore helps significantly reduce the number of network requests to a cloud storage.\n",
            "type": "string",
            "format": "dvr_url",
            "example": "s3://token@minio.mycompany.com/dvr-bucket",
            "x-format-description": "dvr_url"
          },
          "keep_locks": {
            "description": "Whether the locked DVR recordings will be kept when disk usage limit is reached (in bytes or percents).\n\nThis option will be now always enabled, consider managing your free space.\n\nSwitch to `episodes_url` mechanism instead.\n",
            "type": "boolean",
            "example": false,
            "deprecated": true,
            "x-delete-at": 23.11
          }
        },
        "required": [
          "name",
          "root"
        ]
      },
      "dvr_capacity_stats": {
        "type": "object",
        "description": "This list of stats can be used to monitor health of invidiual disk in storage.\n\nThere are several layers of indexes in internal database, here you can validate\nintegrity of data.\n",
        "properties": {
          "blobs_count_db": {
            "description": "The number of blobs on the disk according to centralized Raid DB that is\nused to allocate blobs across whole storage.\n",
            "type": "integer",
            "openmetrics_metric": "storage_blobs_count_db",
            "x-metric-type": "gauge"
          },
          "blobs_count": {
            "description": "The number of blobs on the disk that are enlisted in individual stream indexes.\nIt must be equal to blobs_count_db and can be different in case of software\nor hardware errors.\n",
            "type": "integer",
            "openmetrics_metric": "storage_blobs_count",
            "x-metric-type": "gauge"
          },
          "size": {
            "description": "Disk capacity in bytes.\n",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "storage_size",
            "x-metric-type": "gauge",
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "bytes"
          },
          "used": {
            "description": "Used disk space in bytes according to linux metrics. It must be equal (almost equal) to\n`used_index`. If it differs more than in 1%, then it means that there are lot of unknown files.\n\nIf this disk is used exclusively for Raid, then it may mean that some blobs are lost from\ndatabase and repairing is required.\n",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "storage_used",
            "x-metric-type": "gauge",
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "bytes"
          },
          "used_index": {
            "description": "Used disk space in bytes according to internal database index.\n",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "storage_used_index",
            "x-metric-type": "gauge",
            "x-format-description": "bytes"
          },
          "usage": {
            "description": "Disk utilization percentage.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "storage_usage",
            "x-metric-type": "gauge",
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          }
        }
      },
      "raid_disk_config": {
        "type": "object",
        "properties": {
          "path": {
            "description": "The path to a mounted disk. \n",
            "example": "volume1",
            "type": "string",
            "format": "disk_path",
            "openmetrics_label": "disk",
            "x-primary-key": true,
            "readOnly": true,
            "x-format-description": "disk_path"
          },
          "mode": {
            "$ref": "#/components/schemas/raid_disk_mode"
          },
          "stats": {
            "description": "The runtime statistics about RAID. The statistics shows the state of disks.\nLearn more in [Flussonic RAID for DVR](https://flussonic.com/doc/extend-video-storage-on-fly/#dvr-flussonic-raid-stats)\n",
            "allOf": [
              {
                "$ref": "#/components/schemas/raid_disk_stats"
              },
              {
                "$ref": "#/components/schemas/dvr_capacity_stats"
              }
            ],
            "readOnly": true
          }
        },
        "required": [
          "path"
        ]
      },
      "raid_disk_mode": {
        "type": "string",
        "enum": [
          "normal",
          "migrate",
          "readonly",
          "rescue",
          "abandon",
          "keep"
        ]
      },
      "raid_disk_status": {
        "type": "string",
        "enum": [
          "active",
          "degraded"
        ]
      },
      "raid_disk_errors": {
        "type": "object",
        "properties": {
          "eacces": {
            "description": "Total number of permission denied errors\n",
            "example": 1,
            "type": "integer"
          },
          "eagain": {
            "description": "Total number of temporarily unavailable errors\n",
            "example": 1,
            "type": "integer"
          },
          "ebusy": {
            "description": "Total number of file busy errors\n",
            "example": 1,
            "type": "integer"
          },
          "edquot": {
            "description": "Total number of disk quota exceeded errors\n",
            "example": 1,
            "type": "integer"
          },
          "emfile": {
            "description": "Total number of too many open files errors\n",
            "example": 1,
            "type": "integer"
          },
          "enoent": {
            "description": "Total number of no such file or directory errors\n",
            "example": 1,
            "type": "integer"
          },
          "enodev": {
            "description": "Total number of no such device errors\n",
            "example": 1,
            "type": "integer"
          },
          "enospc": {
            "description": "Total number of no space left on device errors\n",
            "example": 1,
            "type": "integer"
          },
          "erofs": {
            "description": "Total number of read-only file system errors\n",
            "example": 1,
            "type": "integer"
          },
          "connection_timeout": {
            "description": "Total number of connection timeout errors\n",
            "example": 1,
            "type": "integer"
          },
          "ssl_error": {
            "description": "Total number of SSL errors\n",
            "example": 1,
            "type": "integer"
          },
          "nxdomain": {
            "description": "Total number of non-existing domain errors\n",
            "example": 1,
            "type": "integer"
          },
          "econnrefused": {
            "description": "Total number of connection refused errors\n",
            "example": 1,
            "type": "integer"
          },
          "other": {
            "description": "Total number of other errors\n",
            "example": 1,
            "type": "integer"
          }
        }
      },
      "raid_disk_stats": {
        "type": "object",
        "properties": {
          "device": {
            "description": "The block device name backing this disk mount point.",
            "type": "string",
            "example": "sda1"
          },
          "mounted": {
            "description": "Whether the disk is mounted correctly.",
            "type": "boolean"
          },
          "mode": {
            "$ref": "#/components/schemas/raid_disk_mode"
          },
          "status": {
            "$ref": "#/components/schemas/raid_disk_status"
          },
          "io_usage": {
            "description": "Disk I/O utilization percentage from `/proc/devstat`.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "raid_disk_io_usage",
            "x-metric-type": "gauge",
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "migration_speed": {
            "description": "The speed of copying the last blob, in bytes per second.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "migration_eta": {
            "description": "The estimated migration end time, in UTC seconds.",
            "type": "integer",
            "format": "utc",
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "migration_updated": {
            "description": "The time when the values of `migration_speed` and `migration_eta` were last updated.",
            "type": "integer",
            "format": "utc",
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "errors": {
            "$ref": "#/components/schemas/raid_disk_errors"
          }
        }
      },
      "dvr_write_counters": {
        "type": "object",
        "properties": {
          "segments_written": {
            "type": "integer",
            "description": "How many segments have been written since stream start\n",
            "openmetrics_metric": "segments_written"
          },
          "segments_skipped": {
            "type": "integer",
            "description": "How many segments were not written due to delay of storage.\n\nThey could be written, if storage was faster, but they were deleted from memory.\n"
          },
          "segments_failed": {
            "type": "integer",
            "description": "How many segments got some error from the storage during write\n"
          },
          "segments_written_collapsed": {
            "type": "integer",
            "description": "Total amount of segments that were written in batch with another one.\n\nFor 2 segments written in a single batch, here will be recorded 1.\n\nMonitor this to see how your storage is delaying\n"
          },
          "segments_written_fast": {
            "type": "integer",
            "description": "How many segments were written faster than 1/2 of segment duration\n"
          },
          "segments_written_slow": {
            "type": "integer",
            "description": "How many segments were written slower than 1/2 of segment duration, but faster than 90%\nof segment duration\n"
          },
          "segments_written_delayed": {
            "type": "integer",
            "description": "How many segments were written slower than 90% of segment duration, which means\nthat DVR cannot write this stream\n"
          },
          "segments_discontinuity": {
            "type": "integer",
            "description": "How many segments have timestamps gap or different media info between them while source is being written to the archive. This counter does not change during replication.\n"
          }
        }
      },
      "dvr_read_source_counters": {
        "type": "object",
        "properties": {
          "ram": {
            "description": "Number of times when requested segment was read from RAM.",
            "type": "integer",
            "example": 100
          },
          "cache": {
            "description": "Number of times when requested segment was read from cache.",
            "type": "integer",
            "example": 100
          },
          "local": {
            "description": "Number of times when requested segment was read from local DVR.",
            "type": "integer",
            "example": 10
          },
          "remote": {
            "description": "Number of times when requested segment was read from remote DVR.",
            "type": "integer",
            "example": 10
          }
        }
      },
      "dvr_read_popularity_counters": {
        "allOf": [
          {
            "$ref": "#/components/schemas/dvr_read_source_counters"
          },
          {
            "type": "object",
            "properties": {
              "enoent": {
                "description": "Number of times when requested segment was not found.",
                "type": "integer",
                "example": 0
              }
            }
          }
        ]
      },
      "dvr_read_popularity_stats": {
        "type": "object",
        "properties": {
          "today": {
            "$ref": "#/components/schemas/dvr_read_popularity_counters"
          },
          "yesterday": {
            "$ref": "#/components/schemas/dvr_read_popularity_counters"
          },
          "week": {
            "$ref": "#/components/schemas/dvr_read_popularity_counters"
          },
          "other": {
            "$ref": "#/components/schemas/dvr_read_popularity_counters"
          }
        }
      },
      "dvr_read_performance_stats": {
        "type": "object",
        "properties": {
          "segments_read_fast": {
            "$ref": "#/components/schemas/dvr_read_source_counters"
          },
          "segments_read_slow": {
            "$ref": "#/components/schemas/dvr_read_source_counters"
          },
          "segments_read_delayed": {
            "$ref": "#/components/schemas/dvr_read_source_counters"
          },
          "segments_read_enoent": {
            "type": "integer",
            "description": "How many segment read operations have been performed on segments that are not present on the DVR\n"
          },
          "segments_read_failed": {
            "type": "integer",
            "description": "How many segment read operations were performed with errors\n"
          }
        }
      },
      "dvr_export_job": {
        "description": "DVR export job",
        "type": "object",
        "properties": {
          "id": {
            "description": "Job ID",
            "type": "string",
            "format": "uuid",
            "example": "3c448252-2516-4950-a1f6-fa2c7e8f4cb1",
            "x-format-description": "uuid"
          },
          "name": {
            "description": "Source stream name",
            "type": "string",
            "example": "demo"
          },
          "from": {
            "description": "Beginning of the range to export",
            "type": "integer",
            "format": "utc_ms",
            "example": 1730205876000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "duration": {
            "description": "Duration of the range to export",
            "type": "integer",
            "format": "milliseconds",
            "example": 4200000,
            "x-format-description": "milliseconds"
          },
          "path": {
            "description": "Destination file path",
            "examples": {
              "local": {
                "value": "/home/example/file.mp4"
              },
              "s3": {
                "value": "s3://example.com/bucket/path/to/file.mp4"
              }
            },
            "type": "string"
          },
          "filter": {
            "description": "Describes what should be exported for stream",
            "type": "object",
            "properties": {
              "tracks": {
                "description": "If a stream has several audio and video tracks, use this parameter to specify which tracks should be exported",
                "type": "string",
                "example": "v1a1"
              }
            }
          },
          "packing": {
            "description": "How to pack a recording data in the exported file",
            "default": "fragmented",
            "example": "compat",
            "enum": [
              "fragmented",
              "compat"
            ],
            "type": "string"
          },
          "timelapse": {
            "description": "Request a timelapse instead of normal speed",
            "oneOf": [
              {
                "type": "string",
                "const": true
              },
              {
                "type": "integer",
                "format": "milliseconds",
                "x-format-description": "milliseconds"
              }
            ]
          },
          "timelapse_kbps": {
            "description": "Custom bitrate for timelapse",
            "type": "integer",
            "example": 3000
          },
          "started_at": {
            "description": "When this job was started",
            "type": "integer",
            "format": "utc_ms",
            "example": 1730479930721,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "finished_at": {
            "description": "When this job finished (successfully or not)",
            "type": "integer",
            "format": "utc_ms",
            "example": 1730479931103,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "status": {
            "description": "Status of this job",
            "enum": [
              "running",
              "succeeded",
              "failed",
              "canceled"
            ],
            "type": "string"
          },
          "error": {
            "description": "when status='failed' this field contains a reason for failure",
            "type": "string",
            "example": "no_dvr"
          }
        },
        "required": [
          "name",
          "from",
          "duration",
          "path"
        ]
      },
      "dvr_export_job_list": {
        "type": "object",
        "properties": {
          "jobs": {
            "description": "List of known DVR jobs",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/dvr_export_job"
            }
          }
        }
      },
      "dvr_consistency_errors": {
        "description": "Errors found during DVR consistency checks",
        "type": "object",
        "properties": {
          "name": {
            "description": "stream name",
            "type": "string",
            "example": "demo"
          },
          "errors": {
            "description": "List of errors found during checks",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "failed_check": {
                  "description": "Name of the check that raised this error",
                  "type": "string",
                  "example": "blob_coherence"
                },
                "details": {
                  "description": "Arbitrary details that can help to understand the problem",
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "cache_spec": {
        "type": "object",
        "properties": {
          "path": {
            "description": "The path where the files from the cloud or HTTP are cached to speed up broadcasting.",
            "type": "string",
            "format": "disk_path",
            "example": "/storage/cache",
            "x-format-description": "disk_path"
          },
          "reference": {
            "description": "The name of the cache.",
            "type": "string",
            "format": "cache_name",
            "example": "cache1",
            "x-format-description": "cache_name"
          },
          "misses": {
            "description": "The number of requests necessary for a file to be cached.",
            "type": "integer",
            "example": 3
          },
          "storage_limit": {
            "description": "Maximum disk consumption in bytes. \nWhen this limit is reached, the oldest files will be overridden by later files.\n",
            "type": "integer",
            "format": "bytes",
            "example": 400000,
            "x-format-description": "bytes"
          },
          "expiration": {
            "description": "A period (in seconds) back from the current moment during which the files are stored.\nAs time goes, the files which are older than this period are being overridden by the later files.\n",
            "type": "integer",
            "format": "seconds",
            "example": 3600,
            "x-format-description": "seconds"
          }
        }
      },
      "vbi_line": {
        "type": "integer"
      },
      "ttxt_descriptors": {
        "properties": {
          "page": {
            "description": "Page number of the teletext received from an SDI card.\nIt is defined according to ETS 300 706 teletext specification.\n\nThe information about the pages is received from the stream provider.\n",
            "type": "integer",
            "x-primary-key": true,
            "example": 100
          },
          "lang": {
            "description": "The language code of the teletext.",
            "anyOf": [
              {
                "$ref": "#/components/schemas/language_value"
              }
            ]
          },
          "type": {
            "description": "Teletext page type defined according to the Specification for Service Information (SI) in DVB systems, 6.2.32 Teletext descriptor in EN 300 468 Digital Video Broadcasting (DVB).",
            "enum": [
              "initial",
              "subtitle",
              "impaired"
            ],
            "type": "string",
            "example": "initial"
          }
        },
        "required": [
          "page",
          "lang",
          "type"
        ],
        "type": "object"
      },
      "vbi_service": {
        "enum": [
          "ttxt"
        ],
        "type": "string"
      },
      "srt_config": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "port": {
                "$ref": "#/components/schemas/listen_spec"
              },
              "timeout": {
                "description": "Data transmission timeout in seconds. \nIf set to `false` then data transmission time is unlimited. This is a defalut behavior.\n",
                "anyOf": [
                  {
                    "type": "integer",
                    "format": "seconds",
                    "x-format-description": "seconds"
                  },
                  {
                    "enum": [
                      false
                    ],
                    "type": "boolean"
                  }
                ],
                "x-notice": "SRTO_RCVTIMEO SRTO_SNDTIMEO (ms, -1 no limit)",
                "example": 10
              }
            }
          },
          {
            "$ref": "#/components/schemas/srt_config_base"
          }
        ]
      },
      "srt_config_base": {
        "type": "object",
        "properties": {
          "minversion": {
            "description": "The minimum SRT version that is required from the peer for SRT publication.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.1.0"
          },
          "version": {
            "description": "Required SRT version.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.3.0"
          },
          "enforcedencryption": {
            "description": "Whether both connection parties must have the same password set (including empty, in other words, with no encryption). \nIf the passwords do not match or only one side is unencrypted, the connection is rejected. \nThe default value is `true`.\n",
            "type": "boolean",
            "example": true
          },
          "passphrase": {
            "description": "The password for the encrypted transmission. \nIts length should be not less than 10 and not more than 79 characters.\n\nUnlike [password](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_save%7Cbody%7Cpassword),\nthe passphrase is not transmitted openly but is used to encrypt the key that is transmitted by the Caller\nand decoded by Listener.\n",
            "type": "string",
            "minLength": 10,
            "maxLength": 79,
            "example": "9876543210",
            "x-notice": "SRTO_PASSPHRASE (\"\")"
          },
          "linger": {
            "description": "The time, in seconds, that the socket waits for the unsent data before closing. \nThe default value is 180.\n",
            "type": "integer",
            "format": "seconds",
            "x-notice": "SRTO_LINGER on, (180s) (off - 0s)",
            "example": 15,
            "x-format-description": "seconds"
          },
          "latency": {
            "description": "The latency value for both directions of the socket.\nBy default initial value latency is 0 when transmitting and 120ms when receiving video.\nActual value established after connection handshake.\nIncreased value helps tolerate network losses and delays.\n",
            "type": "integer",
            "format": "milliseconds",
            "x-notice": "SRTO_LATENCY",
            "example": 150,
            "x-format-description": "milliseconds"
          },
          "streamid": {
            "description": "A string of maximum 512 characters set on the socket before the connection. \n\nThis string is a part of a callback that is sent by the caller and regisered by the listener. \nBased on this information the listener can accept or reject the connection, select the desired data stream, or set an appropriate passphrase for the connection.\n\nIts format is `#!::` optionally followed by the parameters:\n* `r=` - stream name\n* `m=` - mode expected for the connection: `publish` (if the caller wants to send the stream data) or `request` (if the caller wants to receive the stream).\n* `password=` - a password for the authorization in a publish session (not recommended, better use `passphrase` option instead)\n\nDuring SRT sessions the following parameters are automaticly added to streamid:\n* `s=` - the identifier of a session\n* `a=` - Flussonic version\n\nNOTE: you can specify a string in the format you need; to disable this extension, you need specify empty string.\n",
            "type": "string",
            "maxLength": 512,
            "example": "#!::r=my-stream,m=publish"
          }
        }
      },
      "webrtc_router_config": {
        "type": "object",
        "properties": {
          "transport": {
            "$ref": "#/components/schemas/webrtc_transport",
            "default": "udp"
          },
          "ports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/network_port"
            },
            "description": "Ports that will be used for WebRTC data handling.\n"
          }
        },
        "required": [
          "ports"
        ]
      },
      "stream_dvr_spec": {
        "type": "object",
        "properties": {
          "reference": {
            "description": "Stream can refer to the globally declared DVR. This option referres to a single DVR entry.",
            "type": "string",
            "format": "dvr_name",
            "example": "localdvr0",
            "x-format-description": "dvr_name"
          },
          "remotes": {
            "description": "The address of the source from which Media server will read the archive. This address will not be used for capturing live video, it is strictly for data exchange on the availability of the archive and the transmission of segments.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "dvr_url",
              "pattern": "^(m4f|m4fs|m4s|m4ss|hls)://.*$",
              "examples": {
                "default": {
                  "value": "m4f://clusterkey@secondserver/otherstream"
                }
              },
              "x-format-description": "dvr_url"
            }
          },
          "root": {
            "description": "If no `reference` specified, then `root` must be specified. Video recording will be made to `root/name` directory.\nThis option works only in media server and should be used only as a quickstart mechanism. Should be avoided in large installations, because it mixes infrastructure and content setup and lacks configurability.",
            "type": "string",
            "format": "dvr_url",
            "examples": {
              "default": {
                "value": "/storage"
              }
            },
            "x-format-description": "dvr_url"
          },
          "storage_limit": {
            "description": "Maximum disk consumption in bytes. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nThis option affects both continuous recording and locked episodes (see `episodes_url`).\n\nIf `episodes_url` does not respond, the archive clean-up by `storage_limit` is not performed\nto avoid deleting the recordings that should not be deleted.\n",
            "type": "integer",
            "format": "bytes",
            "example": 400000000000,
            "x-format-description": "bytes"
          },
          "disk_usage_limit": {
            "description": "Maximum disk consumption in percents. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nIt important to understand that this is not a \"per-stream\" option, this option means\nthat cleaning of this stream will be triggered if overall disk usage reaches this number.\n\nIf you have all streams with configuration 98% and one stream with 95%, it will be permanently\nempty.\n",
            "type": "integer",
            "format": "percent",
            "example": 98,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "expiration": {
            "description": "Archive depth - a period (in seconds) back from the current moment during which the \ncontigious part of archive is stored. \nAs time goes, the parts of the recording which are older than the archive depth are deleted.\n\nIf you have option `episodes_expiration` enabled, then some parts of DVR that are \nlocked by episode signalling mechanism may be kept more than this `expiration` depth.\n\nIf `episodes_url` does not respond, the archive clean-up by `expiration` is not performed;\nonly the archive with expired episodes (`episodes_expiration`) is cleaned up until the `episodes_url` restores.\n",
            "type": "integer",
            "format": "seconds",
            "examples": {
              "default": {
                "value": 604800
              }
            },
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "seconds"
          },
          "episodes_expiration": {
            "description": "Additional archive depth in seconds for episodes. If set, episodes and their corresponding DVR record\nwill be saved for `expiration + episodes_expiration` seconds.\n\nThe archive clean-up within `[expiration, expiration+episodes_expiration]` seconds of the\nrecording performed depending on [external_episodes_list](https://flussonic.com/doc/api/config-external/#tag/dvr/operation/external_episodes_list)\nresponse of `episodes_url`.\n\nAnything older than `expiration+episodes_expiration` seconds will\nbe cleaned even if `episodes_url` does not respond.\n",
            "type": "integer",
            "format": "seconds",
            "examples": {
              "default": {
                "value": 6048000
              }
            },
            "x-api-allow": [
              "central-layouter"
            ],
            "x-api-description": {
              "central-layouter": "Additional archive depth in seconds for episodes. If set, episodes and their corresponding DVR record\nwill be saved for `expiration + episodes_expiration` seconds.\n\nThe archive clean-up within `[expiration, expiration+episodes_expiration]` seconds of the\nrecording performed depending on [external_episodes_list](https://flussonic.com/doc/api/config-external/#tag/dvr/operation/external_episodes_list)\nresponse of `episodes_url`.\n\nAnything older than `expiration+episodes_expiration` seconds will\nbe cleaned even if `episodes_url` does not respond.\n\nLayouter uses this field to calculate the potential archive size of the stream when\n[episodes_density](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Cstats%7Cepisodes_density)\nis set and greater than 0.\n"
            },
            "x-format-description": "seconds"
          },
          "episodes_url": {
            "description": "External URL that will be triggered for fetching episodes list.\nTake a look at config_external API for method `external_episodes_list`.\n\nIf the `episodes_url` not set or responds with any HTTP code other than `200` or `501` or does not respond within a timeout,\nthe archive clean-up is only performed by `episodes_expiration` time while `expiration` and `storage_limit` are ignored until the `episodes_url` restores.\n\n\nIf `episodes_url` is a blank string, then current config_external API endpoint will be used to request episodes.\nIt is most common usage of this field.\n",
            "type": "string",
            "examples": {
              "default": {
                "value": "http://central-host.local/config-external/episodes"
              },
              "simple": {
                "value": ""
              }
            }
          },
          "dvr_replicate": {
            "description": "Whether DVR replication is used. Replication means that a DVR archive is stored on two (or more) Flussonic servers.\nIt can be used for reliability or for broadcasting with a time shift. Learn more in [Flussonic documentation](https://flussonic.com/doc/scale-dvr-playback-with-new-server/).\n",
            "type": "boolean",
            "example": true
          },
          "replication_port": {
            "$ref": "#/components/schemas/network_port"
          },
          "schedule": {
            "description": "One or several time intervals for recording by schedule.\nThe beginning and the end of each interval are set in \"hhmm\" format (without leading zeros ) according to UTC standard. \nFor example, `2330` is for 23:30, `800` - for 08:00. The interval can go over midnight, e.g. 22:00-1:30. In this case it is set as follows: `[2200,130]`.\n\nScheduled recording can be useful for the channels with part-time broadcasting. \nIt allows to save disk space significantly.\n",
            "items": {
              "$ref": "#/components/schemas/dvr_schedule_range"
            },
            "type": "array",
            "example": [
              [
                800,
                1600
              ],
              [
                2200,
                130
              ]
            ]
          },
          "dvr_offline": {
            "description": "If this option is enabled, Flussonic detects DVR at the start of the stream,\nbut does not start recording immediately and waits for external API request.\n",
            "type": "boolean"
          },
          "copy": {
            "description": "The URL of another storage to copy the blobs (hours of the archive) into. \nCopying is done when a blob is complete (i.e., once an hour), and therefore helps significantly reduce the number of network requests to a cloud storage.\n",
            "type": "string",
            "format": "dvr_url",
            "example": "s3://token@minio.mycompany.com/dvr-bucket",
            "x-format-description": "dvr_url"
          },
          "keep_locks": {
            "description": "Whether the locked DVR recordings will be kept when disk usage limit is reached (in bytes or percents).\n\nThis option will be now always enabled, consider managing your free space.\n\nSwitch to `episodes_url` mechanism instead.\n",
            "type": "boolean",
            "example": false,
            "deprecated": true,
            "x-delete-at": 23.11
          }
        }
      },
      "transponder_pid": {
        "type": "object",
        "properties": {
          "pid": {
            "$ref": "#/components/schemas/ts_pid",
            "x-primary-key": true
          },
          "content": {
            "description": "Content of the track.",
            "enum": [
              "system",
              "video",
              "audio",
              "application",
              "metadata"
            ],
            "type": "string",
            "example": "audio"
          },
          "codec": {
            "$ref": "#/components/schemas/frame_codec"
          },
          "track": {
            "description": "Index of a track with specified content and maybe codec.\nE.g. when you specify content=audio and track=2 the second audio track will be selected.\nIf you specify content=audio, codec=aac and track=1, the first AAC track will be selected\neven if it is a third audio track and fifth track in stream media_info\n",
            "type": "integer",
            "example": 1
          },
          "bitrate": {
            "description": "Bitrate of the track.",
            "type": "integer",
            "format": "speed",
            "example": 2543,
            "x-format-description": "speed"
          },
          "stream_type": {
            "description": "Custom program element type in PMT\nCombined with bypass (content=metadata, track=0) this option makes\nproprietary PSI streams appear in PMT program info with given stream_type field\n\nThis is an optional parameter for advanced users. By default, the media Server\nis automatically sets the stream_type according to the track codec.\n",
            "type": "integer",
            "minimum": 1,
            "maximum": 255,
            "example": 12
          },
          "es_info": {
            "description": "Raw elementary stream descriptors to describe proprietary stream in PMT program info\nPlese refer to ISO/IEC 13818-1 section 2.6 for syntax\n\nThis is an optional parameter for advanced users. By default, the media Server\nis automatically sets the stream_type according to the track codec.\n",
            "type": "string",
            "format": "hexbinary",
            "example": "52010D",
            "x-format-description": "hexbinary"
          },
          "stats": {
            "$ref": "#/components/schemas/push_pid_counters",
            "readOnly": true
          }
        },
        "required": [
          "pid",
          "content",
          "track"
        ]
      },
      "multiplexer_stats": {
        "type": "object",
        "properties": {
          "bitrate": {
            "description": "Bitrate of the MPTS stream, configured or autotuned.\n",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "payload": {
            "description": "The payload bytes count.",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "multiplexer_payload",
            "x-metric-type": "counter",
            "x-format-description": "bytes"
          },
          "encoded": {
            "description": "The encoded bytes count.",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "multiplexer_encoded",
            "x-metric-type": "counter",
            "x-format-description": "bytes"
          },
          "fillers": {
            "description": "The filler packets count.",
            "type": "integer",
            "openmetrics_metric": "multiplexer_fillers",
            "x-metric-type": "counter"
          },
          "stuffing": {
            "description": "The stuff packets count.",
            "type": "integer",
            "openmetrics_metric": "multiplexer_stuffing",
            "x-metric-type": "counter"
          },
          "trimmed_bytes": {
            "description": "The trimmed bytes count.",
            "type": "integer",
            "format": "bytes",
            "openmetrics_metric": "multiplexer_trimmed_bytes",
            "x-metric-type": "counter",
            "x-format-description": "bytes"
          },
          "trimmed_frames": {
            "description": "The trimmed frames count.",
            "type": "integer",
            "openmetrics_metric": "multiplexer_trimmed_frames",
            "x-metric-type": "counter"
          },
          "exceeded_bytes": {
            "description": "The number of bytes exceeding the allocated bandwidth.",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "exceeded_frames": {
            "description": "The number of PES packets with an instant bitrate boost.",
            "type": "integer"
          },
          "ts_overflow": {
            "description": "Is TS overflowed. True if no stuffing at last time.",
            "type": "boolean"
          },
          "epg_programs": {
            "description": "Number of programs for which EPG is transmitted.",
            "type": "integer"
          },
          "late_ticks": {
            "description": "Encoder is too slow events counter",
            "type": "integer"
          },
          "errors_xmltv_file": {
            "description": "Number of XMLTV file read errors.",
            "type": "integer"
          },
          "errors_xmltv_parse": {
            "description": "Number of XMLTV parse errors.",
            "type": "integer"
          },
          "pids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/push_pid_counters"
            },
            "description": "Per pid statistics for MPEG-TS encoding\n"
          },
          "programs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/transponder_program_stats"
            },
            "description": "Per pid statistics for MPEG-TS encoding\n"
          },
          "sys_payload": {
            "description": "Counts payload bytes for system traffic, including PSI tables and raw bypass.\n",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "sys_packets": {
            "description": "Number of system traffic packets\n",
            "type": "integer"
          },
          "sys_stuffing_packets": {
            "description": "Number of NULL packets (PID 0x1FFF) inserted when no data was scheduled on any PID.\n",
            "type": "integer"
          },
          "rotated_keys_count": {
            "description": "Number of successfully completed key rotations.\n",
            "type": "integer"
          },
          "ecmg_network_errors": {
            "description": "Number of network errors between transponder and ECMG.\n",
            "type": "integer"
          },
          "emm_count": {
            "description": "Number of EMM received from EMMG.\n",
            "type": "integer"
          },
          "emmg_network_errors": {
            "description": "Number of network errors between transponder and EMMG.\n",
            "type": "integer"
          },
          "scrambled_bytes": {
            "description": "Number of scrambled bytes.\n",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          }
        }
      },
      "transponder_program_stats": {
        "type": "object",
        "required": [
          "pnr"
        ],
        "properties": {
          "pnr": {
            "description": "Program ID of the program.\n",
            "type": "integer"
          },
          "errors_program_reset": {
            "description": "Number of times the program was reset.\nThis may occur when a frame fails to enqueue due to bad timing.\n",
            "type": "integer"
          },
          "output_dts_shift_changed": {
            "description": "Number of times the program was reset due to a change in the `output_dts_shift` option.\nThis may happen when the input source is switched.\n",
            "type": "integer"
          },
          "scte35_announces": {
            "description": "Number of SCTE-35 splices targeting an IDR frame.\n",
            "type": "integer"
          },
          "errors_scte35_announces": {
            "description": "Number of SCTE-35 splices that missed their intended splice point.\n",
            "type": "integer"
          }
        }
      },
      "vision_spec": {
        "type": "object",
        "properties": {
          "alg": {
            "description": "The algorithm used for video analytics.\n\nDeprecated. Use `detectors` instead.\n",
            "type": "string",
            "deprecated": true,
            "x-delete-at": 26.07,
            "example": "faces",
            "x-api-allow": [
              "vision-config-external",
              "vision",
              "central",
              "watcher-admin",
              "watcher-client"
            ],
            "enum": [
              "faces",
              "plates"
            ]
          },
          "areas": {
            "description": "This parameter allows you to select specific polygonal area(s) for detection.\nBy default, it is empty, and the recognition system searches over the entire camera field of view.\n\nEach area is specified as a sequence of comma-separated coordinates of vertices of the polygon: `x0,y0,x1,y1,x2,y2,...`.\nThe vertices are specified in a counter-clockwise direction. Multiple areas are separated by `:`.\n\nDeprecated. Use `detectors` instead.\n",
            "type": "string",
            "deprecated": true,
            "x-delete-at": 26.07,
            "x-api-allow": [
              "vision-config-external",
              "vision",
              "central",
              "watcher-admin",
              "watcher-client"
            ]
          }
        }
      },
      "auth_spec": {
        "type": "object",
        "properties": {
          "url": {
            "$ref": "#/components/schemas/auth_url"
          },
          "domains": {
            "description": "Specifying the domains, within which playing this video is allowed. \nThis does not work for those clients that do not pass the value of Referer HTTP header.\n",
            "items": {
              "type": "string"
            },
            "type": "array",
            "example": [
              "mycompany.com"
            ]
          },
          "max_sessions": {
            "description": "The maximal number of streams or files the user can view simultaneously.\nThis limitation allows to prevent users from full restreaming to their servers.\n",
            "type": "integer",
            "example": 5000
          },
          "allowed_countries": {
            "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that have access to the content without any other checks. \n\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated. \nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/"
            },
            "items": {
              "type": "string",
              "format": "iso3166",
              "x-format-description": "iso3166"
            },
            "type": "array",
            "example": [
              "US",
              "DE",
              "GB"
            ]
          },
          "disallowed_countries": {
            "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that are banned from accessing the content. \n\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated. \nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/"
            },
            "items": {
              "type": "string",
              "format": "iso3166",
              "x-format-description": "iso3166"
            },
            "type": "array",
            "example": [
              "US",
              "DE",
              "GB"
            ]
          },
          "soft_limitation": {
            "description": "If this option is enabled and `max_sessions` limitation is used, the extra sessions are interrupted not immediately, but in 30 or 90 seconds.\nThis can be useful for middlewares that cannot generate a new token for every new stream or file request \nand therefore need time to understand that all sessions are being used.\n",
            "type": "boolean",
            "example": false
          },
          "session_keys": {
            "description": "A list of keys to generate a session ID value, allowing to configure the authorization scheme \nwhich is a hash sum calculated as follows: `hash(name + ip + proto)`.\nThis parameter allows to finish one session and start another one with the same authorization token.\nThe keys `name`,`ip`, and `proto` are required.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/authorize-clients/#auth-session-keys"
            },
            "items": {
              "$ref": "#/components/schemas/session_key"
            },
            "type": "array",
            "example": [
              "name",
              "token",
              "proto",
              "ip"
            ]
          },
          "extra": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Some additional options."
          }
        }
      },
      "stream_stats": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Runtime stream ID. Was used to identify different stream instances",
            "example": "61893ba6-07b3-431b-b2f7-716ac1643953",
            "deprecated": true,
            "x-delete-at": 25.06,
            "x-format-description": "uuid"
          },
          "source_id": {
            "type": "string",
            "format": "uuid",
            "description": "Use `stream.stats.input.id` if you still need it. This is deprecated\n",
            "example": "61893be1-054e-4acc-8d24-8ed92efe6ad0",
            "deprecated": true,
            "x-delete-at": 25.04,
            "x-format-description": "uuid"
          },
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the stream opened before authorization/connection completed(in UTC milliseconds).\n",
            "example": 1636383729002,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "lifetime": {
            "type": "number",
            "format": "milliseconds",
            "description": "The time period in seconds during which the stream is being captured.\nCan be calculated from `opened_at`\n",
            "x-api-allow": [
              "central",
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ],
            "example": 71977,
            "x-format-description": "milliseconds"
          },
          "last_dts": {
            "type": "number",
            "format": "ticks",
            "description": "Last frame timestamp read from the stream.",
            "example": 383835646,
            "x-format-description": "ticks"
          },
          "last_dts_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the last time frame was sent to the stream output (in UTC).",
            "example": 1636383841974,
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin",
              "central"
            ],
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "media_info": {
            "$ref": "#/components/schemas/media_info"
          },
          "ts_delay": {
            "type": "number",
            "format": "ticks",
            "example": 1284,
            "description": "The time period during which no frames were received from the stream's input.",
            "x-api-allow": [
              "central",
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ],
            "x-format-description": "ticks"
          },
          "status": {
            "$ref": "#/components/schemas/stream_status"
          },
          "source_error": {
            "type": "string",
            "description": "Error code showing if there are any problems with capturing the stream.\n"
          },
          "backup_running": {
            "description": "Whether a backup is currently running.",
            "type": "boolean",
            "x-api-allow": [
              "central"
            ]
          },
          "backup_error": {
            "$ref": "#/components/schemas/vod_file_error"
          },
          "push": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/push_counters"
            },
            "description": "Per pusher statistic for the stream\n"
          },
          "inputs": {
            "description": "Per-input runtime statistics.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/input_stats"
            },
            "readOnly": true,
            "x-api-allow": [
              "central",
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ]
          },
          "input": {
            "$ref": "#/components/schemas/input_stats"
          },
          "input_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Input bitrate.\n\nBetter calculate from input.bytes\n",
            "example": 186,
            "x-format-description": "speed"
          },
          "current_agent_id": {
            "type": "string",
            "format": "agent_id",
            "description": "The identifier of the Agent that is currently serving the stream.",
            "x-api-allow": [
              "watcher-core",
              "central",
              "watcher-client",
              "watcher-admin"
            ],
            "x-format-description": "agent_id"
          },
          "agent_status": {
            "enum": [
              "connected",
              "not_connected",
              "rproxy_not_configured"
            ],
            "type": "string",
            "description": "The status of the Agent serving the stream.",
            "x-api-allow": [
              "watcher-core",
              "central",
              "watcher-client",
              "watcher-admin"
            ]
          },
          "dvr_enabled": {
            "description": "If DVR is enabled for the stream.",
            "type": "boolean"
          },
          "dvr_info": {
            "$ref": "#/components/schemas/dvr_info"
          },
          "dvr_replication": {
            "description": "If DVR replication is enabled for the stream.\nReplication means that a DVR archive is stored on two (or more) Flussonic servers for reliability.\n",
            "type": "integer",
            "format": "percent",
            "deprecated": true,
            "x-delete-at": 25.03,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "dvr_replication_running": {
            "description": "If DVR replication is in progress for the stream.\nReplication means that a DVR archive is stored on two (or more) Flussonic servers for reliability.\n\nRead `dvr_write_stats.segments_written_from_replication` instead\n",
            "type": "boolean",
            "deprecated": true,
            "x-delete-at": 25.03
          },
          "dvr_read_popularity": {
            "$ref": "#/components/schemas/dvr_read_popularity_stats"
          },
          "dvr_read_performance": {
            "$ref": "#/components/schemas/dvr_read_performance_stats"
          },
          "dvr_write": {
            "$ref": "#/components/schemas/dvr_write_counters"
          },
          "alive": {
            "default": false,
            "type": "boolean",
            "example": true,
            "description": "Becomes `false` when `ts_delay` > 12000 (= 12 seconds)",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin",
              "central"
            ]
          },
          "coder_error": {
            "type": "boolean",
            "description": "Shows if there was any encoding error.\nWas not fully implemented.\n",
            "deprecated": true,
            "x-delete-at": 25.03
          },
          "bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Stream bitrate.",
            "openmetrics_metric": "stream_bitrate",
            "x-metric-type": "gauge",
            "example": 186,
            "x-api-allow": [
              "watcher-core",
              "central",
              "watcher-client",
              "watcher-admin"
            ],
            "x-format-description": "speed"
          },
          "running_transcoder": {
            "default": false,
            "type": "boolean",
            "description": "If the transcoder is enabled for the stream."
          },
          "transcoder_overloaded": {
            "type": "boolean",
            "openmetrics_metric": "stream_transcoder_overloaded",
            "x-metric-type": "gauge",
            "description": "If the transcoder is overloaded."
          },
          "transcoder": {
            "$ref": "#/components/schemas/transcoder_stats"
          },
          "start_running_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Date and time when `status = running` was set.",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "running_on": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "server_name",
              "x-format-description": "server_name"
            },
            "description": "List of servers hostnames where the stream is running on.",
            "example": [
              "streamer1.example.com"
            ],
            "x-api-allow": [
              "central",
              "watcher-core"
            ]
          },
          "srt_port_resolve": {
            "type": "boolean",
            "example": false,
            "description": "This flag shows that the stream name was resolved via srt_port_resolve call.\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n"
          },
          "play": {
            "$ref": "#/components/schemas/play_counters"
          },
          "online_clients": {
            "type": "integer",
            "format": "client_count",
            "description": "The number of clients receiving the stream.\nUse play.play_opened_sessions instead\n",
            "openmetrics_metric": "stream_online_clients",
            "x-metric-type": "gauge",
            "example": 3,
            "x-api-allow": [
              "watcher-core",
              "central",
              "watcher-client",
              "watcher-admin"
            ],
            "deprecated": true,
            "x-delete-at": 25.04,
            "x-format-description": "client_count"
          },
          "last_access_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Date and time the stream was accessed the last time.",
            "example": 1669106270979,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "bytes_out": {
            "type": "integer",
            "format": "bytes",
            "description": "The amount of stream data sent to the clients.",
            "openmetrics_metric": "stream_bytes_out",
            "x-metric-type": "counter",
            "example": 0,
            "x-api-allow": [
              "watcher-core",
              "central",
              "watcher-client",
              "watcher-admin"
            ],
            "x-format-description": "bytes"
          },
          "output_bandwidth": {
            "type": "integer",
            "format": "bps",
            "x-metric-type": "gauge",
            "title": "Output Bandwidth",
            "description": "Upstream bandwidth on the time of the request.\nThe same as `out_bandwidth`, but this is bits/s\n\nConsider using bytes_out instead.\n",
            "x-format-description": "bps"
          },
          "drm": {
            "$ref": "#/components/schemas/drm_stats"
          },
          "thumbnails": {
            "$ref": "#/components/schemas/stream_thumbnails_stats"
          }
        }
      },
      "play_counters": {
        "type": "object",
        "properties": {
          "play_opened_sessions": {
            "type": "integer",
            "description": "How many play sessions are active at the moment\n",
            "openmetrics_metric": "play_opened_sessions",
            "x-metrics-type": "gauge"
          },
          "play_opened_sessions_by_proto": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "How many play sessions are active at the moment groupped by protocol\n"
          },
          "play_total_sessions": {
            "type": "integer",
            "description": "All sessions opened from the stream star\n",
            "openmetrics_metric": "play_total_sessions"
          },
          "play_total_sessions_by_proto": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "All sessions opened from the stream start groupped by protocol\n"
          },
          "play_bytes": {
            "type": "integer",
            "description": "How many bytes sent totally\n",
            "openmetrics_metric": "play_bytes"
          },
          "play_bytes_by_proto": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "How many bytes sent totally groupped by protocol\n"
          },
          "play_duration": {
            "type": "integer",
            "format": "seconds",
            "description": "How many human-hours (duration*clients) were delivered\n",
            "openmetrics_metric": "play_duration",
            "x-format-description": "seconds"
          },
          "play_duration_by_proto": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "seconds",
              "x-format-description": "seconds"
            },
            "description": "How many human-hours (duration*clients) were delivered groupped by protocol\n"
          },
          "authorizations_success": {
            "type": "integer",
            "description": "Count of successful requests made to external authorization backend\n"
          },
          "authorizations_denied": {
            "type": "integer",
            "description": "Count of denied authorization backend requests. This will be incremented when auth backend replies,\nbut denies playing. This means that backend is working, but denying playback.\n"
          },
          "authorizations_failed": {
            "type": "integer",
            "description": "Authorization backend can fail and do not reply at all, or give HTTP 500 errors. These cases will be counted here.\n"
          },
          "authorizations_declined": {
            "type": "integer",
            "description": "Authorization can be denied without even touching external authorization backend, for example in case of\ndenied IP or token. This counter will increase in this case.\n"
          },
          "play_ad_clips_injected": {
            "type": "integer",
            "description": "Number of injected advertisement clips.\n"
          },
          "play_hls_playlist_http_200": {
            "description": "Number of HLS playlist requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_playlist_http_400": {
            "description": "Number of HLS playlist requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_playlist_http_500": {
            "description": "Number of HLS playlist requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_playlist_time_100ms": {
            "description": "Number of HLS playlist requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_playlist_time_500ms": {
            "description": "Number of HLS playlist requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_playlist_time_1000ms": {
            "description": "Number of HLS playlist requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_playlist_time_longms": {
            "description": "Number of HLS playlist requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_segment_http_200": {
            "description": "Number of HLS segment requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_segment_http_400": {
            "description": "Number of HLS segment requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_segment_http_500": {
            "description": "Number of HLS segment requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_hls_segment_time_100ms": {
            "description": "Number of HLS segment requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_segment_time_500ms": {
            "description": "Number of HLS segment requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_segment_time_1000ms": {
            "description": "Number of HLS segment requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_hls_segment_time_longms": {
            "description": "Number of HLS segment requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_playlist_http_200": {
            "description": "Number of LL-HLS playlist requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_playlist_http_400": {
            "description": "Number of LL-HLS playlist requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_playlist_http_500": {
            "description": "Number of LL-HLS playlist requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_playlist_time_100ms": {
            "description": "Number of LL-HLS playlist requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_playlist_time_500ms": {
            "description": "Number of LL-HLS playlist requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_playlist_time_1000ms": {
            "description": "Number of LL-HLS playlist requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_playlist_time_longms": {
            "description": "Number of LL-HLS playlist requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_segment_http_200": {
            "description": "Number of LL-HLS segment requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_segment_http_400": {
            "description": "Number of LL-HLS segment requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_segment_http_500": {
            "description": "Number of LL-HLS segment requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_ll_hls_segment_time_100ms": {
            "description": "Number of LL-HLS segment requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_segment_time_500ms": {
            "description": "Number of LL-HLS segment requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_segment_time_1000ms": {
            "description": "Number of LL-HLS segment requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_ll_hls_segment_time_longms": {
            "description": "Number of LL-HLS segment requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_playlist_http_200": {
            "description": "Number of DASH playlist requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_playlist_http_400": {
            "description": "Number of DASH playlist requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_playlist_http_500": {
            "description": "Number of DASH playlist requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_playlist_time_100ms": {
            "description": "Number of DASH playlist requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_playlist_time_500ms": {
            "description": "Number of DASH playlist requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_playlist_time_1000ms": {
            "description": "Number of DASH playlist requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_playlist_time_longms": {
            "description": "Number of DASH playlist requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_segment_http_200": {
            "description": "Number of DASH segment requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_segment_http_400": {
            "description": "Number of DASH segment requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_segment_http_500": {
            "description": "Number of DASH segment requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_dash_segment_time_100ms": {
            "description": "Number of DASH segment requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_segment_time_500ms": {
            "description": "Number of DASH segment requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_segment_time_1000ms": {
            "description": "Number of DASH segment requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_dash_segment_time_longms": {
            "description": "Number of DASH segment requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_preview_http_200": {
            "description": "Number of Stream Preview requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_preview_http_400": {
            "description": "Number of Stream Preview requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_preview_http_500": {
            "description": "Number of Stream Preview requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_preview_time_100ms": {
            "description": "Number of Stream Preview requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_preview_time_500ms": {
            "description": "Number of Stream Preview requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_preview_time_1000ms": {
            "description": "Number of Stream Preview requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_preview_time_longms": {
            "description": "Number of Stream Preview requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          },
          "webrtc_retransmits": {
            "description": "Number of retransmitted packets when sender sends the same packet again because receiver didn't get it.",
            "type": "integer"
          },
          "webrtc_retransmits_bytes": {
            "description": "Total bytes of restransmitted packets.",
            "type": "integer"
          },
          "webrtc_nacks": {
            "description": "Number of NACK messages when receiver informs sender about lost packet. There is a delay between NACK and Restransmit, so NACKs >= Restransmits.",
            "type": "integer"
          },
          "play_other_http_200": {
            "description": "Number of other protocols requests with HTTP status 2xx",
            "type": "integer",
            "example": 1000
          },
          "play_other_http_400": {
            "description": "Number of other protocols requests with HTTP status 4xx",
            "type": "integer",
            "example": 1000
          },
          "play_other_http_500": {
            "description": "Number of other protocols requests with HTTP status 5xx",
            "type": "integer",
            "example": 1000
          },
          "play_other_time_100ms": {
            "description": "Number of other protocols requests that took less than 100ms",
            "type": "integer",
            "example": 10
          },
          "play_other_time_500ms": {
            "description": "Number of other protocols requests that took less than 500ms",
            "type": "integer",
            "example": 10
          },
          "play_other_time_1000ms": {
            "description": "Number of other protocols requests that took less than 1000ms",
            "type": "integer",
            "example": 10
          },
          "play_other_time_longms": {
            "description": "Number of other protocols requests that took more than 1000ms",
            "type": "integer",
            "example": 10
          }
        }
      },
      "stream_status": {
        "type": "string",
        "enum": [
          "running",
          "waiting",
          "error"
        ]
      },
      "pusher_status": {
        "enum": [
          "starting",
          "pending",
          "retry",
          "error",
          "establishing",
          "running",
          "stalling",
          "finished"
        ],
        "type": "string"
      },
      "pusher_standby_status": {
        "enum": [
          "active",
          "waiting"
        ],
        "type": "string"
      },
      "play_protocols_spec": {
        "type": "object",
        "properties": {
          "whitelist": {
            "description": "- If set to `True`, server **allows** a playback only for listed protocols;\n- If set to `False`, server **forbids** a playback only for listed protocols;\n",
            "default": false,
            "type": "boolean"
          },
          "hls": {
            "description": "Whether to allow or deny an HLS stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "cmaf": {
            "description": "Whether to allow or deny an LL-HLS stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "dash": {
            "description": "Whether to allow or deny a DASH stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "player": {
            "description": "Whether to allow or deny playback in embed.html, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "mss": {
            "description": "Whether to allow or deny an MSS stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "rtmp": {
            "description": "Whether to allow or deny an RTMP stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "rtsp": {
            "description": "Whether to allow or deny an RTSP stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "m4f": {
            "description": "Whether to allow or deny an M4F stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "m4s": {
            "description": "Whether to allow or deny an M4S stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "mseld": {
            "description": "Whether to allow or deny an MSE-LD stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "tshttp": {
            "description": "Whether to allow or deny an MPEG-TS stream playback over HTTP(S), depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "webrtc": {
            "description": "Whether to allow or deny an WebRTC stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "srt": {
            "description": "Whether to allow or deny an SRT stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "shoutcast": {
            "description": "Whether to allow or deny a SHOUTcast/Icecast stream playback, depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "mp4": {
            "description": "Whether to allow or deny an MP4 file download over HTTP(S), depending on the `whitelist` properties.\nUsed to export DVR segment(s) in MP4 file.\n",
            "type": "boolean"
          },
          "jpeg": {
            "description": "Whether to allow or deny delivering JPEG thumbnails over HTTP(S), depending on the `whitelist` properties.",
            "type": "boolean"
          },
          "api": {
            "description": "Whether to allow or deny API requests, depending on the `whitelist` properties.",
            "type": "boolean"
          }
        }
      },
      "track_filter_rule": {
        "type": "object",
        "description": "A single track filter rule.\n",
        "properties": {
          "match": {
            "$ref": "#/components/schemas/track_filter_match"
          },
          "video": {
            "$ref": "#/components/schemas/track_filter_constraints_video"
          }
        },
        "required": [
          "match"
        ]
      },
      "track_filter_match": {
        "type": "object",
        "description": "Conditions that must be met for this rule to apply.\nAt least one condition must be specified.\nThe rule applies if any condition matches (OR logic).\n",
        "properties": {
          "user_agent": {
            "description": "User-Agent string to match (case-insensitive substring match).\nIf the request's User-Agent header contains this string, the rule matches.\n",
            "type": "string",
            "example": "Roku"
          },
          "headers": {
            "$ref": "#/components/schemas/track_filter_match_headers"
          }
        }
      },
      "track_filter_match_headers": {
        "type": "object",
        "additionalProperties": {
          "type": "string"
        },
        "x-key-type": "string",
        "description": "HTTP headers in name-value format for matching (case-insensitive).\nWhen any specified header is present in the request and its value contains the specified substring, the rule matches.\n",
        "example": {
          "stb-model": "4800x"
        }
      },
      "track_filter_constraints_video": {
        "type": "object",
        "description": "Video track filtering constraints.\nThese constraints are applied to filter out video tracks that don't match the specified criteria.\n",
        "properties": {
          "max_width": {
            "description": "Maximum video width in pixels.\nVideo tracks with width greater than this value will be filtered out.\n",
            "type": "integer",
            "minimum": 1,
            "example": 720
          },
          "formats": {
            "description": "Whitelist of allowed video formats.\nOnly video tracks matching one of these formats will be included.\nCannot be used together with `max_width` and `exclude_formats`.\n\nExamples: \"720\", \"720p\", \"1080i\", \"720p60\", \"1080i50\".\n",
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^\\d+(p|i)?\\d*$"
            },
            "example": [
              "1080p30",
              "576p"
            ]
          },
          "exclude_formats": {
            "description": "Blacklist of excluded video formats.\nVideo tracks matching any of these formats will be filtered out.\nCannot be used together with `formats`.\n\nExamples: \"720\", \"720p\", \"1080i\", \"720p60\", \"1080i50\".\n",
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^\\d+(p|i)?\\d*$"
            },
            "example": [
              "720p60"
            ]
          }
        }
      },
      "stream_config": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "format": "media_name",
            "description": "Globally unique stream name.\nNote that the name could not be changed after the stream is created.\n",
            "x-primary-key": true,
            "openmetrics_label": "name",
            "examples": {
              "default": {
                "value": "hockey1"
              },
              "mylive/bunny": {
                "value": "mylive/bunny"
              },
              "decklink": {
                "value": "Decklink-Stream"
              },
              "dektec": {
                "value": "Dektec-Stream"
              },
              "test_stream": {
                "value": "test_stream"
              }
            },
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin",
              "vision-config-external",
              "smartcam",
              "central-layouter",
              "vision"
            ],
            "x-format-description": "media_name"
          },
          "comment": {
            "description": "Human-readable description of the stream.\n",
            "type": "string",
            "example": "This is a test stream",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "title": {
            "description": "Human-readable title of the stream. Provided for SDT MPEG-TS table or\nSDP RTSP title parameter.\n",
            "type": "string",
            "example": "Hockey channel",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "position": {
            "type": "integer",
            "format": "sort_index",
            "description": "Position of the stream in order of streams in the config file, if declared.",
            "example": 2,
            "x-format-description": "sort_index"
          },
          "named_by": {
            "$ref": "#/components/schemas/named_by",
            "readOnly": true
          },
          "srt_port_resolve": {
            "type": "boolean",
            "example": false,
            "readOnly": true,
            "deprecated": true,
            "x-delete-at": 24.06,
            "description": "Stream name was resolved via `srt_port_resolve` call.\n\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n\nThis parameter now lives in `stats` object.\n"
          },
          "template": {
            "description": "Template of the stream.",
            "type": "string",
            "format": "media_name",
            "example": "sports-hd",
            "x-format-description": "media_name"
          },
          "recheck_secondary_inputs_interval": {
            "description": "How often to re-check secondary inputs. If this option is not set than check is never performed.",
            "type": "integer",
            "format": "seconds",
            "example": 120,
            "x-format-description": "seconds"
          },
          "static": {
            "default": true,
            "description": "Whether a stream is `static` or not. \nIf set to `True` the server will try to keep this stream running even if\nthere are no viewers or errors encountered.\n\nStreamer restarts *all* `static` streams even if any internal errors occur\nand the `static` streams crash.\n",
            "type": "boolean",
            "example": true,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ]
          },
          "disabled": {
            "description": "Whether a stream is disabled. Disabled streams are inactive and do not run. \nDisplayed only with the API calls.\n",
            "type": "boolean",
            "example": false,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "inputs": {
            "description": "List of stream inputs. \n***Important:*** A stream without any inputs can receive video frames **only** if backup file is specified.\n",
            "items": {
              "$ref": "#/components/schemas/stream_input"
            },
            "type": "array",
            "x-api-allow": [
              "smartcam",
              "watcher-core",
              "vision-config-external",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "password": {
            "description": "Specify a password when publishing a password-protected stream.\n\nThe password is passed unencrypted in a query string. \nSome protocols may additionally offer built-in tools for stream protection, \nfor example you can use `passphrase` for SRT publications.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/publish-video-on-media-server/#live-publish-on_publish"
            },
            "type": "string"
          },
          "input_media_info": {
            "$ref": "#/components/schemas/input_media_info"
          },
          "provider": {
            "description": "Human-readable name of the content provider. Used, for example, for MPEG-TS.\n\nDeprecated, use `input_media_info.provider` instead\n",
            "type": "string",
            "example": "SportsTV",
            "deprecated": true,
            "x-delete-at": 25.03
          },
          "dvbocr": {
            "description": "This parameter allows to manage subtitles in an output stream.\n",
            "example": "replace",
            "enum": [
              "replace",
              "add"
            ],
            "type": "string"
          },
          "source_timeout": {
            "description": "If a connected source does not send any data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 10,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "video_timeout": {
            "description": "If a connected source does not send video data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "audio_timeout": {
            "description": "If a connected source does not send audio data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to sources when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "backup": {
            "$ref": "#/components/schemas/backup_config"
          },
          "epg_enabled": {
            "description": "Whether to extract EPG from the input.",
            "type": "boolean",
            "example": true
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "clients_timeout": {
            "description": "Stream's lifetime after the last client was disconnected (can be expressed in *seconds* or set to `False`). \nApplicable to on-demand streams **only**.      \n",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "boolean"
              }
            ],
            "example": 485,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "retry_limit": {
            "description": "Number of attempts for the server to reconnect to a data source.\nApplicable to on-demand streams **only**. If not defined, server will constantly try to reconnect (unlimited number of retries). \nIf the input does not become active after specified amount of attempts, stream shuts down till the next user request.\n",
            "type": "integer",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "transcoder": {
            "$ref": "#/components/schemas/transcoder_opts"
          },
          "thumbnails": {
            "$ref": "#/components/schemas/thumbnails_spec"
          },
          "jpeg_snapshot_sign_key": {
            "description": "A key to sign jpeg_snapshot requests.\nGenerating jpeg snapshots is a resource-intensive task.\nTo prevent DoS attacks by users, each request has to be signed by middleware\nto have control over resource consumption.\nThis parameter contains a token from the middleware to ensure\nthis request for JPEG generation is approved.\nFormat is <valid_till>_<Sha256Hash>\nvalid_till is UNIX time (seconds) when this token expires.\n```\nSha256Hash = sha256(str(valid_till) + \":\" + jpeg_snapshot_sign_key + \"@\" + name + \"/\" + \"snapshot-\" + str(pts) + \"-\" + size + \".jpg\")\n```\njpeg_snapshot_sign_key is a part of stream configuration\nFor example, when valid_till=1732200743, jpeg_snapshot_sign_key=\"TopSecret\", name=\"test\", pts=1732200271444, size=\"320x240\"\nsign would be 1732200743_176b3f0349c59f2d4561c8d1f82be90416cc8144b0ef0598856c4cf0d34d4dd8\n",
            "type": "string",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "dvr": {
            "$ref": "#/components/schemas/stream_dvr_spec"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "on_publish": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "drm": {
            "$ref": "#/components/schemas/drm_spec"
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "track_filter": {
            "description": "Configuration for filtering tracks based on named track filter rules.\nAllows to restrict available tracks for specific devices to prevent playback issues.\n\nEach track filter rule has a name, a match block with conditions (user_agent for example), and filter constraints.\nAll rules that have matching conditions are applied.\nIf no rule matches, all tracks are available.\n",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/track_filter_rule"
            },
            "x-key-type": "string"
          },
          "prepush": {
            "description": "The time (in seconds) that Media Server reserves for preloading the data, i. e. *buffering*.\nPrepush is always defined through GoP, but this option provides you with a more flexible way\nto configure the buffer size, e. g. a 1-3 or 7-10 seconds time interval.\n\nThe bigger the buffer size, the better the user experience is for the users\nwith a bad internet connection. However, the latency also increases.\n\nIf set to `False` to remove the latency, the stream's start time \nincreases. To decrease it, reduce the GoP size and make the bitrate higher \nor the video quality lower.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/technology-glossary/#glossary-prepush"
            },
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "integer"
              }
            ],
            "example": false,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "segment_count": {
            "description": "Number of segments stored in memory for the segment-based protocols, such as HLS and DASH.\nAdded to HLS live manifest. Do not forget that one more segment is stored for stale clients\nthat come too late, but the latest segment is not shown in the manifest.\n",
            "type": "integer",
            "example": 4
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "chunk_duration": {
            "description": "Chunk duration in LL-HLS manifest to be used for tunning latency.",
            "type": "integer",
            "format": "milliseconds",
            "example": 200,
            "x-format-description": "milliseconds"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "hls_scte35": {
            "description": "Whether to enable SCTE-35 ad insertion markers signaling in HLS manifest.\nAd markers can be included in SCTE-35 (`scte35`), AWS (`aws`), EXT-X-DATERANGE (`rfc8216`) formats or not included (`false`).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/advertisement-scte-markers/",
              "type": "string"
            },
            "example": "scte35",
            "enum": [
              "aws",
              "scte35",
              "rfc8216"
            ],
            "type": "string"
          },
          "add_audio_only": {
            "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/what-is-live-stream/#live-audio_only_hls"
            },
            "type": "boolean",
            "example": true
          },
          "webrtc_abr": {
            "$ref": "#/components/schemas/webrtc_abr_opts"
          },
          "pushes": {
            "description": "A list of pushes. When a server initiates the connection and sends a stream \nto other server(s), it is called a `push`.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-video-from-media-server/"
            },
            "items": {
              "$ref": "#/components/schemas/stream_push"
            },
            "type": "array",
            "x-api-allow": [
              "watcher-core",
              "watcher-admin"
            ]
          },
          "mpegts_pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "labels": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 40,
              "minLength": 1,
              "format": "unix_name",
              "x-format-description": "Contains only alphanumeric characters (a-z, A-Z, 0-9), underscores (_), hyphens (-) and periods (.).",
              "pattern": "^[a-zA-Z0-9_.-]+$"
            },
            "maxItems": 10,
            "x-key-type": "string",
            "description": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n",
            "x-api-description": {
              "central": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nSee [Layouter schema](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Clabels)\nfor more details.\n",
              "central-layouter": "Stream labels in key value format.\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nYou can use labels to control the stream layout.\n\nNote, that if you are using a multi-stream agent (i.e. multiple streams use the same agent in their inputs),\nthen the labels of these streams **must** be the same. Otherwise, one or more streams will not work.\n\nLayouter can process next labels:\n\n- With `required_` prefix. If stream has a `required_x=y` label, Layouter will provision stream only to nodes with the label `x=y`.\nIf there are no available nodes with the label `x=y`, then the stream will not be provisioned.\nUse `required_` labels to avoid running streams in an unsuitable environment.\n- With `preferred_` prefix. If stream has a `preferred_x=y` label, Layouter will prefer nodes with the label `x=y` to nodes without this label.\nIf there are no available nodes with the label `x=y`, then the stream will be provisioned to any other node.\nUse `preferred_` labels to optimize layout without the risk of downtime.\n\n**Use cases**\n\n1. Suppose you have a server used to test new hardware models, and you want the new streams to be provisioned only to the test nodes.\nTo provide this layout you can add the `required_env=test` label for stream and the `env=test` label for test nodes.\n\n2. Suppose you have two servers in different cities *N* and *M*, with expensive traffic between them, and cameras in city *N*.\nIn such a case, if it is important for you to preserving video recording in case node *N* fails, you can use `preferred_` labels.\nTo provide this layout you can add the `preferred_location=N` label for stream and the `location=N` label for node(-s) in city *N*.\nThen, in case of failure of node *N* - streams will be distributed to node *M*. When node *N* is back up and running, the streams will return to it.\n"
            },
            "examples": [
              {
                "key1": "value1",
                "key2": "value2"
              },
              {
                "required_env": "test",
                "location": "eu"
              },
              {
                "preferred_location": "eu"
              }
            ],
            "x-api-allow": [
              "watcher-core",
              "central-layouter",
              "watcher-admin"
            ]
          },
          "playback_headers": {
            "description": "This parameter sets playback HTTP headers for streams.\n",
            "items": {
              "$ref": "#/components/schemas/playback_headers"
            },
            "maxItems": 10,
            "type": "array"
          },
          "cluster_ingest": {
            "$ref": "#/components/schemas/cluster_ingest_config"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "meta": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "The param is deprecated and now used only for onvif_url and onvif_profile options.",
            "deprecated": true,
            "x-delete-at": 23.12
          },
          "vision": {
            "$ref": "#/components/schemas/vision_spec"
          },
          "srt": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "srt2": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "srt_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "aac_ab": {
            "type": "integer",
            "description": "Bitrate of the AAC audio track."
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "prefer_codec": {
            "$ref": "#/components/schemas/webrtc_prefer_video_codec"
          },
          "transport": {
            "$ref": "#/components/schemas/webrtc_transport"
          },
          "max_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Maximum bitrate for WebRTC.",
            "x-format-description": "speed"
          },
          "min_bitrate": {
            "type": "integer",
            "description": "Minimum bitrate for WebRTC."
          },
          "frames_timeout": {
            "type": "integer",
            "description": "Specifies the period of time, in seconds, \nfor which Flussonic Media Server waits for new frames to come from the data source \nbefore it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Flussonic issues the `frames_restored` event.\n"
          },
          "abr_stepup": {
            "type": "integer",
            "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, \nFlussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n"
          },
          "abr_correction": {
            "type": "integer",
            "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n"
          },
          "abr_loss_lower": {
            "type": "number",
            "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n"
          },
          "abr_loss_upper": {
            "type": "number",
            "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_stepdown": {
            "type": "number",
            "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_mode": {
            "type": "integer",
            "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n"
          },
          "abr_debug": {
            "type": "integer",
            "description": "Whether adaptive bitrate process is logged."
          },
          "abr_cycles": {
            "type": "integer",
            "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n"
          },
          "config_on_disk": {
            "$ref": "#/components/schemas/stream_config_stripped"
          },
          "stats": {
            "$ref": "#/components/schemas/stream_stats",
            "readOnly": true
          }
        }
      },
      "stream_config_stripped": {
        "type": "object",
        "description": "This is a reduced configuration of stream that contains only actual used config.\nCan compare it with stream_config that includes some runtime information and \ninterpretation of stream config information, like config_on_disk\n",
        "properties": {
          "name": {
            "type": "string",
            "format": "media_name",
            "description": "Globally unique stream name.\nNote that the name could not be changed after the stream is created.\n",
            "x-primary-key": true,
            "openmetrics_label": "name",
            "examples": {
              "default": {
                "value": "hockey1"
              },
              "mylive/bunny": {
                "value": "mylive/bunny"
              },
              "decklink": {
                "value": "Decklink-Stream"
              },
              "dektec": {
                "value": "Dektec-Stream"
              },
              "test_stream": {
                "value": "test_stream"
              }
            },
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin",
              "vision-config-external",
              "smartcam",
              "central-layouter",
              "vision"
            ],
            "x-format-description": "media_name"
          },
          "comment": {
            "description": "Human-readable description of the stream.\n",
            "type": "string",
            "example": "This is a test stream",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "title": {
            "description": "Human-readable title of the stream. Provided for SDT MPEG-TS table or\nSDP RTSP title parameter.\n",
            "type": "string",
            "example": "Hockey channel",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "position": {
            "type": "integer",
            "format": "sort_index",
            "description": "Position of the stream in order of streams in the config file, if declared.",
            "example": 2,
            "x-format-description": "sort_index"
          },
          "named_by": {
            "$ref": "#/components/schemas/named_by",
            "readOnly": true
          },
          "srt_port_resolve": {
            "type": "boolean",
            "example": false,
            "readOnly": true,
            "deprecated": true,
            "x-delete-at": 24.06,
            "description": "Stream name was resolved via `srt_port_resolve` call.\n\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n\nThis parameter now lives in `stats` object.\n"
          },
          "template": {
            "description": "Template of the stream.",
            "type": "string",
            "format": "media_name",
            "example": "sports-hd",
            "x-format-description": "media_name"
          },
          "recheck_secondary_inputs_interval": {
            "description": "How often to re-check secondary inputs. If this option is not set than check is never performed.",
            "type": "integer",
            "format": "seconds",
            "example": 120,
            "x-format-description": "seconds"
          },
          "static": {
            "default": true,
            "description": "Whether a stream is `static` or not. \nIf set to `True` the server will try to keep this stream running even if\nthere are no viewers or errors encountered.\n\nStreamer restarts *all* `static` streams even if any internal errors occur\nand the `static` streams crash.\n",
            "type": "boolean",
            "example": true,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ]
          },
          "disabled": {
            "description": "Whether a stream is disabled. Disabled streams are inactive and do not run. \nDisplayed only with the API calls.\n",
            "type": "boolean",
            "example": false,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "inputs": {
            "description": "List of stream inputs. \n***Important:*** A stream without any inputs can receive video frames **only** if backup file is specified.\n",
            "items": {
              "$ref": "#/components/schemas/stream_input"
            },
            "type": "array",
            "x-api-allow": [
              "smartcam",
              "watcher-core",
              "vision-config-external",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "password": {
            "description": "Specify a password when publishing a password-protected stream.\n\nThe password is passed unencrypted in a query string. \nSome protocols may additionally offer built-in tools for stream protection, \nfor example you can use `passphrase` for SRT publications.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/publish-video-on-media-server/#live-publish-on_publish"
            },
            "type": "string"
          },
          "input_media_info": {
            "$ref": "#/components/schemas/input_media_info"
          },
          "provider": {
            "description": "Human-readable name of the content provider. Used, for example, for MPEG-TS.\n\nDeprecated, use `input_media_info.provider` instead\n",
            "type": "string",
            "example": "SportsTV",
            "deprecated": true,
            "x-delete-at": 25.03
          },
          "dvbocr": {
            "description": "This parameter allows to manage subtitles in an output stream.\n",
            "example": "replace",
            "enum": [
              "replace",
              "add"
            ],
            "type": "string"
          },
          "source_timeout": {
            "description": "If a connected source does not send any data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 10,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "video_timeout": {
            "description": "If a connected source does not send video data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "audio_timeout": {
            "description": "If a connected source does not send audio data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to sources when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "backup": {
            "$ref": "#/components/schemas/backup_config"
          },
          "epg_enabled": {
            "description": "Whether to extract EPG from the input.",
            "type": "boolean",
            "example": true
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "clients_timeout": {
            "description": "Stream's lifetime after the last client was disconnected (can be expressed in *seconds* or set to `False`). \nApplicable to on-demand streams **only**.      \n",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "boolean"
              }
            ],
            "example": 485,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "retry_limit": {
            "description": "Number of attempts for the server to reconnect to a data source.\nApplicable to on-demand streams **only**. If not defined, server will constantly try to reconnect (unlimited number of retries). \nIf the input does not become active after specified amount of attempts, stream shuts down till the next user request.\n",
            "type": "integer",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "transcoder": {
            "$ref": "#/components/schemas/transcoder_opts"
          },
          "thumbnails": {
            "$ref": "#/components/schemas/thumbnails_spec"
          },
          "jpeg_snapshot_sign_key": {
            "description": "A key to sign jpeg_snapshot requests.\nGenerating jpeg snapshots is a resource-intensive task.\nTo prevent DoS attacks by users, each request has to be signed by middleware\nto have control over resource consumption.\nThis parameter contains a token from the middleware to ensure\nthis request for JPEG generation is approved.\nFormat is <valid_till>_<Sha256Hash>\nvalid_till is UNIX time (seconds) when this token expires.\n```\nSha256Hash = sha256(str(valid_till) + \":\" + jpeg_snapshot_sign_key + \"@\" + name + \"/\" + \"snapshot-\" + str(pts) + \"-\" + size + \".jpg\")\n```\njpeg_snapshot_sign_key is a part of stream configuration\nFor example, when valid_till=1732200743, jpeg_snapshot_sign_key=\"TopSecret\", name=\"test\", pts=1732200271444, size=\"320x240\"\nsign would be 1732200743_176b3f0349c59f2d4561c8d1f82be90416cc8144b0ef0598856c4cf0d34d4dd8\n",
            "type": "string",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "dvr": {
            "$ref": "#/components/schemas/stream_dvr_spec"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "on_publish": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "drm": {
            "$ref": "#/components/schemas/drm_spec"
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "track_filter": {
            "description": "Configuration for filtering tracks based on named track filter rules.\nAllows to restrict available tracks for specific devices to prevent playback issues.\n\nEach track filter rule has a name, a match block with conditions (user_agent for example), and filter constraints.\nAll rules that have matching conditions are applied.\nIf no rule matches, all tracks are available.\n",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/track_filter_rule"
            },
            "x-key-type": "string"
          },
          "prepush": {
            "description": "The time (in seconds) that Media Server reserves for preloading the data, i. e. *buffering*.\nPrepush is always defined through GoP, but this option provides you with a more flexible way\nto configure the buffer size, e. g. a 1-3 or 7-10 seconds time interval.\n\nThe bigger the buffer size, the better the user experience is for the users\nwith a bad internet connection. However, the latency also increases.\n\nIf set to `False` to remove the latency, the stream's start time \nincreases. To decrease it, reduce the GoP size and make the bitrate higher \nor the video quality lower.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/technology-glossary/#glossary-prepush"
            },
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "integer"
              }
            ],
            "example": false,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "segment_count": {
            "description": "Number of segments stored in memory for the segment-based protocols, such as HLS and DASH.\nAdded to HLS live manifest. Do not forget that one more segment is stored for stale clients\nthat come too late, but the latest segment is not shown in the manifest.\n",
            "type": "integer",
            "example": 4
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "chunk_duration": {
            "description": "Chunk duration in LL-HLS manifest to be used for tunning latency.",
            "type": "integer",
            "format": "milliseconds",
            "example": 200,
            "x-format-description": "milliseconds"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "hls_scte35": {
            "description": "Whether to enable SCTE-35 ad insertion markers signaling in HLS manifest.\nAd markers can be included in SCTE-35 (`scte35`), AWS (`aws`), EXT-X-DATERANGE (`rfc8216`) formats or not included (`false`).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/advertisement-scte-markers/",
              "type": "string"
            },
            "example": "scte35",
            "enum": [
              "aws",
              "scte35",
              "rfc8216"
            ],
            "type": "string"
          },
          "add_audio_only": {
            "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/what-is-live-stream/#live-audio_only_hls"
            },
            "type": "boolean",
            "example": true
          },
          "webrtc_abr": {
            "$ref": "#/components/schemas/webrtc_abr_opts"
          },
          "pushes": {
            "description": "A list of pushes. When a server initiates the connection and sends a stream \nto other server(s), it is called a `push`.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-video-from-media-server/"
            },
            "items": {
              "$ref": "#/components/schemas/stream_push"
            },
            "type": "array",
            "x-api-allow": [
              "watcher-core",
              "watcher-admin"
            ]
          },
          "mpegts_pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "labels": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 40,
              "minLength": 1,
              "format": "unix_name",
              "x-format-description": "Contains only alphanumeric characters (a-z, A-Z, 0-9), underscores (_), hyphens (-) and periods (.).",
              "pattern": "^[a-zA-Z0-9_.-]+$"
            },
            "maxItems": 10,
            "x-key-type": "string",
            "description": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n",
            "x-api-description": {
              "central": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nSee [Layouter schema](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Clabels)\nfor more details.\n",
              "central-layouter": "Stream labels in key value format.\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nYou can use labels to control the stream layout.\n\nNote, that if you are using a multi-stream agent (i.e. multiple streams use the same agent in their inputs),\nthen the labels of these streams **must** be the same. Otherwise, one or more streams will not work.\n\nLayouter can process next labels:\n\n- With `required_` prefix. If stream has a `required_x=y` label, Layouter will provision stream only to nodes with the label `x=y`.\nIf there are no available nodes with the label `x=y`, then the stream will not be provisioned.\nUse `required_` labels to avoid running streams in an unsuitable environment.\n- With `preferred_` prefix. If stream has a `preferred_x=y` label, Layouter will prefer nodes with the label `x=y` to nodes without this label.\nIf there are no available nodes with the label `x=y`, then the stream will be provisioned to any other node.\nUse `preferred_` labels to optimize layout without the risk of downtime.\n\n**Use cases**\n\n1. Suppose you have a server used to test new hardware models, and you want the new streams to be provisioned only to the test nodes.\nTo provide this layout you can add the `required_env=test` label for stream and the `env=test` label for test nodes.\n\n2. Suppose you have two servers in different cities *N* and *M*, with expensive traffic between them, and cameras in city *N*.\nIn such a case, if it is important for you to preserving video recording in case node *N* fails, you can use `preferred_` labels.\nTo provide this layout you can add the `preferred_location=N` label for stream and the `location=N` label for node(-s) in city *N*.\nThen, in case of failure of node *N* - streams will be distributed to node *M*. When node *N* is back up and running, the streams will return to it.\n"
            },
            "examples": [
              {
                "key1": "value1",
                "key2": "value2"
              },
              {
                "required_env": "test",
                "location": "eu"
              },
              {
                "preferred_location": "eu"
              }
            ],
            "x-api-allow": [
              "watcher-core",
              "central-layouter",
              "watcher-admin"
            ]
          },
          "playback_headers": {
            "description": "This parameter sets playback HTTP headers for streams.\n",
            "items": {
              "$ref": "#/components/schemas/playback_headers"
            },
            "maxItems": 10,
            "type": "array"
          },
          "cluster_ingest": {
            "$ref": "#/components/schemas/cluster_ingest_config"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "meta": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "The param is deprecated and now used only for onvif_url and onvif_profile options.",
            "deprecated": true,
            "x-delete-at": 23.12
          },
          "vision": {
            "$ref": "#/components/schemas/vision_spec"
          },
          "srt": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "srt2": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "srt_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "aac_ab": {
            "type": "integer",
            "description": "Bitrate of the AAC audio track."
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "prefer_codec": {
            "$ref": "#/components/schemas/webrtc_prefer_video_codec"
          },
          "transport": {
            "$ref": "#/components/schemas/webrtc_transport"
          },
          "max_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Maximum bitrate for WebRTC.",
            "x-format-description": "speed"
          },
          "min_bitrate": {
            "type": "integer",
            "description": "Minimum bitrate for WebRTC."
          },
          "frames_timeout": {
            "type": "integer",
            "description": "Specifies the period of time, in seconds, \nfor which Flussonic Media Server waits for new frames to come from the data source \nbefore it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Flussonic issues the `frames_restored` event.\n"
          },
          "abr_stepup": {
            "type": "integer",
            "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, \nFlussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n"
          },
          "abr_correction": {
            "type": "integer",
            "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n"
          },
          "abr_loss_lower": {
            "type": "number",
            "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n"
          },
          "abr_loss_upper": {
            "type": "number",
            "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_stepdown": {
            "type": "number",
            "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_mode": {
            "type": "integer",
            "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n"
          },
          "abr_debug": {
            "type": "integer",
            "description": "Whether adaptive bitrate process is logged."
          },
          "abr_cycles": {
            "type": "integer",
            "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n"
          }
        }
      },
      "template_config": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "format": "media_name",
            "description": "Globally unique template name.",
            "x-primary-key": true,
            "x-format-description": "media_name"
          },
          "prefixes": {
            "description": "List of prefixes that will be used to create dynamic names for published streams. \nA template creates one publishing point with one or more publishing locations, depending on the number of prefixes you define. \nAll settings within the template with prefixes apply to the streams published under the name of the prefixes. \nYou can also specify an empty prefix (`\"\"`) to publish a stream with any prefix or even without a prefix. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/configure-similar-streams-with-templates/#stream-templates-page-prefixes"
            },
            "items": {
              "type": "string",
              "format": "media_name",
              "x-format-description": "media_name"
            },
            "type": "array",
            "example": [
              "chats",
              ""
            ]
          },
          "comment": {
            "description": "Human-readable description of the stream.\n",
            "type": "string",
            "example": "This is a test stream",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "title": {
            "description": "Human-readable title of the stream. Provided for SDT MPEG-TS table or\nSDP RTSP title parameter.\n",
            "type": "string",
            "example": "Hockey channel",
            "x-api-allow": [
              "watcher-client",
              "watcher-core",
              "watcher-admin"
            ]
          },
          "position": {
            "type": "integer",
            "format": "sort_index",
            "description": "Position of the stream in order of streams in the config file, if declared.",
            "example": 2,
            "x-format-description": "sort_index"
          },
          "named_by": {
            "$ref": "#/components/schemas/named_by",
            "readOnly": true
          },
          "srt_port_resolve": {
            "type": "boolean",
            "example": false,
            "readOnly": true,
            "deprecated": true,
            "x-delete-at": 24.06,
            "description": "Stream name was resolved via `srt_port_resolve` call.\n\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n\nThis parameter now lives in `stats` object.\n"
          },
          "template": {
            "description": "Template of the stream.",
            "type": "string",
            "format": "media_name",
            "example": "sports-hd",
            "x-format-description": "media_name"
          },
          "recheck_secondary_inputs_interval": {
            "description": "How often to re-check secondary inputs. If this option is not set than check is never performed.",
            "type": "integer",
            "format": "seconds",
            "example": 120,
            "x-format-description": "seconds"
          },
          "static": {
            "default": true,
            "description": "Whether a stream is `static` or not. \nIf set to `True` the server will try to keep this stream running even if\nthere are no viewers or errors encountered.\n\nStreamer restarts *all* `static` streams even if any internal errors occur\nand the `static` streams crash.\n",
            "type": "boolean",
            "example": true,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin"
            ]
          },
          "disabled": {
            "description": "Whether a stream is disabled. Disabled streams are inactive and do not run. \nDisplayed only with the API calls.\n",
            "type": "boolean",
            "example": false,
            "x-api-allow": [
              "watcher-core",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "inputs": {
            "description": "List of stream inputs. \n***Important:*** A stream without any inputs can receive video frames **only** if backup file is specified.\n",
            "items": {
              "$ref": "#/components/schemas/stream_input"
            },
            "type": "array",
            "x-api-allow": [
              "smartcam",
              "watcher-core",
              "vision-config-external",
              "watcher-client",
              "watcher-admin",
              "central-layouter"
            ]
          },
          "password": {
            "description": "Specify a password when publishing a password-protected stream.\n\nThe password is passed unencrypted in a query string. \nSome protocols may additionally offer built-in tools for stream protection, \nfor example you can use `passphrase` for SRT publications.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/publish-video-on-media-server/#live-publish-on_publish"
            },
            "type": "string"
          },
          "input_media_info": {
            "$ref": "#/components/schemas/input_media_info"
          },
          "provider": {
            "description": "Human-readable name of the content provider. Used, for example, for MPEG-TS.\n\nDeprecated, use `input_media_info.provider` instead\n",
            "type": "string",
            "example": "SportsTV",
            "deprecated": true,
            "x-delete-at": 25.03
          },
          "dvbocr": {
            "description": "This parameter allows to manage subtitles in an output stream.\n",
            "example": "replace",
            "enum": [
              "replace",
              "add"
            ],
            "type": "string"
          },
          "source_timeout": {
            "description": "If a connected source does not send any data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 10,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "video_timeout": {
            "description": "If a connected source does not send video data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "audio_timeout": {
            "description": "If a connected source does not send audio data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to sources when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "backup": {
            "$ref": "#/components/schemas/backup_config"
          },
          "epg_enabled": {
            "description": "Whether to extract EPG from the input.",
            "type": "boolean",
            "example": true
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "clients_timeout": {
            "description": "Stream's lifetime after the last client was disconnected (can be expressed in *seconds* or set to `False`). \nApplicable to on-demand streams **only**.      \n",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "boolean"
              }
            ],
            "example": 485,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "retry_limit": {
            "description": "Number of attempts for the server to reconnect to a data source.\nApplicable to on-demand streams **only**. If not defined, server will constantly try to reconnect (unlimited number of retries). \nIf the input does not become active after specified amount of attempts, stream shuts down till the next user request.\n",
            "type": "integer",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "transcoder": {
            "$ref": "#/components/schemas/transcoder_opts"
          },
          "thumbnails": {
            "$ref": "#/components/schemas/thumbnails_spec"
          },
          "jpeg_snapshot_sign_key": {
            "description": "A key to sign jpeg_snapshot requests.\nGenerating jpeg snapshots is a resource-intensive task.\nTo prevent DoS attacks by users, each request has to be signed by middleware\nto have control over resource consumption.\nThis parameter contains a token from the middleware to ensure\nthis request for JPEG generation is approved.\nFormat is <valid_till>_<Sha256Hash>\nvalid_till is UNIX time (seconds) when this token expires.\n```\nSha256Hash = sha256(str(valid_till) + \":\" + jpeg_snapshot_sign_key + \"@\" + name + \"/\" + \"snapshot-\" + str(pts) + \"-\" + size + \".jpg\")\n```\njpeg_snapshot_sign_key is a part of stream configuration\nFor example, when valid_till=1732200743, jpeg_snapshot_sign_key=\"TopSecret\", name=\"test\", pts=1732200271444, size=\"320x240\"\nsign would be 1732200743_176b3f0349c59f2d4561c8d1f82be90416cc8144b0ef0598856c4cf0d34d4dd8\n",
            "type": "string",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "dvr": {
            "$ref": "#/components/schemas/stream_dvr_spec"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "on_publish": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "drm": {
            "$ref": "#/components/schemas/drm_spec"
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "track_filter": {
            "description": "Configuration for filtering tracks based on named track filter rules.\nAllows to restrict available tracks for specific devices to prevent playback issues.\n\nEach track filter rule has a name, a match block with conditions (user_agent for example), and filter constraints.\nAll rules that have matching conditions are applied.\nIf no rule matches, all tracks are available.\n",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/track_filter_rule"
            },
            "x-key-type": "string"
          },
          "prepush": {
            "description": "The time (in seconds) that Media Server reserves for preloading the data, i. e. *buffering*.\nPrepush is always defined through GoP, but this option provides you with a more flexible way\nto configure the buffer size, e. g. a 1-3 or 7-10 seconds time interval.\n\nThe bigger the buffer size, the better the user experience is for the users\nwith a bad internet connection. However, the latency also increases.\n\nIf set to `False` to remove the latency, the stream's start time \nincreases. To decrease it, reduce the GoP size and make the bitrate higher \nor the video quality lower.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/technology-glossary/#glossary-prepush"
            },
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "integer"
              }
            ],
            "example": false,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "segment_count": {
            "description": "Number of segments stored in memory for the segment-based protocols, such as HLS and DASH.\nAdded to HLS live manifest. Do not forget that one more segment is stored for stale clients\nthat come too late, but the latest segment is not shown in the manifest.\n",
            "type": "integer",
            "example": 4
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "chunk_duration": {
            "description": "Chunk duration in LL-HLS manifest to be used for tunning latency.",
            "type": "integer",
            "format": "milliseconds",
            "example": 200,
            "x-format-description": "milliseconds"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "hls_scte35": {
            "description": "Whether to enable SCTE-35 ad insertion markers signaling in HLS manifest.\nAd markers can be included in SCTE-35 (`scte35`), AWS (`aws`), EXT-X-DATERANGE (`rfc8216`) formats or not included (`false`).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/advertisement-scte-markers/",
              "type": "string"
            },
            "example": "scte35",
            "enum": [
              "aws",
              "scte35",
              "rfc8216"
            ],
            "type": "string"
          },
          "add_audio_only": {
            "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/what-is-live-stream/#live-audio_only_hls"
            },
            "type": "boolean",
            "example": true
          },
          "webrtc_abr": {
            "$ref": "#/components/schemas/webrtc_abr_opts"
          },
          "pushes": {
            "description": "A list of pushes. When a server initiates the connection and sends a stream \nto other server(s), it is called a `push`.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-video-from-media-server/"
            },
            "items": {
              "$ref": "#/components/schemas/stream_push"
            },
            "type": "array",
            "x-api-allow": [
              "watcher-core",
              "watcher-admin"
            ]
          },
          "mpegts_pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "labels": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 40,
              "minLength": 1,
              "format": "unix_name",
              "x-format-description": "Contains only alphanumeric characters (a-z, A-Z, 0-9), underscores (_), hyphens (-) and periods (.).",
              "pattern": "^[a-zA-Z0-9_.-]+$"
            },
            "maxItems": 10,
            "x-key-type": "string",
            "description": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n",
            "x-api-description": {
              "central": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nSee [Layouter schema](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Clabels)\nfor more details.\n",
              "central-layouter": "Stream labels in key value format.\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nYou can use labels to control the stream layout.\n\nNote, that if you are using a multi-stream agent (i.e. multiple streams use the same agent in their inputs),\nthen the labels of these streams **must** be the same. Otherwise, one or more streams will not work.\n\nLayouter can process next labels:\n\n- With `required_` prefix. If stream has a `required_x=y` label, Layouter will provision stream only to nodes with the label `x=y`.\nIf there are no available nodes with the label `x=y`, then the stream will not be provisioned.\nUse `required_` labels to avoid running streams in an unsuitable environment.\n- With `preferred_` prefix. If stream has a `preferred_x=y` label, Layouter will prefer nodes with the label `x=y` to nodes without this label.\nIf there are no available nodes with the label `x=y`, then the stream will be provisioned to any other node.\nUse `preferred_` labels to optimize layout without the risk of downtime.\n\n**Use cases**\n\n1. Suppose you have a server used to test new hardware models, and you want the new streams to be provisioned only to the test nodes.\nTo provide this layout you can add the `required_env=test` label for stream and the `env=test` label for test nodes.\n\n2. Suppose you have two servers in different cities *N* and *M*, with expensive traffic between them, and cameras in city *N*.\nIn such a case, if it is important for you to preserving video recording in case node *N* fails, you can use `preferred_` labels.\nTo provide this layout you can add the `preferred_location=N` label for stream and the `location=N` label for node(-s) in city *N*.\nThen, in case of failure of node *N* - streams will be distributed to node *M*. When node *N* is back up and running, the streams will return to it.\n"
            },
            "examples": [
              {
                "key1": "value1",
                "key2": "value2"
              },
              {
                "required_env": "test",
                "location": "eu"
              },
              {
                "preferred_location": "eu"
              }
            ],
            "x-api-allow": [
              "watcher-core",
              "central-layouter",
              "watcher-admin"
            ]
          },
          "playback_headers": {
            "description": "This parameter sets playback HTTP headers for streams.\n",
            "items": {
              "$ref": "#/components/schemas/playback_headers"
            },
            "maxItems": 10,
            "type": "array"
          },
          "cluster_ingest": {
            "$ref": "#/components/schemas/cluster_ingest_config"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "meta": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "The param is deprecated and now used only for onvif_url and onvif_profile options.",
            "deprecated": true,
            "x-delete-at": 23.12
          },
          "vision": {
            "$ref": "#/components/schemas/vision_spec"
          },
          "aac_ab": {
            "type": "integer",
            "description": "Bitrate of the AAC audio track."
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "prefer_codec": {
            "$ref": "#/components/schemas/webrtc_prefer_video_codec"
          },
          "transport": {
            "$ref": "#/components/schemas/webrtc_transport"
          },
          "max_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Maximum bitrate for WebRTC.",
            "x-format-description": "speed"
          },
          "min_bitrate": {
            "type": "integer",
            "description": "Minimum bitrate for WebRTC."
          },
          "frames_timeout": {
            "type": "integer",
            "description": "Specifies the period of time, in seconds, \nfor which Flussonic Media Server waits for new frames to come from the data source \nbefore it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Flussonic issues the `frames_restored` event.\n"
          },
          "abr_stepup": {
            "type": "integer",
            "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, \nFlussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n"
          },
          "abr_correction": {
            "type": "integer",
            "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n"
          },
          "abr_loss_lower": {
            "type": "number",
            "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n"
          },
          "abr_loss_upper": {
            "type": "number",
            "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_stepdown": {
            "type": "number",
            "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n"
          },
          "abr_mode": {
            "type": "integer",
            "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n"
          },
          "abr_debug": {
            "type": "integer",
            "description": "Whether adaptive bitrate process is logged."
          },
          "abr_cycles": {
            "type": "integer",
            "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n"
          }
        }
      },
      "push_counters": {
        "type": "object",
        "properties": {
          "url": {
            "description": "Obfuscated URL where to push to",
            "type": "string",
            "format": "input_url",
            "x-format-description": "input_url"
          },
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time in milliseconds when the pusher instance was created.",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "status": {
            "$ref": "#/components/schemas/pusher_status"
          },
          "standby_status": {
            "$ref": "#/components/schemas/pusher_standby_status"
          },
          "bytes": {
            "type": "integer",
            "format": "bytes",
            "description": "Total amount of bytes sent since the pusher was created.",
            "x-format-description": "bytes"
          },
          "frames": {
            "type": "integer",
            "description": "Number of frames sent by this pusher.\n"
          },
          "segments": {
            "type": "integer",
            "description": "Number of segments sent by this pusher.\n"
          },
          "pusher_restarts": {
            "description": "How many times pusher was restarted",
            "type": "integer"
          },
          "pusher_queue_exhausted_count": {
            "description": "How many times there were no data to push in pusher queue",
            "type": "integer"
          },
          "errors_stop_overloaded": {
            "description": "How many times pusher was stopped due to overload",
            "type": "integer"
          },
          "errors_dropped_frames": {
            "description": "Number of dropped frames",
            "type": "integer"
          },
          "errors_dropped_segments": {
            "description": "Number of dropped segments",
            "type": "integer"
          },
          "pids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/push_pid_counters"
            },
            "description": "Per pid statistics for MPEG-TS encoding calculated for the pusher\n"
          },
          "sys_payload_bytes": {
            "description": "The payload bytes count for system traffic.",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "sys_stuffing_packets": {
            "description": "The stuff packets count for system traffic.",
            "type": "integer"
          },
          "encoded_bytes": {
            "description": "The encoded bytes count.",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "retransmitted_packets": {
            "type": "integer",
            "description": "How many packets were retransmitted\n"
          },
          "errors_device_not_opened": {
            "description": "How much times pusher was unable to open (attach to) device for pushing",
            "type": "integer"
          },
          "errors_device_buffer_overflow": {
            "description": "How many times internal device buffer was overflowed.",
            "type": "integer"
          },
          "errors_audio_frame_decode": {
            "description": "Number of errors during of audio frame decoding to raw format.",
            "type": "integer"
          },
          "errors_video_frame_decode": {
            "description": "Number of errors during of video frame decoding to raw format.",
            "type": "integer"
          },
          "errors_no_destination": {
            "description": "How many times pusher did not establish connection because of destination peer is not reached",
            "type": "integer"
          },
          "errors_tls": {
            "description": "How many times pusher got TLS errors.",
            "type": "integer"
          },
          "errors_connection_lost": {
            "description": "How many times pusher unexpectedly lost connection with peer",
            "type": "integer"
          },
          "errors_401": {
            "type": "integer",
            "description": "How many times we've got 401 (unauthorized).\n"
          },
          "errors_403": {
            "type": "integer",
            "description": "How many times we've got 403 (forbidden).\n"
          },
          "errors_404": {
            "type": "integer",
            "description": "How many times we've got 404 (enoent).\n"
          },
          "errors_409": {
            "type": "integer",
            "description": "How many times we've got 409 (double_publish_denied).\n"
          },
          "errors_500": {
            "type": "integer",
            "description": "How many times we've got 500 (server_error).\n"
          },
          "errors_redirect_limit": {
            "type": "integer",
            "description": "How many times pusher was stopped because of redirect limit is reached\n"
          },
          "errors_not_authorized": {
            "description": "How many times pusher did not establish connection because of missing or wrong credentials",
            "type": "integer"
          },
          "genlock_status": {
            "$ref": "#/components/schemas/genlock_status"
          },
          "genref_status": {
            "$ref": "#/components/schemas/genref_status"
          }
        }
      },
      "push_pid_counters": {
        "type": "object",
        "required": [
          "pid"
        ],
        "properties": {
          "pid": {
            "description": "Related MPEG-TS PID.\n",
            "type": "integer"
          },
          "pnr": {
            "description": "Program ID this PID belongs to.\n",
            "type": "integer"
          },
          "content": {
            "$ref": "#/components/schemas/frame_content"
          },
          "bitrate": {
            "description": "Bitrate on this PID, configured or autotuned.\n",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "packets": {
            "description": "How many MPEG-TS packets with 188 bytes on this PID produced.\n",
            "type": "integer"
          },
          "payload_bytes": {
            "description": "The payload bytes count.",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "filler_packets": {
            "description": "How many MPEG-TS packets with NAL fillers on this PID produced.\n",
            "type": "integer"
          },
          "stuffing_packets": {
            "description": "How many NULL packets (PID 0x1FFF) inserted when no data is scheduled on this PID.\n",
            "type": "integer"
          },
          "trimmed_bytes": {
            "description": "The trimmed bytes count.\n",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "trimmed_frames": {
            "description": "The trimmed PES packets count.\n",
            "type": "integer"
          },
          "exceeded_bytes": {
            "description": "The number of bytes exceeding the allocated bandwidth.\n",
            "type": "integer",
            "format": "bytes",
            "x-format-description": "bytes"
          },
          "exceeded_frames": {
            "description": "The number of PES packets with an instant bitrate boost.\n",
            "type": "integer"
          },
          "min_buffer": {
            "description": "Lowest recorded level of the TS buffer.\nWith too small values the HRD buffer may be completely empty (underflow).\n",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "max_buffer": {
            "description": "Highest recorded level of the TS buffer.\nWith too big values the HRD buffer may be filling up completely (overflow).\n",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "queued_time": {
            "description": "Total duration of media queued for this PID.",
            "type": "integer",
            "format": "milliseconds",
            "x-metric-type": "gauge",
            "x-format-description": "milliseconds"
          },
          "errors_pid_off": {
            "description": "Number of times this PID was dropped from the output multiplexed stream (e.g., due to prebuffer exhaustion).\n",
            "type": "integer"
          },
          "errors_dts_jumps_forward": {
            "description": "Number of times a frame was dropped on this PID due to a forward DTS jump.\nEach such event currently triggers a full program reset.\n",
            "type": "integer"
          },
          "errors_dts_goes_backward": {
            "description": "Number of times a frame was dropped on this PID due to DTS going backward.\nEach such event currently triggers a full program reset.\n",
            "type": "integer"
          },
          "errors_start_late_dts": {
            "description": "Number of PID start errors caused by late DTS.\nEach such event currently triggers a full program reset.\n",
            "type": "integer"
          },
          "errors_start_future_dts": {
            "description": "Number of PID start errors caused by DTS values too far in the future.\nEach such event currently triggers a full program reset.\n",
            "type": "integer"
          },
          "errors_unconfigured_queue": {
            "description": "Number of times a frame was received on an unconfigured PID.\nUsually occurs after reconfiguration.\n",
            "type": "integer"
          }
        }
      },
      "vbi_lines": {
        "type": "object",
        "properties": {
          "service": {
            "$ref": "#/components/schemas/vbi_service"
          },
          "lines": {
            "description": "Numbers of VBI lines that will carry a teletext track.",
            "items": {
              "$ref": "#/components/schemas/vbi_line"
            },
            "type": "array"
          }
        }
      },
      "scale_algorithm": {
        "enum": [
          "fast_bilinear",
          "bilinear",
          "bicubic",
          "experimental",
          "neighbor",
          "area",
          "bicublin",
          "gauss",
          "sinc",
          "lanczos",
          "spline"
        ],
        "type": "string"
      },
      "web_logo_spec": {
        "type": "object",
        "properties": {
          "path": {
            "description": "Path to the logo file.\nIf specified without the `@` in the beginning, the logo will be served from the webroot (***not recommended***).\nIf specified with the `@` in the beginning, the logo will be served from the special directory and can be\nmanaged by the logo API.\n",
            "type": "string",
            "format": "logo_path",
            "example": "@chan.png",
            "x-format-description": "logo_path"
          },
          "height": {
            "description": "Set the specified height for the logo.",
            "type": "integer",
            "example": 100
          },
          "width": {
            "description": "Set the specified width for the logo.",
            "type": "integer",
            "example": 200
          },
          "left": {
            "description": "Change the position of the logo to the left.",
            "type": "integer",
            "example": 15
          },
          "top": {
            "description": "Change the position of the logo to the top.",
            "type": "integer",
            "example": 15
          },
          "right": {
            "description": "Change the position of the logo to the right.",
            "type": "integer"
          },
          "bottom": {
            "description": "Change the position of the logo to the bottom.",
            "type": "integer"
          }
        }
      },
      "network_port": {
        "maximum": 65535,
        "minimum": 0,
        "type": "integer"
      },
      "network_port_range": {
        "type": "object",
        "properties": {
          "first": {
            "$ref": "#/components/schemas/network_port"
          },
          "last": {
            "$ref": "#/components/schemas/network_port"
          }
        },
        "required": [
          "first",
          "last"
        ]
      },
      "stream_thumbnails_stats": {
        "type": "object",
        "properties": {
          "completed_count": {
            "description": "Number of successfully generated thumbnails.\n",
            "type": "integer"
          },
          "dropped_count": {
            "description": "Number of thumbnail requests dropped when they arrive faster than they can be processed.\n",
            "type": "integer"
          },
          "errors_count": {
            "description": "Number of failed thumbnail generations due to internal errors.\n",
            "type": "integer"
          }
        }
      },
      "listen_spec": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/network_port"
          },
          {
            "type": "string",
            "format": "hostport",
            "x-format-description": "Hostname with port"
          }
        ]
      },
      "listeners": {
        "type": "object",
        "properties": {
          "http": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_http_config"
            },
            "description": "List of HTTP ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 80,
                    "api": false
                  }
                ]
              }
            },
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "https": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_https_config"
            },
            "description": "List of HTTPS ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 443
                  }
                ]
              }
            }
          },
          "rtmp": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_config"
            },
            "description": "List of RTMP ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 1935
                  }
                ]
              }
            }
          },
          "rtmps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_rtmps_config"
            },
            "description": "List of RTMPS ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 1936
                  }
                ]
              }
            }
          },
          "rtsp": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_config"
            },
            "description": "List of RTSP ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 554
                  }
                ]
              }
            }
          },
          "rtsps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_rtsps_config"
            },
            "description": "List of RTSPS ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 555
                  }
                ]
              }
            }
          },
          "turn": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_config"
            },
            "description": "List of TURN ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 3478
                  }
                ]
              }
            }
          },
          "snmp": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_config"
            },
            "description": "List of SNMP ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 161
                  }
                ]
              }
            }
          },
          "sip": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_config"
            },
            "description": "List of SIP ports or `host:port` pairs that will be used for listening.",
            "examples": {
              "default": {
                "value": [
                  {
                    "port": 5060
                  }
                ]
              }
            }
          },
          "srt": {
            "description": "The list of port ranges or `host:port-range` pairs that may be in use for playing SRT or accepting SRT publications \n(depending on the `mode` parameter).\n\nWhen playing from or publishing to one of the ports from the range using `srt://server:port` URL with `stream_id` not specified,\nMedia Server requests the stream name from `config_external` backend using \n[GET /srt_port_resolve/{port}](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve) endpoint\nand uses the stream with such name for further playback or publishing.\n\nSo for resolving a stream name by SRT port you need:\n\n* `srt` ranges set (this option)\n* `config_external` option set in Media Server\n* `/streams` and `/srt_port_resolve` endpoints implemented on the config backend side\n* a stream name in the provisioned external config equals to the name returned by `/srt_port_resolve` for the specified port.\n\nNote that you should use `stream.srt_publish` and `stream.srt_play` options \nfor SRT-specific settings of streams involved to `/srt_port_resolve` logics.\n",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/listen_srt_config"
            }
          }
        }
      },
      "listen_config": {
        "type": "object",
        "properties": {
          "port": {
            "type": "integer",
            "format": "network_port",
            "description": "Port that will be used for listening.",
            "example": 80,
            "x-primary-key": true,
            "x-format-description": "network_port"
          },
          "address": {
            "type": "string",
            "description": "Network address that will be used for listening.",
            "example": "10.0.35.1"
          }
        },
        "required": [
          "port"
        ]
      },
      "listen_ssl_config": {
        "type": "object",
        "properties": {
          "ssl_protocols": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tls_version"
            },
            "description": "List of SSL protocol versions that will be used for listening.",
            "example": [
              "tlsv1.1",
              "tlsv1.2"
            ]
          }
        }
      },
      "listen_http_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/listen_config"
          },
          {
            "$ref": "#/components/schemas/listen_http_config_params"
          }
        ]
      },
      "listen_http_config_params": {
        "type": "object",
        "properties": {
          "api": {
            "type": "boolean",
            "default": true,
            "description": "If false, listener do not serve api calls."
          }
        }
      },
      "listen_https_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/listen_http_config"
          },
          {
            "$ref": "#/components/schemas/listen_ssl_config"
          }
        ]
      },
      "listen_rtmps_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/listen_config"
          },
          {
            "$ref": "#/components/schemas/listen_ssl_config"
          }
        ]
      },
      "listen_rtsps_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/listen_config"
          },
          {
            "$ref": "#/components/schemas/listen_ssl_config"
          }
        ]
      },
      "listen_srt_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/srt_direction"
          },
          {
            "$ref": "#/components/schemas/listen_port_range_config"
          }
        ]
      },
      "listen_port_range_config": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "Network address that will be used for listening.",
            "example": "10.0.35.1"
          },
          "ports": {
            "$ref": "#/components/schemas/network_port_range"
          }
        },
        "required": [
          "ports"
        ]
      },
      "input_stats": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "ip": {
                "type": "string",
                "description": "IP address of the connected peer.",
                "example": "172.16.25.73"
              },
              "proto": {
                "$ref": "#/components/schemas/protocol"
              },
              "opened_at": {
                "type": "integer",
                "format": "utc_ms",
                "description": "The time when this session was created.",
                "example": 1637094994000,
                "x-format-description": "Unix timestamp in milliseconds",
                "minimum": 1000000000000,
                "maximum": 10000000000000
              },
              "media_info": {
                "$ref": "#/components/schemas/media_info"
              },
              "ts_delay": {
                "type": "number",
                "format": "ticks",
                "example": 1284,
                "description": "The time period during which no frames were received from the stream's input.\n",
                "x-format-description": "ticks"
              },
              "ts_delay_per_tracks": {
                "type": "array",
                "items": {
                  "type": "number",
                  "format": "ticks",
                  "x-format-description": "ticks"
                },
                "example": [
                  1284
                ],
                "description": "The time period during which no frames were received per each track according to `media_info`\n"
              },
              "url": {
                "type": "string",
                "format": "url",
                "description": "Final URL after redirects.\n\nDeprecated because was never actually used.\n",
                "example": "udp://239.0.0.1:1234",
                "deprecated": true,
                "x-delete-at": 25.03,
                "x-format-description": "url"
              },
              "user_agent": {
                "type": "string",
                "description": "Client's user agent for selected protocol.",
                "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36"
              },
              "active": {
                "description": "Whether this input is selected as active for the stream.",
                "type": "boolean",
                "example": true
              },
              "divergent_inputs": {
                "description": "Indicates that the stream sources have different track sets, which may cause switching problems. The list of tracks to be compared is obtained only when the sources are checked or started, until then the stream is considered normal.",
                "type": "boolean"
              },
              "stop_events": {
                "description": "List of recent events that led to the input source being stopped.",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "description": "Identifier of the event.",
                      "type": "string"
                    },
                    "timestamp": {
                      "description": "Time when the event occurred.",
                      "type": "integer",
                      "format": "utc_ms",
                      "x-format-description": "Unix timestamp in milliseconds",
                      "minimum": 1000000000000,
                      "maximum": 10000000000000
                    }
                  },
                  "required": [
                    "code",
                    "timestamp"
                  ]
                }
              },
              "dvr_info": {
                "$ref": "#/components/schemas/dvr_info"
              }
            }
          },
          {
            "$ref": "#/components/schemas/input_counters"
          }
        ]
      },
      "input_counters": {
        "type": "object",
        "description": "Here are grouped different counters for sessions: generic and errors\n",
        "properties": {
          "bytes": {
            "type": "integer",
            "format": "bytes",
            "default": 0,
            "description": "Number of bytes received by this stream from live sources.\nIt will be counted before transcoding and will sum all inputs working together.\n",
            "openmetrics_metric": "stream_input_bytes",
            "x-format-description": "bytes"
          },
          "bytes_dvr": {
            "type": "integer",
            "format": "bytes",
            "default": 0,
            "description": "Number of bytes received by this stream when downloading from remote DVR.\n",
            "x-format-description": "bytes"
          },
          "frames": {
            "type": "integer",
            "default": 0,
            "description": "Number of frames passed to this stream from the inputs.\n"
          },
          "retries": {
            "type": "integer",
            "description": "How many times has this stream retried to connect to source"
          },
          "input_switches": {
            "type": "integer",
            "description": "Aggregated: how many times this stream has switched between different inputs.\nIndividual input: number of times switched to this input.\n"
          },
          "media_info_changes": {
            "type": "integer",
            "description": "Indicates, how often does media_info changes\n"
          },
          "valid_secondary_inputs": {
            "description": "Number of secondary inputs that have no problems.",
            "type": "integer",
            "example": 2
          },
          "invalid_secondary_inputs": {
            "description": "Number of secondary inputs that have some problems.",
            "type": "integer",
            "example": 0
          },
          "num_sec_on_primary_input": {
            "description": "How many seconds has this stream played from primary input.",
            "type": "integer",
            "format": "seconds",
            "x-format-description": "seconds"
          },
          "num_sec_on_secondary_input": {
            "description": "How many seconds has this stream played from secondary inputs.",
            "type": "integer",
            "format": "seconds",
            "x-format-description": "seconds"
          },
          "num_sec_no_data": {
            "description": "How many seconds has this stream had no frames.",
            "type": "integer",
            "format": "seconds",
            "x-format-description": "seconds"
          },
          "resync_count_normal": {
            "type": "integer",
            "description": "Stream timestamps are synchronized with real time. This counter tells, how many times\nit was syncronized after source reconnect.\n"
          },
          "resync_count_jump": {
            "type": "integer",
            "description": "Source may change timestamps without any signalling. This counter indicates how bad is the source\n"
          },
          "resync_count_drift": {
            "type": "integer",
            "description": "Source may send frames timestamps faster or slower than realtime.\nLive stream will catch it and resync. This counter indicates how many times did it happened.\n"
          },
          "reorder_count": {
            "type": "integer",
            "description": "Source may send frames not in the order they should be played. It will be catched and reordered.\nThis counter indicates how many times did it happened.\n"
          },
          "ad_splices_ingested": {
            "type": "integer",
            "description": "How many Ad markers passed to this stream from the inputs.\n"
          },
          "ad_splices_inserted": {
            "type": "integer",
            "description": "How many Ad markers inserted to this stream by user.\n"
          },
          "srt": {
            "$ref": "#/components/schemas/input_srt_counters"
          },
          "motion_detector": {
            "$ref": "#/components/schemas/input_motion_detector_counters"
          },
          "errors": {
            "type": "integer",
            "description": "Sum of all other specific errors. Can be used for triggering alert on any error\n",
            "example": 0
          },
          "error_rate": {
            "type": "integer",
            "description": "Sum of all other specific errors in the last minute\n",
            "example": 0
          },
          "errors_lost_packets": {
            "type": "integer",
            "description": "RTP, MPEG-TS or other protocols have enough information to tell how many packets were lost\n"
          },
          "errors_decoder_reset": {
            "type": "integer",
            "description": "Decoder reset count due to abnormal DTS change. Can happen in MPEG-TS, RTP.\n"
          },
          "errors_broken_payload": {
            "type": "integer",
            "description": "Demultiplexing was done right, but content is broken.\n"
          },
          "errors_dropped_frames": {
            "type": "integer",
            "description": "Dropped frames count due timestamp adjustment.\n"
          },
          "errors_desync": {
            "type": "integer",
            "description": "This can be used as a `TS_sync_loss` - how many times MPEG-TS sync was lost.\n\nAlso this counter refers to RTSP desync, when camera starts dropping TCP data and\nwe have to find packet boundaries.\n\nHere we write count of such resynchronizations.\n"
          },
          "errors_ts_pat": {
            "type": "integer",
            "description": "how many times PAT was missing during 0,5 seconds or pid 0 misses PAT\n\n`PAT_error`\n"
          },
          "pids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/input_pid_counters"
            },
            "description": "Per pid statistics calculated for MPEG-TS input\n"
          },
          "rtp_channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/input_rtp_counters"
            },
            "description": "Per channel statistics calculated for RTP input\n"
          },
          "errors_ts_service_lost": {
            "type": "integer",
            "description": "How many times have received PAT that was missing required service (program)\n"
          },
          "errors_ts_stuck_restarts": {
            "type": "integer",
            "description": "Number of connection restarts to fix ts_stuck issue. Can happen in RTSP.\n"
          },
          "errors_ts_jump_restarts": {
            "type": "integer",
            "description": "Number of connection restarts when very long jump of stream timestamp detected.\n"
          },
          "errors_404": {
            "type": "integer",
            "description": "How many times we've got 404 (enoent).\n"
          },
          "errors_403": {
            "type": "integer",
            "description": "How many times we've got 403 (eaccess).\n"
          },
          "errors_500": {
            "type": "integer",
            "description": "How many times we've got 500 (backend error).\n"
          },
          "errors_crashed": {
            "type": "integer",
            "description": "How many times input was restarted due to internal crash.\n\nThis may happen due to unhandled input.\n"
          },
          "sdi": {
            "$ref": "#/components/schemas/input_sdi_counters"
          },
          "agent": {
            "$ref": "#/components/schemas/input_agent_counters"
          },
          "udp_mpegts": {
            "$ref": "#/components/schemas/input_udp_mpegts_counters"
          }
        }
      },
      "input_pid_counters": {
        "type": "object",
        "required": [
          "pid"
        ],
        "properties": {
          "pid": {
            "description": "Related MPEG-TS pid with following problems\n",
            "type": "integer"
          },
          "pnr": {
            "description": "What program does have this pid\n",
            "type": "integer"
          },
          "packets": {
            "description": "How many MPEG-TS packets with 188 bytes on this pid received\n",
            "type": "integer"
          },
          "frames": {
            "description": "Frame count on this pid\n",
            "type": "integer"
          },
          "empty_packets": {
            "description": "Packets without payload and adaptation field\n",
            "type": "integer"
          },
          "errors_adaptation_broken": {
            "description": "Packets with adaptation field larger than packet size\n",
            "type": "integer"
          },
          "errors_ts_scrambled": {
            "type": "integer",
            "description": "Amount of scrambled TS packets\n"
          },
          "errors_ts_pmt": {
            "type": "integer",
            "description": "how many times PMT was not received after 0,5 seconds\n\n`PMT_error`\n"
          },
          "errors_ts_cc": {
            "type": "integer",
            "description": "how many MPEG-TS packets were received with non-contigious contiuity counters.\n\n`Continuity_count_error`\n",
            "example": 0
          },
          "errors_ts_tei": {
            "type": "integer",
            "description": "How many MPEG-TS packets with Transport Error Indicator were received\n\n`Transport_error`, 2.1\n"
          },
          "errors_ts_psi_checksum": {
            "type": "integer",
            "description": "How many times have received PSI entry with broken checksum\n\n`CRC_error`\n"
          },
          "errors_pid_lost": {
            "type": "integer",
            "description": "How many times pid has been lost\n"
          },
          "broken_pes_count": {
            "type": "integer",
            "description": "How many PES packets were started not from startcode\n"
          },
          "broken_pes_sum": {
            "type": "integer",
            "description": "How many bytes were discarded due to lack of PES startcode\n"
          },
          "time_corrections": {
            "type": "integer",
            "description": "Jumps of timestamps inside a MPEG-TS stream\n"
          },
          "repeated_frames": {
            "type": "integer",
            "description": "In case of CC error last frame can be repeated. This is a count of repeated frames\n"
          },
          "corrected_backward_pts": {
            "type": "integer",
            "description": "How many times PTS was less than PCR or previous PTS\n"
          },
          "pcr_resync": {
            "type": "integer",
            "description": "If PTS is drifting away from PCR, it can be resynchronized with PCR. This is a resync count\n"
          },
          "discarded_buffer_count": {
            "type": "integer",
            "description": "How many times was discarded too big ES buffer without making a frame of it\n"
          },
          "discarded_buffer_sum": {
            "type": "integer",
            "description": "How many bytes were lost due to discarding ES buffer\n"
          },
          "fillers_count": {
            "type": "integer",
            "description": "How many H264(5) NAL fillers were seen in the input\n"
          },
          "fillers_sum": {
            "type": "integer",
            "description": "How many bytes were seen in NAL fillers\n"
          },
          "padding_pes_count": {
            "type": "integer",
            "description": "How many PES packets were on the Padding streamId\n"
          },
          "padding_pes_sum": {
            "type": "integer",
            "description": "How many bytes were in PES packets on the Padding streamId\n"
          },
          "crashed": {
            "type": "integer",
            "description": "Unhandled crashes inside mpegts decoding process due\n"
          },
          "dts_goes_backwards": {
            "type": "integer",
            "description": "Time on this PID jumped back from reference PTS and it was not a roll over zero\n"
          },
          "dts_jump_forward": {
            "type": "integer",
            "description": "Time on this PID jumped forward too far away from reference PTS\n"
          },
          "too_large_dts_jump": {
            "type": "integer",
            "description": "Jump of the PTS was so big from previous, that had to flush all frames and restart parsing\n"
          }
        }
      },
      "input_rtp_counters": {
        "allOf": [
          {
            "$ref": "#/components/schemas/rtp_counters_base"
          },
          {
            "$ref": "#/components/schemas/h26x_decoder_counters"
          }
        ]
      },
      "input_srt_counters": {
        "type": "object",
        "description": "SRT specific counters\n",
        "properties": {
          "rtt": {
            "type": "integer",
            "description": "Round-trip time\n"
          },
          "latency": {
            "type": "integer",
            "description": "Receiver buffering delay"
          },
          "packets": {
            "type": "integer",
            "description": "Total incoming SRT packets counter\n"
          },
          "retransmitted_packets": {
            "type": "integer",
            "description": "How many packets were retransmitted\n"
          },
          "error_lost_packets": {
            "type": "integer",
            "description": "How many SRT packets were lost\n"
          },
          "error_dropped_packets": {
            "type": "integer",
            "description": "How many SRT packets were dropped by various reasons\n"
          }
        }
      },
      "input_udp_mpegts_counters": {
        "type": "object",
        "description": "Counters for MPEG-TS carried over a plain UDP input (including multicast).\n\nPlease note that if multiple streams use the same UDP multicast MPTS input,\ncounter values are repeated per stream (same receive on the wire).\nDo not sum them across streams.\n",
        "properties": {
          "bytes": {
            "type": "integer",
            "format": "bytes",
            "description": "Total number of payload bytes read from the UDP socket for this input.\n",
            "x-format-description": "bytes"
          },
          "packets": {
            "type": "integer",
            "description": "Total number of UDP packets successfully received for this input.\n"
          },
          "not_aligned_packets": {
            "type": "integer",
            "description": "Number of UDP packets whose MPEG-TS payload length is **not** a multiple of 188 bytes.\n"
          },
          "rtp_packets": {
            "type": "integer",
            "description": "Number of UDP packets which are MPEG-TS over RTP (i.e. has 12-byte RTP header).\n"
          }
        }
      },
      "input_motion_detector_counters": {
        "type": "object",
        "description": "Specific counters to get insights on current state of getting events from cameras.\nDesigned to be used by analyzers, monitoring and alerting tools\n",
        "properties": {
          "motion_detected_count": {
            "type": "integer",
            "description": "Number of detected motions.\n"
          },
          "episodes_count": {
            "type": "integer",
            "description": "Number of collected episodes.\n"
          },
          "errors_not_authorized_count": {
            "type": "integer",
            "description": "Number of not authorized requests\n"
          },
          "errors_url_unreachable_count": {
            "type": "integer",
            "description": "Number of failed requests because of bad url or network issues.\n"
          },
          "errors_broken_payload": {
            "type": "integer",
            "description": "Number of responses with broken content.\n"
          },
          "errors_no_agent_connected": {
            "type": "integer",
            "description": "Number of failed request attempts because of no agent connected.\n"
          },
          "errors_no_service_count": {
            "type": "integer",
            "description": "Number of attempts to request disabled or unsupported ONVIF service  \n"
          },
          "errors_incorrect_time_values_count": {
            "type": "integer",
            "description": "`ONVIF Event Handling Test Specification` says that valid values for `CurrentTime` and `TerminationTime` are \n`TerminationTime >= CurrentTime + InitialTerminationTime`.\n\nHow many responses did not met the condition.\n"
          }
        }
      },
      "input_sdi_counters_base": {
        "type": "object",
        "description": "SDI,HDMI and other raw input counters",
        "properties": {
          "errors_no_signal": {
            "type": "integer",
            "description": "Frames dropped due to 'No signal'."
          },
          "errors_duplicate": {
            "type": "integer",
            "description": "Frame data is duplicated from previous frame because the input was too slow."
          },
          "errors_ts_duplicate": {
            "type": "integer",
            "description": "Frame time is the same as the previous frame."
          },
          "errors_cpu_stall": {
            "type": "integer",
            "description": "The frame was dropped due to too high CPU load."
          },
          "peak_duration_deviation": {
            "type": "integer",
            "description": "Gauge of maximum deviation from the estimated frame duration."
          },
          "avg_recv_duration": {
            "type": "integer",
            "description": "Gauge of average duration of incoming frame calculated in real time."
          },
          "error_lost_audio": {
            "type": "integer",
            "description": "Counter of configured audio sdi channels without samples or non valid."
          },
          "compensated_frames": {
            "type": "integer",
            "description": "Frames injected to fix client-side SDI stream drift."
          },
          "errors_frame_invalid": {
            "type": "integer",
            "description": "Frames dropped because the SDI backend reported an invalid frame status."
          }
        }
      },
      "input_sdi_counters": {
        "allOf": [
          {
            "$ref": "#/components/schemas/input_sdi_counters_base"
          },
          {
            "$ref": "#/components/schemas/dtapi_error_counters"
          }
        ]
      },
      "input_agent_counters": {
        "type": "object",
        "description": "Agent counters",
        "properties": {
          "errors_conn_failed": {
            "type": "integer",
            "description": "The agent was unable to open the requested connection. These errors may indicate problems opening the TCP socket on the agent or the remote host is unreacheable."
          },
          "errors_out_of_memory": {
            "type": "integer",
            "description": "These errors indicate that the agent does not have enough memory to establish a connection to the remote host."
          },
          "errors_buffer_overrun": {
            "type": "integer",
            "description": "These errors indicate that the agent does not have enough buffer size to handle outgoing traffic."
          },
          "errors_invalid_request": {
            "type": "integer",
            "description": "These errors indicate that the agent is receiving invalid requests."
          },
          "errors_unknown": {
            "type": "integer",
            "description": "Unknown errors counter."
          }
        }
      },
      "rtp_counters_base": {
        "type": "object",
        "required": [
          "channel_id"
        ],
        "properties": {
          "channel_id": {
            "description": "RTP channel number\n",
            "type": "integer",
            "example": 0
          },
          "content": {
            "description": "Content of the track transmitted in the channel\n",
            "type": "string",
            "example": "video"
          },
          "rtp_packets": {
            "type": "integer",
            "description": "How many RTP packets received for this channel\n"
          },
          "rtcp_packets": {
            "type": "integer",
            "description": "How many RTCP packets received for this channel\n"
          },
          "bytes": {
            "type": "integer",
            "description": "How many bytes received for this channel\n"
          },
          "frames": {
            "type": "integer",
            "description": "How many frames received for this channel\n"
          },
          "pt_reject_count": {
            "type": "integer",
            "description": "Number of rtp packets rejected due to wrong payload type\n"
          },
          "pt_reject_sum": {
            "type": "integer",
            "description": "Total size of rejected packets due to wrong payload type (pt_reject_count) rtp packets\n"
          },
          "ts_goes_backwards": {
            "type": "integer",
            "description": "Time on this channel is jumped back from reference wallclock.\n"
          },
          "ts_jump_forward": {
            "type": "integer",
            "description": "Time on this channel is jumped forward from reference wallclock.\n"
          },
          "ts_stuck": {
            "type": "integer",
            "description": "https://datatracker.ietf.org/doc/html/rfc6184#section-4.1\n\naccess unit: A set of NAL units always containing a primary coded picture.  In addition to the primary coded\npicture, an access unit may also contain one or more redundant coded pictures or other NAL units not containing\nslices or slice data partitions of a coded picture.  The decoding of an access unit always results in a\ndecoded picture.\n\nThere is `marker bit` in RTP packet which is set for the very last packet of the access unit indicated by the RTP timestamp.\n\nIt is protocol violation if received RTP packet has the same timestamp as previous marker bit packet.\n\nThis counter is a number of RTP packets which `RTP timestamp` is equal to previous RTP marker bit packet.\n"
          },
          "errors_dts_stuck": {
            "type": "integer",
            "description": "Number of frames which dts is same as previous frame dts.\n"
          },
          "sr_ts_stuck": {
            "type": "integer",
            "description": "Number of rtcp SR packets which `RTP timestamp` is equal to the previous rtcp SR packet `RTP timestamp`. \n"
          },
          "sender_clock_deviation": {
            "type": "integer",
            "description": "Sender wallclock deviation from server time in ms. Positive value means that sender time is ahead of server time.\n"
          },
          "errors_sr_clock_deviation": {
            "type": "integer",
            "description": "Number of clock synchronization events where sender wallclock deviation exceeded acceptable limits. \nEach increment represents a synchronization with potentially incorrect camera time. \nThis counter increments only when wait_rtcp option is enabled and |sender_clock_deviation| > max_allowed_threshold.\n"
          },
          "marker_packets_count": {
            "type": "integer",
            "description": "Number of RTP packets which marker bit is set to one.\n"
          },
          "no_marker_mode_flag": {
            "type": "boolean",
            "description": "If no marker bit packet is received after 400 RTP packets then decoder switches to `no_marker_mode` and\nmakes frame on each timecode change. \n\nThis flag shows if decoder works in `no_marker_mode`.\n"
          },
          "errors_broken_payload": {
            "type": "integer",
            "description": "Demultiplexing was done right, but content is broken.\n"
          },
          "errors_lost_packets": {
            "type": "integer",
            "description": "RTP have enough information to tell how many packets were lost\n"
          },
          "nack_count": {
            "type": "integer",
            "description": "How many NACK messages are sent for this channel\n"
          }
        }
      },
      "h26x_decoder_counters": {
        "type": "object",
        "description": "Here are counters for h264/h265 decoder.\n",
        "properties": {
          "nal_count": {
            "type": "integer",
            "description": "How many NAL units handled by this decoder.\n"
          },
          "discarded_broken_nal_count": {
            "type": "integer",
            "description": "Number of NAL units, which `forbidden_zero_bit` is set to one.\n"
          },
          "discarded_not_allowed_nal_count": {
            "type": "integer",
            "description": "Number of NAL units, which type is not allowed in `non-interleaved packetization mode`.\n"
          },
          "nal_fu_count": {
            "type": "integer",
            "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows how many `Fragmentation Units` handled by this decoder. \n"
          },
          "nal_stap_a_count": {
            "type": "integer",
            "description": "How many NAL `STAP_A` units handled by this decoder.\n"
          },
          "nal_aggregation_count": {
            "type": "integer",
            "description": "How many NAL `AGGREGATION` units handled by this decoder.\n"
          },
          "fu_pattern_is_broken_count": {
            "type": "integer",
            "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\n`Fragmentation Units` pattern must have a `Start FU`, `End FU` and could have `FUs` between these ones. \n\nThis counter indicates how many times pattern was broken.\n"
          },
          "fu_has_both_start_end_bits_count": {
            "type": "integer",
            "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows number of `Fragmentation Units` which `Start bit` and `End bit` are set to one in the same `FU` header\n"
          },
          "incomplete_nal_count": {
            "type": "integer",
            "description": "NAL deframentation could be interrupted by unexpected NAL or broken/incomplete packet.\nIf NAL deframentation is interrupted then incomplete fragment of NAL is not discarded and used in decoding process.\n\nThis counter indicates how many incomplete NALs were used.  \n"
          },
          "discarded_fu_count": {
            "type": "integer",
            "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows number of discarded `Fragmentation Units`\n"
          },
          "fu_end_then_middle_workaround_count": {
            "type": "integer",
            "description": "There is workaround to not interrupt `FU` sequence if `end-FU` followed by `middle-FU`. \nThis counter shows how many time the workaround was applied.\n"
          },
          "nal_sei_count": {
            "type": "integer",
            "description": "How many NAL `SEI` units handled by this decoder.\n"
          },
          "invalid_sei_type_count": {
            "type": "integer",
            "description": "Number of `SEI` NAL units with invalid type\n"
          },
          "invalid_sei_size_count": {
            "type": "integer",
            "description": "Number of `SEI` NAL units with invalid size\n"
          },
          "invalid_sei_payload_count": {
            "type": "integer",
            "description": "Number of `SEI` NAL units with bad payload\n"
          },
          "discarded_sei_count": {
            "type": "integer",
            "description": "Number of discarded `SEI` NAL units\n"
          },
          "nal_idr_count": {
            "type": "integer",
            "description": "How many NAL `IDR` units handled by this decoder.\n"
          },
          "nal_single_count": {
            "type": "integer",
            "description": "How many NAL `SINGLE` units handled by this decoder. \n"
          },
          "nal_sps_count": {
            "type": "integer",
            "description": "How many NAL `SPS` units handled by this decoder.\n"
          },
          "nal_pps_count": {
            "type": "integer",
            "description": "How many NAL `PPS` units handled by this decoder.\n"
          },
          "nal_aud_count": {
            "type": "integer",
            "description": "How many NAL `AUD` units handled by this decoder.\n"
          },
          "nal_filler_count": {
            "type": "integer",
            "description": "How many NAL `FILLER` units handled by this decoder.\n"
          },
          "nal_slice_count": {
            "type": "integer",
            "description": "How many NAL `SLICE` units handled by this decoder.\n"
          },
          "nal_vps_count": {
            "type": "integer",
            "description": "How many NAL `VPS` units handled by this decoder.\n"
          },
          "nal_other_count": {
            "type": "integer",
            "description": "How many other NAL units handled by this decoder.\n"
          },
          "discarded_nal_count": {
            "type": "integer",
            "description": "Number of discarded NAL units.\n"
          }
        }
      },
      "segment_duration": {
        "type": "integer",
        "format": "milliseconds",
        "minimum": 1000,
        "maximum": 15000,
        "x-format-description": "milliseconds"
      },
      "stream_push": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/stream_push_name"
          },
          "asi": {
            "$ref": "#/components/schemas/stream_push_dektec_asi"
          },
          "decklink": {
            "$ref": "#/components/schemas/stream_push_decklink"
          },
          "dektec": {
            "$ref": "#/components/schemas/stream_push_dektec"
          },
          "hls": {
            "$ref": "#/components/schemas/stream_push_hls"
          },
          "m4f": {
            "$ref": "#/components/schemas/stream_push_m4f"
          },
          "m4s": {
            "$ref": "#/components/schemas/stream_push_m4s"
          },
          "ndi": {
            "$ref": "#/components/schemas/stream_push_ndi"
          },
          "rtmp": {
            "$ref": "#/components/schemas/stream_push_rtmp"
          },
          "srt": {
            "$ref": "#/components/schemas/stream_push_srt"
          },
          "st2110": {
            "$ref": "#/components/schemas/stream_push_st2110"
          },
          "tshttp": {
            "$ref": "#/components/schemas/stream_push_tshttp"
          },
          "udp": {
            "$ref": "#/components/schemas/stream_push_udp"
          }
        },
        "required": [
          "name"
        ]
      },
      "stream_push_name": {
        "type": "string",
        "x-primary-key": true,
        "description": "Per stream unique push name.\n"
      },
      "stream_push_rtmp": {
        "type": "object",
        "title": "RTMP",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "RTMP URL where to push.\nYou can publish to RTMP servers. Usually it is a social network streaming.\n",
            "type": "string",
            "x-api-allow": [
              "watcher-admin"
            ],
            "format": "input_url",
            "examples": {
              "default": {
                "value": "rtmp://your-server.com/app/stream1"
              }
            },
            "pattern": "^rtmps?://.*$",
            "x-format-description": "input_url"
          },
          "service": {
            "description": "The name of the service.\nThe value will be sent within FlashVer string when establishing a connection.\nString template is `FMLE/3.0 (compatible; #{encoder}; Streamer #{streamer_version}; #{service}`.\nExample of the resulting FlashVer string is `FMLE/3.0 (compatible; Lavf56.40.101; Streamer 25.01; My service)`.\n",
            "type": "string",
            "example": "My service"
          },
          "domain": {
            "description": "Service public domain name.\nThe value will be sent within notify message with command name 'onMetaData'\nMetadata also will contain the name `Streamer`, streamer version, the type and version of the operating system.\nMetadata will be sent as map with associated map key `yt_project`.\nString template is `Streamer #{streamer_version} #{encoder} #{os_type} #{os_version} #{domain}`.\nExample of the resulting string is `{\"yt_project\" : \"Streamer 25.01 Lavf56.40.101 unix-linux 6.1.0 officialdomain.com\"}`.\n",
            "type": "string",
            "example": "officialdomain.com"
          },
          "encoder": {
            "description": "The name of the encoder used by the pusher. Can also be used as a device name.\nThe value will be sent within notify message with command name 'onMetaData' and within FlashVer string (see above).\n",
            "type": "string",
            "example": "Lavf57"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_push_udp": {
        "type": "object",
        "title": "Multicast MPEG-TS",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "UDP URL of multicast group\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "udp://239.0.0.1:1234"
              },
              "interface": {
                "value": "udp://eth0@239.0.0.1:1234"
              },
              "bind_ip": {
                "value": "udp://239.0.0.1:1234/192.168.20.24"
              }
            },
            "pattern": "^udp[12]?://([^@]+\\@)?[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+:[0-9]+.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "multicast_loop": {
            "description": "Whether to capture multicast back to the *Flussonic* host. \nThis option allows you to ingest the sent stream on the sending host by *Flussonic* or other application.\nSet to `True` for a UDP MPEG-TS push.\n",
            "type": "boolean",
            "example": true
          },
          "standby": {
            "description": "Monitoring multicast group and stop pushing if another publisher presented",
            "type": "boolean"
          },
          "vb": {
            "description": "Average bitrate per second that you can send of a video track, including all the headers and encapsulation in the transport stream. \nSo, for example, the value of vb=2720 approximately corresponds to the bitrate 2600 specified in the transcoder settings.\n",
            "type": "integer",
            "format": "speed",
            "example": 2720,
            "x-format-description": "speed"
          },
          "bitrate": {
            "description": "The bitrate of the whole stream.",
            "type": "integer",
            "format": "speed",
            "example": 3200,
            "x-format-description": "speed"
          },
          "pnr": {
            "description": "Program number in the outgoing MPEG-TS stream. A program may represent a television channel.\n",
            "type": "integer"
          },
          "pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "service": {
            "description": "Service name. Used to fill in the field service name within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My service name"
          },
          "provider": {
            "description": "Provider name. Used to fill in the field service provider within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My provider name"
          },
          "prebuffer": {
            "description": "The length of the multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 800,
            "x-format-description": "milliseconds"
          }
        }
      },
      "stream_push_m4f": {
        "type": "object",
        "title": "M4F",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Another Flussonic URL where to push video to.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "m4f://your-server.com/app/stream1"
              }
            },
            "pattern": "^m4fs?://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_push_m4s": {
        "type": "object",
        "title": "M4S",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Flussonic stream URL where to push to.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "m4s://your-server.com/app/stream1"
              }
            },
            "pattern": "^m4ss?://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_push_decklink": {
        "type": "object",
        "title": "Decklink SDI",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Specify Blackmagic Decklink SDI card as a destination for this stream.\n\nYou need to specify exact number of output, refer to decklink manual to find\nenumeration rules.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "decklink://0"
              }
            },
            "pattern": "^decklink://[0-9]+$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "volume": {
            "description": "Audio volume coefficient.\nThe output audio volume is given by the relation: `output_volume = volume * input_volume`.\nThe maximum volume value is 1.0 (default value).\n",
            "type": "number",
            "example": 0.5
          },
          "deinterlace": {
            "description": "Activate deinterlacing, i.e., converting an interlaced image to a progressive image. \nIt is necessary for comfortable viewing of legacy TV video on PC/mobile devices.\n",
            "type": "boolean"
          },
          "video_format": {
            "description": "Specify SDI/HDMI output format",
            "enum": [
              "pal",
              "625i50",
              "ntsc",
              "525i29.97",
              "525i29",
              "720p23.98",
              "720p23",
              "720p24",
              "720p25",
              "720p29.97",
              "720p29",
              "720p30",
              "720p50",
              "720p59.94",
              "720p59",
              "720p60",
              "1080p23.98",
              "1080p23",
              "1080p24",
              "1080p25",
              "1080p29.97",
              "1080p29",
              "1080p30",
              "1080psf23.98",
              "1080psf23",
              "1080psf24",
              "1080psf25",
              "1080psf29.97",
              "1080psf29",
              "1080psf30",
              "1080i50",
              "1080i59.94",
              "1080i60",
              "1080p50",
              "1080p50b",
              "1080p59.94",
              "1080p59",
              "1080p59.94b",
              "1080p59b",
              "1080p60",
              "1080p60b",
              "2160p50",
              "2160p50b",
              "2160p59.94",
              "2160p59",
              "2160p59.94b",
              "2160p59b",
              "2160p60",
              "2160p60b",
              "2160p23",
              "2160p24",
              "2160p25",
              "2160p29",
              "2160p30"
            ],
            "type": "string"
          },
          "vbi_lines": {
            "description": "Lines of VBI (vertical blanking interval) of an output analog stream that will contain teletext.\nIt is used for passing teletext from MPEG-TS to analog streams.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-teletext-to-sdi-vbi/"
            },
            "items": {
              "$ref": "#/components/schemas/vbi_lines"
            },
            "type": "array"
          },
          "dthreads": {
            "description": "Defines a number of threads in a decoder. \nOne thread uses one core. \nThe default value equals 4, but you can set it equal to the number of cores of your CPU.\n",
            "type": "integer",
            "x-notice": "video decoder threads number"
          },
          "scale": {
            "$ref": "#/components/schemas/scale_algorithm"
          }
        }
      },
      "stream_push_dektec": {
        "type": "object",
        "title": "Dektec SDI",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Select which Dektec SDI card to use as a sink for this stream.\n\nDektec url is combined of card serial # and number of output port on this card.\n\nOutput ports on a card are numbered starting from 1.\nSerial numbers are uniq for each produced card. Take a look at admin UI or use\nnative dektec tools to find the serial number.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "dektec://2174223350:1"
              }
            },
            "pattern": "^dektec://[0-9]+:[0-9]+$",
            "x-format-description": "input_url"
          },
          "genlock": {
            "description": "Enable clock-lock feature (if supported). See also genlock_status property in pusher stats.",
            "type": "boolean"
          },
          "pixel_offset": {
            "description": "Adjusting genlock timing pixel offset.",
            "type": "integer"
          },
          "external": {
            "description": "If true, then an external dektec-bridge application using the FRIP protocol will be used to send data.",
            "type": "boolean"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "volume": {
            "description": "Audio volume coefficient.\nThe output audio volume is given by the relation: `output_volume = volume * input_volume`.\nThe maximum volume value is 1.0 (default value).\n",
            "type": "number",
            "example": 0.5
          },
          "deinterlace": {
            "description": "Activate deinterlacing, i.e., converting an interlaced image to a progressive image. \nIt is necessary for comfortable viewing of legacy TV video on PC/mobile devices.\n",
            "type": "boolean"
          },
          "video_format": {
            "description": "Specify SDI/HDMI output format",
            "enum": [
              "pal",
              "625i50",
              "ntsc",
              "525i29.97",
              "525i29",
              "720p23.98",
              "720p23",
              "720p24",
              "720p25",
              "720p29.97",
              "720p29",
              "720p30",
              "720p50",
              "720p59.94",
              "720p59",
              "720p60",
              "1080p23.98",
              "1080p23",
              "1080p24",
              "1080p25",
              "1080p29.97",
              "1080p29",
              "1080p30",
              "1080psf23.98",
              "1080psf23",
              "1080psf24",
              "1080psf25",
              "1080psf29.97",
              "1080psf29",
              "1080psf30",
              "1080i50",
              "1080i59.94",
              "1080i60",
              "1080p50",
              "1080p50b",
              "1080p59.94",
              "1080p59",
              "1080p59.94b",
              "1080p59b",
              "1080p60",
              "1080p60b",
              "2160p50",
              "2160p50b",
              "2160p59.94",
              "2160p59",
              "2160p59.94b",
              "2160p59b",
              "2160p60",
              "2160p60b",
              "2160p23",
              "2160p24",
              "2160p25",
              "2160p29",
              "2160p30"
            ],
            "type": "string"
          },
          "vbi_lines": {
            "description": "Lines of VBI (vertical blanking interval) of an output analog stream that will contain teletext.\nIt is used for passing teletext from MPEG-TS to analog streams.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-teletext-to-sdi-vbi/"
            },
            "items": {
              "$ref": "#/components/schemas/vbi_lines"
            },
            "type": "array"
          },
          "dthreads": {
            "description": "Defines a number of threads in a decoder. \nOne thread uses one core. \nThe default value equals 4, but you can set it equal to the number of cores of your CPU.\n",
            "type": "integer",
            "x-notice": "video decoder threads number"
          },
          "scale": {
            "$ref": "#/components/schemas/scale_algorithm"
          }
        }
      },
      "stream_push_dektec_asi": {
        "type": "object",
        "title": "Dektec ASI",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Select which Dektec ASI card to use as a sink for this stream.\n\nDektec url is combined of card serial # and number of output port on this card.\n\nOutput ports on a card are numbered starting from 1.\nSerial numbers are uniq for each produced card. Take a look at admin UI or use\nnative dektec tools to find the serial number.\n\nMention that ASI is a MPEG-TS transport\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "dektec-asi://"
              }
            },
            "pattern": "^dektec-asi://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "vb": {
            "description": "Average bitrate per second that you can send of a video track, including all the headers and encapsulation in the transport stream. \nSo, for example, the value of vb=2720 approximately corresponds to the bitrate 2600 specified in the transcoder settings.\n",
            "type": "integer",
            "format": "speed",
            "example": 2720,
            "x-format-description": "speed"
          },
          "bitrate": {
            "description": "The bitrate of the whole stream.",
            "type": "integer",
            "format": "speed",
            "example": 3200,
            "x-format-description": "speed"
          },
          "pnr": {
            "description": "Program number in the outgoing MPEG-TS stream. A program may represent a television channel.\n",
            "type": "integer"
          },
          "pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "service": {
            "description": "Service name. Used to fill in the field service name within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My service name"
          },
          "provider": {
            "description": "Provider name. Used to fill in the field service provider within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My provider name"
          },
          "prebuffer": {
            "description": "The length of the multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 800,
            "x-format-description": "milliseconds"
          }
        }
      },
      "stream_push_tshttp": {
        "type": "object",
        "title": "HTTP MPEG-TS",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Content will be similar to multicast MPEG-TS, but endless HTTP POST will be used to upload content.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "tshttp://your-server.com/app/stream1"
              },
              "https": {
                "value": "tshttps://your-server.com/app/stream1"
              }
            },
            "pattern": "^tshttps?://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "vb": {
            "description": "Average bitrate per second that you can send of a video track, including all the headers and encapsulation in the transport stream. \nSo, for example, the value of vb=2720 approximately corresponds to the bitrate 2600 specified in the transcoder settings.\n",
            "type": "integer",
            "format": "speed",
            "example": 2720,
            "x-format-description": "speed"
          },
          "bitrate": {
            "description": "The bitrate of the whole stream.",
            "type": "integer",
            "format": "speed",
            "example": 3200,
            "x-format-description": "speed"
          },
          "pnr": {
            "description": "Program number in the outgoing MPEG-TS stream. A program may represent a television channel.\n",
            "type": "integer"
          },
          "pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "service": {
            "description": "Service name. Used to fill in the field service name within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My service name"
          },
          "provider": {
            "description": "Provider name. Used to fill in the field service provider within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My provider name"
          },
          "prebuffer": {
            "description": "The length of the multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 800,
            "x-format-description": "milliseconds"
          }
        }
      },
      "stream_push_hls": {
        "type": "object",
        "title": "HLS",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "It is possible to publish HLS to a CDN. Segments will be uploaded together with manifests.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "hls://your-server.com/app/stream1"
              }
            },
            "pattern": "^hlss?://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_push_srt": {
        "type": "object",
        "title": "SRT",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "SRT URL where to push video.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "srt://my-server.com:8994"
              }
            },
            "pattern": "^srt[12]?://[^:]+:[0-9]+.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "multicast_loop": {
            "description": "Whether to capture multicast back to the *Flussonic* host. \nThis option allows you to ingest the sent stream on the sending host by *Flussonic* or other application.\nSet to `True` for a UDP MPEG-TS push.\n",
            "type": "boolean",
            "example": true
          },
          "standby": {
            "description": "Monitoring multicast group and stop pushing if another publisher presented",
            "type": "boolean"
          },
          "vb": {
            "description": "Average bitrate per second that you can send of a video track, including all the headers and encapsulation in the transport stream. \nSo, for example, the value of vb=2720 approximately corresponds to the bitrate 2600 specified in the transcoder settings.\n",
            "type": "integer",
            "format": "speed",
            "example": 2720,
            "x-format-description": "speed"
          },
          "bitrate": {
            "description": "The bitrate of the whole stream.",
            "type": "integer",
            "format": "speed",
            "example": 3200,
            "x-format-description": "speed"
          },
          "pnr": {
            "description": "Program number in the outgoing MPEG-TS stream. A program may represent a television channel.\n",
            "type": "integer"
          },
          "pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "mpegts_ac3": {
            "$ref": "#/components/schemas/output_mpegts_ac3"
          },
          "service": {
            "description": "Service name. Used to fill in the field service name within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My service name"
          },
          "provider": {
            "description": "Provider name. Used to fill in the field service provider within SDT MPEG-TS table.\n",
            "type": "string",
            "example": "My provider name"
          },
          "prebuffer": {
            "description": "The length of the multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 800,
            "x-format-description": "milliseconds"
          },
          "minversion": {
            "description": "The minimum SRT version that is required from the peer for SRT publication.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.1.0"
          },
          "version": {
            "description": "Required SRT version.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.3.0"
          },
          "enforcedencryption": {
            "description": "Whether both connection parties must have the same password set (including empty, in other words, with no encryption). \nIf the passwords do not match or only one side is unencrypted, the connection is rejected. \nThe default value is `true`.\n",
            "type": "boolean",
            "example": true
          },
          "passphrase": {
            "description": "The password for the encrypted transmission. \nIts length should be not less than 10 and not more than 79 characters.\n\nUnlike [password](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_save%7Cbody%7Cpassword),\nthe passphrase is not transmitted openly but is used to encrypt the key that is transmitted by the Caller\nand decoded by Listener.\n",
            "type": "string",
            "minLength": 10,
            "maxLength": 79,
            "example": "9876543210",
            "x-notice": "SRTO_PASSPHRASE (\"\")"
          },
          "linger": {
            "description": "The time, in seconds, that the socket waits for the unsent data before closing. \nThe default value is 180.\n",
            "type": "integer",
            "format": "seconds",
            "x-notice": "SRTO_LINGER on, (180s) (off - 0s)",
            "example": 15,
            "x-format-description": "seconds"
          },
          "latency": {
            "description": "The latency value for both directions of the socket.\nBy default initial value latency is 0 when transmitting and 120ms when receiving video.\nActual value established after connection handshake.\nIncreased value helps tolerate network losses and delays.\n",
            "type": "integer",
            "format": "milliseconds",
            "x-notice": "SRTO_LATENCY",
            "example": 150,
            "x-format-description": "milliseconds"
          },
          "streamid": {
            "description": "A string of maximum 512 characters set on the socket before the connection. \n\nThis string is a part of a callback that is sent by the caller and regisered by the listener. \nBased on this information the listener can accept or reject the connection, select the desired data stream, or set an appropriate passphrase for the connection.\n\nIts format is `#!::` optionally followed by the parameters:\n* `r=` - stream name\n* `m=` - mode expected for the connection: `publish` (if the caller wants to send the stream data) or `request` (if the caller wants to receive the stream).\n* `password=` - a password for the authorization in a publish session (not recommended, better use `passphrase` option instead)\n\nDuring SRT sessions the following parameters are automaticly added to streamid:\n* `s=` - the identifier of a session\n* `a=` - Flussonic version\n\nNOTE: you can specify a string in the format you need; to disable this extension, you need specify empty string.\n",
            "type": "string",
            "maxLength": 512,
            "example": "#!::r=my-stream,m=publish"
          }
        }
      },
      "stream_push_st2110": {
        "type": "object",
        "title": "SMPTE 2110",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "UDP URL of multicast group\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "st2110://239.0.0.1:1234"
              },
              "interface": {
                "value": "st2110://eth0@239.0.0.1:1234"
              },
              "bind_ip": {
                "value": "st2110://239.0.0.1:1234/192.168.20.24"
              }
            },
            "pattern": "^st2110?://([^@]+\\@)?[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+:[0-9]+.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_push_ndi": {
        "type": "object",
        "title": "NDI",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "The URL allows you to set the name of the NDI source being created.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "default": {
                "value": "ndi://source_name"
              }
            },
            "pattern": "^ndi://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the pusher.\n",
            "type": "string",
            "example": "This is a test push",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          },
          "retry_limit": {
            "description": "The maximum number of times *Flussonic* retries to push the stream.",
            "type": "integer",
            "x-api-allow": [
              "watcher-admin"
            ]
          },
          "retry_timeout": {
            "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n",
            "type": "integer",
            "format": "seconds",
            "example": 7,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n",
            "type": "integer",
            "format": "seconds",
            "example": 10,
            "x-api-allow": [
              "watcher-admin"
            ],
            "x-format-description": "seconds"
          },
          "connect_timeout": {
            "description": "Connection timeout, in seconds. Equals to 0 by default.",
            "type": "integer",
            "format": "seconds",
            "example": 2,
            "x-format-description": "seconds"
          },
          "disabled": {
            "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n",
            "type": "boolean",
            "x-api-allow": [
              "watcher-admin"
            ]
          }
        }
      },
      "stream_input": {
        "type": "object",
        "properties": {
          "copy": {
            "$ref": "#/components/schemas/stream_input_copy"
          },
          "decklink": {
            "$ref": "#/components/schemas/stream_input_decklink"
          },
          "dektec": {
            "$ref": "#/components/schemas/stream_input_dektec"
          },
          "fake": {
            "$ref": "#/components/schemas/stream_input_fake"
          },
          "file": {
            "$ref": "#/components/schemas/stream_input_file"
          },
          "frip": {
            "$ref": "#/components/schemas/stream_input_frip"
          },
          "h323": {
            "$ref": "#/components/schemas/stream_input_h323"
          },
          "hls": {
            "$ref": "#/components/schemas/stream_input_hls"
          },
          "m4f": {
            "$ref": "#/components/schemas/stream_input_m4f"
          },
          "m4s": {
            "$ref": "#/components/schemas/stream_input_m4s"
          },
          "mixer": {
            "$ref": "#/components/schemas/stream_input_mixer"
          },
          "mosaic": {
            "$ref": "#/components/schemas/stream_input_mosaic"
          },
          "mpts": {
            "$ref": "#/components/schemas/stream_input_mpts"
          },
          "mxl": {
            "$ref": "#/components/schemas/stream_input_mxl"
          },
          "ndi": {
            "$ref": "#/components/schemas/stream_input_ndi"
          },
          "playlist": {
            "$ref": "#/components/schemas/stream_input_playlist"
          },
          "publish": {
            "$ref": "#/components/schemas/stream_input_publish"
          },
          "rtp": {
            "$ref": "#/components/schemas/stream_input_rtp"
          },
          "rtmp": {
            "$ref": "#/components/schemas/stream_input_rtmp"
          },
          "rtsp": {
            "$ref": "#/components/schemas/stream_input_rtsp"
          },
          "shoutcast": {
            "$ref": "#/components/schemas/stream_input_shoutcast"
          },
          "spts": {
            "$ref": "#/components/schemas/stream_input_spts"
          },
          "srt": {
            "$ref": "#/components/schemas/stream_input_srt"
          },
          "st2110": {
            "$ref": "#/components/schemas/stream_input_st2110"
          },
          "timeshift": {
            "$ref": "#/components/schemas/stream_input_timeshift"
          },
          "tshttp": {
            "$ref": "#/components/schemas/stream_input_tshttp"
          },
          "v4l": {
            "$ref": "#/components/schemas/stream_input_v4l"
          }
        }
      },
      "stream_input_fake": {
        "type": "object",
        "title": "Demo source",
        "properties": {
          "url": {
            "description": "URL to get a demo stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "fake://fake",
            "pattern": "^fake://.*$",
            "x-format-description": "input_url"
          },
          "width": {
            "type": "integer",
            "description": "Width of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n"
          },
          "height": {
            "type": "integer",
            "description": "Height of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n"
          },
          "bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Bitrate of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n",
            "x-format-description": "speed"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_file": {
        "type": "object",
        "title": "File",
        "properties": {
          "url": {
            "description": "URL to get a stream from file.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "file://vod/bunny.mp4",
            "pattern": "^file://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_h323": {
        "type": "object",
        "title": "H323",
        "properties": {
          "url": {
            "description": "URL to connect to the H323 source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "h323://192.168.100.150",
            "pattern": "^h323://.*$",
            "x-format-description": "input_url"
          },
          "id": {
            "type": "string",
            "description": "H323 input ID."
          },
          "video_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "H323 input bitrate.",
            "x-format-description": "speed"
          },
          "audio_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "H323 audio bitrate.",
            "x-format-description": "speed"
          },
          "connections": {
            "type": "integer",
            "description": "H323 connections."
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_hls": {
        "type": "object",
        "title": "HLS",
        "properties": {
          "url": {
            "description": "URL to get a stream from HLS source.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "hls://remote.host.com/example/video.m3u8"
              },
              "apple_standard": {
                "value": "hls://remote.host.com/example/index.m3u8"
              },
              "secure": {
                "value": "hlss://remote.host.com/example/video.m3u8"
              },
              "hls2": {
                "value": "hls2://remote.host.com/example/video.m3u8"
              },
              "hlss2": {
                "value": "hlss2://remote.host.com/example/video.m3u8"
              },
              "http": {
                "value": "http://remote.host.com/index.m3u8"
              },
              "https": {
                "value": "https://remote.host.com/index.m3u8"
              }
            },
            "pattern": "^(hls|hlss|hls2|hlss2)://.*$|^(http|https)://.*\\.m3u8((#|\\?).*)?$",
            "x-format-description": "input_url"
          },
          "skip_stalled_check": {
            "description": "By default Flussonic will wait for at least 2-3 new segments before making stream available.\n\nThis parameter allows to disable this protection. Use it at your own risk - with it enabled, old content might be repeated over and over.\n",
            "type": "boolean"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_rtmp": {
        "type": "object",
        "title": "RTMP",
        "properties": {
          "url": {
            "description": "URL to connect to the RTMP source and get the stream.\n\nRTMP uses a special URL consisting of at least two segments. *Flussonic* parses the URL and splits it into parts, \nusing the first segment as an RTMP application name.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "rtmp://remote.host.com/static/example"
              },
              "secure": {
                "value": "rtmps://remote.host.com/static/example"
              }
            },
            "pattern": "^(rtmp|rtmps)://.*$",
            "x-format-description": "input_url"
          },
          "pageUrl": {
            "description": "URL of the web page from where the SWF file was loaded. \nThis is an RTMP header (Referer) used for establishing connection.\n",
            "type": "string",
            "format": "url",
            "example": "http://somehost/sample.html",
            "x-format-description": "url"
          },
          "swfUrl": {
            "description": "URL of the source SWF file making the connection by RTMP.",
            "type": "string",
            "example": "file://C:/FlvPlayer.swf"
          },
          "tcUrl": {
            "description": "URL of the remote Server for entering credentials. \nIt has the following format: `protocol://servername:port/appName/appInstance`.\n",
            "type": "string",
            "format": "url",
            "example": "rtmp://localhost:1935/testapp/instance1",
            "x-format-description": "url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_rtsp": {
        "type": "object",
        "title": "RTSP",
        "properties": {
          "url": {
            "description": "URL to connect to the RTSP source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "rtsp://remote.host.com/example"
              },
              "secure": {
                "value": "rtsps://remote.host.com/example"
              },
              "rtsp-udp": {
                "value": "rtsp-udp://remote.host.com/example"
              },
              "rtsp2": {
                "value": "rtsp2://remote.host.com/example"
              }
            },
            "pattern": "^(rtsp|rtsps|rtsp-udp|rtsp2)://.*$",
            "x-format-description": "input_url"
          },
          "rtp": {
            "enum": [
              "udp"
            ],
            "type": "string",
            "description": "Whether to force UDP to capture a video from RTSP cameras.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "wait_rtcp": {
            "type": "boolean",
            "description": "Whether to wait for the full RTP time synchronization before the processing of frames from the RTSP camera.\nThis option also disables the correction of the time received from the camera; the time from the camera is used as is.\nWarning: if the camera provides unsynchronized time with the streamer, there will be problems with the archive.\n",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_v4l": {
        "type": "object",
        "title": "V4L",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "URL to connect to the Video4Linux source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "v4l2://"
              },
              "v4l": {
                "value": "v4l://"
              }
            },
            "pattern": "^(v4l|v4l2)://.*$",
            "x-format-description": "input_url"
          },
          "audio_device": {
            "description": "The audio device to capture audio from Stream Labs SDI cards.\n\nThis parameter is specified for ALSA devices in the following format `interface:card,device`.\n",
            "type": "string",
            "example": "plughw:1,0"
          },
          "video_device": {
            "description": "The video device to capture video from Stream Labs SDI cards.\nIt is actually a path to a device file created on the disk by Video4Linux.\n",
            "type": "string",
            "example": "/dev/video0"
          },
          "vbi_device": {
            "description": "The VBI device to capture raw VBI data from Stream Labs SDI cards. VBI data can contain information about teletext or closed captions.\nIt is actually a path to a VBI device file created on the disk by Video4Linux.\n",
            "type": "string",
            "example": "/dev/vbi"
          },
          "ttxt_descriptors": {
            "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.",
            "items": {
              "$ref": "#/components/schemas/ttxt_descriptors"
            },
            "type": "array"
          },
          "vbi_threshold": {
            "description": "This parameter is used for debugging when reading teletext from VBI.\nThis is a threshold, in seconds, for turning on the decoder.\n",
            "type": "integer"
          },
          "vbi_debug": {
            "description": "This parameter allows logging the decoded data when reading teletext from VBI.",
            "type": "boolean"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        }
      },
      "stream_input_decklink": {
        "type": "object",
        "title": "Decklink SDI",
        "properties": {
          "url": {
            "description": "URL to connect to the Decklink SDI source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "decklink://0",
            "pattern": "^decklink://.*$",
            "x-format-description": "input_url"
          },
          "mode": {
            "description": "Mode of the input stream captured from the Decklink card. It is composed of the size and FPS of the captured video. \n\nUsually, it is autodetected, but for some Decklink models you'll need to specify it manually.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/ingest-sdi-with-blackmagic/#live-sdi-capture"
            },
            "example": "4d30",
            "enum": [
              "ntsc",
              "nt23",
              "pal",
              "ntsp",
              "palp",
              "23ps",
              "24ps",
              "Hp25",
              "Hp29",
              "Hp30",
              "Hp47",
              "Hp48",
              "Hp50",
              "Hp59",
              "Hp60",
              "Hp95",
              "Hp96",
              "Hp10",
              "Hp11",
              "Hp12",
              "Hi50",
              "Hi59",
              "Hi60",
              "hp50",
              "hp59",
              "hp60",
              "2k23",
              "2k24",
              "2k25",
              "2d23",
              "2d24",
              "2d25",
              "2d29",
              "2d30",
              "2d47",
              "2d48",
              "2d50",
              "2d59",
              "2d60",
              "2d95",
              "2d96",
              "2d10",
              "2d11",
              "2d12",
              "4k23",
              "4k24",
              "4k29",
              "4k30",
              "4k47",
              "4k48",
              "4k50",
              "4k59",
              "4k60",
              "4k95",
              "4k96",
              "4k10",
              "4k11",
              "4k12",
              "4d23",
              "4d24",
              "4d25",
              "4d29",
              "4d30",
              "4d47",
              "4d48",
              "4d50",
              "4d59",
              "4d60",
              "4d95",
              "4d96",
              "4d10",
              "4d11",
              "4d12",
              "8k23",
              "8k24",
              "8k25",
              "8k29",
              "8k30",
              "8k47",
              "8k48",
              "8k50",
              "8k59",
              "8k60",
              "8d23",
              "8d24",
              "8d25",
              "8d29",
              "8d30",
              "8d47",
              "8d48",
              "8d50",
              "8d59",
              "8d60",
              "vga6",
              "svg6",
              "wxg5",
              "wxg6",
              "sxg5",
              "sxg6",
              "uxg5",
              "uxg6",
              "wux5",
              "wux6",
              "1945",
              "1946",
              "wqh5",
              "wqh6",
              "wqx5",
              "wqx6",
              "rwci",
              "rwcc"
            ],
            "type": "string"
          },
          "ainput": {
            "description": "Audio interface for capturing from the Decklink card.\n\nUsually, it is autodetected, but for some Decklink models you should specify it manually.\n",
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7
                ]
              },
              {
                "enum": [
                  "embedded",
                  "aes_ebu",
                  "analog",
                  "analog_xlr",
                  "analog_rca",
                  "microphone",
                  "headphones"
                ],
                "type": "string"
              }
            ],
            "example": "microphone"
          },
          "vinput": {
            "description": "Video interface for capturing from the Decklink card.\n\nUsually, it is autodetected, but for some Decklink models you should specify it manually.\n",
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  1,
                  2,
                  3,
                  4,
                  5,
                  6
                ]
              },
              {
                "enum": [
                  "sdi",
                  "hdmi",
                  "optical_sdi",
                  "component",
                  "composite",
                  "s_video"
                ],
                "type": "string"
              }
            ],
            "example": "hdmi"
          },
          "vpts": {
            "description": "Synchronization mode for video captured from the Decklink card.\nAliases: 2 = `audio`, 3 = `ref`.\n",
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  2,
                  3
                ]
              },
              {
                "type": "string",
                "enum": [
                  "ref",
                  "audio"
                ]
              }
            ]
          },
          "apts": {
            "description": "Synchronization mode for audio captured from the Decklink card.\nAliases: 1 = `video`, 3 = `ref`.\n",
            "anyOf": [
              {
                "type": "integer",
                "enum": [
                  1,
                  3
                ]
              },
              {
                "type": "string",
                "enum": [
                  "ref",
                  "video"
                ]
              }
            ]
          },
          "pixel": {
            "description": "Preferred pixel format for captured video.",
            "enum": [
              "rgb8",
              "rgb10",
              "rgb12",
              "yuv8",
              "yuv10",
              "8",
              "10"
            ],
            "type": "string"
          },
          "sar": {
            "description": "The ratio of the width of the display representation to the width of the pixel representation of video.\n\nThis parameter is used for creating non-anamorphic video from anamorphic video.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar"
            },
            "type": "string",
            "example": "16:9"
          },
          "ttxt_descriptors": {
            "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.",
            "items": {
              "$ref": "#/components/schemas/ttxt_descriptors"
            },
            "type": "array"
          },
          "vbi_threshold": {
            "description": "This parameter is used for debugging when reading teletext from VBI.\nThis is a threshold, in seconds, for turning on the decoder.\n",
            "type": "integer"
          },
          "vbi_debug": {
            "description": "This parameter allows logging the decoded data when reading teletext from VBI.",
            "type": "boolean"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_dektec": {
        "type": "object",
        "title": "DekTec SDI",
        "properties": {
          "url": {
            "description": "URL to connect to the DekTec SDI source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "dektec://2174220025:2",
            "pattern": "^dektec://.*$",
            "x-format-description": "input_url"
          },
          "pixel": {
            "description": "Preferred pixel format for captured video.",
            "enum": [
              "rgb8",
              "rgb10",
              "rgb12",
              "yuv8",
              "yuv10",
              "8",
              "10"
            ],
            "type": "string"
          },
          "sar": {
            "description": "The ratio of the width of the display representation to the width of the pixel representation of video.\n\nThis parameter is used for creating non-anamorphic video from anamorphic video.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/transcoder/#video-options"
            },
            "type": "string",
            "example": "16:9"
          },
          "ttxt_descriptors": {
            "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.",
            "items": {
              "$ref": "#/components/schemas/ttxt_descriptors"
            },
            "type": "array"
          },
          "vbi_debug": {
            "description": "This parameter allows logging the decoded data when reading teletext from VBI.",
            "type": "boolean"
          },
          "external": {
            "description": "If true, then an external dektec-bridge application using the FRIP protocol will be used to receive data.",
            "type": "boolean"
          },
          "pts_source": {
            "description": "Source for PTS for input stream.",
            "default": "aligned",
            "enum": [
              "aligned",
              "sdi",
              "tod",
              "us"
            ],
            "type": "string"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_srt": {
        "type": "object",
        "title": "SRT",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "Artificial URL to connect to the SRT source and get the stream.\n\nSRT requires IP and port, so we create an artificial URL to specify the options to manage the data interchange.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "srt://remote.host.com:1234?bind_ip=10.77.0.100"
              },
              "srt1": {
                "value": "srt1://remote.host.com:1234?bind_ip=10.77.0.100"
              },
              "srt2": {
                "value": "srt2://remote.host.com:1234?bind_ip=10.77.0.100"
              }
            },
            "pattern": "^(srt|srt1|srt2)://.*$",
            "x-format-description": "input_url"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "minversion": {
            "description": "The minimum SRT version that is required from the peer for SRT publication.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.1.0"
          },
          "version": {
            "description": "Required SRT version.\n",
            "type": "string",
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
            "example": "1.3.0"
          },
          "enforcedencryption": {
            "description": "Whether both connection parties must have the same password set (including empty, in other words, with no encryption). \nIf the passwords do not match or only one side is unencrypted, the connection is rejected. \nThe default value is `true`.\n",
            "type": "boolean",
            "example": true
          },
          "passphrase": {
            "description": "The password for the encrypted transmission. \nIts length should be not less than 10 and not more than 79 characters.\n\nUnlike [password](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_save%7Cbody%7Cpassword),\nthe passphrase is not transmitted openly but is used to encrypt the key that is transmitted by the Caller\nand decoded by Listener.\n",
            "type": "string",
            "minLength": 10,
            "maxLength": 79,
            "example": "9876543210",
            "x-notice": "SRTO_PASSPHRASE (\"\")"
          },
          "linger": {
            "description": "The time, in seconds, that the socket waits for the unsent data before closing. \nThe default value is 180.\n",
            "type": "integer",
            "format": "seconds",
            "x-notice": "SRTO_LINGER on, (180s) (off - 0s)",
            "example": 15,
            "x-format-description": "seconds"
          },
          "latency": {
            "description": "The latency value for both directions of the socket.\nBy default initial value latency is 0 when transmitting and 120ms when receiving video.\nActual value established after connection handshake.\nIncreased value helps tolerate network losses and delays.\n",
            "type": "integer",
            "format": "milliseconds",
            "x-notice": "SRTO_LATENCY",
            "example": 150,
            "x-format-description": "milliseconds"
          },
          "streamid": {
            "description": "A string of maximum 512 characters set on the socket before the connection. \n\nThis string is a part of a callback that is sent by the caller and regisered by the listener. \nBased on this information the listener can accept or reject the connection, select the desired data stream, or set an appropriate passphrase for the connection.\n\nIts format is `#!::` optionally followed by the parameters:\n* `r=` - stream name\n* `m=` - mode expected for the connection: `publish` (if the caller wants to send the stream data) or `request` (if the caller wants to receive the stream).\n* `password=` - a password for the authorization in a publish session (not recommended, better use `passphrase` option instead)\n\nDuring SRT sessions the following parameters are automaticly added to streamid:\n* `s=` - the identifier of a session\n* `a=` - Flussonic version\n\nNOTE: you can specify a string in the format you need; to disable this extension, you need specify empty string.\n",
            "type": "string",
            "maxLength": 512,
            "example": "#!::r=my-stream,m=publish"
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from SRT input stream.\n",
            "type": "boolean",
            "default": true,
            "example": true
          }
        }
      },
      "stream_input_tshttp": {
        "type": "object",
        "title": "TSHTTP",
        "properties": {
          "url": {
            "description": "URL for ingest and pass a stream \"as is\" without repackaging.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "tshttp://ADMIN:PASSWORD@FLUSSONIC_IP/flussonic/api/dvbts/a0"
              },
              "secure": {
                "value": "tshttps://127.0.0.1:8080"
              },
              "mpegts": {
                "value": "http://remote.host.com/mpegts"
              },
              "mpegts_secure": {
                "value": "https://remote.host.com/mpegts"
              },
              "ts": {
                "value": "http://remote.host.com/example.ts"
              },
              "ts_secure": {
                "value": "https://remote.host.com/example.ts"
              }
            },
            "pattern": "^(tshttp|tshttps)://.*$|^(http|https)://.*(\\.ts|/mpegts)$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_mixer": {
        "type": "object",
        "title": "Mixer",
        "properties": {
          "url": {
            "description": "URL to make a mixer stream from other streams.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "mixer://stream1,stream2",
            "pattern": "^mixer://.*$",
            "x-format-description": "input_url"
          },
          "sync": {
            "description": "This parameter is used for a mixer stream that uses other streams as its video and audio sources.\n\nIf the parameter is set to `realtime`, audio frames will be played in sync with video frames: \nif the difference between timestamps of an audio frame and a corresponding video frame is more than 2 seconds, \nthe audio frame will be played at the timestamp of the video frame. \n\nIf this parameter is set to `dts`, no synchronization is performed.\n",
            "enum": [
              "dts",
              "realtime"
            ],
            "type": "string",
            "example": "dts",
            "default": "dts",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_add": {
            "type": "integer",
            "description": "Moves audio timestamp forwards or backwards on a specified number of milliseconds.",
            "deprecated": true,
            "x-delete-at": 23.09,
            "format": "milliseconds",
            "x-alias": "audio_offset",
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "milliseconds"
          },
          "mixer_strategy": {
            "description": "The mixing mode for the `mixer://` input type.\n",
            "default": "first_video_audio",
            "type": "string",
            "enum": [
              "all",
              "first_video_audio"
            ]
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_timeshift": {
        "type": "object",
        "title": "Timeshift",
        "properties": {
          "url": {
            "description": "Special URL to play the archive record of a stream with a fixed delay.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "timeshift://channel/7200"
              }
            },
            "pattern": "^timeshift://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_m4f": {
        "type": "object",
        "title": "M4F",
        "properties": {
          "url": {
            "description": "URL to get a stream from m4f source.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "m4f://remote.host.com/example"
              },
              "secure": {
                "value": "m4fs://remote.host.com/example"
              }
            },
            "pattern": "^(m4f|m4fs)://.*$",
            "x-format-description": "input_url"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_copy": {
        "type": "object",
        "title": "Copy source",
        "properties": {
          "url": {
            "description": "URL to connect to the source and get a copy of the original stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "copy://stream1",
            "pattern": "^copy://.*$",
            "x-format-description": "input_url"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_shoutcast": {
        "type": "object",
        "title": "SHOUTcast",
        "properties": {
          "url": {
            "description": "URL to connect to the SHOUTcast source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "shoutcast://remote.host.com/example/shoutcast"
              },
              "secure": {
                "value": "shoutcasts://remote.host.com/example/shoutcast"
              }
            },
            "pattern": "^(shoutcast|shoutcasts)://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_rtp": {
        "type": "object",
        "title": "RTP",
        "properties": {
          "url": {
            "description": "URL to connect to RTP source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "rtp://remote.host.com",
            "pattern": "^rtp://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_m4s": {
        "type": "object",
        "title": "M4S",
        "properties": {
          "url": {
            "description": "URL to get a stream from m4s source.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "m4s://remote.host.com/example"
              },
              "secure": {
                "value": "m4ss://remote.host.com/example"
              }
            },
            "pattern": "^(m4s|m4ss)://.*$",
            "x-format-description": "input_url"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_mosaic": {
        "type": "object",
        "title": "Mosaic",
        "properties": {
          "url": {
            "description": "Special URL to make a mosaic stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "mosaic://cam1,cam2,cam3,cam4?fps=20&preset=ultrafast&bitrate=1024k&size=340x240&mosaic_size=16"
              },
              "mosaic2": {
                "value": "mosaic2://"
              }
            },
            "pattern": "^(mosaic|mosaic2)://.*$",
            "x-format-description": "input_url"
          },
          "bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Bitrate of the audio. \n",
            "x-format-description": "speed"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_publish": {
        "type": "object",
        "title": "Publish",
        "properties": {
          "url": {
            "description": "The publish:// URL used to indicate where this stream started in publish mode.\n\nYou can publish videos to Flussonic using the following URLs:  \n  __RTSP__: rtsp://FLUSSONIC-IP/stream_name  \n  __HTTP MPEG-TS__: http://FLUSSONIC-IP/stream_name/mpegts  \n  __RTMP__: rtmp://flussonic-ip/published or rtmp://flussonic-ip/static/published  \n  __WebRTC__: http://FLUSSONIC-IP/stream_name/whip  \n  __SRT__: srt://FLUSSONIC-IP:SRT_PORT?streamid=#!::r=STREAM_NAME,m=publish\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "publish://",
            "pattern": "^publish://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from SRT input stream.\n",
            "type": "boolean",
            "default": true,
            "example": true
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          },
          "prefer_codec": {
            "$ref": "#/components/schemas/webrtc_prefer_video_codec"
          },
          "prefer_video_codec": {
            "$ref": "#/components/schemas/webrtc_prefer_video_codec"
          },
          "transport": {
            "$ref": "#/components/schemas/webrtc_transport"
          },
          "min_bitrate": {
            "description": "The minimum bitrate threshold, in kbit/s. The default value is 100 kbit/s.",
            "type": "integer",
            "example": 150
          },
          "webrtc_abr": {
            "description": "Whether the adaptive bitrate mechanism is used for WebRTC publications.",
            "type": "boolean",
            "example": true
          },
          "abr_stepup": {
            "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n",
            "type": "integer"
          },
          "abr_correction": {
            "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n",
            "type": "integer",
            "example": 200
          },
          "abr_loss_lower": {
            "type": "number",
            "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n",
            "example": 2
          },
          "abr_loss_upper": {
            "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n",
            "type": "number",
            "example": 10
          },
          "abr_stepdown": {
            "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n",
            "type": "number"
          },
          "abr_mode": {
            "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n",
            "type": "integer",
            "example": 1
          },
          "abr_debug": {
            "description": "Whether adaptive bitrate process is logged.",
            "type": "integer",
            "example": 1
          },
          "abr_cycles": {
            "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n",
            "type": "integer",
            "example": 3
          },
          "abr_max_bitrate": {
            "description": "Maximum bitrate for adjustment process, in kbit/s.\nFlussonic will keep the publication bitrate equal or below of the specified value.\n",
            "type": "integer",
            "default": 2500,
            "example": 1000
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_playlist": {
        "type": "object",
        "title": "Playlist",
        "properties": {
          "url": {
            "description": "URL to get a stream from playlist.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "playlist://remote.host.com/example.m3u8",
            "pattern": "^playlist://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_ndi": {
        "type": "object",
        "title": "NDI",
        "properties": {
          "url": {
            "description": "URL to get a stream from NDI source. Usually NDI software display sources like `My PC (Camera1)`, convert it into `ndi://My PC/Camera1`.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "example": "ndi://hostname/Source1",
            "pattern": "^ndi://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_frip": {
        "type": "object",
        "title": "FRIP",
        "properties": {
          "url": {
            "description": "FRIP input. Can be a cmd if started from `-` or an existing socket.\n",
            "type": "string",
            "format": "input_url",
            "examples": {
              "socket": {
                "value": "frip://hostname/Source1"
              },
              "cmd": {
                "value": "frip://-contrib/devel/simulator.erl"
              }
            },
            "pattern": "^frip://.*$",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "x-format-description": "input_url"
          },
          "socket_dir": {
            "description": "Directory for shmem files\n",
            "type": "string",
            "example": "tmp"
          },
          "shmem_size": {
            "description": "Size of shared memory buffer. Omit to make it auto\n",
            "type": "integer",
            "example": 1024000
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_mxl": {
        "type": "object",
        "title": "MXL",
        "properties": {
          "url": {
            "description": "MXL input - the path to the domain directory.\nAll flows found there will be read and exposed as tracks in the stream.\n",
            "type": "string",
            "examples": {
              "disk_path": {
                "value": "mxl:///path/to/stream"
              }
            },
            "pattern": "^mxl://.*$",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "format": "input_url",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_spts": {
        "type": "object",
        "title": "SPTS",
        "properties": {
          "url": {
            "description": "URL to connect to the SPTS source and get the stream.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "udp://239.0.0.1:1234"
              },
              "udp1": {
                "value": "udp1://239.0.0.1:1234"
              },
              "udp2": {
                "value": "udp2://239.0.0.1:1234"
              },
              "udp3": {
                "value": "udp3://239.0.0.1:1234"
              }
            },
            "pattern": "^(udp|udp1|udp2|udp3)://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_mpts": {
        "type": "object",
        "title": "MPTS",
        "properties": {
          "url": {
            "description": "URL to get a stream from MPTS source.\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "smartcam",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "mpts-udp://239.0.0.1:1234"
              },
              "mpts-http": {
                "value": "mpts-http://239.0.0.1:1234"
              },
              "mpts-https": {
                "value": "mpts-https://239.0.0.1:1234"
              },
              "mpts-dvb": {
                "value": "mpts-dvb://asi_10?program=15"
              },
              "dvb": {
                "value": "dvb://asi_10?program=15"
              }
            },
            "pattern": "^(mpts-udp|mpts-http|mpts-https|mpts-dvb|dvb)://.*$",
            "x-format-description": "input_url"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          },
          "programs": {
            "description": "Choose a program to ingest from an MPEG-TS stream.",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              1
            ]
          },
          "pids": {
            "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n",
            "items": {
              "type": "integer"
            },
            "type": "array",
            "example": [
              211
            ]
          },
          "subtitles": {
            "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n",
            "example": "drop",
            "deprecated": true,
            "x-delete-at": 25.03,
            "enum": [
              "drop",
              "accept",
              "ocr_replace",
              "ocr_add"
            ],
            "type": "string"
          },
          "closed_captions": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "string",
            "description": "The rules for handling the closed captions.\n"
          },
          "scte35": {
            "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n",
            "type": "boolean",
            "default": true,
            "example": true,
            "deprecated": true,
            "x-delete-at": 23.09
          },
          "languages": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "x-key-type": "mpegts_lang_track",
            "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n"
          },
          "teletext_page": {
            "description": "Forces the selection of a specific teletext page for subtitling. \n\nThis is primarily used as a workaround when the source marks subtitle pages as \n`teletext_type = 0x01` (Initial Teletext page). Since an Initial page service \ncan carry multiple pages across different magazines, this parameter ensures \nthe correct one is selected, preventing the auto-detector from picking \nthe wrong subtitle data.\n\nThe value is a 3-digit integer (100-899), where:\n- The first digit is the Magazine number (1-8).\n- The last two digits are the Page number (00-99).\n",
            "type": "integer",
            "example": 888,
            "minimum": 100,
            "maximum": 899
          }
        },
        "required": [
          "url"
        ]
      },
      "stream_input_st2110": {
        "type": "object",
        "title": "SMPTE 2110\n",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "description": "SMPTE 2110 UDP multicast group\n",
            "type": "string",
            "format": "input_url",
            "x-api-allow": [
              "watcher-core",
              "vision-config-external",
              "central-layouter"
            ],
            "examples": {
              "default": {
                "value": "st2110://239.0.0.1:1234"
              },
              "interface": {
                "value": "st2110://eth0@239.0.0.1:1234"
              },
              "bind_ip": {
                "value": "st2110://239.0.0.1:1234/192.168.20.24"
              }
            },
            "pattern": "^st2110://.*$",
            "x-format-description": "input_url"
          },
          "width": {
            "type": "integer",
            "description": "Must specify received pixel width\n"
          },
          "height": {
            "type": "integer",
            "description": "Must specify received pixel height\n"
          },
          "bind_to_core": {
            "type": "integer",
            "description": "Optional bind core\n"
          },
          "comment": {
            "description": "Human-readable description of the input.\n",
            "type": "string",
            "example": "This is a test input"
          },
          "source_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout"
            },
            "anyOf": [
              {
                "type": "integer",
                "format": "seconds",
                "x-format-description": "seconds"
              },
              {
                "enum": [
                  false
                ],
                "type": "boolean"
              }
            ],
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "audio_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.",
            "externalDocs": {
              "description": "Find more information here"
            },
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "video_timeout": {
            "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.",
            "type": "integer",
            "format": "seconds",
            "example": 20,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "max_retry_timeout": {
            "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n",
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "minimum": 1,
            "x-api-allow": [
              "watcher-core"
            ],
            "x-format-description": "seconds"
          },
          "timeout": {
            "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n",
            "type": "integer",
            "example": 10,
            "deprecated": true,
            "x-delete-at": 26.1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "frames_timeout": {
            "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n",
            "type": "integer",
            "example": 3,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "priority": {
            "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority"
            },
            "type": "integer",
            "example": 1,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/input_stats",
            "readOnly": true
          },
          "user_agent": {
            "type": "string",
            "description": "User agent. Can be modified if a protocol allows it.",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "cluster_key": {
            "type": "string",
            "description": "Authorization key used to fetch the stream from another streamer in a cluster."
          },
          "via": {
            "type": "string",
            "format": "agent_url",
            "description": "Agent ID. Used as a proxy to connect to the input server.",
            "x-api-allow": [
              "watcher-core",
              "central-layouter"
            ],
            "x-format-description": "agent://ID identification for `via` configuration option\n"
          },
          "max_bitrate": {
            "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "remote_dvr": {
            "enum": [
              "nochain",
              "chain",
              "none"
            ],
            "type": "string",
            "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n"
          },
          "output_audio": {
            "$ref": "#/components/schemas/output_audio"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Request headers as key-value pairs.",
            "example": {
              "User-Agent": "curl/7.85.0",
              "Authorization": "Basic dXNlcjpwYXNzd29yZA=="
            },
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "no_clients_reconnect_delay": {
            "type": "integer",
            "description": "Skip input start if the stream has no clients."
          },
          "allow_if": {
            "type": "string",
            "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n"
          },
          "deny_if": {
            "type": "string",
            "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n"
          }
        }
      },
      "webrtc_abr_opts": {
        "type": "object",
        "properties": {
          "start_track": {
            "description": "Video track number from which playback starts. Possible values: `v1`, `v2`, `v3` and so on.\n\nIf not specified, or an audio track specified (`start_track=a3`), or a video track number does not exist, \nplayback starts with the track number in the middle of the list (e.g. `v2` if you have tracks `v1`, `v2`, and `v3`) \nand then adjusts to the bandwidth availability.\n\nIf some tracks are excluded by the query parameter `?filter=tracks:...`, Flussonic searches for an available track with a lower number up to v0. \nIf no track with a lower number was found, Flussonic searches for a closest track with a higher number.\n",
            "type": "string",
            "example": "v2"
          }
        }
      },
      "named_by": {
        "type": "string",
        "enum": [
          "config",
          "user",
          "remote",
          "external"
        ]
      },
      "backup_config": {
        "type": "object",
        "properties": {
          "file": {
            "description": "Path to the backup file in a VOD location on the server (**not on the local disk!**). \nThe backup file is played to fill in a time interval when the source is down.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#live-sources-url_file"
            },
            "type": "string",
            "example": "vod/blank.mp4"
          },
          "timeout": {
            "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending frames. \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\nThis option takes any type of frames into account. \n\nIf you do not specify timeout specifically for a fallback source, then in the absence of frames, `source_timeout` of the main source will be used.\n",
            "type": "integer",
            "example": 10
          },
          "audio_timeout": {
            "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending audio frames.",
            "type": "integer",
            "example": 5
          },
          "video_timeout": {
            "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending video frames.",
            "type": "integer",
            "example": 4
          },
          "transcode": {
            "description": "Whether or not to transcode the backup file. Set to `True` by default. \nIf set to `False`, backup file frames will bypass as-is to the output stream.\n\nShould not be set to `False` unless the backup file has the same stream characteristics\nas the live stream.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#live-sources-backup_transcode"
            },
            "type": "boolean",
            "default": true
          },
          "dvr": {
            "description": "Whether or not to record a backup to DVR. \nSet to `False` by default (backup is not recorded).\n",
            "type": "boolean"
          }
        }
      },
      "auth_url": {
        "type": "string"
      },
      "dvr_info": {
        "type": "object",
        "properties": {
          "from": {
            "type": "integer",
            "format": "utc",
            "description": "The UTC timestamp of the first recording in this archive.",
            "example": 1641045644,
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "depth": {
            "type": "integer",
            "format": "seconds",
            "description": "The time interval between the start of the *first* recording segment and the end of the *last* one.",
            "example": 259200,
            "x-format-description": "seconds"
          },
          "ranges": {
            "deprecated": true,
            "x-delete-at": 24.09,
            "description": "The list of DVR ranges. The param is replaced with `ranges_list` method.",
            "items": {
              "$ref": "#/components/schemas/dvr_range"
            },
            "type": "array"
          },
          "bytes": {
            "description": "The size of the recorded archive.",
            "type": "integer",
            "format": "bytes",
            "example": 129600000000,
            "x-format-description": "bytes"
          },
          "disk_size": {
            "description": "The size of the recorded archive. Please, use bytes instead.",
            "type": "integer",
            "format": "bytes",
            "example": 1099511627776,
            "deprecated": true,
            "x-delete-at": 25.07,
            "x-format-description": "bytes"
          },
          "duration": {
            "type": "integer",
            "format": "seconds",
            "description": "A total duration of the recorded segments, excluding recording gaps.\nIt can be smaller than depth if you have gaps.\n",
            "example": 172800,
            "x-format-description": "seconds"
          }
        },
        "required": [
          "from",
          "depth",
          "ranges"
        ]
      },
      "cluster_ingest_config": {
        "type": "object",
        "properties": {
          "capture_at": {
            "description": "Preferred server to run the main stream on.",
            "type": "string"
          }
        }
      },
      "url_prefix": {
        "anyOf": [
          {
            "enum": [
              false
            ],
            "type": "boolean"
          },
          {
            "type": "string"
          }
        ]
      },
      "output_mpegts_pids": {
        "type": "object",
        "properties": {
          "pmt": {
            "$ref": "#/components/schemas/ts_pid"
          },
          "pcr": {
            "$ref": "#/components/schemas/ts_pid"
          },
          "sdt": {
            "$ref": "#/components/schemas/ts_pid"
          },
          "ecm": {
            "$ref": "#/components/schemas/ts_pid"
          },
          "media": {
            "description": "Information about a particular media track.",
            "items": {
              "$ref": "#/components/schemas/transponder_pid"
            },
            "type": "array"
          },
          "default": {
            "description": "The default algorithm of selecting PID for a track.\n\n* `auto`: track PID = PMT PID + track ID, \nwhere PMT PID is the PID of Program Map Table and track ID is a number of the track set by Flussonic \n(usually, all video tracks and then all audio tracks are numbered starting from 1).\n* `increment`: track PID = previous track PID + 1.\n",
            "enum": [
              "auto",
              "increment"
            ],
            "type": "string"
          }
        }
      },
      "output_mpegts_ac3": {
        "type": "string",
        "example": "keep",
        "enum": [
          "system_b",
          "system_a",
          "keep"
        ]
      },
      "video_format": {
        "type": "string",
        "enum": [
          "pal",
          "625i50",
          "ntsc",
          "525i29.97",
          "525i29",
          "720p23.98",
          "720p23",
          "720p24",
          "720p25",
          "720p29.97",
          "720p29",
          "720p30",
          "720p50",
          "720p59.94",
          "720p59",
          "720p60",
          "1080p23.98",
          "1080p23",
          "1080p24",
          "1080p25",
          "1080p29.97",
          "1080p29",
          "1080p30",
          "1080psf23.98",
          "1080psf23",
          "1080psf24",
          "1080psf25",
          "1080psf29.97",
          "1080psf29",
          "1080psf30",
          "1080i50",
          "1080i59.94",
          "1080i60",
          "1080p50",
          "1080p50b",
          "1080p59.94",
          "1080p59",
          "1080p59.94b",
          "1080p59b",
          "1080p60",
          "1080p60b",
          "2160p50",
          "2160p50b",
          "2160p59.94",
          "2160p59",
          "2160p59.94b",
          "2160p59b",
          "2160p60",
          "2160p60b",
          "2160p23",
          "2160p24",
          "2160p25",
          "2160p29",
          "2160p30"
        ]
      },
      "language_value": {
        "type": "string",
        "description": "The language of the teletext received from an SDI card. \nSpecified according to the ISO 639-2 standard.\n",
        "pattern": "^[a-zA-Z]{2,3}",
        "example": "ita"
      },
      "srt_direction": {
        "type": "object",
        "properties": {
          "mode": {
            "description": "The type of SRT sessions expected for the port.",
            "enum": [
              "play",
              "publish"
            ],
            "type": "string"
          }
        },
        "required": [
          "mode"
        ]
      },
      "input_media_info": {
        "allOf": [
          {
            "type": "object",
            "description": "This structure looks like a regular `media_info`, but it is designed to be a\nmatching filter. It will be used as a mask for matching over incoming tracks with\npatterns.\n\nMatched track templates will be used to rewrite settings of input media_info tracks.\n",
            "properties": {
              "tracks": {
                "description": "Just like a regular `track_info`, but with matching rules,\nthat allow to select which input track must be mapped to output\n",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/input_track_info"
                }
              }
            }
          },
          {
            "$ref": "#/components/schemas/media_info_common"
          }
        ]
      },
      "input_track_info": {
        "allOf": [
          {
            "type": "object",
            "description": "Almost the same as track_info, but with match rules for matching with\nother media_info\n",
            "properties": {
              "match": {
                "$ref": "#/components/schemas/input_track_info_match"
              }
            }
          },
          {
            "$ref": "#/components/schemas/track_info_full"
          }
        ]
      },
      "input_track_info_match": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "description": "Select input track language\n",
            "example": "eng"
          },
          "codec": {
            "$ref": "#/components/schemas/frame_codec"
          },
          "index": {
            "type": "integer",
            "description": "SUnfortunately, the sources may change the index of track without notice.\nPlease, use matching by index only and only if no other match option is suitable.\n",
            "example": 2
          }
        }
      },
      "drm_spec": {
        "discriminator": {
          "propertyName": "vendor",
          "mapping": {
            "aes128": "#/components/schemas/drm_vendor_aes128",
            "axinom": "#/components/schemas/drm_vendor_axinom",
            "buydrm": "#/components/schemas/drm_vendor_buydrm",
            "clearkey": "#/components/schemas/drm_vendor_clearkey",
            "conax": "#/components/schemas/drm_vendor_conax",
            "cpix": "#/components/schemas/drm_vendor_cpix",
            "drmtoday": "#/components/schemas/drm_vendor_drmtoday",
            "ezdrm": "#/components/schemas/drm_vendor_ezdrm",
            "ezdrm_classic": "#/components/schemas/drm_vendor_ezdrm_classic",
            "gsdrm": "#/components/schemas/drm_vendor_gsdrm",
            "irdeto": "#/components/schemas/drm_vendor_irdeto",
            "keyos": "#/components/schemas/drm_vendor_keyos",
            "pallycon": "#/components/schemas/drm_vendor_pallycon",
            "playready": "#/components/schemas/drm_vendor_playready",
            "sample_aes": "#/components/schemas/drm_vendor_sample_aes",
            "sample_aes_identity": "#/components/schemas/drm_vendor_sample_aes_identity",
            "solocoo": "#/components/schemas/drm_vendor_solocoo",
            "verimatrix": "#/components/schemas/drm_vendor_verimatrix",
            "widevine": "#/components/schemas/drm_vendor_widevine"
          }
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/drm_vendor_aes128"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_axinom"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_buydrm"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_clearkey"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_conax"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_cpix"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_drmtoday"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_ezdrm"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_ezdrm_classic"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_gsdrm"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_irdeto"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_keyos"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_pallycon"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_playready"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_sample_aes"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_sample_aes_identity"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_solocoo"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_verimatrix"
          },
          {
            "$ref": "#/components/schemas/drm_vendor_widevine"
          }
        ]
      },
      "drm_stats": {
        "type": "object",
        "properties": {
          "vendor": {
            "type": "string",
            "description": "DRM vendor using to encrypt the stream content"
          },
          "keys_count": {
            "type": "integer",
            "description": "Number of DRM keys requested for the stream"
          }
        }
      },
      "drm_system": {
        "enum": [
          "widevine",
          "fairplay",
          "playready"
        ],
        "type": "string"
      },
      "drm_systems": {
        "type": "object",
        "properties": {
          "systems": {
            "description": "This parameter is used to specify applicable DRM systems.\nIf you turned off some of the systems (FairPlay, PlayReady, or Widevine) you should specify the systems that remain in use.\n",
            "items": {
              "$ref": "#/components/schemas/drm_system"
            },
            "type": "array"
          }
        }
      },
      "drm_iv": {
        "type": "object",
        "properties": {
          "iv": {
            "description": "Initialization vector (IV) - an arbitrary number that can be used along with a secret key for data encryption.\nIt is employed only one time in any session.\nThe use of an IV prevents repetition in data encryption, making it more difficult for a hacker to break a cipher.\n\nUsually, IV is received from a DRM provider.\n",
            "type": "string"
          }
        }
      },
      "drm_enc_key_url": {
        "type": "object",
        "properties": {
          "url": {
            "description": "Http link which specifies how to obtain the key. It is URI attribute of HLS manifest EXT-X-KEY method.\n",
            "type": "string"
          }
        }
      },
      "drm_enc_key": {
        "type": "object",
        "properties": {
          "key": {
            "description": "Encryption Key in hex or file. Length must be 128 bit.\n",
            "type": "string",
            "example": "0x76359e1212952a6db42b41eeb94ceb29"
          }
        }
      },
      "drm_base": {
        "type": "object",
        "properties": {
          "keyserver": {
            "description": "DRM key server.",
            "type": "string",
            "example": "https://keyserver1.mycompany.com"
          },
          "resource_id": {
            "description": "The ID of a resource (a stream or a VOD file) in DRM system, usually it is a UUID.\nThe DRM system keeps track of viewing each resource by clients.\n\nA resource ID is automatically generated for each stream or VOD file by Flussonic but it changes after renaming.\nIt is possible to set it manually to attach a stream to a particular resource or to combine several streams into one.\n",
            "type": "string",
            "format": "drm_resource_id",
            "example": "L2sItm6",
            "x-format-description": "drm_resource_id"
          },
          "expires": {
            "description": "Key rotation interval, in minutes.\n\nBy default, Flussonic does not rotate enryption keys.\nSpecify this parameter to enable encryption key rotation and thus to provide a better securtiy.\n",
            "type": "integer"
          },
          "encryption": {
            "description": "If this parameter is set to `full`, all frames are encrypted.\nIf it is set to `sparse` (or empty), only the keyframes are encrypted.\n\nBy default, Flussonic encrypts only key frames. In most cases this is enough to protect the stream from an unauthorized access.\nIt also reduces the power consumption, when decrypting on the client side.\nHowever, some Smart TVs and STBs require all frames to be encrypted.\n",
            "type": "string",
            "default": "sparse",
            "enum": [
              "full",
              "sparse"
            ]
          }
        }
      },
      "drm_cpix_base": {
        "allOf": [
          {
            "$ref": "#/components/schemas/drm_base"
          },
          {
            "$ref": "#/components/schemas/drm_systems"
          },
          {
            "$ref": "#/components/schemas/drm_iv"
          }
        ]
      },
      "drm_keyos_base": {
        "type": "object",
        "properties": {
          "userkey": {
            "description": "A unique identifier of the user\n",
            "type": "string",
            "deprecated": true,
            "x-delete-at": "25.04"
          },
          "content_id": {
            "description": "A unique identifier of the content, used for Widevine DRM.\nBy default, it is equal to the stream name.\n",
            "type": "string"
          },
          "end_user_cert": {
            "description": "Path to end user certificate file.\n",
            "type": "string"
          },
          "end_user_private_key": {
            "description": "Path to end user private key file\n",
            "type": "string"
          }
        }
      },
      "drm_vendor_axinom": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Axinom\n",
                "type": "string",
                "x-atom": true
              },
              "tenant_id": {
                "description": "Axinom Tenant Id",
                "type": "string"
              },
              "management_key": {
                "description": "Axinom Management Key",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_cpix_base"
          }
        ]
      },
      "drm_vendor_solocoo": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Solocoo\n",
                "type": "string",
                "x-atom": true
              },
              "secret": {
                "description": "A part of the keyserver's URL: `https://SITE.solocoo.tv/SITEadmintools/papi/SECRET/method`.\n",
                "type": "string"
              },
              "site": {
                "description": "A part of the keyserver's URL: `https://SITE.solocoo.tv/SITEadmintools/papi/SECRET/method`.\n",
                "type": "string"
              },
              "fp": {
                "description": "Whether to use FairPlay system for key generation.\nIf set to `false`, the requests for FairPlay encryption key are disabled.\n",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_ezdrm": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Ezdrm\n",
                "type": "string",
                "x-atom": true
              },
              "user": {
                "description": "A user name for authorization of a user on a key server.",
                "type": "string"
              },
              "password": {
                "description": "A password for authorization of a user on a key server.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_clearkey": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "Clear Key is a lightweight DRM mode, where decryption keys are provided directly to the player. It’s easy to\nintegrate (simple JSON key/KID), requires minimal infrastructure, and can work via a license URL or with\nclient-embedded keys.\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          },
          {
            "$ref": "#/components/schemas/drm_enc_key"
          }
        ]
      },
      "drm_vendor_conax": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Conax\n",
                "type": "string",
                "x-atom": true
              },
              "user_path": {
                "description": "A custom key server path",
                "type": "string",
                "example": "12345/nks/conax"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          },
          {
            "$ref": "#/components/schemas/drm_systems"
          }
        ]
      },
      "drm_vendor_cpix": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Cpix\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_cpix_base"
          }
        ]
      },
      "drm_vendor_drmtoday": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: DRMtoday\n",
                "type": "string",
                "x-atom": true
              },
              "auth_server": {
                "description": "Authentication server for DRMtoday.",
                "type": "string",
                "example": "https://auth.drmtoday.com"
              },
              "merchant_id": {
                "description": "The uuid of the merchant at DRMtoday.",
                "type": "string"
              },
              "cpix_config_id": {
                "description": "The uuid of the CPIX/SPEKE ingest configuration",
                "type": "string"
              },
              "username": {
                "description": "The login name of an API account.",
                "type": "string"
              },
              "password": {
                "description": "A password for API account.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_cpix_base"
          }
        ]
      },
      "drm_vendor_pallycon": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Pallycon\n",
                "type": "string",
                "x-atom": true
              },
              "enc_token": {
                "description": "An API authentication token that is generated when you sign up for the PallyCon service at https://login.pallycon.com/.\n",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_cpix_base"
          }
        ]
      },
      "drm_vendor_keyos": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "KeyOs\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_keyos_base"
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_verimatrix": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Verimatrix\n",
                "type": "string",
                "x-atom": true
              },
              "user_keyserver": {
                "description": "The URL sent to the client for watching the content.",
                "type": "string",
                "example": "https://public-keyserver.mycompany.com"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_irdeto": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Irdeto\n",
                "type": "string",
                "x-atom": true
              },
              "account_id": {
                "description": "ID of the Irdeto DRM account.",
                "type": "string"
              },
              "ic_host": {
                "description": "A hostname of Irdeto DRM key server.",
                "type": "string"
              },
              "password": {
                "description": "A password for authorization of a user on a key server.",
                "type": "string"
              },
              "user_name": {
                "description": "A user name of the Irdeto DRM user.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_cpix_base"
          }
        ]
      },
      "drm_vendor_gsdrm": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: GS DRM\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_aes128": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Aes128\n",
                "type": "string",
                "x-atom": true
              },
              "hls_ext_x_key_iv": {
                "description": "This parameter is used for encryption of HLS streams.\nFor successful playback of an AES128 encrypted HLS streams on some modern devices (running on Tizen 5),\nset this pareameter to `false`.\n",
                "type": "boolean"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_sample_aes": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Sample AES\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_sample_aes_identity": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "Sample AES which uses KEYFORMAT=identity. It allows to encrypt and decrypt content using clear text AES key.\nThe identity value for KEYFORMAT should be used only for testing.\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_iv"
          },
          {
            "$ref": "#/components/schemas/drm_enc_key"
          },
          {
            "$ref": "#/components/schemas/drm_enc_key_url"
          }
        ]
      },
      "drm_vendor_widevine": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Widevine\n",
                "type": "string",
                "x-atom": true
              },
              "aes_key": {
                "description": "AES (Advanced Encryption Standard) key. Used for Widevine DRM.\n",
                "type": "string"
              },
              "signer": {
                "description": "A unique ID of the signer.\nFlussonic uses it to connect to the key server when using test key for Widevine DRM.\n",
                "externalDocs": {
                  "description": "Find more information here",
                  "url": "https://flussonic.com/doc/drm-widevine/"
                },
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          },
          {
            "$ref": "#/components/schemas/drm_iv"
          }
        ]
      },
      "drm_vendor_buydrm": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "BuyDRM\n",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_keyos_base"
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_ezdrm_classic": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Ezdrm classic\n",
                "type": "string",
                "x-atom": true
              },
              "user": {
                "description": "A user name for authorization of a user on a key server.",
                "type": "string"
              },
              "password": {
                "description": "A password for authorization of a user on a key server.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "drm_vendor_playready": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "vendor"
            ],
            "properties": {
              "vendor": {
                "description": "FIXME: Playready\n",
                "type": "string",
                "x-atom": true
              },
              "keyseed": {
                "description": "An arbitrary Base64-encoded string of 30 bytes.\nIt is necessary for PlayReady to create an encryption key.\n",
                "type": "string"
              },
              "la_url": {
                "description": "License URL, used for PlayReady DRM.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              }
            }
          },
          {
            "$ref": "#/components/schemas/drm_base"
          }
        ]
      },
      "transponder_push": {
        "properties": {
          "url": {
            "description": "Push URL for the MPTS stream. Usually it is a `udp://` multicast address and port.\n",
            "type": "string"
          },
          "multicast_loop": {
            "description": "The multicast socket option that enables ingesting the sent data back to the transponder.\nUse for test purposes, e.g. if the same server creates MTPS and splits MPTS to separate programs.\n",
            "type": "boolean",
            "default": true
          },
          "tos": {
            "description": "ToS byte in the IP packages of the multicasted data.",
            "type": "integer",
            "default": 0
          },
          "standby": {
            "description": "Monitoring multicast group and stop pushing if another publisher presented",
            "type": "boolean"
          },
          "stats": {
            "$ref": "#/components/schemas/push_counters",
            "readOnly": true
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "ts_descriptor": {
        "type": "object",
        "properties": {
          "tag": {
            "type": "integer",
            "description": "Identifier of the descriptor."
          },
          "hex": {
            "type": "string",
            "format": "hexbinary",
            "description": "Descriptor data.",
            "x-format-description": "hexbinary"
          }
        },
        "required": [
          "tag",
          "hex"
        ]
      },
      "ts_timeouts": {
        "type": "object",
        "properties": {
          "service_type": {
            "type": "integer",
            "description": "The type of the program."
          },
          "media_info": {
            "type": "integer",
            "description": "The timeout value."
          }
        }
      },
      "ts_service_type": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "string",
            "enum": [
              "none",
              "digital_tv",
              "digital_radio",
              "teletext",
              "nvod_reference",
              "nvod_shifted",
              "mosaic",
              "fm_radio",
              "dvb_srm",
              "digital_radio_aac",
              "mosaic_avc",
              "data",
              "common_interface",
              "rcs_map",
              "rcs_fls",
              "dvb_mhp",
              "digital_tv_mpeg2_hd",
              "digital_tv_avc_sd",
              "nvod_shifted_avc_sd",
              "nvod_reference_avc_sd",
              "digital_tv_avc_hd",
              "digital_tv_avc_stereo_hd",
              "nvod_shifted_avc_stereo_hd",
              "nvod_reference_avc_stereo_hd",
              "digital_tv_hevc",
              "digital_tv_hevc_uhd"
            ]
          }
        ]
      },
      "ts_versions": {
        "type": "object",
        "properties": {
          "psi": {
            "$ref": "#/components/schemas/psi_version"
          },
          "pat": {
            "$ref": "#/components/schemas/psi_version"
          },
          "pmt": {
            "$ref": "#/components/schemas/psi_version"
          },
          "nit": {
            "$ref": "#/components/schemas/psi_version"
          },
          "sdt": {
            "$ref": "#/components/schemas/psi_version"
          },
          "cat": {
            "$ref": "#/components/schemas/psi_version"
          }
        }
      },
      "transponder_time_offset": {
        "type": "object",
        "required": [
          "country"
        ],
        "properties": {
          "country": {
            "description": "The country code.",
            "type": "string"
          },
          "region": {
            "description": "The region code.",
            "type": "integer"
          },
          "time_of_change": {
            "$ref": "#/components/schemas/iso8601"
          },
          "local_time_offset": {
            "description": "The current offset time from UTC.",
            "type": "string"
          },
          "next_time_offset": {
            "description": "The next offset time after the change.",
            "type": "string"
          }
        }
      },
      "ts_eit_intervals": {
        "type": "object",
        "properties": {
          "actual": {
            "description": "Period for the actual transponder.",
            "type": "integer"
          },
          "other": {
            "description": "Period for the other transponder.",
            "type": "integer"
          }
        }
      },
      "transponder_eit": {
        "type": "object",
        "properties": {
          "max_bitrate": {
            "description": "Maximum bitrate for the transponder's EIT EPG.",
            "type": "integer",
            "format": "max_bitrate",
            "x-format-description": "max_bitrate"
          },
          "xmltv_url": {
            "description": "Directory for storing the XMLTV EPG files.",
            "type": "string",
            "example": "xmltv_dir"
          },
          "keep_epg": {
            "description": "Period for storing the XMLTV files.",
            "type": "integer",
            "format": "seconds",
            "x-format-description": "seconds"
          },
          "intervals_pf": {
            "$ref": "#/components/schemas/ts_eit_intervals"
          },
          "intervals_schedule": {
            "$ref": "#/components/schemas/ts_eit_intervals"
          }
        }
      },
      "transponder_program": {
        "type": "object",
        "properties": {
          "program_id": {
            "$ref": "#/components/schemas/program_id",
            "x-primary-key": true
          },
          "source": {
            "description": "The stream that is in use as the program source.",
            "type": "string",
            "format": "media_name",
            "openmetrics_label": "source",
            "example": "hockey1",
            "x-format-description": "media_name"
          },
          "lcn": {
            "description": "Logical channel number.",
            "type": "integer",
            "example": 5
          },
          "service_type": {
            "$ref": "#/components/schemas/ts_service_type"
          },
          "title": {
            "description": "The program title.",
            "type": "string",
            "example": "ProgramTitle"
          },
          "pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "eit_title": {
            "description": "The name of the EIT.",
            "type": "string",
            "example": "EIT_Title"
          }
        },
        "required": [
          "program_id"
        ]
      },
      "transponder_config": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "description": "The name of the transponder.",
            "type": "string",
            "format": "media_name",
            "x-primary-key": true,
            "readOnly": true,
            "openmetrics_label": "name",
            "example": "multiplexer",
            "x-format-description": "media_name"
          },
          "pushes": {
            "description": "The list of pushes for the transponder.",
            "items": {
              "$ref": "#/components/schemas/transponder_push"
            },
            "type": "array"
          },
          "bitrate": {
            "description": "Transponder bitrate.",
            "type": "integer",
            "format": "speed",
            "x-format-description": "speed"
          },
          "provider": {
            "description": "Provider of the transponder.",
            "type": "string",
            "example": "Example Provider"
          },
          "network_name": {
            "description": "The name of the TV network.",
            "type": "string",
            "example": "Example Network"
          },
          "ts_stream_id": {
            "description": "The identifier of the transport stream for the transponder.",
            "type": "integer"
          },
          "network_id": {
            "description": "Identifier of the delivery network.",
            "type": "integer"
          },
          "original_network_id": {
            "description": "Identifier of the original delivery network. The same original network is used for NIT and SDT.",
            "type": "integer"
          },
          "ts_descriptors": {
            "description": "The list of transport stream descriptors. Descriptors are added to NIT and SDT.",
            "items": {
              "$ref": "#/components/schemas/ts_descriptor"
            },
            "type": "array"
          },
          "timeouts": {
            "$ref": "#/components/schemas/ts_timeouts"
          },
          "programs": {
            "description": "The list of programs in the transponder.",
            "items": {
              "$ref": "#/components/schemas/transponder_program"
            },
            "type": "array"
          },
          "time_offsets": {
            "description": "The list of time offsets.",
            "items": {
              "$ref": "#/components/schemas/transponder_time_offset"
            },
            "type": "array"
          },
          "versions": {
            "$ref": "#/components/schemas/ts_versions"
          },
          "others": {
            "description": "The list of other transponders on the network.",
            "items": {
              "$ref": "#/components/schemas/transponder_other"
            },
            "type": "array"
          },
          "eit": {
            "$ref": "#/components/schemas/transponder_eit"
          },
          "prebuffer": {
            "description": "The length of the multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n",
            "type": "integer",
            "format": "milliseconds",
            "default": 300,
            "example": 800,
            "x-format-description": "milliseconds"
          },
          "video_buffer": {
            "description": "Target maximum video buffering time.\nLower values reduce latency, but require more stable transport and decoder behavior.\nThe minimum safe value depends on bitrate, frame sizes, transport conditions, and decoder behavior.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 1000,
            "x-format-description": "milliseconds"
          },
          "stats": {
            "$ref": "#/components/schemas/multiplexer_stats",
            "readOnly": true
          }
        }
      },
      "transponder_other": {
        "type": "object",
        "properties": {
          "name": {
            "description": "The name of the other transponder on the network.",
            "type": "string",
            "format": "media_name",
            "x-primary-key": true,
            "readOnly": true,
            "x-format-description": "media_name"
          }
        },
        "required": [
          "name"
        ]
      },
      "peer_stats": {
        "allOf": [
          {
            "$ref": "#/components/schemas/server_stats_whoami"
          },
          {
            "$ref": "#/components/schemas/server_stats_streamer"
          },
          {
            "$ref": "#/components/schemas/server_stats_network"
          },
          {
            "type": "object",
            "properties": {
              "error": {
                "description": "Description of an error, if any.",
                "type": "string",
                "x-api-allow": [
                  "central-layouter"
                ]
              },
              "predictions": {
                "type": "object",
                "description": "Predictions of future stats based on the current state of the cluster.\n",
                "properties": {
                  "disk": {
                    "$ref": "#/components/schemas/central_disk_predictions"
                  }
                }
              }
            }
          }
        ]
      },
      "peer_config": {
        "type": "object",
        "properties": {
          "hostname": {
            "type": "string",
            "format": "server_name",
            "description": "Streamer's identifier in the cluster.\n\nThe managing server may try using this hostname to access the streamer \nif API URL is not specified.\n",
            "x-primary-key": true,
            "example": "peer.example.com",
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "server_name"
          },
          "stats": {
            "$ref": "#/components/schemas/peer_stats",
            "readOnly": true
          },
          "api_url": {
            "type": "string",
            "format": "url",
            "example": "http://streamer.local:8080",
            "description": "The URL for provisioning of configuration from the managing server to the streamer.\nThis URL does not have to be public but must be accessible from the managing server.\n\nThe API URL can also be used as Public and/or Private payload URL if they are not set.\nWhen used as Public payload URL, the API URL shall be public to allow playback from this streamer.\n",
            "x-format-description": "url"
          },
          "public_payload_url": {
            "description": "Clients will be redirected to this URL and port when requesting (via UI or shared URL)\nfor playback of camera captured on this streamer. \nThis URL shall be accessible from the Internet and conform to the specifications of the FQDN.\n\nIf not specified, API URL is used.\n",
            "type": "string",
            "example": "http://public.example.com"
          },
          "private_payload_url": {
            "description": "The internal address for video transfer between streamers in a local network.\nIf not specified, API URL is used. \n\nThe Private payload URL will be used when accessing archive of a stream \nthat is currently ingested on other streamer due to layout change.\nOr, when other streamer restreams a camera from this streamer. \n",
            "type": "string",
            "format": "url",
            "example": "http://streamer.local",
            "x-format-description": "url"
          },
          "fetch_timeout": {
            "description": "How often the peer will try to get the data from the remote server via internal API.",
            "type": "integer",
            "format": "milliseconds",
            "example": 1000,
            "x-format-description": "milliseconds"
          },
          "stale_timeout": {
            "description": "The time after which deleted streams on this server are considered to be inactive \nand cannot be used in the `cluster_ingest` mechanism.\n",
            "type": "integer",
            "format": "milliseconds",
            "example": 1000,
            "x-format-description": "milliseconds"
          },
          "channel_limit": {
            "description": "Maximal number of streams.",
            "type": "integer",
            "example": 5,
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "cpu_limit": {
            "description": "CPU limit in percents.",
            "type": "integer",
            "format": "percent",
            "example": 10,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "cluster_key": {
            "description": "The key for authorization for inter-Flussonic connections.\nAll cluster peers should have the same cluster key.\n",
            "type": "string",
            "example": "xS6i6Q3DCc5nEvnu",
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "max_bitrate": {
            "description": "Maximal output bitrate of the peer.",
            "type": "integer",
            "format": "speed",
            "deprecated": true,
            "x-delete-at": 23.09,
            "x-format-description": "speed"
          }
        }
      },
      "balancer_config": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "format": "media_name",
            "description": "Globally unique balancer name.",
            "readOnly": true,
            "x-primary-key": true,
            "x-format-description": "media_name"
          },
          "servers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/balancer_server_config"
            },
            "description": "Balancer will distribute requests between these servers."
          },
          "mode": {
            "description": "Balancing mode",
            "type": "string",
            "default": "bitrate",
            "enum": [
              "usage",
              "clients",
              "bitrate",
              "streams"
            ]
          }
        }
      },
      "balancer_server_config": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Hostname of the peer. Can refer to globally defined peer.\n",
            "format": "server_name",
            "x-primary-key": true,
            "x-format-description": "server_name"
          },
          "max_bitrate": {
            "type": "integer",
            "format": "speed",
            "description": "Maximum allowed bitrate, request is redirecting if current bitrate is lower.",
            "x-format-description": "speed"
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "iso3166",
              "x-format-description": "iso3166"
            },
            "description": "Client will be redirected to the peer if its IP belongs to one of these countries."
          },
          "countries_default": {
            "type": "boolean",
            "default": false,
            "description": "This flag allows to redirect a request to this peer if \"countries\" list not matched."
          }
        }
      },
      "source_config": {
        "type": "object",
        "properties": {
          "url": {
            "description": "URL and port of the remote server to get streams from.",
            "type": "string",
            "format": "hostport",
            "x-primary-key": true,
            "pattern": "^(m4f:|m4fs:|m4s:|m4ss:).+",
            "x-format-description": "Hostname with port"
          },
          "prefix": {
            "description": "The prefix used for the streams on the remote server from which the peer gets them.\n",
            "type": "string",
            "format": "media_name",
            "x-format-description": "media_name"
          },
          "stats": {
            "$ref": "#/components/schemas/peer_stats"
          },
          "only": {
            "description": "White list of streams. \nThe items of the array may be individual stream names or values like `prefix/*`\nwhich stands for all streams with the given prefix.\n",
            "type": "array",
            "items": {
              "type": "string",
              "format": "media_name",
              "x-format-description": "media_name"
            }
          },
          "except": {
            "description": "Black list of streams. Higher priority than `only`.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "media_name",
              "x-format-description": "media_name"
            }
          },
          "group_config": {
            "description": "Configuration applied to the specific group of streams (all or limited by `only` and `except`) received from the sources.",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/source_group_config"
            },
            "x-key-type": "string"
          },
          "cluster_key": {
            "description": "Cluster ingest stream key.",
            "type": "string"
          },
          "clients_timeout": {
            "description": "Stream's lifetime after the last client was disconnected (can be expressed in *seconds* or set to `False`). \nApplicable to on-demand streams **only**.      \n",
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "boolean"
              }
            ],
            "example": 485,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "retry_limit": {
            "description": "Number of attempts for the server to reconnect to a data source.\nApplicable to on-demand streams **only**. If not defined, server will constantly try to reconnect (unlimited number of retries). \nIf the input does not become active after specified amount of attempts, stream shuts down till the next user request.\n",
            "type": "integer",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "transcoder": {
            "$ref": "#/components/schemas/transcoder_opts"
          },
          "thumbnails": {
            "$ref": "#/components/schemas/thumbnails_spec"
          },
          "jpeg_snapshot_sign_key": {
            "description": "A key to sign jpeg_snapshot requests.\nGenerating jpeg snapshots is a resource-intensive task.\nTo prevent DoS attacks by users, each request has to be signed by middleware\nto have control over resource consumption.\nThis parameter contains a token from the middleware to ensure\nthis request for JPEG generation is approved.\nFormat is <valid_till>_<Sha256Hash>\nvalid_till is UNIX time (seconds) when this token expires.\n```\nSha256Hash = sha256(str(valid_till) + \":\" + jpeg_snapshot_sign_key + \"@\" + name + \"/\" + \"snapshot-\" + str(pts) + \"-\" + size + \".jpg\")\n```\njpeg_snapshot_sign_key is a part of stream configuration\nFor example, when valid_till=1732200743, jpeg_snapshot_sign_key=\"TopSecret\", name=\"test\", pts=1732200271444, size=\"320x240\"\nsign would be 1732200743_176b3f0349c59f2d4561c8d1f82be90416cc8144b0ef0598856c4cf0d34d4dd8\n",
            "type": "string",
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "dvr": {
            "$ref": "#/components/schemas/stream_dvr_spec"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "on_publish": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "drm": {
            "$ref": "#/components/schemas/drm_spec"
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "track_filter": {
            "description": "Configuration for filtering tracks based on named track filter rules.\nAllows to restrict available tracks for specific devices to prevent playback issues.\n\nEach track filter rule has a name, a match block with conditions (user_agent for example), and filter constraints.\nAll rules that have matching conditions are applied.\nIf no rule matches, all tracks are available.\n",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/track_filter_rule"
            },
            "x-key-type": "string"
          },
          "prepush": {
            "description": "The time (in seconds) that Media Server reserves for preloading the data, i. e. *buffering*.\nPrepush is always defined through GoP, but this option provides you with a more flexible way\nto configure the buffer size, e. g. a 1-3 or 7-10 seconds time interval.\n\nThe bigger the buffer size, the better the user experience is for the users\nwith a bad internet connection. However, the latency also increases.\n\nIf set to `False` to remove the latency, the stream's start time \nincreases. To decrease it, reduce the GoP size and make the bitrate higher \nor the video quality lower.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/technology-glossary/#glossary-prepush"
            },
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "integer"
              }
            ],
            "example": false,
            "x-api-allow": [
              "watcher-core"
            ]
          },
          "segment_count": {
            "description": "Number of segments stored in memory for the segment-based protocols, such as HLS and DASH.\nAdded to HLS live manifest. Do not forget that one more segment is stored for stale clients\nthat come too late, but the latest segment is not shown in the manifest.\n",
            "type": "integer",
            "example": 4
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "chunk_duration": {
            "description": "Chunk duration in LL-HLS manifest to be used for tunning latency.",
            "type": "integer",
            "format": "milliseconds",
            "example": 200,
            "x-format-description": "milliseconds"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "hls_scte35": {
            "description": "Whether to enable SCTE-35 ad insertion markers signaling in HLS manifest.\nAd markers can be included in SCTE-35 (`scte35`), AWS (`aws`), EXT-X-DATERANGE (`rfc8216`) formats or not included (`false`).\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/advertisement-scte-markers/",
              "type": "string"
            },
            "example": "scte35",
            "enum": [
              "aws",
              "scte35",
              "rfc8216"
            ],
            "type": "string"
          },
          "add_audio_only": {
            "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/what-is-live-stream/#live-audio_only_hls"
            },
            "type": "boolean",
            "example": true
          },
          "webrtc_abr": {
            "$ref": "#/components/schemas/webrtc_abr_opts"
          },
          "pushes": {
            "description": "A list of pushes. When a server initiates the connection and sends a stream \nto other server(s), it is called a `push`.      \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/push-video-from-media-server/"
            },
            "items": {
              "$ref": "#/components/schemas/stream_push"
            },
            "type": "array",
            "x-api-allow": [
              "watcher-core",
              "watcher-admin"
            ]
          },
          "mpegts_pids": {
            "$ref": "#/components/schemas/output_mpegts_pids"
          },
          "labels": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 40,
              "minLength": 1,
              "format": "unix_name",
              "x-format-description": "Contains only alphanumeric characters (a-z, A-Z, 0-9), underscores (_), hyphens (-) and periods (.).",
              "pattern": "^[a-zA-Z0-9_.-]+$"
            },
            "maxItems": 10,
            "x-key-type": "string",
            "description": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n",
            "x-api-description": {
              "central": "Stream labels in key value format.\n\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nSee [Layouter schema](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Clabels)\nfor more details.\n",
              "central-layouter": "Stream labels in key value format.\nKey is a string in unix_name format (alphanumeric characters, underscores, hyphens and periods).\n\nYou can use labels to control the stream layout.\n\nNote, that if you are using a multi-stream agent (i.e. multiple streams use the same agent in their inputs),\nthen the labels of these streams **must** be the same. Otherwise, one or more streams will not work.\n\nLayouter can process next labels:\n\n- With `required_` prefix. If stream has a `required_x=y` label, Layouter will provision stream only to nodes with the label `x=y`.\nIf there are no available nodes with the label `x=y`, then the stream will not be provisioned.\nUse `required_` labels to avoid running streams in an unsuitable environment.\n- With `preferred_` prefix. If stream has a `preferred_x=y` label, Layouter will prefer nodes with the label `x=y` to nodes without this label.\nIf there are no available nodes with the label `x=y`, then the stream will be provisioned to any other node.\nUse `preferred_` labels to optimize layout without the risk of downtime.\n\n**Use cases**\n\n1. Suppose you have a server used to test new hardware models, and you want the new streams to be provisioned only to the test nodes.\nTo provide this layout you can add the `required_env=test` label for stream and the `env=test` label for test nodes.\n\n2. Suppose you have two servers in different cities *N* and *M*, with expensive traffic between them, and cameras in city *N*.\nIn such a case, if it is important for you to preserving video recording in case node *N* fails, you can use `preferred_` labels.\nTo provide this layout you can add the `preferred_location=N` label for stream and the `location=N` label for node(-s) in city *N*.\nThen, in case of failure of node *N* - streams will be distributed to node *M*. When node *N* is back up and running, the streams will return to it.\n"
            },
            "examples": [
              {
                "key1": "value1",
                "key2": "value2"
              },
              {
                "required_env": "test",
                "location": "eu"
              },
              {
                "preferred_location": "eu"
              }
            ],
            "x-api-allow": [
              "watcher-core",
              "central-layouter",
              "watcher-admin"
            ]
          },
          "playback_headers": {
            "description": "This parameter sets playback HTTP headers for streams.\n",
            "items": {
              "$ref": "#/components/schemas/playback_headers"
            },
            "maxItems": 10,
            "type": "array"
          },
          "cluster_ingest": {
            "$ref": "#/components/schemas/cluster_ingest_config"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "meta": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "The param is deprecated and now used only for onvif_url and onvif_profile options.",
            "deprecated": true,
            "x-delete-at": 23.12
          },
          "vision": {
            "$ref": "#/components/schemas/vision_spec"
          }
        }
      },
      "source_group_config": {
        "type": "object",
        "properties": {
          "name": {
            "description": "Tha name of the source group.",
            "type": "string",
            "format": "group_name",
            "x-format-description": "group_name"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "dvr": {
            "$ref": "#/components/schemas/stream_dvr_spec"
          }
        }
      },
      "logo_file": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The logo name."
          },
          "stream_names": {
            "description": "List of streams that use this logo",
            "type": "array",
            "items": {
              "type": "string"
            },
            "readOnly": true
          },
          "content": {
            "description": "Payload of this logo",
            "type": "string",
            "format": "byte",
            "x-format-description": "byte"
          },
          "content_type": {
            "description": "Content type of this logo. Calculated from file name extension\n",
            "type": "string",
            "readOnly": true
          }
        }
      },
      "disk_file": {
        "type": "object",
        "properties": {
          "name": {
            "description": "The file or directory name.",
            "type": "string",
            "format": "media_name",
            "examples": {
              "default": {
                "value": "vod/bunny.mp4"
              },
              "bunny1": {
                "value": "vod/bunny1.mp4"
              },
              "bunny2": {
                "value": "vod/bunny2.mp4"
              },
              "bunny3": {
                "value": "vod/bunny3.mp4"
              }
            },
            "x-format-description": "media_name"
          },
          "prefix": {
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "type": "string",
            "format": "media_name",
            "examples": {
              "default": {
                "value": "vod"
              },
              "bunny1": {
                "value": "vod1"
              },
              "bunny2": {
                "value": "vod2"
              },
              "bunny3": {
                "value": "vod3"
              }
            },
            "x-format-description": "media_name"
          },
          "url": {
            "description": "URL of the file or directory.",
            "type": "string",
            "examples": {
              "default": {
                "value": "/storage/bunny.mp4"
              },
              "bunny1": {
                "value": "/storage/bunny1.mp4"
              },
              "bunny2": {
                "value": "/storage/bunny2.mp4"
              },
              "bunny3": {
                "value": "/storage/bunny3.mp4"
              }
            }
          },
          "folder": {
            "description": "Name of the folder containing the file or directory.",
            "type": "string",
            "example": "example"
          },
          "subpath": {
            "description": "Subpath to the file or directory in the storage.",
            "type": "string",
            "examples": {
              "default": {
                "value": "bunny.mp4"
              },
              "bunny1": {
                "value": "bunny1.mp4"
              },
              "bunny2": {
                "value": "bunny2.mp4"
              },
              "bunny3": {
                "value": "bunny3.mp4"
              }
            }
          },
          "bytes": {
            "description": "File size in bytes.",
            "type": "integer",
            "example": 42309561
          },
          "is_directory": {
            "description": "Whether it is a directory.",
            "type": "boolean",
            "default": false,
            "example": false
          },
          "is_multibitrate_directory": {
            "description": "Whether it is a directory with multi-bitrate content.",
            "type": "boolean",
            "default": false,
            "example": false
          },
          "opened": {
            "description": "Whether the file or directory is currently opened.",
            "type": "boolean",
            "default": false,
            "example": true
          },
          "stats": {
            "$ref": "#/components/schemas/disk_file_stats"
          }
        }
      },
      "disk_file_stats": {
        "type": "object",
        "properties": {
          "worker_count": {
            "description": "Number of worker threads on the server executing the task of playing the file.",
            "type": "integer",
            "example": 1
          },
          "client_count": {
            "description": "Number of clients playing the file.",
            "type": "integer",
            "format": "client_count",
            "examples": {
              "default": {
                "value": 2
              },
              "bunny1": {
                "value": 1
              },
              "bunny2": {
                "value": 10
              },
              "bunny3": {
                "value": 5
              }
            },
            "x-format-description": "client_count"
          },
          "bytes_in": {
            "description": "Number of bytes read from the disk.",
            "type": "integer",
            "format": "bytes",
            "example": 1700923231,
            "x-format-description": "bytes"
          },
          "bytes_out": {
            "description": "Number of bytes downloaded form the disk.",
            "type": "integer",
            "format": "bytes",
            "example": 1700923231,
            "x-format-description": "bytes"
          },
          "media_info": {
            "$ref": "#/components/schemas/media_info"
          },
          "vod_file_error": {
            "$ref": "#/components/schemas/vod_file_error"
          }
        }
      },
      "vod_storage": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The storage (on the disk or on another server) that Flussonic will scan for VOD files.\nIf it is a path on the disk, it should be specified relating to the disk root.\n\nIt is possible to specify multiple storages for one VOD location. When Flussonic gets the URL for playing the file, it finds the prefix in this URL, \ncuts the path after it and consequently searches for this path in all specified storages.\n",
            "example": "/storage"
          },
          "extra": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Some additional options."
          }
        }
      },
      "vod_config": {
        "type": "object",
        "properties": {
          "prefix": {
            "description": "The unique name of VOD location. \n\nIt is used as a prefix in file playback requests to explicitly specify where the system should find the files for playing. \nAll the path after the prefix will be cut and added to the specified path on the disk (the storage configured for this VOD location). \nThus, the system will find the file on the disk and play it.\n",
            "type": "string",
            "format": "media_name",
            "x-primary-key": true,
            "example": "movies",
            "x-format-description": "media_name"
          },
          "auto_mbr": {
            "description": "Turns on automatic creation of a multi-bitrate HLS playlist from several files with different bitrates.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/play-mbr-vod-with-auto-mbr/"
            },
            "type": "boolean",
            "default": false
          },
          "position": {
            "type": "integer",
            "format": "sort_index",
            "description": "If an order of VOD locations is declared, it is a position of the this VOD location in the order.",
            "x-notice": "only for stream",
            "example": 1,
            "x-format-description": "sort_index"
          },
          "disabled": {
            "description": "Whether this VOD location is disabled.",
            "type": "boolean",
            "example": false
          },
          "storages": {
            "description": "The directories (on disk or on another server) that Flussonic scans for VOD files.",
            "items": {
              "$ref": "#/components/schemas/vod_storage"
            },
            "type": "array"
          },
          "on_play": {
            "$ref": "#/components/schemas/auth_spec"
          },
          "cache": {
            "$ref": "#/components/schemas/cache_spec"
          },
          "read_queue": {
            "description": "The number of simultaneous readers form disk that should wait in a queue for playing a file.",
            "type": "integer",
            "example": 100
          },
          "thumbnails": {
            "$ref": "#/components/schemas/thumbnails_spec"
          },
          "download": {
            "description": "Enables downloading files from the URL `http://FLUSSONIC-IP:80/vod_prefix/file_subpath.mp4`. \nThe `Range` HTTP headers are supported.\n",
            "type": "boolean",
            "default": false,
            "example": false
          },
          "protocols": {
            "$ref": "#/components/schemas/play_protocols_spec"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "segment_duration": {
            "$ref": "#/components/schemas/segment_duration"
          },
          "logo": {
            "$ref": "#/components/schemas/web_logo_spec"
          },
          "timeout": {
            "description": "The time (in milliseconds) passed since the last file request.\nIf the file was not requested within this period, it will be closed and its resources will be deallocated.\n",
            "type": "integer",
            "example": 3
          },
          "drm": {
            "$ref": "#/components/schemas/drm_spec"
          },
          "add_audio_only": {
            "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.\nAdd audio-only HLS playlist to variant MBR playlist for iOS compliant streaming.\n",
            "type": "boolean",
            "example": false
          },
          "provider": {
            "description": "Human-readable name of the content provider. Applicable to MPEG-TS.",
            "type": "string"
          }
        }
      },
      "vod_file_error": {
        "type": "string",
        "enum": [
          "enoent",
          "bad_media_info",
          "unknown"
        ],
        "description": "Normalized error code for failures when Flussonic opens or reads a media file:\n- `enoent` - the file was not found or could not be opened on any tried storage.\n- `bad_media_info` - file was reachable but is not valid playable media.\n- `unknown` - the reason could not be mapped to the above\n"
      },
      "dvb_card_config": {
        "type": "object",
        "properties": {
          "name": {
            "description": "DVB card name.",
            "type": "string",
            "format": "dvb_card_name",
            "x-primary-key": true,
            "readOnly": true,
            "openmetrics_label": "name",
            "example": "a16",
            "x-format-description": "dvb_card_name"
          },
          "hw": {
            "description": "Adapter card hardware type.",
            "type": "string",
            "enum": [
              "dvb",
              "dektec_asi",
              "record_input",
              "resi",
              "tbs6014"
            ],
            "example": "dvb"
          },
          "system": {
            "description": "Adapter type. Different systems are supported besides DVB, as the configuring is similar.",
            "type": "string",
            "enum": [
              "dvbs",
              "dvbs2",
              "dvbt",
              "dvbt2",
              "dvbca",
              "dvbcb",
              "dvbcc",
              "atsc",
              "isdbt"
            ]
          },
          "adapter": {
            "description": "Adapter number.",
            "type": "integer",
            "example": 16
          },
          "device": {
            "description": "Modulator number in adapter.",
            "type": "integer"
          },
          "frontend": {
            "description": "Frontend number.",
            "type": "integer"
          },
          "frequency": {
            "description": "The carrier frequency of the transponder for this channel, in Hz.",
            "type": "integer",
            "example": 11606
          },
          "symbol_rate": {
            "description": "The symbol rate of the transponder, in symbols per second.\nA symbol is a pulse in digital baseband transmission.\n",
            "type": "integer",
            "example": 27500
          },
          "int_freq": {
            "description": "Base frequency, in MHz.",
            "type": "integer"
          },
          "high_band": {
            "description": "Whether high frequency band is used.",
            "type": "boolean"
          },
          "polarization": {
            "description": "Polarization of the transponder for this channel. \nThe supported values are: \n\n * `v`- vertical linear polarization, \n * `h` - horizontal linear polarization, \n * `r` - right-hand circular polarization, \n * `l` - left-hand circular polarization.\n",
            "type": "string",
            "enum": [
              "v",
              "h",
              "r",
              "l"
            ],
            "example": "v"
          },
          "hierarchy": {
            "description": "Constellation ratio for hierarchical transmission.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://dvb.org/wp-content/uploads/2019/12/a012_dvb-t_june_2015.pdf"
            },
            "type": "string",
            "enum": [
              "1",
              "2",
              "4",
              "none",
              "auto"
            ]
          },
          "transmission_mode": {
            "description": "DVB transmission mode.",
            "type": "string",
            "enum": [
              "1k",
              "2k",
              "8k",
              "16k",
              "32k",
              "c1",
              "c3780"
            ]
          },
          "guard_interval": {
            "description": "The mode of inserting a guard interval - a padding separating transmissions so that they do not interfere with each other.\n",
            "type": "string",
            "enum": [
              "1_128",
              "1_32",
              "1_16",
              "1_8",
              "1_4",
              "19_128",
              "19_256",
              "pn420",
              "pn595",
              "pn945"
            ],
            "example": "1_16"
          },
          "pilot": {
            "description": "Enable, disable, or autodetect pilot tones.\n",
            "type": "string",
            "enum": [
              "auto",
              "on",
              "off"
            ],
            "example": "auto"
          },
          "rolloff": {
            "description": "Rolloff factor, in %.\nIt is used to estimate bandwidth, together with symbol rate.\n",
            "type": "string",
            "enum": [
              "35",
              "25",
              "20"
            ]
          },
          "bandwidth": {
            "description": "Bandwidth, in Hz.",
            "type": "integer",
            "enum": [
              1712000,
              5000000,
              6000000,
              7000000,
              8000000,
              10000000
            ],
            "example": 6000000
          },
          "code_rate_lp": {
            "$ref": "#/components/schemas/dvb_fec"
          },
          "code_rate_hp": {
            "$ref": "#/components/schemas/dvb_fec"
          },
          "modulation": {
            "description": "DVB-C modulation method.",
            "type": "string",
            "enum": [
              "auto",
              "qpsk",
              "qam16",
              "qam32",
              "qam64",
              "qam128",
              "qam256",
              "qam_auto",
              "psk8",
              "apsk16",
              "apsk32",
              "vsb8",
              "vsb16",
              "dqpsk",
              "qam4nr"
            ],
            "example": "auto"
          },
          "disabled": {
            "description": "Whether this DVB card is disabled.",
            "type": "boolean",
            "example": false
          },
          "comment": {
            "description": "Any text comment.",
            "type": "string"
          },
          "stats": {
            "$ref": "#/components/schemas/dvb_card_stats"
          },
          "serial": {
            "description": "Serial number of the card, used for capturing from DekTec ASI cards.",
            "type": "integer"
          },
          "port": {
            "description": "Port number, used for capturing from DekTec ASI cards.",
            "type": "integer"
          },
          "compensate_time_drift_ppm": {
            "description": "Max source's internal clock drift to compensate, rounding to six decimal places.",
            "type": "integer"
          },
          "plp_stream_id": {
            "description": "PLP stream selector. Used in DVB-T2.",
            "type": "integer"
          },
          "attenuator": {
            "description": "Attenuation of the signal level. Takes values from 0 to 10.\n",
            "type": "integer"
          },
          "interleave": {
            "description": "Use interleaver.\nThe interlaver disperses sequence of bits in bit stream to minimize effect of burst errors during transmission.\n",
            "type": "integer",
            "minimum": 0,
            "maximum": 15
          },
          "gain": {
            "description": "Adjust the output gain to the specified value in dB.",
            "type": "integer"
          },
          "input_bitrate": {
            "description": "Input bitrate, in Mbps.",
            "type": "integer"
          },
          "video_device": {
            "description": "The video device to capture video from Stream Labs SDI/ASI cards.\nIt is actually a path to a device file created on the disk by Video4Linux.\n",
            "type": "string",
            "example": "/dev/video0"
          }
        },
        "required": [
          "name"
        ]
      },
      "dvb_card_stats": {
        "type": "object",
        "properties": {
          "ber": {
            "description": "Bit error rate. It is the percent of bit errors from total number of transferred bits.\n",
            "type": "integer",
            "example": 5
          },
          "strength_raw": {
            "description": "Signal strength, as a raw 16-bit number received from DVB API.",
            "type": "integer",
            "example": 62446
          },
          "strength": {
            "description": "Signal strength, in percent.",
            "type": "integer",
            "openmetrics_metric": "dvb_card_strength",
            "x-metric-type": "gauge",
            "example": 95
          },
          "snr_raw": {
            "description": "Signal-noise ratio, as a raw 16-bit number received from DVB API. It is the ratio of signal power to the noise power.\n",
            "type": "integer",
            "example": 894
          },
          "snr": {
            "description": "Signal-noise ratio, in percent. It is the ratio of signal power to the noise power. \n",
            "type": "integer",
            "example": 1
          },
          "has_signal": {
            "description": "Whether a signal is detected above the normal noise level.",
            "type": "boolean",
            "example": true
          },
          "has_carrier": {
            "description": "Carrier detected in signal.",
            "type": "boolean",
            "example": true
          },
          "has_viterbi": {
            "description": "DVB signal was locked at Viterbi decoder stage.",
            "type": "boolean",
            "example": true
          },
          "has_sync": {
            "description": "Synchronization bytes detected.",
            "type": "boolean",
            "example": true
          },
          "has_lock": {
            "description": "DVB signal was successfully locked.",
            "type": "boolean",
            "example": true
          },
          "has_timedout": {
            "description": "The signal was not locked within the last about 2 seconds.",
            "type": "boolean",
            "example": false
          },
          "has_reinit": {
            "description": "The frontend was reinitialized, the application is recommended to reset DiSEqC, tone and parameters.\n",
            "type": "boolean",
            "example": false
          },
          "has_rate": {
            "description": "Input rate is sufficient (900 bps or greater). Used for capturing from DekTec ASI cards.\n",
            "type": "boolean",
            "example": true
          }
        }
      },
      "dvb_fec": {
        "type": "string",
        "enum": [
          "1_2",
          "2_3",
          "2_5",
          "3_4",
          "3_5",
          "4_5",
          "5_6",
          "6_7",
          "7_8",
          "8_9",
          "9_10"
        ]
      },
      "genlock_status": {
        "enum": [
          "no_ref",
          "locking",
          "locked",
          "invalid",
          "not_supported",
          "unknown"
        ],
        "type": "string"
      },
      "genref_status": {
        "type": "object",
        "properties": {
          "port": {
            "description": "Detected genref input port number.",
            "type": "integer"
          },
          "external": {
            "description": "If true genref port is a physical port, else genref port is a virtual port (internal clock-lock feature).",
            "type": "boolean"
          },
          "vstd": {
            "$ref": "#/components/schemas/video_format"
          },
          "vstd_detected": {
            "$ref": "#/components/schemas/video_format"
          }
        }
      },
      "dtapi_error_counters": {
        "type": "object",
        "description": "Dektec DTAPI error counters.",
        "properties": {
          "errors_dtapi_in_use": {
            "type": "integer",
            "description": "Number of DTAPI_E_IN_USE errors. This usually means that the requested\nhardware port is already attached by another input or output.\n"
          },
          "errors_dtapi_no_such_device": {
            "type": "integer",
            "description": "Number of DTAPI_E_NO_SUCH_DEVICE errors.\nThe device with the specified serial number could not be found\n"
          },
          "errors_dtapi_out_of_mem": {
            "type": "integer",
            "description": "Number of DTAPI_E_OUT_OF_MEM errors.\nDTAPI could not allocate the required memory, buffer, or FIFO resources.\n"
          },
          "errors_dtapi_started": {
            "type": "integer",
            "description": "Number of DTAPI_E_STARTED errors.\nThe requested operation cannot be performed while the DTAPI process is running.\n"
          },
          "errors_dtapi_invalid_stream": {
            "type": "integer",
            "description": "Number of DTAPI_E_INVALID_STREAM errors.\nThe specified stream is invalid.\n"
          },
          "errors_dtapi_other": {
            "type": "integer",
            "description": "Total number of other DTAPI errors.\n"
          }
        }
      },
      "decklink_card_id": {
        "oneOf": [
          {
            "type": "integer"
          },
          {
            "const": "test_fake",
            "type": "string"
          }
        ]
      },
      "decklink_config": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/decklink_card_id",
            "x-primary-key": true,
            "readOnly": true
          },
          "profile": {
            "description": "The Decklink card profile that allows choosing between input and output direction.",
            "enum": [
              "one_full",
              "one_half",
              "two_full",
              "two_half",
              "four_half"
            ],
            "type": "string"
          }
        }
      },
      "event_sink_filter": {
        "type": "object",
        "additionalProperties": {
          "description": "A set of filters for event fields.\nYou can specify an event field and its possible values.\n",
          "type": "array",
          "items": {
            "type": "string",
            "example": "stream_stopped"
          }
        }
      },
      "event_sink_config": {
        "type": "object",
        "required": [
          "name",
          "url"
        ],
        "properties": {
          "name": {
            "type": "string",
            "format": "event_sink_name",
            "description": "Globally unique event sink name.",
            "x-primary-key": true,
            "readOnly": true,
            "example": "my_json_sink",
            "x-format-description": "event_sink_name"
          },
          "url": {
            "type": "string",
            "description": "Path where events are sent.\n\n* For event handler, it is the URL of an HTTP handler or the path to a lua script:  `http://URL`, `https://URL`, or `path_to_lua_script.lua`.\n* For event logging, it is the path to a log file (human-readable text file or JSON): `log://path_to_log_file.log` or `jsonlog://path_to_log_file.json`.\n",
            "example": "jsonlog:///var/log/events-json.log",
            "pattern": "^(log|jsonlog|http|https)://.+$|^pid://<[0-9]+\\.[0-9]+\\.[0-9]+>$"
          },
          "only": {
            "description": "If specified, only the events that match **every** filter in the filter set will be passed to the event sink target.\n\nThat is, if even one of the conditions is not satisfied, an event will **not** be processed. \nEach filter (condition) has several possible values. For an event to satisfy the condition, \nan event should match **any** of the specified values, not all of them.\n",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/event_sink_filter"
            },
            "examples": {
              "default": {
                "value": [
                  {
                    "event": [
                      "listener_start"
                    ],
                    "group": [
                      "system_overloaded"
                    ]
                  }
                ]
              }
            }
          },
          "except": {
            "description": "If specified, only the events that match **every** filter in the filter set will not be be passed to the event sink target.\n\nThat is, if even one of the conditions is not satisfied, an event will be processed.\n\nEach filter (condition) has several possible values. For an event to satisfy the condition, \nan event should match **any** of the specified values, not all of them.\n",
            "type": "array",
            "examples": {
              "default": {
                "value": [
                  {
                    "event": [
                      "stream_stopped",
                      "stream_started",
                      "source_*"
                    ]
                  }
                ]
              }
            },
            "items": {
              "$ref": "#/components/schemas/event_sink_filter"
            }
          },
          "throttle_delay": {
            "description": "The delay (in seconds) before sending an event to the sink after saving it into the buffer. \nThis parameter allows to lower frequency of sending events.\n\nIf there are more than 100 events in the buffer, all of them will be sent to the sink without any delay.  \n",
            "type": "integer",
            "format": "seconds",
            "example": 1,
            "x-format-description": "seconds"
          },
          "max_size": {
            "description": "Maximum size of a log file. \n\nWhen this limit is reached, log rotation is performed: the oldest events will be overridden by later data.\n",
            "type": "integer",
            "format": "bytes",
            "example": 10000,
            "x-format-description": "bytes"
          },
          "max_depth": {
            "description": "Maximal number of log files with events (JSON or text) that can be stored on a disk.\n\nWhen this limit is reached, log rotation is performed: the oldest files will be overridden by later data.\n",
            "type": "integer",
            "example": 100
          },
          "resend_limit": {
            "description": "If an error occurs (`HTTP 500` or any other error), then *Flussonic* will try to buffer events and send them later.\n\nThe option defines the **number** of events to keep in memory for further delivery.\n\nThe default value is `unlimited`.\n",
            "type": "integer",
            "example": 1000
          },
          "resend_timeout": {
            "description": "How often *Flussonic* will try to resend non-confirmed events to the handler (in seconds).",
            "type": "integer",
            "example": 10
          },
          "level": {
            "$ref": "#/components/schemas/loglevel"
          },
          "extra": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object",
            "description": "Some additional options."
          }
        }
      },
      "streamer_event1": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/server_starting"
          },
          {
            "$ref": "#/components/schemas/server_started"
          },
          {
            "$ref": "#/components/schemas/change_server_id"
          },
          {
            "$ref": "#/components/schemas/presence_connected"
          },
          {
            "$ref": "#/components/schemas/presence_disconnected"
          },
          {
            "$ref": "#/components/schemas/config_external_error"
          },
          {
            "$ref": "#/components/schemas/config_external_success"
          },
          {
            "$ref": "#/components/schemas/source_opened"
          },
          {
            "$ref": "#/components/schemas/source_connected"
          },
          {
            "$ref": "#/components/schemas/source_started"
          },
          {
            "$ref": "#/components/schemas/source_updated"
          },
          {
            "$ref": "#/components/schemas/source_closed"
          },
          {
            "$ref": "#/components/schemas/stream_opened"
          },
          {
            "$ref": "#/components/schemas/stream_updated"
          },
          {
            "$ref": "#/components/schemas/stream_closed"
          },
          {
            "$ref": "#/components/schemas/play_opened"
          },
          {
            "$ref": "#/components/schemas/play_started"
          },
          {
            "$ref": "#/components/schemas/play_updated"
          },
          {
            "$ref": "#/components/schemas/play_closed"
          },
          {
            "$ref": "#/components/schemas/push_opened"
          },
          {
            "$ref": "#/components/schemas/push_connected"
          },
          {
            "$ref": "#/components/schemas/push_started"
          },
          {
            "$ref": "#/components/schemas/push_updated"
          },
          {
            "$ref": "#/components/schemas/push_closed"
          },
          {
            "$ref": "#/components/schemas/push_blocked"
          },
          {
            "$ref": "#/components/schemas/push_restored"
          },
          {
            "$ref": "#/components/schemas/push_reconfigured"
          },
          {
            "$ref": "#/components/schemas/chassis_connected"
          },
          {
            "$ref": "#/components/schemas/chassis_disconnected"
          },
          {
            "$ref": "#/components/schemas/transcoder_device_insufficient_resources"
          },
          {
            "$ref": "#/components/schemas/webrtc_play_prober_timeout"
          },
          {
            "$ref": "#/components/schemas/webrtc_play_prober_wrong_interval"
          },
          {
            "$ref": "#/components/schemas/ad_injected"
          },
          {
            "$ref": "#/components/schemas/multiplexer_pid_on"
          },
          {
            "$ref": "#/components/schemas/multiplexer_pid_off"
          },
          {
            "$ref": "#/components/schemas/motion_started"
          },
          {
            "$ref": "#/components/schemas/motion_stopped"
          },
          {
            "$ref": "#/components/schemas/api_call_event"
          },
          {
            "$ref": "#/components/schemas/dvr_raid_disk_status_changed"
          },
          {
            "$ref": "#/components/schemas/dvr_clean"
          },
          {
            "$ref": "#/components/schemas/dvr_drop_write"
          },
          {
            "$ref": "#/components/schemas/dvr_collapsed_write"
          },
          {
            "$ref": "#/components/schemas/dvr_export_finished"
          },
          {
            "$ref": "#/components/schemas/dvr_consistency_check_finished"
          },
          {
            "$ref": "#/components/schemas/dvr_new_fragment"
          },
          {
            "$ref": "#/components/schemas/dvr_deleted_fragments"
          },
          {
            "$ref": "#/components/schemas/dvr_blob_deleted"
          }
        ],
        "discriminator": {
          "propertyName": "event"
        }
      },
      "api_call": {
        "type": "object",
        "properties": {
          "created_at": {
            "type": "string",
            "format": "date_time",
            "description": "Creation date and time",
            "example": "2021-01-30T08:30:00.432567Z",
            "x-format-description": "date_time"
          },
          "ip": {
            "description": "IP address of the caller.",
            "type": "string",
            "format": "ip",
            "example": "192.34.32.10",
            "x-format-description": "ip"
          },
          "user_agent": {
            "description": "The type of the device from which the API call was produced.",
            "type": "string",
            "example": "Flussonic 24.04"
          },
          "originator": {
            "description": "The program produced the API call. Content of `X-Originator` header.",
            "type": "string",
            "example": "flussonic"
          },
          "operation_id": {
            "description": "API method ID.",
            "type": "string",
            "example": "streams_list"
          },
          "payload": {
            "description": "Payload data transmitter in the API call.",
            "type": "string"
          },
          "status": {
            "description": "Request status code.",
            "type": "integer"
          },
          "duration": {
            "type": "integer",
            "format": "microseconds",
            "description": "Microseconds that this request took",
            "x-format-description": "microseconds"
          },
          "request_id": {
            "x-primary-key": true,
            "type": "string",
            "description": "Internal request-id for this operation"
          }
        }
      },
      "event_default": {
        "type": "object",
        "properties": {
          "utc_ms": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time of the event registration on the server.\n",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "event_id": {
            "type": "integer",
            "description": "Event identifier.\n"
          },
          "trace_id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier of the operation.\nYou can use this field to search for events related to same operation.\nValue of this field is taken from the `X-Trace-Id` header.\nIf `X-Trace-Id` header is not set, it will be generated automatically.\nService will use the value of this field to make outgoing requests.\n",
            "example": "05cec7ee-fbd0-11ed-be56-0242ac120002",
            "x-format-description": "uuid"
          },
          "server": {
            "type": "string",
            "description": "Originator of event.\nThis field is present if [event_sink.url](https://flussonic.com/doc/api/reference/#tag/events/operation/event_sink_get/response%7Curl)\nis configured as HTTP/HTTPS url.\n",
            "example": "flussonic.host"
          }
        }
      },
      "event_media": {
        "type": "object",
        "properties": {
          "media": {
            "type": "string",
            "description": "The name of the stream or file where the event was captured.\n"
          },
          "submedia": {
            "description": "Some additional info on the media, may vary depending on the media type.\n",
            "type": "string"
          }
        }
      },
      "event_session": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "format": "session_token",
            "description": "Token provided by the client.",
            "example": "zGAFxLkoWluO1pG7_nJmQAbCnM5",
            "x-format-description": "session_token"
          },
          "duration": {
            "description": "Duration of the session.",
            "type": "integer",
            "format": "seconds",
            "x-format-description": "seconds"
          },
          "referer": {
            "type": "string",
            "format": "uri",
            "description": "Referer HTTP header or its analog for other protocols.",
            "example": "http://my-tv-portal.local/hockey1",
            "x-format-description": "uri"
          },
          "user_agent": {
            "type": "string",
            "format": "user_agent",
            "description": "Client's user agent for selected protocol.",
            "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36",
            "x-format-description": "user_agent"
          },
          "query_string": {
            "type": "string",
            "description": "Full query string of initial request of the session."
          }
        }
      },
      "event_play": {
        "type": "object",
        "properties": {
          "country": {
            "description": "The country determined from the user's IP address.",
            "type": "string"
          },
          "user_name": {
            "description": "User-provided original stream/VOD name.",
            "type": "string"
          },
          "user_id": {
            "description": "User ID provided by the authorization backend like Middleware, your billing, or web portal.",
            "type": "string"
          }
        }
      },
      "server_starting": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Server started booting."
              },
              "version": {
                "description": "Version of service.",
                "type": "string"
              },
              "full_version": {
                "description": "Full version of service with the build number.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "server_started": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Server started successfully."
              },
              "previous_state": {
                "$ref": "#/components/schemas/previous_server_state"
              },
              "version": {
                "description": "Version of Service.",
                "type": "string"
              },
              "instance_id": {
                "description": "The ID of the started instance.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "change_server_id": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Change the server ID."
              },
              "old": {
                "description": "The previous server ID.",
                "type": "string"
              },
              "instance_id": {
                "description": "The instance ID.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "presence_connected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Presence connected."
              },
              "flush": {
                "description": "The number of flushes.",
                "type": "integer"
              },
              "ip": {
                "description": "Presence server IP address.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "presence_disconnected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Presence disconnected."
              },
              "reason": {
                "description": "Reason for disconnecting from the presence server.",
                "type": "string",
                "x-atom": true
              },
              "ip": {
                "description": "Presence server IP address.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "config_external_error": {
        "$ref": "#/components/schemas/config_external_error_body"
      },
      "config_external_success": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "External config is successfully refreshed."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "source_opened": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Source opened."
              },
              "url": {
                "description": "The input (source) URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "priority": {
                "description": "The input priority.",
                "type": "integer"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "source_connected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Source is connected"
              },
              "url": {
                "description": "The input (source) URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "priority": {
                "description": "The input priority.",
                "type": "integer"
              },
              "status": {
                "type": "string",
                "description": "Status",
                "example": "socket_connected",
                "enum": [
                  "connecting",
                  "connected",
                  "retrying",
                  "redirected",
                  "socket_connected",
                  "transport_connected"
                ]
              },
              "while": {
                "type": "string",
                "description": "The state of connection",
                "example": "rtsp_setup"
              },
              "version": {
                "type": "string",
                "description": "Protocol version (when applicable)"
              },
              "redirected_to": {
                "type": "string",
                "description": "URL to which connection was redirected. The value is available only on 'redirected' status. \n"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "source_started": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Source started."
              },
              "url": {
                "description": "The input (source) URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "priority": {
                "description": "The input priority.",
                "type": "integer"
              },
              "dts": {
                "description": "First frame DTS (Decoding Time Stamp).",
                "type": "number"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "source_updated": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Source updated."
              },
              "url": {
                "description": "The input (source) URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "priority": {
                "description": "The input priority.",
                "type": "integer"
              },
              "bitrate": {
                "description": "The input bitrate.",
                "type": "number",
                "format": "speed",
                "x-format-description": "speed"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "source_closed": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Source closed."
              },
              "url": {
                "description": "The input (source) URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "priority": {
                "description": "The input priority.",
                "type": "integer"
              },
              "bitrate": {
                "description": "The input bitrate.",
                "type": "number",
                "format": "speed",
                "x-format-description": "speed"
              },
              "reason": {
                "description": "Reason for closing the source.",
                "type": "object"
              },
              "limit": {
                "description": "Retry limit.",
                "type": "integer"
              },
              "count": {
                "description": "Retry count.",
                "type": "integer"
              },
              "client_count": {
                "description": "The number of clients.",
                "type": "integer"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "stream_opened": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Stream opened."
              }
            }
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "stream_updated": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Stream updated."
              },
              "reason": {
                "description": "Reason for updating the stream.",
                "type": "string",
                "x-atom": true
              },
              "sub_id": {
                "description": "Sub-stream ID.",
                "type": "string",
                "format": "uuid",
                "x-format-description": "uuid"
              },
              "sub_bytes": {
                "description": "The number of bytes sent in the sub-stream.",
                "type": "integer",
                "format": "bytes",
                "x-format-description": "bytes"
              },
              "sub_opened_at": {
                "description": "The time when the sub-stream was created.",
                "type": "integer",
                "format": "milliseconds",
                "x-format-description": "milliseconds"
              },
              "bytes_in": {
                "description": "The amount of stream data received.",
                "type": "integer",
                "format": "bytes",
                "x-format-description": "bytes"
              },
              "bytes_out": {
                "description": "The amount of stream data sent to the clients.",
                "type": "integer",
                "format": "bytes",
                "x-format-description": "bytes"
              }
            }
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "stream_closed": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Stream closed."
              },
              "reason": {
                "description": "Reason for closing the stream.",
                "type": "string",
                "x-atom": true
              },
              "bytes_out": {
                "description": "The number of bytes transmitted.",
                "type": "integer",
                "format": "bytes",
                "x-format-description": "bytes"
              }
            }
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "play_opened": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Play session opened."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_play"
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "play_started": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Play session started."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_play"
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "play_updated": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Play session updated."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_play"
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "play_closed": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Play session closed."
              },
              "reason": {
                "description": "Reason for closing the play session.",
                "type": "object"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/event_play"
          }
        ]
      },
      "push_opened": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push opened."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "retry_count": {
                "description": "The number of attempts to start pushing.",
                "type": "integer"
              },
              "retry_limit": {
                "description": "The maximum number of attempts to push the stream.",
                "type": "integer"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_connected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push connected."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "status": {
                "description": "The push status.",
                "type": "object"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_started": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push started."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_updated": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push updated."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_closed": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push closed."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "reason": {
                "description": "Reason for closing the push.",
                "type": "object"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_blocked": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push blocked."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_restored": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push restored."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "push_reconfigured": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Push reconfigured."
              },
              "url": {
                "description": "The push URL.",
                "type": "string",
                "format": "url",
                "x-format-description": "url"
              },
              "options": {
                "description": "Changed options list.",
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_session"
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "chassis_connected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Chassis is connected."
              },
              "node": {
                "description": "The node name.",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "chassis_disconnected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Chassis is disconnected."
              },
              "node": {
                "description": "The node name.",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "transcoder_device_insufficient_resources": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "description": "No resources to autodistribute",
                "type": "string"
              },
              "deviceid": {
                "description": "Transcoder module ID in Flussonic Coder.",
                "type": "integer"
              },
              "reason": {
                "description": "One of the two reasons for the event: `manual_resource_allocation` or `auto_resource_allocation`.\nThe first one is a warning, the second one is an error.\n",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "webrtc_play_prober_timeout": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "WebRTC Play Prober timeout"
              }
            }
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "webrtc_play_prober_wrong_interval": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "WebRTC Play Prober wrong interval"
              },
              "direction": {
                "description": "Shows if the problem occurs when sending or receiving the `probe` packets.",
                "type": "string",
                "enum": [
                  "sending",
                  "receiving"
                ]
              },
              "value": {
                "description": "The interval value that is wrong.",
                "type": "integer"
              }
            }
          },
          {
            "$ref": "#/components/schemas/session_generic"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "ad_injected": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Advertisement injected."
              },
              "path": {
                "type": "string",
                "description": "The path to the advertising file in a VOD location."
              },
              "placement": {
                "$ref": "#/components/schemas/ad_placement"
              },
              "duration": {
                "type": "integer",
                "format": "seconds",
                "description": "Duration of injected advertising.",
                "x-format-description": "seconds"
              },
              "midroll_insert_by": {
                "type": "string",
                "enum": [
                  "interval",
                  "splicing"
                ],
                "description": "When to perform midrolls.\nIf your stream has SCTE35 or SCTE104 you may opt to use them.\nBy default ads are inserted on regular intervals\n"
              },
              "program_id": {
                "type": "integer",
                "description": "SCTE-35 or SCTE-104 markers program_id if set by `midroll_program_id`.",
                "example": 1
              },
              "session_id": {
                "type": "string",
                "format": "uuid",
                "description": "Unique identifier (or UUID) of the session.",
                "example": "61942414-8c15-4809-8bb6-adf1ae846027",
                "x-format-description": "uuid"
              },
              "dts": {
                "type": "integer",
                "format": "utc_ms",
                "description": "First advertising keyframe's DTS",
                "example": 1655362349383,
                "x-format-description": "Unix timestamp in milliseconds",
                "minimum": 1000000000000,
                "maximum": 10000000000000
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_play"
          }
        ]
      },
      "multiplexer_pid_on": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Pid is added to the output multiplexed stream"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "multiplexer_pid_off": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Pid is dropped from the output multiplexed stream"
              },
              "reason": {
                "description": "Reason for dropping the PID.",
                "type": "string",
                "x-atom": true
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "motion_base": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "motion_id": {
                "type": "string",
                "description": "Uniq motion id.",
                "example": "b639b21f-3926-4a9f-812e-4eb57e283d59"
              },
              "motion_data": {
                "type": "string",
                "description": "Non-structured data received from source.",
                "example": "#{<<\\\"Message\\\">> => #{<<\\\"Topic\\\">> => <<\\\"tns1:VideoSource/MotionAlarm\\\">>}]"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "motion_started": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Motion started.",
                "example": "motion_started"
              }
            }
          },
          {
            "$ref": "#/components/schemas/motion_base"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "motion_stopped": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "Motion stopped.",
                "example": "motion_stopped"
              },
              "duration": {
                "type": "integer",
                "format": "milliseconds",
                "description": "How long has the movement been active.",
                "example": 1972,
                "x-format-description": "milliseconds"
              }
            }
          },
          {
            "$ref": "#/components/schemas/motion_base"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "api_call_event": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The api call.",
                "const": "api_call"
              },
              "path": {
                "description": "The api call path.",
                "type": "string"
              },
              "qs": {
                "description": "The api call query string.",
                "type": "string"
              }
            }
          },
          {
            "$ref": "#/components/schemas/api_call"
          },
          {
            "$ref": "#/components/schemas/entity_event"
          }
        ]
      },
      "dvr_raid_disk_status_changed": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "A RAID disk status has changed.",
                "const": "dvr_raid_disk_status_changed"
              },
              "dvr_name": {
                "type": "string",
                "description": "The name of the DVR storage containing the disk.",
                "example": "main"
              },
              "disk": {
                "type": "string",
                "description": "The mount path of the disk.",
                "example": "volume1"
              },
              "device": {
                "type": "string",
                "description": "The block device name.",
                "example": "sda1"
              },
              "status": {
                "$ref": "#/components/schemas/raid_disk_status"
              },
              "previous_status": {
                "$ref": "#/components/schemas/raid_disk_status"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "dvr_clean": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The dvr clean occured.",
                "const": "dvr_clean"
              },
              "episodes_count": {
                "type": "integer",
                "minimum": 0,
                "description": "The total count of all deleted episodes."
              },
              "episodes_duration": {
                "description": "The total duration of all deleted episodes.",
                "type": "integer",
                "minimum": 0
              }
            }
          },
          {
            "$ref": "#/components/schemas/dvr_config"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "dvr_drop_write": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The dvr drop write occured.",
                "const": "dvr_drop_write"
              },
              "duration": {
                "type": "integer",
                "description": "Dropped duration in milliseconds."
              },
              "path": {
                "type": "string",
                "description": "Segment disk path which dropped."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "dvr_collapsed_write": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The dvr collapsed write occured.",
                "const": "dvr_collapsed_write"
              },
              "duration": {
                "type": "integer",
                "description": "Collapsed duration in milliseconds."
              },
              "count": {
                "type": "integer",
                "description": "Segments count which collapsed."
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      },
      "dvr_export_finished": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "DVR export operation finished",
                "const": "dvr_export_finished"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/dvr_export_job"
          }
        ]
      },
      "dvr_consistency_check_finished": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "A DVR consistency check finished",
                "const": "dvr_consistency_check_finished"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_media"
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/dvr_consistency_errors"
          }
        ]
      },
      "dvr_new_fragment": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The new dvr fragment is saved to disk.",
                "const": "dvr_new_fragment"
              },
              "utc": {
                "type": "integer",
                "format": "seconds",
                "description": "Segment start time",
                "x-format-description": "seconds"
              },
              "duration": {
                "type": "number",
                "format": "milliseconds",
                "description": "Segment duration",
                "x-format-description": "milliseconds"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "dvr_deleted_fragments": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The DVR fragments deleted from DVR blob.",
                "const": "dvr_deleted_fragments"
              },
              "utcs": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "seconds",
                  "x-format-description": "seconds"
                },
                "description": "Segment start times"
              },
              "path": {
                "type": "string",
                "description": "DVR Blob disk path"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "dvr_blob_deleted": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The DVR blob deleted from disk.",
                "const": "dvr_blob_deleted"
              },
              "path": {
                "type": "string",
                "description": "Blob disk path"
              },
              "blob": {
                "type": "string",
                "description": "Blob name"
              },
              "disk_size": {
                "type": "integer",
                "format": "bytes",
                "description": "Blob size in bytes",
                "x-format-description": "bytes"
              },
              "reason": {
                "type": "string",
                "description": "Deletion reason"
              },
              "reason_text": {
                "type": "string",
                "description": "Detailed deletion reason"
              }
            }
          },
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "$ref": "#/components/schemas/event_media"
          }
        ]
      },
      "auth_backend_url": {
        "type": "object",
        "properties": {
          "url": {
            "description": "The URL of an HTTP backend.      \n",
            "example": "http://stalker-1.iptv.net/auth.php",
            "type": "string"
          }
        },
        "required": [
          "url"
        ]
      },
      "auth_backend_config": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "format": "auth_backend_name",
            "description": "Globally unique [`auth_backend`](https://flussonic.com/doc/complex-authorization-with-backends/) name.",
            "x-primary-key": true,
            "readOnly": true,
            "x-format-description": "auth_backend_name"
          },
          "allow_tokens": {
            "description": "Explicit list of tokens that give access to the content without any other checks.\n",
            "example": [
              "test_token1",
              "test_token2"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deny_tokens": {
            "description": "Explicit list of tokens that deny access to the content and stop any other checks.\n",
            "example": [
              "test_token3",
              "test_token4"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "allow_ips": {
            "description": "Explicit list of IP-addresses or subnet masks that have access to the content without any other checks.\n",
            "example": [
              "127.0.0.1",
              "10.10.0.0/24"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deny_ips": {
            "description": "Explicit list of IP-addresses or subnet masks that are banned from accessing the content.      \n",
            "example": [
              "8.8.8.8",
              "10.10.0.0/24"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "allow_countries": {
            "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that have access to the content without any other checks.\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated.\nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/"
            },
            "example": [
              "RU",
              "US"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deny_countries": {
            "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that are banned from accessing the content.\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated.\nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/"
            },
            "example": [
              "RU",
              "GB"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "allow_uas": {
            "description": "Explicit list of user agents (set-top boxes or browsers) that have access to the content without any other checks.    \n",
            "example": [
              "AppleWebKit/533.3 (KHTML, like Gecko)",
              "VLC/3.0.8 LibVLC/3.0.8"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "deny_uas": {
            "description": "The list of user agents (set-top boxes or browsers) that are banned from accessing the content.      \n",
            "example": [
              "Mobile Safari/533.3",
              "VLC/3.0.8 LibVLC/3.0.8"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "backends": {
            "description": "URL(s) of the HTTP backend(s).",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/auth_backend_url"
            }
          },
          "allow_default": {
            "description": "This option defines the default behavior when all backends are not responding (usually, because of errors in HTTP responses) and the session is not started yet.\nIf this option is enabled, all clients or devices except those listed in `deny` option will have access to the content.\nIf this option is disabled, all clients or devices except those listed in `allow` option will not have access to the content. \n",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/complex-authorization-with-backends/#auth-configurator-allowdefault"
            },
            "type": "boolean",
            "default": false
          }
        }
      },
      "server_name_config": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "description": "Domain names to issue ssl certificates for",
            "example": "streamer.local",
            "x-primary-key": true
          },
          "aliases": {
            "description": "List of domain aliases, used together with the primary name to issue ssl certs\n",
            "example": [
              "s1.streamer.local",
              "s2.streamer.local"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "cache_config": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "format": "cache_name",
            "description": "Globally unique cache name.",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/scale-vod-playback-with-ssd-cache/"
            },
            "x-primary-key": true,
            "readOnly": true,
            "example": "cache1",
            "x-format-description": "cache_name"
          },
          "path": {
            "description": "The path where the files from the cloud or HTTP are cached to speed up broadcasting.",
            "type": "string",
            "format": "disk_path",
            "example": "/storage/cache",
            "x-format-description": "disk_path"
          },
          "misses": {
            "description": "The number of requests necessary for a file to be cached.",
            "type": "integer",
            "example": 3
          },
          "storage_limit": {
            "description": "Maximum disk consumption in bytes. \nWhen this limit is reached, the oldest files will be overridden by later files.\n",
            "type": "integer",
            "format": "bytes",
            "example": 400000,
            "x-format-description": "bytes"
          },
          "expiration": {
            "description": "A period (in seconds) back from the current moment during which the files are stored.\nAs time goes, the files which are older than this period are being overridden by the later files.\n",
            "type": "integer",
            "format": "seconds",
            "example": 604800,
            "x-format-description": "seconds"
          }
        }
      },
      "http_proxy_config": {
        "type": "object",
        "properties": {
          "prefix": {
            "type": "string",
            "format": "media_name",
            "x-primary-key": true,
            "description": "HTTP prefix that will be intercepted by this http proxy configuration\n",
            "x-format-description": "media_name"
          },
          "url": {
            "type": "string",
            "format": "url",
            "description": "Upstream url\n",
            "x-format-description": "url"
          },
          "mainpage": {
            "type": "boolean",
            "default": false,
            "description": "If this flag is set, then streamer will redirect from \"/\" to this proxy configuration.\n"
          },
          "stats": {
            "$ref": "#/components/schemas/http_proxy_stats",
            "readOnly": true
          }
        },
        "required": [
          "prefix",
          "url"
        ]
      },
      "http_proxy_stats": {
        "type": "object",
        "properties": {
          "requests": {
            "description": "Total number of requests this prefix received\n",
            "type": "integer",
            "openmetrics_metric": "http_proxy_requests",
            "x-metric-type": "counter",
            "example": 1000
          },
          "protocol_upgrades": {
            "description": "Total number of requests with protocol upgrade (e.g. websocket)\n",
            "type": "integer",
            "openmetrics_metric": "http_proxy_protocol_upgrades",
            "x-metric-type": "counter",
            "example": 1000
          },
          "proxy_error": {
            "description": "Number of requests with error on proxy itself\n",
            "type": "integer",
            "example": 10,
            "openmetrics_metric": "http_proxy_error",
            "x-metric-type": "counter"
          },
          "proxy_error_connection": {
            "description": "Number of requests with connection errors - econnrefused, etc\n",
            "type": "integer",
            "example": 10,
            "openmetrics_metric": "http_proxy_error_connection",
            "x-metric-type": "counter"
          },
          "http_100": {
            "description": "Number of requests with HTTP code 1xx (e.g. protocol upgrades)\n",
            "type": "integer",
            "example": 1000,
            "openmetrics_metric": "http_proxy_100",
            "x-metric-type": "counter"
          },
          "http_200": {
            "description": "Number of requests with HTTP code 2xx\n",
            "type": "integer",
            "example": 1000,
            "openmetrics_metric": "http_proxy_200",
            "x-metric-type": "counter"
          },
          "http_300": {
            "description": "Number of requests with HTTP code 3xx\n",
            "type": "integer",
            "example": 10,
            "openmetrics_metric": "http_proxy_300",
            "x-metric-type": "counter"
          },
          "http_400": {
            "description": "Number of requests with HTTP code 4xx\n",
            "type": "integer",
            "example": 10,
            "openmetrics_metric": "http_proxy_400",
            "x-metric-type": "counter"
          },
          "http_500": {
            "description": "Number of requests with HTTP code 5xx\n",
            "type": "integer",
            "example": 10,
            "openmetrics_metric": "http_proxy_500",
            "x-metric-type": "counter"
          },
          "time_100ms": {
            "type": "integer",
            "description": "Number of API calls that took less than 100ms",
            "example": 10,
            "openmetrics_metric": "http_proxy_time_100ms",
            "x-metric-type": "counter"
          },
          "time_500ms": {
            "type": "integer",
            "description": "Number of API calls that took more than 100ms and less than 500ms",
            "example": 5,
            "openmetrics_metric": "http_proxy_time_500ms",
            "x-metric-type": "counter"
          },
          "time_1000ms": {
            "type": "integer",
            "description": "Number of API calls that took more than 500ms and less than 1s",
            "example": 2,
            "openmetrics_metric": "http_proxy_time_1000ms",
            "x-metric-type": "counter"
          },
          "time_5000ms": {
            "type": "integer",
            "description": "Number of API calls that took more than 1s and less than 5s",
            "example": 2,
            "openmetrics_metric": "http_proxy_time_5000ms",
            "x-metric-type": "counter"
          },
          "time_longms": {
            "type": "integer",
            "description": "Number of API calls that took more than 5s",
            "example": 1,
            "openmetrics_metric": "http_proxy_time_longms",
            "x-metric-type": "counter"
          }
        }
      },
      "http_proxies_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "$ref": "#/components/schemas/openmetrics_labels"
          },
          {
            "type": "object",
            "properties": {
              "http_proxies": {
                "description": "List of http proxies",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/http_proxy_config"
                }
              }
            }
          }
        ]
      },
      "chassis_config": {
        "type": "object",
        "properties": {
          "product_name": {
            "$ref": "#/components/schemas/chassis_product",
            "readOnly": true
          },
          "api_port": {
            "$ref": "#/components/schemas/listen_spec",
            "readOnly": true
          },
          "auto_reboot": {
            "description": "Shows if auto restart of coders when (re)starting chassis is enabled.",
            "type": "boolean",
            "default": false,
            "readOnly": true
          },
          "dhcpd_iface": {
            "description": "Network interface for automatic reception of IP address from DHCP server. \nThis interface will be used for launching coders.\n",
            "type": "string",
            "format": "interface_name",
            "readOnly": true,
            "x-format-description": "interface_name"
          },
          "dhcpd_port": {
            "$ref": "#/components/schemas/listen_spec",
            "readOnly": true
          },
          "dhcpd_port_dest": {
            "$ref": "#/components/schemas/listen_spec",
            "readOnly": true
          },
          "lcd": {
            "description": "Shows if LCD monitor capabilities are enabled in the firmware.",
            "type": "boolean",
            "default": false,
            "readOnly": true
          },
          "ntpd_iface": {
            "description": "Network interface for NTP daemon.",
            "type": "string",
            "format": "interface_name",
            "readOnly": true,
            "x-format-description": "interface_name"
          },
          "ntpd_port": {
            "$ref": "#/components/schemas/listen_spec",
            "readOnly": true
          },
          "tftp_port": {
            "$ref": "#/components/schemas/listen_spec",
            "readOnly": true
          },
          "tftp_root": {
            "description": "TFTP root directory.",
            "type": "string",
            "format": "disk_path",
            "readOnly": true,
            "x-format-description": "disk_path"
          },
          "update_channel": {
            "description": "Update channel specified in the config file.",
            "type": "string",
            "readOnly": true
          },
          "firmware_host": {
            "description": "URL for downloading firmware.",
            "type": "string",
            "format": "url",
            "readOnly": true,
            "x-format-description": "url"
          },
          "firmware_version": {
            "$ref": "#/components/schemas/chassis_version",
            "readOnly": true
          },
          "firmware_boot_dir": {
            "description": "Directory to boot the device from. This is also where the firmware is downloaded on updates.",
            "type": "string",
            "format": "disk_path",
            "readOnly": true,
            "x-format-description": "disk_path"
          },
          "stats": {
            "$ref": "#/components/schemas/chassis_stats",
            "readOnly": true
          },
          "restart_coder_timeout": {
            "description": "Timeout for restarting coders.",
            "type": "integer",
            "readOnly": true
          },
          "hostname": {
            "description": "The name of the chassis server.",
            "type": "string",
            "format": "server_name",
            "example": "coder1.example.com",
            "x-format-description": "server_name"
          },
          "default_gateway_interface": {
            "description": "If `default_gateway` parameters are set the individual interfaces config, \nthis gateway is only used for checking license and updates. \nOtherwise, it is used as gateway for all traffic.\n",
            "type": "string",
            "example": "streaming"
          },
          "ntp_servers": {
            "description": "List of NTP server host names or IP addresses",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "chassis_stats": {
        "type": "object",
        "properties": {
          "model": {
            "description": "The chassis model name.",
            "type": "string",
            "example": "chassis_model"
          },
          "version": {
            "$ref": "#/components/schemas/chassis_version"
          },
          "next_version": {
            "$ref": "#/components/schemas/chassis_version"
          },
          "serial_number": {
            "description": "The serial number of the chassis.",
            "type": "string",
            "example": "2174220024"
          },
          "hardware_id": {
            "description": "MAC address of the manage0 interface.",
            "type": "string"
          },
          "hostname": {
            "type": "string",
            "description": "Hostname of the server.",
            "example": "coder1.example.com"
          },
          "ntp_clock_synchronized": {
            "type": "boolean",
            "description": "Whether a system clock synchronized with NTP server"
          },
          "ntp_timesync": {
            "$ref": "#/components/schemas/chassis_timesync_stats"
          },
          "system_time": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Chassis system time (in UTC milliseconds)",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          }
        }
      },
      "chassis_timesync_stats": {
        "type": "object",
        "properties": {
          "system_servers": {
            "description": "NTP servers configured in systemd-timesyncd configuration.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "link_servers": {
            "description": "NTP servers provided per network link, for example by DHCP.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "fallback_servers": {
            "description": "Fallback NTP servers used only when no system or link servers are available.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "active_server": {
            "description": "Active NTP server selected by systemd-timesyncd.",
            "type": "string"
          }
        }
      },
      "chassis_product": {
        "type": "string",
        "enum": [
          "coder_transcoder",
          "coder_vision",
          "coder_dvb"
        ]
      },
      "chassis_version": {
        "type": "string"
      },
      "server_meta": {
        "type": "string"
      },
      "config_version": {
        "type": "array",
        "items": {
          "type": "integer"
        }
      },
      "previous_server_state": {
        "type": "string",
        "enum": [
          "shutdown",
          "killed",
          "unknown",
          "none",
          "error_reading",
          "unconfigured"
        ],
        "description": "The previous state of the server."
      },
      "config_path_segment": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "integer"
          }
        ]
      },
      "config_error_status": {
        "type": "object",
        "properties": {
          "error": {
            "description": "Short error description.",
            "type": "string",
            "x-atom": true,
            "example": "bad_url"
          },
          "config": {
            "description": "Partial configuration that can be recovered if an error occurs.",
            "type": "object"
          },
          "line": {
            "description": "Line number pointing to where an error was detected.",
            "type": "integer",
            "example": 15
          },
          "first_error_line": {
            "description": "If an error takes up to several lines, it is the first line where the error was detected.",
            "type": "integer",
            "example": 14
          },
          "col": {
            "description": "The column number pointing to where the error was detected.",
            "type": "integer",
            "example": 20
          },
          "first_error_col": {
            "description": "Last column with something valid.",
            "type": "integer",
            "example": 5
          },
          "path": {
            "description": "Config path to the erroneous element.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/config_path_segment"
            },
            "example": [
              "streams",
              0,
              "inputs",
              0,
              "url",
              "input_url"
            ]
          },
          "detail": {
            "description": "Some other details that may help to identify the error.",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              },
              {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/config_path_segment"
                }
              }
            ]
          }
        }
      },
      "license_type": {
        "type": "string",
        "enum": [
          "undefined",
          "online",
          "usb",
          "network",
          "offline"
        ]
      },
      "partition_stats": {
        "type": "object",
        "properties": {
          "path": {
            "description": "Mount path.",
            "type": "string",
            "format": "disk_path",
            "example": "_var_lib_docker_overlay2_3684778579db0a4d418fdc1a8a6953b680ab92d179a7d6f9506710d073095e36_merged",
            "openmetrics_label": "path",
            "x-format-description": "disk_path"
          },
          "device": {
            "description": "The block device or file related to a mount path.",
            "type": "string",
            "format": "disk_device",
            "example": "sda1",
            "openmetrics_label": "device",
            "x-format-description": "disk_device"
          },
          "total_mb": {
            "description": "Total number of megabytes shown by the OS for this partition.",
            "type": "integer",
            "format": "megabytes",
            "openmetrics_metric": "partition_total_mb",
            "x-metric-type": "gauge",
            "example": 45423,
            "x-format-description": "megabytes"
          },
          "usage": {
            "description": "Percentage of usage of this partition.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "partition_usage",
            "x-metric-type": "gauge",
            "example": 30,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "io_util": {
            "description": "Percentage of IO utilization for device related to a mount path.",
            "type": "integer",
            "format": "percent",
            "example": 42,
            "openmetrics_metric": "device_io_util",
            "x-metric-type": "gauge",
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          }
        }
      },
      "server_stats": {
        "allOf": [
          {
            "$ref": "#/components/schemas/server_stats_whoami"
          },
          {
            "$ref": "#/components/schemas/server_stats_streamer"
          },
          {
            "$ref": "#/components/schemas/server_stats_network"
          },
          {
            "$ref": "#/components/schemas/server_stats_events"
          }
        ]
      },
      "server_stats_whoami": {
        "type": "object",
        "properties": {
          "server_version": {
            "description": "Package version of the server. Might be simple a number of release like 21.11 or longer if you have a rolling release installed.",
            "type": "string",
            "format": "server_version",
            "openmetrics_label": "version",
            "example": "23.04",
            "x-format-description": "server_version"
          },
          "build": {
            "type": "integer",
            "description": "Build version\n",
            "openmetrics_label": "build"
          },
          "now": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Current response time\n",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "started_at": {
            "description": "Boot time of this instance.",
            "type": "integer",
            "format": "utc",
            "openmetrics_metric": "server_started_at",
            "x-metric-type": "gauge",
            "example": 1639337825,
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          }
        }
      },
      "server_stats_streamer": {
        "type": "object",
        "properties": {
          "config_version": {
            "$ref": "#/components/schemas/config_version"
          },
          "next_version": {
            "description": "Notification about a newer version in the repository.",
            "type": "string",
            "format": "server_version",
            "example": "22.01",
            "x-format-description": "server_version"
          },
          "streamer_status": {
            "$ref": "#/components/schemas/server_stats_streamer_status"
          },
          "config_external_status": {
            "$ref": "#/components/schemas/config_external_error_status"
          },
          "hostname": {
            "description": "Hostname of your server. Please, use FQDN, do not leave your Linux misconfigured.",
            "type": "string",
            "example": "openapi.flussonic.com"
          },
          "license_txt": {
            "description": "The code of the license applied on the server.",
            "type": "string",
            "example": "uO8v12HJhNXVj5gM"
          },
          "license_type": {
            "$ref": "#/components/schemas/license_type"
          },
          "id": {
            "description": "Unique runtime ID of this instance. Updated with the restart.",
            "type": "string",
            "format": "uuid",
            "example": "61893b15-75b2-4fcb-b4cf-ae1dd0858ea2",
            "x-format-description": "uuid"
          },
          "vsaas": {
            "description": "Shows if Flussonic Watcher is enabled in the license.",
            "type": "boolean"
          },
          "vsaas_branding": {
            "description": "Shows if Watcher branding is enabled in the license.",
            "type": "boolean"
          },
          "vsaas_running": {
            "description": "Shows if Watcher is currently running.",
            "type": "boolean"
          },
          "rproxy": {
            "description": "Shows if rproxy is configured.",
            "type": "boolean"
          },
          "rproxy_running": {
            "description": "Shows if rproxy is running.",
            "type": "boolean"
          },
          "transcoder": {
            "description": "Shows if the server's CPU can be used for transcoding \n(i.e. if the `flussonic-transcoder` package is installed on the server). \n",
            "type": "boolean",
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "bandwidth_usage": {
            "description": "Outbound bandwidth usage (load balancing in `usage` mode is based on this value).",
            "type": "integer",
            "format": "percent",
            "example": 67,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "total_bandwidth": {
            "description": "Total server bandwidth.",
            "type": "integer",
            "format": "speed",
            "deprecated": true,
            "x-notice": "duplicate of config total_bandwidth",
            "x-delete-at": 22.03,
            "x-format-description": "speed"
          },
          "cpu_usage": {
            "description": "CPU usage on the server.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "server_cpu_usage",
            "x-metric-type": "gauge",
            "example": 48,
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "memory_usage": {
            "description": "Memory usage on the server.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "server_memory_usage",
            "x-metric-type": "gauge",
            "example": 27,
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "scheduler_load": {
            "description": "Erlang scheduler load.",
            "type": "integer",
            "format": "percent",
            "openmetrics_metric": "server_scheduler_load",
            "x-metric-type": "gauge",
            "example": 40,
            "x-api-allow": [
              "central-layouter"
            ],
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          },
          "uptime": {
            "description": "The server uptime.",
            "type": "integer",
            "format": "seconds",
            "example": 4325502,
            "x-format-description": "seconds"
          },
          "partitions": {
            "description": "The list of disk partitions on the server.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/partition_stats"
            },
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "transcoder_devices": {
            "description": "Statistics on the devices used for transcoding.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/transcoder_device_stats"
            },
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "text_alerts": {
            "description": "Human-readable format of errors and alerts that need to be fixed. \nProvided by some *Flussonic* subsystems.\n",
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "config_error": {
            "$ref": "#/components/schemas/config_error_status"
          },
          "is_chassis": {
            "description": "The flag shows if Flussonic runs on Flussonic Coder.\n",
            "type": "boolean"
          }
        }
      },
      "server_stats_network": {
        "type": "object",
        "properties": {
          "total_clients": {
            "description": "The number of clients receiving the streams from the server at the moment of request.",
            "type": "integer",
            "openmetrics_metric": "server_total_clients",
            "x-metric-type": "gauge",
            "example": 2040
          },
          "total_streams": {
            "description": "The number of streams created on the server.",
            "type": "integer",
            "example": 45,
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "online_streams": {
            "description": "The number of streams that are ready to be served to the clients.",
            "type": "integer",
            "openmetrics_metric": "server_online_streams",
            "x-metric-type": "gauge",
            "example": 27,
            "x-api-allow": [
              "central-layouter"
            ]
          },
          "opened_files": {
            "description": "The number of opened files.",
            "type": "integer",
            "openmetrics_metric": "server_opened_files",
            "x-metric-type": "gauge",
            "example": 5
          },
          "input_kbit": {
            "description": "Current incoming speed (bitrate) of the data transmission over the network.",
            "type": "integer",
            "format": "speed",
            "openmetrics_metric": "server_input_bitrate",
            "x-metric-type": "gauge",
            "example": 400300,
            "x-format-description": "speed"
          },
          "output_kbit": {
            "description": "Current outgoing speed (bitrate) of the data transmission over the network.",
            "type": "integer",
            "format": "speed",
            "openmetrics_metric": "server_output_bitrate",
            "x-metric-type": "gauge",
            "example": 500400,
            "x-format-description": "speed"
          }
        }
      },
      "server_stats_events": {
        "type": "object",
        "properties": {
          "events": {
            "type": "object",
            "description": "Events statistics",
            "properties": {
              "resent_events": {
                "description": "Number of events, which have been retransmitted due to network issues.\nThe counter relates with events sinks `resend_timeout` parameter.\n",
                "type": "integer",
                "example": 100
              },
              "dropped_events": {
                "description": "Number of events, which have been dropped due to buffer limitation\nconfigured by events sinks `resend_limit` parameter.\n",
                "type": "integer",
                "example": 100
              }
            }
          }
        }
      },
      "server_stats_streamer_status": {
        "type": "string",
        "example": "running",
        "enum": [
          "no_config",
          "broken_config",
          "config_external_error",
          "license_failure",
          "no_license",
          "starting",
          "running"
        ]
      },
      "config_external_error_status": {
        "type": "object",
        "properties": {
          "status": {
            "description": "External config status",
            "type": "string",
            "enum": [
              "loaded",
              "error"
            ]
          },
          "reason": {
            "$ref": "#/components/schemas/request_error_reason"
          },
          "while": {
            "description": "Conditions of the error occurrence.",
            "type": "string",
            "enum": [
              "refresh",
              "request",
              "srt_port_resolve"
            ]
          },
          "code": {
            "type": "integer",
            "description": "HTTP response code"
          },
          "error": {
            "type": "string",
            "description": "Error description (optional)",
            "example": "invalid_authorization"
          },
          "path": {
            "description": "Config path to the erroneous element.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/config_path_segment"
            },
            "example": [
              "streams",
              0,
              "inputs",
              0,
              "url",
              "input_url"
            ]
          },
          "detail": {
            "type": "string",
            "description": "Detailed error description (optional)"
          }
        }
      },
      "request_error_reason": {
        "description": "Reason of the error.",
        "type": "string",
        "enum": [
          "validation_error",
          "network_error",
          "malformed_json",
          "invalid_request",
          "unknown"
        ]
      },
      "admin_credentials": {
        "type": "object",
        "properties": {
          "login": {
            "type": "string",
            "description": "Login",
            "example": "secretlogin"
          },
          "password": {
            "type": "string",
            "description": "Password",
            "example": "passw",
            "format": "password",
            "x-format-description": "password"
          },
          "hash": {
            "type": "boolean",
            "description": "Server will pass your password through a hashing algorithm.",
            "example": true
          }
        },
        "required": [
          "login",
          "password"
        ]
      },
      "server_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/server_config_base"
          },
          {
            "$ref": "#/components/schemas/server_config_full"
          },
          {
            "$ref": "#/components/schemas/server_config_local"
          },
          {
            "$ref": "#/components/schemas/server_config_stats"
          },
          {
            "$ref": "#/components/schemas/openmetrics_labels"
          },
          {
            "$ref": "#/components/schemas/opentelemetry"
          }
        ],
        "description": "Global server configuration and current runtime status"
      },
      "server_config_base": {
        "type": "object",
        "properties": {
          "listeners": {
            "$ref": "#/components/schemas/listeners"
          },
          "srt": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "srt_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_play": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "srt2_publish": {
            "$ref": "#/components/schemas/srt_config"
          },
          "geoip": {
            "type": "string",
            "format": "disk_path",
            "description": "Use your own GeoIP database.",
            "example": "/usr/share/GeoIP/GeoLite2-City.mmdb",
            "x-format-description": "disk_path"
          },
          "meta": {
            "$ref": "#/components/schemas/server_meta"
          },
          "loglevel": {
            "$ref": "#/components/schemas/loglevel"
          },
          "nvidia_monitor": {
            "description": "Enables saving statistics on Nvidia performance.",
            "type": "boolean",
            "example": true,
            "deprecated": true,
            "x-notice": "Not needed since we detect nvidia presence automatically.",
            "x-delete-at": 25.11
          },
          "total_bandwidth": {
            "description": "Total server bandwidth.",
            "type": "integer",
            "format": "speed",
            "example": 1000000000,
            "x-format-description": "speed"
          },
          "log_requests": {
            "description": "Enables logging of requests for streams (manifests, segments) and API request.",
            "type": "boolean"
          },
          "pulsedb": {
            "description": "Directory to store Pulse statistics.",
            "type": "string",
            "format": "disk_path",
            "example": "/var/run/flussonic/pulsedb",
            "x-delete-at": 26.06,
            "deprecated": true,
            "x-format-description": "disk_path"
          },
          "session_log": {
            "description": "Directory to store the session log.",
            "type": "string",
            "format": "disk_path",
            "example": "/var/run/flussonic/session_log",
            "deprecated": true,
            "x-delete-at": 26.01,
            "x-format-description": "disk_path"
          },
          "cluster_key": {
            "description": "The cluster key to unite several servers with the same key into a cluster.",
            "type": "string",
            "example": "xS6i6Q3DCc5nEvnu"
          },
          "url_prefix": {
            "$ref": "#/components/schemas/url_prefix"
          },
          "view_auth": {
            "$ref": "#/components/schemas/admin_credentials"
          },
          "edit_auth": {
            "$ref": "#/components/schemas/admin_credentials"
          },
          "api_allowed_from": {
            "description": "The list of allowed subnets to accept API requests from.",
            "type": "array",
            "items": {
              "type": "string",
              "format": "cidr",
              "x-format-description": "cidr"
            }
          },
          "server_names": {
            "type": "array",
            "description": "The configuration of server domain name and aliases",
            "items": {
              "$ref": "#/components/schemas/server_name_config"
            }
          },
          "auth_token": {
            "$ref": "#/components/schemas/auth_token"
          },
          "streaming_prefix": {
            "type": "string",
            "description": "Prefix of streaming api and all streaming requests that will be removed from the path\nwhile calculating stream name.\n"
          },
          "webrtc_play": {
            "$ref": "#/components/schemas/webrtc_router_config"
          },
          "webrtc_publish": {
            "$ref": "#/components/schemas/webrtc_router_config"
          }
        }
      },
      "server_config_full": {
        "type": "object",
        "properties": {
          "event_sinks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/event_sink_config"
            },
            "description": "The configuration of event notifications"
          },
          "auth_backends": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/auth_backend_config"
            },
            "description": "The configuration of auth backends"
          },
          "vods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/vod_config"
            },
            "description": "The configuration of VODs"
          },
          "dvrs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/dvr_config"
            },
            "description": "The configuration of the DVRs"
          },
          "transponders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/transponder_config"
            },
            "description": "The configuration of the transponders."
          },
          "caches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/cache_config"
            },
            "description": "The configuration of the cache."
          },
          "dvb_cards": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/dvb_card_config"
            },
            "description": "The configuration of the DVB cards."
          },
          "camera_alarm": {
            "$ref": "#/components/schemas/camera_alarm_config"
          },
          "rproxy": {
            "$ref": "#/components/schemas/rproxy_config"
          },
          "vsaas": {
            "$ref": "#/components/schemas/vsaas_config"
          },
          "decklinks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/decklink_config"
            },
            "description": "Configuration of decklink SDI capture cards\n"
          },
          "http_proxies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/http_proxy_config"
            },
            "description": "List of HTTP prefixes that can be handled via call to remote http server\n"
          }
        }
      },
      "server_config_stats": {
        "type": "object",
        "properties": {
          "stats": {
            "$ref": "#/components/schemas/server_stats"
          }
        }
      },
      "server_config_local": {
        "type": "object",
        "properties": {
          "chassis": {
            "$ref": "#/components/schemas/chassis_config"
          },
          "config_external": {
            "type": "string",
            "format": "url",
            "description": "Specify stream config backend.",
            "example": "http://central.example.com/streamer/api/v3/streamers",
            "externalDocs": {
              "description": "Find more information here",
              "url": "https://flussonic.com/doc/centralized-cluster-configuration-with-config-external/"
            },
            "x-format-description": "url"
          },
          "peers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/peer_config"
            },
            "description": "The configuration of peers in the cluster."
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/source_config"
            },
            "description": "The configuration of the video sources."
          },
          "templates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/template_config"
            },
            "description": "The configuration of the templates."
          },
          "streams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/stream_config"
            },
            "description": "The configuration of the streams."
          },
          "balancers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/balancer_config"
            },
            "description": "The configuration of the balancers."
          },
          "file_processor": {
            "$ref": "#/components/schemas/file_processor_config"
          },
          "iptv": {
            "$ref": "#/components/schemas/iptv_config"
          }
        }
      },
      "api_tokens_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "api_tokens": {
                "description": "List of available api tokens",
                "items": {
                  "$ref": "#/components/schemas/api_token"
                },
                "type": "array"
              }
            }
          }
        ]
      },
      "api_token": {
        "type": "object",
        "description": "This object describes one API token with its unique text, permissions, etc.\n",
        "properties": {
          "key": {
            "type": "string",
            "description": "Unique secret string generated by server.",
            "x-api-description": {
              "iris-hal": "Unique secret string generated by server. It's interpreted according to\noptional `key_format` field\n"
            },
            "examples": {
              "default": {
                "value": "IJCo3KGLBf6NAqMCGgHf5gNhpl9"
              },
              "plaintext": {
                "value": "1234"
              },
              "crypt": {
                "value": "$5$tz/6I0KpagoQ9kQN$nnnKQCxuhCOCaZ7q9WEWvHo6.dRb2hawYofHPdAhHV."
              }
            },
            "readOnly": true
          },
          "name": {
            "type": "string",
            "description": "unique name of the token that can be used to distinguish tokens\n",
            "examples": {
              "default": {
                "value": "root"
              },
              "inference_server": {
                "value": "inference_server"
              }
            }
          },
          "auth_scopes": {
            "type": "array",
            "description": "A list of scopes that restrict the permissions of this API token.\nThe system sets these scopes based on the context and limitations present when the token is created.\nFor example, this can be used to specify a particular user or other constraints.\n\nThe token cannot have permissions beyond those defined in this array.\n",
            "items": {
              "type": "string"
            },
            "examples": {
              "default": {
                "value": [
                  "user/15"
                ]
              }
            },
            "readonly": true
          },
          "permissions": {
            "type": "array",
            "description": "list of independent permissions, available for this token",
            "items": {
              "$ref": "#/components/schemas/api_token_permission"
            }
          }
        },
        "required": [
          "key",
          "name"
        ]
      },
      "api_token_permission": {
        "type": "object",
        "required": [
          "scopes"
        ],
        "properties": {
          "read": {
            "type": "boolean",
            "description": "reading one item is allowed"
          },
          "write": {
            "type": "boolean",
            "description": "writing/updating/deletion one item is allowed"
          },
          "list": {
            "type": "boolean",
            "description": "listing items is allowed"
          },
          "execute": {
            "type": "boolean",
            "description": "executing this function (if it is a function) is allowed"
          },
          "scopes": {
            "type": "array",
            "description": "List of permission scopes that will be intersected\nEach scope is a name of the collection or a function with nested resource name\nthat is covered with this permission\n",
            "items": {
              "type": "string"
            },
            "examples": {
              "default": {
                "value": [
                  "streams/*"
                ]
              },
              "fine_grained": {
                "value": [
                  "streams/location1%2F*"
                ]
              },
              "superadmin": {
                "value": [
                  "*"
                ]
              }
            }
          }
        }
      },
      "forward_ports_config": {
        "type": "object",
        "properties": {
          "handler": {
            "description": "The handler name.",
            "type": "string",
            "x-atom": true
          },
          "options": {
            "description": "The handler options.",
            "type": "object"
          }
        }
      },
      "rproxy_config": {
        "type": "object",
        "required": [
          "streampoint_key"
        ],
        "properties": {
          "streampoint_key": {
            "description": "The streamer ID key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 256
          },
          "forward_ports": {
            "description": "Configuration of port handlers.",
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/forward_ports_config"
            },
            "x-key-type": "network_port"
          },
          "endpoint_auth": {
            "description": "Path to authorization backend on the endpoint to check if the Agents are allowed to connect.",
            "type": "string"
          }
        }
      },
      "vsaas_config": {
        "type": "object",
        "properties": {
          "watcher_url": {
            "type": "string",
            "description": "All requests to /vsaas and /watcher will be proxied to this url.\nWatcher will not be launched by flussonic with this option.\n"
          },
          "central_url": {
            "type": "string",
            "description": "All requests to /central will be proxied to this url.\n"
          }
        }
      },
      "camera_alarm_config": {
        "type": "object",
        "properties": {
          "listen": {
            "$ref": "#/components/schemas/listen_spec"
          },
          "catch": {
            "description": "The list of keywords in the e-mails that are considered alarms.",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "vision_config": {
        "type": "object",
        "properties": {
          "jpeg_vector_helper": {
            "description": "Enables JPEG generation for recognized objects. By default, vision process will generate only text events.",
            "type": "string"
          },
          "hw": {
            "description": "Hardware device type to be used for a vision process.",
            "type": "string"
          }
        }
      },
      "iptv_config": {
        "type": "object",
        "properties": {
          "database": {
            "description": "DB connection string.",
            "type": "string"
          }
        }
      },
      "subscribers_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "subscribers": {
                "items": {
                  "$ref": "#/components/schemas/subscriber_config"
                },
                "type": "array",
                "description": "List of fetched subscribers according to query parameters."
              }
            }
          }
        ]
      },
      "subscriber_config": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Unique identifier of the subscriber.\n",
            "example": "client01",
            "readOnly": true
          },
          "token": {
            "type": "string",
            "description": "Simple static unique token that will be automatically created for the\nsubscriber if not provided.\n\nThis token can be used in play URLs.\n\nShould be URL-friendly.\n",
            "example": "ybBb5CFLqSFYc2"
          },
          "max_sessions": {
            "type": "integer",
            "description": "Limit of simulateously played sessions for this subscriber.\n",
            "example": 3
          },
          "packages": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "package_name",
              "x-format-description": "package_name"
            },
            "description": "List of available packages of channels for this subscriber.\n\nChannels (streams) are not added directly, only via packages.\n"
          }
        }
      },
      "packages_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "packages": {
                "items": {
                  "$ref": "#/components/schemas/package_config"
                },
                "type": "array",
                "description": "List of fetched packages according to query parameters."
              }
            }
          }
        ]
      },
      "package_config": {
        "type": "object",
        "properties": {
          "name": {
            "description": "The package name.",
            "type": "string",
            "readOnly": true
          },
          "channels": {
            "description": "The list of channels in the package.",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "name"
        ]
      },
      "central_disk_predictions": {
        "type": "object",
        "description": "Predictions for disk usage.\n",
        "properties": {
          "estimated_disk_usage": {
            "type": "integer",
            "format": "percent",
            "description": "Estimated disk usage in percent.\nThis value is estimated on the based on streamer disk space and current configurations of streams processed by the streamer,\nwhich specify the rate of data writing to disk by them and the duration of their data storage.\n\nNote: This value represents what percentage of the disk will be filled when all streams on the streamer reach the point where the disk is static. \nIt can be greater than 100% if streamer can't store estimated amount of data.\n",
            "x-format-description": "percent",
            "minimum": 0,
            "maximum": 100
          }
        }
      },
      "entity_event": {
        "allOf": [
          {
            "$ref": "#/components/schemas/event_default"
          },
          {
            "type": "object",
            "properties": {}
          }
        ]
      },
      "watcher_agents_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "agents": {
                "items": {
                  "$ref": "#/components/schemas/watcher_agent_config"
                },
                "type": "array",
                "description": "The list of Agents fetched according to the query parameters."
              }
            }
          }
        ]
      },
      "watcher_agent_config": {
        "allOf": [
          {
            "$ref": "#/components/schemas/agent_config_base"
          },
          {
            "type": "object",
            "properties": {}
          }
        ]
      },
      "watcher_agent_stats": {
        "type": "object",
        "properties": {
          "agent_type": {
            "type": "string",
            "enum": [
              "single",
              "router"
            ],
            "default": "single",
            "description": "The type of Agent installed on the device: \n\n* `single` means \"one Agent = one camera\", i.e. Agent is installed on a camera itself.\n* `router` means \"one Agent = multiple cameras\", i.e. Agent is installed on a router\nto provision the cameras from LAN to Watcher.\n"
          },
          "connections_requested": {
            "type": "integer",
            "default": 0,
            "description": "The number of connections requested by Agent."
          },
          "connections_established": {
            "type": "integer",
            "default": 0,
            "description": "The number of successfully established connections."
          },
          "peer_ip": {
            "type": "string",
            "format": "ipv4",
            "description": "Public IP address of the device (camera or router) on which the Agent is running.",
            "example": "185.134.232.183",
            "x-format-description": "ipv4"
          },
          "local_ip": {
            "type": "string",
            "format": "ipv4",
            "description": "IP address of the device (camera or router) in the local network.",
            "example": "10.10.17.88",
            "x-format-description": "ipv4"
          },
          "mac_address": {
            "type": "string",
            "example": "F0-23-B9-59-20-F1",
            "description": "MAC-address of the device."
          },
          "version": {
            "type": "string",
            "description": "Agent version.",
            "example": "v21.02-8-g535c85d"
          },
          "endpoint_connection": {
            "$ref": "#/components/schemas/watcher_agent_control_connection"
          },
          "streampoint_connection": {
            "description": "Parameters of the connection between Agent and its streampoint.",
            "allOf": [
              {
                "$ref": "#/components/schemas/watcher_agent_control_connection"
              },
              {
                "$ref": "#/components/schemas/watcher_agent_data_connections"
              }
            ]
          }
        }
      },
      "watcher_agent_control_connection": {
        "type": "object",
        "properties": {
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Timestamp of the current Agent control connection opening.",
            "example": 1637094994000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "hostname": {
            "type": "string",
            "description": "Hostname of the server",
            "example": "agents-001.vsaas.io"
          },
          "alive": {
            "type": "boolean",
            "description": "A flag showing if Agent is connected at the moment of the request."
          },
          "status_changed_at": {
            "description": "UTC timestamp of the last Agent status change to offline or online.\nSame as `opened_at` if Agent is now connected.\n",
            "type": "integer",
            "format": "utc",
            "example": 1634560921,
            "x-format-description": "Unix timestamp in seconds",
            "minimum": 1000000000,
            "maximum": 10000000000
          },
          "bytes_from_server": {
            "type": "integer",
            "format": "bytes",
            "description": "A number of bytes received from the server by Agent since `opened_at`.",
            "example": 40000,
            "x-format-description": "bytes"
          },
          "bytes_to_server": {
            "type": "integer",
            "format": "bytes",
            "description": "A number of bytes sent to the server by Agent since `opened_at`.",
            "example": 400000000000,
            "x-format-description": "bytes"
          }
        }
      },
      "watcher_agent_data_connections": {
        "type": "object",
        "properties": {
          "connections_attempted": {
            "type": "integer",
            "description": "A number of times the streamer tried to open a data connection via this Agent.",
            "example": 400
          },
          "connections_opened": {
            "type": "integer",
            "description": "A number of successfully opened data connections via this Agent.",
            "example": 300
          },
          "connections_current": {
            "type": "integer",
            "description": "A number of currently active data connections opened via this Agent.",
            "example": 2
          }
        }
      },
      "episode": {
        "discriminator": {
          "propertyName": "episode_type",
          "mapping": {
            "generic": "#/components/schemas/episode_generic",
            "face": "#/components/schemas/vision_episode_face",
            "vehicle": "#/components/schemas/vision_episode_vehicle",
            "context_search": "#/components/schemas/vision_episode_context_search",
            "qr_code": "#/components/schemas/vision_episode_qr_code",
            "custom": "#/components/schemas/episode_custom"
          }
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/episode_generic"
          },
          {
            "$ref": "#/components/schemas/vision_episode_face"
          },
          {
            "$ref": "#/components/schemas/vision_episode_vehicle"
          },
          {
            "$ref": "#/components/schemas/vision_episode_human"
          },
          {
            "$ref": "#/components/schemas/vision_episode_context_search"
          },
          {
            "$ref": "#/components/schemas/vision_episode_qr_code"
          },
          {
            "$ref": "#/components/schemas/episode_custom"
          }
        ]
      },
      "episode_base": {
        "type": "object",
        "description": "# Definition\n\nEpisode is a record about continious part of one video stream.\n\nIt is used in video analytics, television systems, etc. for describing one continious and logically\nconsolidated part of video stream.\n\nFor example, episode can describe one TV show or a part of video when the car with specific license plate\npassed the camera view.\n\nDifferent systems in our ecosystem can emit and consume episodes of different `episode_type`.\n\n# Alternatives\n\nWhat episodes are not:\n\n  * they cannot combine multiple streams. If you have multicamera view on the scene, you will have to create many episodes and join then in another system\n  * they cannot be multipart. Only one continious uninterrupted episode. However, it is ok for them to overlap.\n\n# Updates\n\nEpisodes are supposed to be streamable and updatable. \n\nIf you consume episodes, you must be ready to see old `episode_id`\nwith new updated data. You MUST overwrite previous data.\n\nIf you emit episodes and you change any fields, you MUST accumulate previous data of episode and send full copy of\nupdated episode.\n\n# Borders\n\nEpisode have two mandatory fields: `opened_at` and `updated_at`, they are default borders of the episode:\nbeginning and the end.\n\nSometimes you need to look at another fields: `started_at` and `closed_at`.\n\n`started_at` appears when episode emitter decides that beginning of the episode should be different from `opened_at`,\nfor example if video analytics has analysed previous frames and decided that this object appeared earlier.\n\n`closed_at` can appear if episode source have decided that episode will not continue anymore, for example\ncar have run out of camera view. However, `updated_at` can be still changed, if any other system will add \nmore data there, for example detected licence plates of some other auxiliary information.\n",
        "required": [
          "episode_id",
          "media",
          "opened_at",
          "updated_at"
        ],
        "properties": {
          "episode_id": {
            "type": "integer",
            "format": "snowflake_id",
            "description": "Unique identifier of the episode. Must be created by the system that first creates this episode.\n\nPlease, mention that it is assumed to be 64 bit length including time of creation in it (refer to snowflake),\nso you cannot handle it in javascript with simple `JSON.parse()`, you need to use parsed that will properly\nhandle very long integers.\n",
            "examples": {
              "default": {
                "value": 1722279170848854000
              }
            },
            "x-format-description": "snowflake_id"
          },
          "media": {
            "type": "string",
            "format": "media_name",
            "description": "Stream name on which this episode exists.\n",
            "x-format-description": "media_name"
          },
          "close_reason": {
            "$ref": "#/components/schemas/episode_close_reason"
          },
          "opened_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this episode was created. Naming is standard for whole flussonic ecosystem.\nUsually this time will be the same as `started_at`, but can differ, refer to the description of that field.\n\nThe value of this field is copied into `episode_id`, so sorting by `episode_id` will give you the same\nsort as by `opened_at`\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "started_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "This field can be used as indication of the fact that some system have checked and ensured that\nthis episode has really started at some time, that may differ from `opened_at`.\n\nFor example video analytics will use this field for the time when this episode was confirmed as confident.\n\nMay be not relevant for television systems.\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "updated_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time of last change of the episode.\n\nSystem that processes episodes and can send them to other systems, MUST update this field\non any changes in this episode.\n\nThis field MUST be updated strictly monotonical and increasing. The updater MUST guarantee that\nthis `updated_at` can be used as a sort key for fetching fresh updates.\n\nConsumer of the episodes can use `updated_at` in the following scenario:\n\n  * fetch all exisiting episodes from the source\n  * take biggest `updated_at` from this dataset, it will be T\n  * ask source for all episodes with `updated_at > T`\n\nThis algorithm can be used for fetching update stream from the source.\n",
            "examples": {
              "default": {
                "value": 1637098611000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "closed_at": {
            "type": "integer",
            "format": "utc_ms",
            "description": "Episode emitter can decide that episode considered closed and will not grow further.\n`closed_at` MUST NOT change, it must be emitted only once.\n\nEpisode can live without `closed_at`, in this case you should use `updated_at` as the last time\nof the episode.\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "preview_timestamp": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when the preview of this episode is available.\nUse it to request preview image via Mediaserver's DVR API (`jpeg_preview_dvr`).\n\nVisit the [Getting JPEGs from DVR by specific time](https://flussonic.com/doc/thumbnails/#thumbnails-dvr-time) article\nand [JPEG thumbnail from DVR](https://flussonic.com/doc/api/streaming/#tag/image/operation/jpeg_preview_dvr) section of the Mediaserver's API Reference\nfor details.\n\nThis field may not be present. If so, you may use the timestamp from the `started_at` field to request the preview image\n",
            "examples": {
              "default": {
                "value": 1637094994000
              }
            },
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "preview": {
            "type": "string",
            "contentEncoding": "base64",
            "format": "base64",
            "description": "Small inline image of detected object cropped from the entire frame used for directly display in web-browser UI or mobile application.\n",
            "x-format-description": "base64"
          },
          "frame_preview": {
            "type": "string",
            "contentEncoding": "base64",
            "format": "base64",
            "description": "Small inline image of the entire frame used for direct display in web-browser UI or mobile application.\n\nFrame preview resolution is about 240p and the maximum image size is not larger then a few tens of kilobytes.\n",
            "x-format-description": "base64"
          },
          "episode_appearance_timestamps": {
            "$ref": "#/components/schemas/episode_appearance_timestamps"
          },
          "recording_status": {
            "type": "string",
            "enum": [
              "full",
              "none",
              "partial"
            ],
            "description": "DVR recording status: fully recorded, not recorded, or partially recorded\n",
            "readOnly": true
          }
        }
      },
      "episodes_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "episodes": {
                "description": "The list of Episodes fetched according to the query parameters.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/episode"
                }
              }
            }
          }
        ]
      },
      "episode_close_reason": {
        "type": "string",
        "enum": [
          "timeout"
        ]
      },
      "episode_generic": {
        "allOf": [
          {
            "$ref": "#/components/schemas/episode_base"
          },
          {
            "type": "object",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Generic stream episode",
                "const": "generic"
              }
            }
          }
        ]
      },
      "episode_custom": {
        "allOf": [
          {
            "$ref": "#/components/schemas/episode_base"
          },
          {
            "type": "object",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Custom episode type.\nUse this field to define your own episode types when integrating custom analytics. \nIf episode type is not specified, episode will be saved with `generic` type.\n",
                "maxLength": 20,
                "minLength": 1
              },
              "payload": {
                "type": "object",
                "description": "Custom episode payload. Use this field to provide additional information about the episode."
              }
            }
          }
        ]
      },
      "episode_appearance_timestamps": {
        "type": "object",
        "properties": {
          "inference_timestamp": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this episode was created in inference service.",
            "example": 1637094994000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "central_timestamp": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this episode was fetched by Central.",
            "example": 1637098611000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "watcher_timestamp": {
            "type": "integer",
            "format": "utc_ms",
            "description": "The time when this episode was fetched by Watcher.",
            "example": 1637094994000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          }
        }
      },
      "vision_confidence": {
        "description": "Confidence metric",
        "type": "number",
        "examples": {
          "default": {
            "value": 0.34
          },
          "one": {
            "value": 0.98
          }
        },
        "minimum": 0,
        "maximum": 1
      },
      "vision_box": {
        "type": "object",
        "description": "Rectangle",
        "required": [
          "top",
          "left",
          "bottom",
          "right"
        ],
        "properties": {
          "top": {
            "description": "Top border of the bounding box. Fraction of full frame height",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "left": {
            "description": "Left border of the bounding box. Fraction of full frame width",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "bottom": {
            "description": "Bottom border of the bounding box. Fraction of full frame height",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "right": {
            "description": "Right border of the bounding box. Fraction of full frame width",
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        }
      },
      "vision_episode_face": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "preview"
            ],
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Face is detected",
                "const": "face"
              },
              "detections": {
                "type": "array",
                "description": "Detections associated with this episode",
                "items": {
                  "$ref": "#/components/schemas/vision_detected_face"
                }
              },
              "fingerprint": {
                "$ref": "#/components/schemas/vision_face_fingerprint"
              },
              "preview": {
                "type": "string",
                "contentEncoding": "base64",
                "format": "base64",
                "description": "Small inline image of detected object cropped from the entire frame used for directly display in web-browser UI or mobile application.\n\nPreview contains an image of person's face and has a resolution about 200 x 200 pixels with maximum size about 10 kilobytes.\n",
                "x-format-description": "base64"
              },
              "matched_persons": {
                "description": "List of matched persons with similarity metric.  \nVideoanalytics identification service enriches episode's data and fills this field\nwith the list of persons that are similar to the face detected in this episode.\n",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/vision_person_match"
                }
              }
            }
          },
          {
            "$ref": "#/components/schemas/episode_base"
          }
        ]
      },
      "vision_episode_vehicle": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "preview"
            ],
            "description": "Vehicle episode",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Vehicle is detected",
                "const": "vehicle"
              },
              "detections": {
                "type": "array",
                "description": "Detections associated with this episode",
                "items": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/vision_detected_vehicle"
                    },
                    {
                      "$ref": "#/components/schemas/vision_detected_license_plate"
                    }
                  ]
                }
              },
              "vehicle_purpose": {
                "$ref": "#/components/schemas/vision_vehicle_purpose"
              },
              "vehicle_emergency_subtype": {
                "$ref": "#/components/schemas/vision_vehicle_emergency_subtype"
              },
              "license_plate_text": {
                "$ref": "#/components/schemas/vision_license_plate_text"
              },
              "preview": {
                "type": "string",
                "contentEncoding": "base64",
                "format": "base64",
                "description": "Small inline image of detected object cropped from the entire frame used for directly display in web-browser UI or mobile application.\n\nPreview contains an image of vehicle's license plate and has a resolution about 160 x 64 pixels with maximum size about 10 kilobytes.\n",
                "x-format-description": "base64"
              },
              "license_plate_missing": {
                "type": "boolean",
                "description": "Indicates if no license plate is detected on this vehicle"
              },
              "vehicle_facing_side": {
                "$ref": "#/components/schemas/vision_vehicle_facing_side"
              },
              "vehicle_model": {
                "description": "Displays list of the most likely vehicle brand and model options.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/vision_vehicle_model"
                },
                "minItems": 1,
                "maxItems": 3
              },
              "vehicle_color": {
                "description": "Displays list of the most likely vehicle color options.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/vision_vehicle_color"
                },
                "minItems": 1,
                "maxItems": 3
              }
            }
          },
          {
            "$ref": "#/components/schemas/episode_base"
          }
        ]
      },
      "vision_episode_context_search": {
        "allOf": [
          {
            "$ref": "#/components/schemas/episode_base"
          },
          {
            "type": "object",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Episode matches context search text query",
                "const": "context_search"
              },
              "match_score": {
                "type": "number",
                "description": "Maximum matching score between the text query and episode.",
                "examples": {
                  "default": {
                    "value": 0.2345
                  }
                }
              }
            }
          }
        ]
      },
      "vision_episode_qr_code": {
        "allOf": [
          {
            "$ref": "#/components/schemas/episode_base"
          },
          {
            "type": "object",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "QR-code is detected",
                "const": "qr_code"
              },
              "payload": {
                "type": "string",
                "description": "Raw data extracted from QR-code",
                "example": "WIFI:T:WPA;S:MyOfficeWiFi;P:Mypassword;H:;"
              }
            }
          }
        ]
      },
      "vision_episode_human": {
        "allOf": [
          {
            "$ref": "#/components/schemas/episode_base"
          },
          {
            "type": "object",
            "properties": {
              "episode_type": {
                "type": "string",
                "description": "Human is detected",
                "const": "human"
              },
              "detections": {
                "type": "array",
                "description": "Detections associated with this episode",
                "items": {
                  "$ref": "#/components/schemas/vision_detected_object_base"
                }
              }
            }
          }
        ]
      },
      "vision_detected_object_base": {
        "type": "object",
        "required": [
          "detected_at",
          "object_class"
        ],
        "properties": {
          "detected_at": {
            "description": "Timestamp when the object was detected",
            "type": "integer",
            "format": "utc_ms",
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "object_class": {
            "$ref": "#/components/schemas/vision_object_class"
          },
          "appearance": {
            "$ref": "#/components/schemas/vision_appearance"
          },
          "confidence": {
            "$ref": "#/components/schemas/vision_confidence"
          },
          "thumbnail_quality": {
            "$ref": "#/components/schemas/vision_confidence"
          },
          "thumbnail": {
            "$ref": "#/components/schemas/vision_image_attributes"
          }
        }
      },
      "vision_detected_face": {
        "allOf": [
          {
            "$ref": "#/components/schemas/vision_detected_object_base"
          },
          {
            "$ref": "#/components/schemas/vision_face_attributes"
          },
          {
            "type": "object",
            "description": "Detected face"
          }
        ]
      },
      "vision_detected_vehicle": {
        "allOf": [
          {
            "$ref": "#/components/schemas/vision_detected_object_base"
          },
          {
            "$ref": "#/components/schemas/vision_vehicle_attributes"
          },
          {
            "type": "object",
            "description": "Detected vehicle"
          }
        ]
      },
      "vision_detected_license_plate": {
        "allOf": [
          {
            "$ref": "#/components/schemas/vision_detected_object_base"
          },
          {
            "$ref": "#/components/schemas/vision_license_plate_attributes"
          },
          {
            "type": "object",
            "description": "Detected license plate"
          }
        ]
      },
      "vision_vehicle_facing_side": {
        "description": "Shows from which side the vehicle was detected.",
        "type": "string",
        "enum": [
          "front",
          "rear"
        ]
      },
      "vision_face_attributes": {
        "type": "object",
        "properties": {
          "fingerprint": {
            "$ref": "#/components/schemas/vision_face_fingerprint"
          }
        }
      },
      "vision_face_fingerprint": {
        "type": "object",
        "description": "Digital fingerprint of the face",
        "required": [
          "data",
          "version"
        ],
        "properties": {
          "data": {
            "description": "Base64 encoded representation of the fingerprint",
            "type": "string",
            "format": "base64",
            "x-format-description": "base64"
          },
          "version": {
            "description": "Version identifier of the fingerprint's data. The version is assigned automatically.\nFingerprints of different versions cannot be compared to each other.\n",
            "type": "string",
            "examples": {
              "default": {
                "value": "aabbccdd"
              },
              "one": {
                "value": "c6ba4246"
              }
            }
          }
        }
      },
      "vision_vehicle_attributes": {
        "type": "object",
        "properties": {
          "purpose": {
            "$ref": "#/components/schemas/vision_vehicle_purpose"
          },
          "license_plate_missing": {
            "type": "boolean",
            "description": "Indicates if no license plate is detected on this vehicle"
          }
        }
      },
      "vision_vehicle_purpose": {
        "description": "The purpose of the vehicle, e.g. emergency or regular.\nPolice, ambulance cars and firetrucks are being detected by the videoanalytics as `emergency`.\nAny other type of vehicle is marked as `regular`.\n",
        "type": "string",
        "enum": [
          "regular",
          "emergency"
        ]
      },
      "vision_vehicle_model": {
        "type": "object",
        "description": "Single vehicle model prediction, including the model name and confidence level.",
        "required": [
          "name",
          "confidence"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Model name of the vehicle.",
            "example": "Hyundai Palisade"
          },
          "confidence": {
            "$ref": "#/components/schemas/vision_confidence"
          }
        }
      },
      "vision_vehicle_color": {
        "type": "object",
        "description": "Single vehicle color prediction, including the color and confidence level.",
        "required": [
          "color",
          "confidence"
        ],
        "properties": {
          "color": {
            "description": "Vehicle color",
            "enum": [
              "beige",
              "white",
              "silver",
              "blue",
              "black",
              "burgundy",
              "grey",
              "brown",
              "red",
              "gold",
              "green",
              "cyan",
              "purple",
              "violet",
              "orange",
              "yellow",
              "pink"
            ],
            "type": "string"
          },
          "confidence": {
            "$ref": "#/components/schemas/vision_confidence"
          }
        }
      },
      "vision_vehicle_emergency_subtype": {
        "description": "Emergency type of the vehicle, e.g. ambulance, police, firetruck.\n",
        "type": "string",
        "enum": [
          "ambulance",
          "police",
          "firetruck"
        ]
      },
      "vision_license_plate_attributes": {
        "type": "object",
        "description": "Attributes of the detected vehicle",
        "properties": {
          "plate_text": {
            "$ref": "#/components/schemas/vision_license_plate_text"
          },
          "facing_side": {
            "$ref": "#/components/schemas/vision_vehicle_facing_side"
          }
        }
      },
      "vision_license_plate_text": {
        "description": "Recognized vehicle's license plate number",
        "type": "string",
        "examples": {
          "default": {
            "value": "A123BC45"
          },
          "one": {
            "value": "B98365H"
          },
          "two": {
            "value": "7BTK345"
          }
        }
      },
      "vision_object_class": {
        "type": "string",
        "description": "Object class",
        "enum": [
          "face",
          "license_plate",
          "vehicle",
          "human"
        ]
      },
      "vision_appearance": {
        "type": "object",
        "properties": {
          "box": {
            "$ref": "#/components/schemas/vision_box"
          }
        }
      },
      "vision_image_mimetype": {
        "type": "string",
        "enum": [
          "image/jpeg"
        ]
      },
      "vision_image_attributes": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "description": "Base64-encoded image data",
            "type": "string",
            "format": "base64",
            "x-format-description": "base64"
          },
          "sha256": {
            "type": "string",
            "format": "hexbinary",
            "description": "Checksum of this image",
            "minLength": 64,
            "maxLength": 64,
            "x-format-description": "hexbinary"
          },
          "mime_type": {
            "$ref": "#/components/schemas/vision_image_mimetype"
          }
        }
      },
      "vision_person": {
        "type": "object",
        "description": "Person",
        "required": [
          "person_id",
          "updated_at",
          "originator"
        ],
        "properties": {
          "person_id": {
            "description": "Identifier of the person",
            "readOnly": true,
            "format": "snowflake_id",
            "type": "integer",
            "examples": {
              "default": {
                "value": 7036001172460667000
              }
            },
            "x-format-description": "snowflake_id"
          },
          "external_id": {
            "description": "Identifier of the person in the external system. \nUse it when supplying the recognition results further into the external system\n(e.g. for access level check) if the person identifiers in the external system \nare different from the ones in Flussonic Identification database.\n\nThis field may contain `null` when video analytics detects a new person\nwhich explicitly has no association in the external system (i.e. if `originator=identification_service`). \n",
            "type": "string",
            "examples": {
              "default": {
                "value": "dedcc8e8"
              }
            }
          },
          "originator": {
            "$ref": "#/components/schemas/vision_person_originator"
          },
          "updated_at": {
            "description": "When this person was last updated",
            "type": "integer",
            "format": "utc_ms",
            "example": 1637034282845,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "deleted_at": {
            "description": "When this person was marked as deleted",
            "type": "integer",
            "format": "utc_ms",
            "example": 1637095014573,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          }
        }
      },
      "vision_person_match": {
        "type": "object",
        "description": "Person matching information",
        "required": [
          "person",
          "match_score"
        ],
        "properties": {
          "person": {
            "$ref": "#/components/schemas/vision_person"
          },
          "match_score": {
            "$ref": "#/components/schemas/vision_confidence"
          }
        }
      },
      "vision_person_originator": {
        "type": "string",
        "enum": [
          "api",
          "identification_service"
        ]
      },
      "tls_version": {
        "type": "string",
        "enum": [
          "tlsv1",
          "tlsv1.1",
          "tlsv1.2",
          "tlsv1.3"
        ]
      },
      "streams_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "$ref": "#/components/schemas/openmetrics_labels"
          },
          {
            "type": "object",
            "properties": {
              "streams": {
                "items": {
                  "$ref": "#/components/schemas/stream_config"
                },
                "type": "array",
                "description": "List of fetched streams according to the query parameters."
              }
            }
          }
        ]
      },
      "stream_dvr_ranges_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "ranges": {
                "description": "List of DVR ranges.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/dvr_range"
                }
              }
            }
          }
        ]
      },
      "stream_dvr_locks_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "locks": {
                "description": "List of locked DVR ranges.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/dvr_range"
                }
              }
            }
          }
        ]
      },
      "sessions_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "sessions": {
                "type": "array",
                "description": "List of fetched sessions according to query parameters.",
                "items": {
                  "$ref": "#/components/schemas/session"
                }
              }
            }
          }
        ]
      },
      "templates_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "templates": {
                "items": {
                  "$ref": "#/components/schemas/template_config"
                },
                "type": "array",
                "description": "List of templates."
              }
            }
          }
        ]
      },
      "transponder_ts_descriptors_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "ts_descriptors": {
                "description": "The list of transport stream descriptors. Descriptors are added to NIT and SDT.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ts_descriptor"
                }
              }
            }
          }
        ]
      },
      "transponder_others_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "others": {
                "description": "The list of other multiplexers added for the current multiplexer.",
                "items": {
                  "$ref": "#/components/schemas/transponder_other"
                },
                "type": "array"
              }
            }
          }
        ]
      },
      "transponder_programs_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "programs": {
                "description": "The list of programs configured in the multiplexer.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/transponder_program"
                }
              }
            }
          }
        ]
      },
      "transponder_pushes_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "pushes": {
                "description": "The list of pushes configured for the multiplexer.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/transponder_push"
                }
              }
            }
          }
        ]
      },
      "transponder_time_offsets_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "time_offsets": {
                "description": "The list of time offsets.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/transponder_time_offset"
                }
              }
            }
          }
        ]
      },
      "transponders_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "$ref": "#/components/schemas/openmetrics_labels"
          },
          {
            "type": "object",
            "properties": {
              "transponders": {
                "description": "The list of multiplexers.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/transponder_config"
                }
              }
            }
          }
        ]
      },
      "dvb_cards_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "dvb_cards": {
                "description": "The list of DVB cards configured on the server.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/dvb_card_config"
                }
              }
            }
          }
        ]
      },
      "event_sinks_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "event_sinks": {
                "description": "The configuration of event notifications.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/event_sink_config"
                }
              }
            }
          }
        ]
      },
      "available_events_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "events": {
                "description": "The list of available events.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/streamer_event1"
                }
              }
            }
          }
        ]
      },
      "auth_backends_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "auth_backends": {
                "description": "Configurations of the authorization backends.",
                "items": {
                  "$ref": "#/components/schemas/auth_backend_config"
                },
                "type": "array"
              }
            }
          }
        ]
      },
      "caches_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "caches": {
                "description": "The list of caches.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/cache_config"
                }
              }
            }
          }
        ]
      },
      "dvrs_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "$ref": "#/components/schemas/openmetrics_labels"
          },
          {
            "type": "object",
            "properties": {
              "dvrs": {
                "description": "Configurations of the DVRs.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/dvr_config"
                }
              }
            }
          }
        ]
      },
      "dvr_disks_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "disks": {
                "description": "Configurations of the RAID disks.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/raid_disk_config"
                }
              }
            }
          }
        ]
      },
      "peers_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "peers": {
                "description": "The list of peers.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/peer_config"
                }
              }
            }
          }
        ]
      },
      "sources_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "sources": {
                "description": "The list of sources.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/source_config"
                }
              }
            }
          }
        ]
      },
      "vods_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "vods": {
                "description": "Configurations of the VODs.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/vod_config"
                }
              }
            }
          }
        ]
      },
      "disk_files_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "files": {
                "description": "The list of VOD files.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/disk_file"
                }
              }
            }
          }
        ]
      },
      "logos_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "logos": {
                "description": "The array of logo files.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/logo_file"
                }
              }
            }
          }
        ]
      },
      "media_info_list": {
        "allOf": [
          {
            "$ref": "#/components/schemas/collection_response"
          },
          {
            "type": "object",
            "properties": {
              "media_info_list": {
                "description": "The list of `media_info` for each program transmitted via the DVB card.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/media_info"
                }
              }
            }
          }
        ]
      },
      "file_processor_config": {
        "type": "object",
        "properties": {
          "path": {
            "description": "The directory where Flussonic puts output files.",
            "type": "string",
            "format": "disk_path",
            "x-format-description": "disk_path"
          }
        }
      },
      "file_processor_job": {
        "description": "Video files processing request",
        "type": "object",
        "properties": {
          "input_files": {
            "description": "Input files",
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "format": "disk_path",
              "x-format-description": "disk_path"
            }
          },
          "output_file": {
            "description": "Prefix of the output file. Resulting name of the output file \nhas the following structure: {output_file}.processed.{timestamp}.mp4.\n",
            "type": "string"
          },
          "filters": {
            "description": "Processing filters",
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/file_processor_filter"
            }
          },
          "id": {
            "description": "Job id",
            "type": "string",
            "readOnly": true
          },
          "status": {
            "description": "Job status.",
            "type": "string",
            "enum": [
              "new",
              "running",
              "done",
              "error"
            ],
            "readOnly": true
          },
          "size": {
            "description": "Output file size",
            "type": "integer",
            "readOnly": true
          },
          "duration": {
            "description": "Output file duration",
            "type": "integer",
            "readOnly": true
          },
          "progress": {
            "description": "Percent done",
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "readOnly": true
          },
          "errors": {
            "description": "List of errors",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/error"
            },
            "readOnly": true
          }
        }
      },
      "file_processor_filter": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/file_processor_filter_overlay"
          },
          {
            "$ref": "#/components/schemas/file_processor_filter_crop"
          },
          {
            "$ref": "#/components/schemas/file_processor_filter_mute"
          },
          {
            "$ref": "#/components/schemas/file_processor_filter_mosaic"
          },
          {
            "$ref": "#/components/schemas/file_processor_filter_transcoder"
          },
          {
            "$ref": "#/components/schemas/file_processor_filter_extract"
          }
        ],
        "discriminator": {
          "propertyName": "group",
          "mapping": {
            "overlay": "#/components/schemas/file_processor_filter_overlay",
            "crop": "#/components/schemas/file_processor_filter_crop",
            "mute": "#/components/schemas/file_processor_filter_mute",
            "mosaic": "#/components/schemas/file_processor_filter_mosaic",
            "transcoder": "#/components/schemas/file_processor_filter_transcoder",
            "extract": "#/components/schemas/file_processor_filter_extract"
          }
        }
      },
      "file_processor_filter_overlay": {
        "type": "object",
        "required": [
          "group",
          "start",
          "stop",
          "position"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Overlay",
            "const": "overlay",
            "description": "Put black rectangle to the specified place"
          },
          "start": {
            "description": "Filter start time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "stop": {
            "description": "Filter end time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "position": {
            "description": "Overlay position at the output image",
            "type": "object",
            "required": [
              "x1",
              "y1",
              "x2",
              "y2"
            ],
            "properties": {
              "x1": {
                "description": "Top overlay coordinate",
                "type": "integer"
              },
              "y1": {
                "description": "Left overlay coordinate",
                "type": "integer"
              },
              "x2": {
                "description": "Right overlay coordinate",
                "type": "integer"
              },
              "y2": {
                "description": "Bottom overlay coordinate",
                "type": "integer"
              }
            }
          }
        }
      },
      "file_processor_filter_crop": {
        "type": "object",
        "required": [
          "group",
          "start",
          "stop"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Crop",
            "const": "crop",
            "description": "Cut off interval [start, stop] from the output"
          },
          "start": {
            "description": "Filter start time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "stop": {
            "description": "Filter end time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          }
        }
      },
      "file_processor_filter_mute": {
        "type": "object",
        "required": [
          "group",
          "start",
          "stop"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Mute",
            "const": "mute",
            "description": "Mute audio on interval [start, stop]"
          },
          "start": {
            "description": "Filter start time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "stop": {
            "description": "Filter end time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          }
        }
      },
      "file_processor_filter_mosaic": {
        "type": "object",
        "required": [
          "group"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Mosaic",
            "const": "mosaic",
            "description": "Combine all input files into single image. Cannot be used with other filters"
          }
        }
      },
      "file_processor_filter_transcoder": {
        "type": "object",
        "required": [
          "group",
          "transcoder"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Transcoder",
            "const": "transcoder",
            "description": "Transcode the input file. Cannot be used with other filters"
          },
          "transcoder": {
            "description": "Transcoder configuration",
            "oneOf": [
              {
                "$ref": "#/components/schemas/transcoder_opts"
              },
              {
                "$ref": "#/components/schemas/media_info"
              }
            ]
          }
        }
      },
      "file_processor_filter_extract": {
        "type": "object",
        "required": [
          "group",
          "start",
          "stop"
        ],
        "properties": {
          "group": {
            "type": "string",
            "title": "Extract",
            "const": "extract",
            "description": "Keep only interval [start, stop] in output"
          },
          "start": {
            "description": "Extract start time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          },
          "stop": {
            "description": "Extract end time",
            "type": "integer",
            "format": "milliseconds",
            "x-format-description": "milliseconds"
          }
        }
      },
      "openmetrics_labels": {
        "type": "object",
        "properties": {
          "server_id": {
            "type": "string",
            "format": "uuid",
            "openmetrics_label": "server_id",
            "description": "Unique server ID generated on a first start or license change.\nShould not changing until running on the same hardware.\n",
            "x-format-description": "uuid"
          }
        }
      },
      "opentelemetry": {
        "type": "object",
        "properties": {}
      },
      "agent_config_base": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Agent identifier",
            "x-primary-key": true,
            "example": "1234567"
          },
          "key": {
            "type": "string",
            "description": "Agent authentication key."
          },
          "stats": {
            "$ref": "#/components/schemas/watcher_agent_stats",
            "readOnly": true
          }
        }
      },
      "config_external_error_body": {
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "External config is not valid."
              }
            }
          },
          {
            "$ref": "#/components/schemas/config_external_error_status"
          },
          {
            "$ref": "#/components/schemas/event_default"
          }
        ]
      }
    },
    "securitySchemes": {
      "basicAuth": {
        "scheme": "basic",
        "type": "http",
        "description": "To use Basic Auth API calls authorization, you need credentials that can be set in `/etc/flussonic/flussonic.conf` file:\n\n* Use `edit_auth` for GET, PUT, POST, and DELETE requests.\n\n* Use `view_auth` if you need GET requests only.\n"
      },
      "bearerAuth": {
        "bearerFormat": "JWT",
        "scheme": "bearer",
        "type": "http",
        "description": "To use Bearer Auth API calls authorization, you need a token. \nThe token is base64-encoded string `username:password`.\n\nIf you are going to use GET, PUT, POST, and DELETE requests, \nuse username and password specified in the `edit_auth` parameter in `/etc/flussonic/flussonic.conf` file.\n\nThe `view_auth` credentials allow only GET requests.\n"
      }
    }
  },
  "paths": {
    "/streams": {
      "get": {
        "operationId": "streams_list",
        "summary": "List streams",
        "description": "This API method is one of the most important in whole API, because it gives the list of all streams,\nincluding:\n\n* configured (may not be running at the moment)\n* running (including those that are created via a template and do not have own disk configuration)\n* remote (available from other servers)\n* only recorded\n\nTogether with the `stream_save` method you can manage streams in Flussonic.\n\nYou can pass all stream configuration options to query string for filtering, not only specified in the parameters.\n\nThis method and `stream_get` will return `effective stream configuration` with all templates, defaults\nincluded into this response. It is not exactly what you can see in the disk config. If you have configured\nthis stream in the disk file, then the original disk configuration can be found in the field `config_on_disk`.\n\nWhat you get from this API call is not what you write to `stream_save`.\n",
        "parameters": [
          {
            "name": "select",
            "description": "Comma-separated list of fields (including nested) that will be returned.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name,inputs,stats,dvr.root",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `named_by (config,user,remote)`, `position`, `name`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "-stats.bitrate,name,position",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements.  Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items. \nWe do not offer common `offset` fields, use please cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          },
          {
            "name": "q",
            "description": "Search pattern for different fields like name, title, urls, etc.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "somepattern"
            }
          },
          {
            "name": "Accept",
            "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "openmetrics",
              "enum": [
                "openmetrics"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/streams_list"
                }
              },
              "application/openmetrics-text": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n"
                },
                "examples": {
                  "default": {
                    "summary": "General example",
                    "description": "The example describes the rule how the response string forms.",
                    "value": "metric{label=\"value\"} VALUE"
                  },
                  "bitrate": {
                    "value": "stream_bitrate{server_id=\"123e4567-e89b-12d3-a456-426614174000\",name=\"mystream\"} 1000"
                  },
                  "online_clients": {
                    "value": "stream_online_clients{server_id=\"123e4567-e89b-12d3-a456-426614174000\",name=\"mystream\"} 1000"
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for receiving openmetrics for Prometheus application as a text."
                }
              }
            }
          }
        },
        "tags": [
          "stream"
        ]
      }
    },
    "/streams/{name}": {
      "get": {
        "operationId": "stream_get",
        "summary": "Get one stream",
        "description": "This method allows to fetch a single stream. Refer to the `streams_list` operation to find out what data will be returned in this method.",
        "parameters": [
          {
            "description": "Stream name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stream_config"
                }
              }
            },
            "description": "Whole stream"
          }
        },
        "tags": [
          "stream"
        ]
      },
      "put": {
        "operationId": "stream_save",
        "summary": "Save stream",
        "description": "Create or update a stream by its name.\nIf the stream doesn't exist in the disk config, it will be created.\n\nIf you update a stream that is created with a template using a user request\nhaving `named_by=user`, a new stream will be created in the disk config.\n\nIf you pass partial stream configuration, this exact part will be updated, not the whole stream.\n\nTo disable a feature, provide the corresponding property with the `null` value, like `'{\"drm\": null}'`.\n\nPass the `\"$reset\": true` option to replace the stream configuration with the provided one.\n",
        "parameters": [
          {
            "name": "name",
            "description": "stream name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "description": "Partial stream configuration",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/stream_config"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated stream",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stream_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "stream"
        ]
      },
      "delete": {
        "operationId": "stream_delete",
        "summary": "Delete the stream",
        "description": "This method allows to delete a single stream. \n",
        "parameters": [
          {
            "name": "name",
            "description": "stream name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "stream"
        ]
      }
    },
    "/streams/{name}/stop": {
      "post": {
        "operationId": "stream_stop",
        "summary": "Stop the stream",
        "description": "Stop the stream with a specified name.\n\nIf the stream is static, it will restart according to existing rules.\n\nThis API call is a replacement for both: stop and restart.\n\nServer cannot restart a stream that was started by user (publish for example),\nbecause it cannot ask user to repeat publishing.\n\nStatic stream declared in config will be started automatically as if it failed\ndue to any bug.\n\nThis is why `restart` is actually a `stop` and maybe `start`, while `start` is made\nby live stream subsystem\n",
        "parameters": [
          {
            "name": "name",
            "description": "Stream name.\n",
            "in": "path",
            "required": true,
            "schema": {
              "example": "demo",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Stopped"
          }
        },
        "tags": [
          "stream-ops"
        ]
      }
    },
    "/streams/{name}/dvr/ranges": {
      "parameters": [
        {
          "description": "Stream name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "abc",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "description": "This method allows to get the list of DVR recorded ranges for a stream.",
        "operationId": "stream_dvr_ranges_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `opened_at`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "opened_at,-closed_at",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          },
          {
            "name": "opened_at_gte",
            "in": "query",
            "description": "Return only ranges with `opened_at` greater than or equal to this value.\n",
            "schema": {
              "type": "integer",
              "format": "utc_ms",
              "example": 1637094994000,
              "x-format-description": "Unix timestamp in milliseconds",
              "minimum": 1000000000000,
              "maximum": 10000000000000
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stream_dvr_ranges_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get stream recorded dvr ranges",
        "tags": [
          "stream-dvr"
        ]
      },
      "delete": {
        "description": "This method allows to delete a DVR recording in a specified range for a stream.",
        "operationId": "stream_dvr_ranges_delete",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvr_range"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The DVR recording for the specified range is deleted."
          }
        },
        "summary": "Delete stream recorded DVR range",
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/streams/{name}/dvr/locks": {
      "parameters": [
        {
          "description": "Stream name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "abc",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "description": "This method allows to get the list of locked DVR ranges for a stream.",
        "operationId": "stream_dvr_locks_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `opened_at`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "opened_at,-closed_at",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "deprecated": true,
        "x-delete-at": 23.12,
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stream_dvr_locks_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get stream locked dvr ranges",
        "tags": [
          "stream-dvr"
        ]
      },
      "post": {
        "description": "This method allows to lock a DVR range for a stream.\nLocking can be useful for the nPVR (Network Personal Video Recorder) service or just for keeping important recordings.\n",
        "operationId": "stream_dvr_locks_save",
        "deprecated": true,
        "x-delete-at": 23.12,
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvr_range"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The specified DVR range is locked."
          }
        },
        "summary": "Lock stream recorded DVR range",
        "tags": [
          "stream-dvr"
        ]
      },
      "delete": {
        "description": "This method allows to unlock a DVR range for a stream.",
        "operationId": "stream_dvr_locks_delete",
        "deprecated": true,
        "x-delete-at": 23.12,
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvr_range"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The specified DVR range is unlocked."
          }
        },
        "summary": "Unlock stream recorded DVR range",
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/streams/{name}/dvr/export": {
      "parameters": [
        {
          "description": "Stream name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "abc",
            "type": "string"
          }
        },
        {
          "description": "Start time in Unix timestamp (seconds).",
          "in": "query",
          "name": "from",
          "required": true,
          "schema": {
            "example": 1675159800,
            "type": "integer"
          }
        },
        {
          "description": "Duration in seconds.",
          "in": "query",
          "name": "duration",
          "required": true,
          "schema": {
            "example": 4200,
            "type": "integer"
          }
        },
        {
          "description": "The recording path.",
          "in": "query",
          "name": "path",
          "required": true,
          "schema": {
            "examples": [
              "/home/example/file.mp4",
              "s3://example.com/bucket/path/to/file.mp4"
            ],
            "type": "string"
          }
        },
        {
          "name": "packing",
          "in": "query",
          "description": "How to pack a recording data in the exported file",
          "required": false,
          "schema": {
            "default": "fragmented",
            "example": "compat",
            "enum": [
              "fragmented",
              "compat"
            ],
            "type": "string"
          }
        },
        {
          "name": "timelapse",
          "in": "query",
          "description": "Request a timelapse instead of normal speed",
          "schema": {
            "type": "boolean"
          }
        },
        {
          "name": "timelapse_kbps",
          "in": "query",
          "description": "Custom bitrate for timelapse",
          "schema": {
            "type": "integer"
          }
        },
        {
          "description": "The necessity to save the metadata with the MP4 file.\nIf true, the metadata will be stored in the udta.meta.ilst.data atom.\n",
          "in": "query",
          "name": "meta",
          "required": false,
          "schema": {
            "example": true,
            "type": "boolean"
          }
        }
      ],
      "post": {
        "description": "This method allows to export MP4 files from DVR and save them on the server disk or to the S3 bucket.",
        "operationId": "stream_save_mp4",
        "responses": {
          "204": {
            "description": "The requested fragment has been successfully exported"
          },
          "303": {
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Export is taking long time, and the client is advised to monitor the job at other URI"
          }
        },
        "summary": "Export DVR as MP4 file",
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/streams/{name}/dvr/consistency_check": {
      "parameters": [
        {
          "description": "Stream name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "demo",
            "type": "string"
          }
        }
      ],
      "post": {
        "summary": "Check stream DVR",
        "description": "Run DVR consistency checks on this stream.\nWhen there are any problems found, errors are returned in response body.\nThis is a diagnostic operation, response format is not fully specified.\n",
        "operationId": "stream_dvr_consistency_check",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_consistency_errors"
                }
              }
            },
            "description": "Some consistency issues were found during checks"
          },
          "204": {
            "description": "No problem was found"
          }
        },
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/sessions": {
      "get": {
        "operationId": "sessions_list",
        "summary": "List sessions",
        "description": "This method returns list of opened play sessions.\n\nAt this moment sessions are filtered only to `type=play`, however later\nwe may add additional sessions like `publish`, `push`, or `ingest`.\n",
        "parameters": [
          {
            "description": "Comma-separated list of fields (including nested) that will be returned",
            "explode": false,
            "in": "query",
            "name": "select",
            "required": false,
            "schema": {
              "example": "name,bytes,created_at",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Composite sort direction.",
            "explode": false,
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "example": "-created_at,name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Limit select count in collection to N elements.",
            "explode": false,
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "description": "Properly encoded analog of offset, allowing to read the next bunch of items. of items",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/sessions_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "session"
        ]
      }
    },
    "/sessions/reauth": {
      "post": {
        "operationId": "sessions_reauth",
        "summary": "Invalidate auth backend response cache for sessions of specified stream",
        "description": "Flussonic immediately re-call auth-backend and check if session is still authorized.\nThis will be done for all open sessions.\n",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "Media name",
            "required": true,
            "schema": {
              "type": "string",
              "example": "clock"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Stream sessions have been successfully marked for reauth",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/collection_response"
                },
                "example": {
                  "estimated_count": 42
                }
              }
            }
          },
          "404": {
            "description": "Stream is not found by the specified name.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                },
                "example": {
                  "errors": [
                    {
                      "code": "stream_not_found",
                      "status": "404",
                      "title": "Stream not found"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "session"
        ]
      }
    },
    "/sessions/{id}": {
      "get": {
        "operationId": "session_get",
        "summary": "Get the session",
        "description": "Get the play session.\n",
        "parameters": [
          {
            "description": "Unique identifier (or UUID) of the session.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "example": "61942414-8c15-4809-8bb6-adf1ae846027",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/session"
                }
              }
            },
            "description": "Whole session"
          }
        },
        "tags": [
          "session"
        ]
      },
      "delete": {
        "operationId": "session_delete",
        "summary": "Close the session",
        "description": "Close the play session. The closed session will be available in the sessions history.\n",
        "parameters": [
          {
            "description": "Unique identifier (or UUID) of the session.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "example": "61942414-8c15-4809-8bb6-adf1ae846027",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "session"
        ]
      }
    },
    "/episodes": {
      "parameters": [
        {
          "name": "select",
          "description": "Comma-separated list of fields (including nested) that will be returned.",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "example": "episode_id,media,close_reason",
            "type": "string"
          },
          "style": "form"
        },
        {
          "name": "sort",
          "description": "Composite sort direction.\nDefault sort order is `opened_at`.\n",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "example": "opened_at,-closed_at",
            "type": "string"
          },
          "style": "form"
        },
        {
          "name": "limit",
          "description": "Limit select count in collection to N elements.",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "integer",
            "example": 100
          },
          "style": "form"
        },
        {
          "name": "cursor",
          "description": "Properly encoded analog of offset, allowing to read next bunch of items. \nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
          "in": "query",
          "required": false,
          "schema": {
            "type": "string",
            "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
          }
        },
        {
          "name": "episode_type",
          "description": "Episode type",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "string",
            "example": "motion"
          },
          "style": "form"
        },
        {
          "name": "media",
          "description": "Filter the collection by media name on which the episode is registered",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "string",
            "example": "cam-045"
          },
          "style": "form"
        },
        {
          "name": "updated_at_gt",
          "description": "Filter the collection by episode update time.\nThis field is rather specific because it allows to have an update stream with new/updated episodes\n",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "integer",
            "format": "utc_ms",
            "example": 1637094994000,
            "x-format-description": "Unix timestamp in milliseconds",
            "minimum": 1000000000000,
            "maximum": 10000000000000
          },
          "style": "form"
        },
        {
          "name": "poll_timeout",
          "description": "Client may ask to delay a response if there are no episodes to fetch.\nThis should be used as a long-poll mechanism for lightweight fetching episodes from origin.\n",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "integer",
            "format": "seconds",
            "example": 30,
            "x-format-description": "seconds"
          },
          "style": "form"
        },
        {
          "name": "dvr_presence_check",
          "description": "Enables check of DVR presence on streamer for the episode.\n",
          "in": "query",
          "required": false,
          "schema": {
            "type": "boolean",
            "example": true,
            "default": false
          },
          "style": "form"
        }
      ],
      "get": {
        "operationId": "episodes_list",
        "summary": "List episodes",
        "description": "This method allows you to fetch registered episodes\n",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/episodes_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "episode"
        ]
      }
    },
    "/templates": {
      "get": {
        "operationId": "templates_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List templates",
        "description": "This method allows to get the list of all templates in Flussonic with all their settings.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/templates_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "template"
        ]
      }
    },
    "/templates/{name}": {
      "parameters": [
        {
          "description": "Template name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "hd-sports",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "operationId": "template_get",
        "summary": "Get the template",
        "description": "This method allows to get a single template by name.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/template_config"
                }
              }
            },
            "description": "The whole template configuration."
          }
        },
        "tags": [
          "template"
        ]
      },
      "put": {
        "operationId": "template_save",
        "summary": "Save the template",
        "description": "Create or update a template. \nIf you pass only a partial template configuration, only the passed fields will be updated, not the whole template.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/template_config"
              }
            }
          },
          "description": "Partial template configuration."
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/template_config"
                }
              }
            },
            "description": "Updated template."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "template"
        ]
      },
      "delete": {
        "operationId": "template_delete",
        "summary": "Delete the template",
        "description": "Delete the template by its name.",
        "responses": {
          "204": {
            "description": "The template is deleted."
          }
        },
        "tags": [
          "template"
        ]
      }
    },
    "/transponders": {
      "get": {
        "description": "Fetch the multiplexers list.",
        "operationId": "transponders_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `name`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          },
          {
            "name": "format",
            "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "openmetrics",
              "enum": [
                "openmetrics"
              ]
            }
          },
          {
            "name": "Accept",
            "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n",
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponders_list"
                }
              },
              "application/openmetrics-text": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n",
                  "examples": {
                    "default": {
                      "summary": "General example",
                      "description": "The example describes the rule how the response string forms.",
                      "value": "metric{label=\"value\"} VALUE"
                    },
                    "stuffing": {
                      "value": "pusher_stuffing{server_id=\"123e4567-e89b-12d3-a456-426614174000\",id=1,name=\"multiplexer\"} 128"
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for receiving openmetrics for Prometheus application as a text."
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get multiplexers",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}": {
      "delete": {
        "description": "Delete the multiplexer by its name.",
        "operationId": "transponder_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the multiplexer",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "This method allows you to fetch a single multiplexer.",
        "operationId": "transponder_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_config"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the multiplexer",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update the multiplexer.",
        "operationId": "transponder_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transponder_config"
              }
            }
          },
          "description": "Request"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_config"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the multiplexer",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/pushes": {
      "get": {
        "description": "Fetch all multiplexer pushes.",
        "operationId": "transponder_pushes_list",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "url",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_pushes_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get multiplexer pushes",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/pushes/{index}": {
      "delete": {
        "description": "Delete the multiplexer push by its index.",
        "operationId": "transponder_push_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "push index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the multiplexer push",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "Method allows to fetch single multiplexer push.",
        "operationId": "transponder_push_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "push index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_push"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the multiplexer push",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update multiplexer push.",
        "operationId": "transponder_push_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "push index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transponder_push"
              }
            }
          },
          "description": "Request"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_push"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the multiplexer push",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/ts_descriptors": {
      "get": {
        "description": "Fetch all multiplexer ts_descriptors.",
        "operationId": "transponder_ts_descriptors_list",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "tag",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_ts_descriptors_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get multiplexer ts_descriptors",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/ts_descriptors/{index}": {
      "delete": {
        "description": "Delete the multiplexer descriptor by its index.",
        "operationId": "transponder_ts_descriptor_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "descriptor index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the multiplexer MPEG-TS descriptor",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "This method allows you to fetch a single multiplexer descriptor.",
        "operationId": "transponder_ts_descriptor_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "ts_descriptor index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ts_descriptor"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the multiplexer descriptor",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update multiplexer descriptor.",
        "operationId": "transponder_ts_descriptor_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "ts_descriptor index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ts_descriptor"
              }
            }
          },
          "description": "Request"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ts_descriptor"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the multiplexer ts_descriptor",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/programs": {
      "get": {
        "description": "Fetch all multiplexer programs.",
        "operationId": "transponder_programs_list",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "title",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_programs_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get multiplexer programs",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/programs/{program_id}": {
      "delete": {
        "description": "Delete the multiplexer program by its number.",
        "operationId": "transponder_program_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "program number",
            "in": "path",
            "name": "program_id",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the multiplexer program",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "Method allows you to fetch single multiplexer program.",
        "operationId": "transponder_program_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "program index",
            "in": "path",
            "name": "program_id",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_program"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the multiplexer program",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update multiplexer program.",
        "operationId": "transponder_program_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "program index",
            "in": "path",
            "name": "program_id",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transponder_program"
              }
            }
          },
          "description": "Requested"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_program"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the multiplexer program",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/time_offsets": {
      "get": {
        "description": "Fetch all multiplexer time_offsets.",
        "operationId": "transponder_time_offsets_list",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_time_offsets_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get multiplexer time_offsets",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/time_offsets/{index}": {
      "delete": {
        "description": "Delete the multiplexer time_offset by its index.",
        "operationId": "transponder_time_offset_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "time_offset index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the multiplexer time_offset",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "Method allows to fetch single multiplexer time_offset",
        "operationId": "transponder_time_offset_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "time_offset index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_time_offset"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the multiplexer time_offset",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update multiplexer time_offset",
        "operationId": "transponder_time_offset_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "time_offset index",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transponder_time_offset"
              }
            }
          },
          "description": "Requested"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_time_offset"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the multiplexer time_offset",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/others": {
      "get": {
        "description": "Fetch all other multiplexers for the multiplexer with the specified name.",
        "operationId": "transponder_others_list",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_others_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get other multiplexers",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/transponders/{name}/others/{index}": {
      "delete": {
        "description": "Delete the other multiplexer by its index.",
        "operationId": "transponder_other_delete",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "Other multiplexer index.",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the other multiplexer",
        "tags": [
          "multiplexer"
        ]
      },
      "get": {
        "description": "Method allows to fetch a single other multiplexer.",
        "operationId": "transponder_other_get",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "Other multiplexer index.",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_other"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the other multiplexer",
        "tags": [
          "multiplexer"
        ]
      },
      "put": {
        "description": "Create or update other multiplexer.",
        "operationId": "transponder_other_save",
        "parameters": [
          {
            "description": "Multiplexer name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "Other multiplexer index.",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "example": 1,
              "type": "integer"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transponder_other"
              }
            }
          },
          "description": "Request"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/transponder_other"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save the other multiplexer",
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/multiplexers/{name}/xmltv_upload": {
      "post": {
        "operationId": "multiplexer_xmltv_upload",
        "summary": "Upload XMLTV files",
        "description": "Upload XMLTV files to multiplexer\n",
        "parameters": [
          {
            "description": "multiplexer name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "description": "The array of XMLTV files.",
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary",
                      "x-format-description": "binary"
                    }
                  }
                }
              }
            }
          },
          "description": "Multipart XMLTV files upload request"
        },
        "responses": {
          "204": {
            "description": "The XMLTV files were uploaded"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't upload"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Multiplexer not found"
          }
        },
        "tags": [
          "multiplexer"
        ]
      }
    },
    "/dvb_cards": {
      "get": {
        "operationId": "dvb_cards_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "Get list of DVB cards",
        "description": "This method allows to get the list of all DVB cards configured in Flussonic.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvb_cards_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "dvb"
        ]
      }
    },
    "/dvb_cards/{name}": {
      "get": {
        "operationId": "dvb_card_get",
        "summary": "Get the DVB card",
        "description": "This method allows to get a single DVB card by name.",
        "parameters": [
          {
            "description": "dvb_card name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvb_card_config"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "dvb"
        ]
      },
      "put": {
        "operationId": "dvb_card_save",
        "summary": "Save the DVB card",
        "description": "Create or update a DVB card.\nIf you pass only a partial DVB card configuration, only the passed fields will be updated, not the whole configuration.\n",
        "parameters": [
          {
            "description": "dvb_card name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvb_card_config"
              }
            }
          },
          "description": "Request"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvb_card_config"
                }
              }
            },
            "description": "Response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save a DVB card"
          }
        },
        "tags": [
          "dvb"
        ]
      },
      "delete": {
        "operationId": "dvb_card_delete",
        "summary": "Delete the DVB card",
        "description": "Delete the DVB card by its name.",
        "parameters": [
          {
            "description": "dvb_card name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "dvb"
        ]
      }
    },
    "/dvb_cards/{name}/available_programs": {
      "get": {
        "operationId": "dvb_card_available_programs_get",
        "description": "Fetch the list of `media_info` for each program transmitted via the DVB card.",
        "parameters": [
          {
            "description": "dvb_card name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/media_info_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "summary": "Get the media_info for each dvb_card program",
        "tags": [
          "dvb"
        ]
      }
    },
    "/event_sinks": {
      "get": {
        "operationId": "event_sinks_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List event sinks configs",
        "x-api-deny": [
          "watcher-core"
        ],
        "description": "This method allows to get the list of all event sinks (former `notify`) configured in Flussonic.\n\nEach event sink is an instruction for Flussonic to send events to some target. \nIn particular, you can configure sending events to an event handler or writing them to a log file.\n\nEvent sink has its unique name just for management purposes,\nevent filtering instructions and target for sending events.\n",
        "externalDocs": {
          "description": "Find more information here",
          "url": "https://flussonic.com/doc/events-from-media-server/"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/event_sinks_list"
                }
              }
            },
            "description": "List of event sinks"
          }
        },
        "tags": [
          "events"
        ]
      }
    },
    "/event_sinks/{name}": {
      "parameters": [
        {
          "name": "name",
          "description": "event_sink name",
          "in": "path",
          "required": true,
          "schema": {
            "example": "middleware_logger",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "operationId": "event_sink_get",
        "summary": "Get one event sink configuration",
        "x-api-deny": [
          "watcher-core"
        ],
        "description": "This method allows to get a single event sink configuration.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/event_sink_config"
                }
              }
            },
            "description": "Whole event_sink  config"
          }
        },
        "tags": [
          "events"
        ]
      },
      "put": {
        "operationId": "event_sink_save",
        "summary": "Save a single event sink configuration",
        "x-api-deny": [
          "watcher-core"
        ],
        "description": "Create or update an event sink configuration by its name.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/event_sink_config"
              }
            }
          },
          "description": "Partial event_sink configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/event_sink_config"
                }
              }
            },
            "description": "Updated event sink configuration"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "events"
        ]
      },
      "delete": {
        "operationId": "event_sink_delete",
        "summary": "Delete an event sink configuration",
        "x-api-deny": [
          "watcher-core"
        ],
        "description": "Delete an event sink configuration by its name.",
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "events"
        ]
      }
    },
    "/event_sinks/{name}/events": {
      "get": {
        "operationId": "available_events_list",
        "summary": "Get events from sink configuration",
        "description": "This method allows to get the batch of events from an event sink configuration.\nCurrenly this method is not implemented yet.\nHowever, its schema can be used for getting the list of events with descriptions (see the `event` parameter in the response.)\n",
        "parameters": [
          {
            "name": "name",
            "description": "Globally unique event sink name.",
            "in": "path",
            "required": true,
            "schema": {
              "example": "middleware_logger",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "description": "List of events",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/available_events_list"
                }
              }
            }
          }
        },
        "tags": [
          "events"
        ]
      }
    },
    "/auth_backends": {
      "get": {
        "operationId": "auth_backends_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List auth backends",
        "description": "This method allows to get the list of all authorization backends configured in Flussonic.",
        "x-api-deny": [
          "watcher-core"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/auth_backends_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "auth"
        ]
      }
    },
    "/auth_backends/{name}": {
      "parameters": [
        {
          "description": "Authorization backend name.",
          "in": "path",
          "name": "name",
          "required": true,
          "schema": {
            "example": "middleware_auth",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "operationId": "auth_backend_get",
        "x-api-deny": [
          "watcher-core"
        ],
        "summary": "Get the auth backend",
        "description": "This method allows to get a single authorization backend.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/auth_backend_config"
                }
              }
            },
            "description": "The authorization backend configuration."
          }
        },
        "tags": [
          "auth"
        ]
      },
      "put": {
        "operationId": "auth_backend_save",
        "x-api-deny": [
          "watcher-core"
        ],
        "summary": "Save the auth backend",
        "description": "Create or update an authorization backend. \nIf you pass only a partial configuration, only the passed fields will be updated.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/auth_backend_config"
              }
            }
          },
          "description": "Partial authorization backend configuration."
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/auth_backend_config"
                }
              }
            },
            "description": "Updated auth_backend"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "auth"
        ]
      },
      "delete": {
        "operationId": "auth_backend_delete",
        "x-api-deny": [
          "watcher-core"
        ],
        "summary": "Delete the auth backend",
        "description": "Delete the authorization backend by its name.",
        "responses": {
          "204": {
            "description": "The authorization backend is deleted."
          }
        },
        "tags": [
          "auth"
        ]
      }
    },
    "/caches": {
      "get": {
        "description": "Fetch all caches",
        "operationId": "caches_list",
        "summary": "List of caches",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/caches_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "cache"
        ]
      }
    },
    "/caches/{name}": {
      "get": {
        "description": "Method allows to fetch single cache",
        "operationId": "cache_get",
        "parameters": [
          {
            "description": "cache name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/cache_config"
                }
              }
            },
            "description": "Whole cache"
          }
        },
        "summary": "Get the cache",
        "tags": [
          "cache"
        ]
      },
      "put": {
        "description": "Create or update cache",
        "operationId": "cache_save",
        "parameters": [
          {
            "description": "cache name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/cache_config"
              }
            }
          },
          "description": "Partial cache configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/cache_config"
                }
              }
            },
            "description": "Updated cache"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "summary": "Save cache",
        "tags": [
          "cache"
        ]
      },
      "delete": {
        "description": "Delete the cache by its name",
        "operationId": "cache_delete",
        "parameters": [
          {
            "description": "cache name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "summary": "Delete the cache",
        "tags": [
          "cache"
        ]
      }
    },
    "/dvrs": {
      "get": {
        "operationId": "dvrs_list",
        "summary": "List DVR configurations",
        "description": "This method allows to get the whole list of global DVR congifurations.",
        "parameters": [
          {
            "name": "Accept",
            "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "openmetrics",
              "enum": [
                "openmetrics"
              ]
            }
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvrs_list"
                }
              },
              "application/openmetrics-text": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n"
                },
                "examples": {
                  "default": {
                    "summary": "General example",
                    "description": "The example describes the rule how the response string forms.",
                    "value": "metric{label=\"value\"} VALUE"
                  },
                  "usage_per_disk": {
                    "value": "storage_usage{disk=\"d1\",dvr_name=\"raid\",server_id=\"6617d8c7-0044-4af7-81ec-48c29d4a4b62\"} 60"
                  },
                  "usage_per_storage": {
                    "value": "storage_usage{dvr_name=\"raid\",server_id=\"6617d8c7-0044-4af7-81ec-48c29d4a4b62\"} 54"
                  }
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "dvr"
        ]
      }
    },
    "/dvrs/{name}": {
      "get": {
        "operationId": "dvr_get",
        "summary": "Get DVR configuration",
        "description": "This method allows to get a single global DVR configuration.",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_config"
                }
              }
            },
            "description": "A single global DVR configuration."
          }
        },
        "tags": [
          "dvr"
        ]
      },
      "put": {
        "operationId": "dvr_save",
        "summary": "Save DVR configuration",
        "description": "Create or update a single global DVR configuration. \nIf you pass only a partial DVR configuration, only the passed fields will be updated, not the whole configuration.\n",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvr_config"
              }
            }
          },
          "description": "Partial DVR configuration."
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_config"
                }
              }
            },
            "description": "Updated DVR configuration."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "dvr"
        ]
      },
      "delete": {
        "operationId": "dvr_delete",
        "summary": "Delete DVR configuration",
        "description": "Delete a single global DVR configuration by its name.",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "The DVR configuration is deleted."
          }
        },
        "tags": [
          "dvr"
        ]
      }
    },
    "/dvrs/{name}/disks": {
      "get": {
        "operationId": "dvr_disks_list",
        "summary": "List the DVR disks",
        "description": "This method allows to get the whole list of disks for a DVR configuration with RAID enabled. \nLearn more in [Flussonic RAID for DVR](https://flussonic.com/doc/extend-video-storage-on-fly/). \n",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "path",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_disks_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "dvr"
        ]
      }
    },
    "/dvrs/{name}/disks/{path}": {
      "get": {
        "operationId": "dvr_disk_get",
        "summary": "Get the DVR disk",
        "description": "This method allows to get a single DVR disk for a DVR configuration with RAID enabled.",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "The path to a mounted disk. \n",
            "in": "path",
            "name": "path",
            "required": true,
            "schema": {
              "example": "volume1",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/raid_disk_config"
                }
              }
            },
            "description": "The configuration of the DVR disk."
          }
        },
        "tags": [
          "dvr"
        ]
      },
      "put": {
        "operationId": "dvr_disk_save",
        "summary": "Save the DVR disk",
        "description": "Create or update a DVR disk. \nIf you pass only a partial DVR disk configuration, only the passed fields will be updated, not the whole disk configuration.\n",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "The path to a mounted disk. \n",
            "in": "path",
            "name": "path",
            "required": true,
            "schema": {
              "example": "volume4",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/raid_disk_config"
              }
            }
          },
          "description": "Partial DVR disk configuration."
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/raid_disk_config"
                }
              }
            },
            "description": "Updated dvr disk"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "dvr"
        ]
      },
      "delete": {
        "operationId": "dvr_disk_delete",
        "summary": "Delete the DVR disk",
        "description": "Delete the DVR disk by its path.",
        "parameters": [
          {
            "description": "DVR configuration name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "description": "The path to a mounted disk. \n",
            "in": "path",
            "name": "path",
            "required": true,
            "schema": {
              "example": "volume4",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "The DVR disk is deleted."
          }
        },
        "tags": [
          "dvr"
        ]
      }
    },
    "/dvr_export_jobs": {
      "get": {
        "operationId": "dvr_export_job_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "description": "List DVR export jobs",
        "summary": "List DVR background jobs",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_export_job_list"
                }
              }
            },
            "description": "List of jobs"
          }
        },
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/dvr_export_jobs/{id}": {
      "parameters": [
        {
          "name": "id",
          "description": "The job ID.",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "format": "uuid",
            "example": "3c448252-2516-4950-a1f6-fa2c7e8f4cb1",
            "x-format-description": "uuid"
          }
        }
      ],
      "put": {
        "operationId": "dvr_export_job_start",
        "description": "Start a new DVR export job",
        "summary": "Start a job",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dvr_export_job"
              }
            }
          },
          "description": "Job request: source stream, time range, output path\n"
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_export_job"
                }
              }
            },
            "description": "Job has been created"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          },
          "409": {
            "description": "There is already a job with this id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          },
          "423": {
            "description": "There is already a job exporting to this file",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "stream-dvr"
        ]
      },
      "get": {
        "operationId": "dvr_export_job_status",
        "description": "Get the status of the DVR export job",
        "summary": "Get the job status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dvr_export_job"
                }
              }
            },
            "description": "Job status"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "stream-dvr"
        ]
      },
      "delete": {
        "operationId": "dvr_export_job_cancel",
        "description": "Cancel the DVR export job.",
        "summary": "Cancel the job",
        "responses": {
          "204": {
            "description": "Deleted"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "stream-dvr"
        ]
      }
    },
    "/dvr_episodes": {
      "parameters": [
        {
          "name": "select",
          "description": "Comma-separated list of fields (including nested) that will be returned.",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "example": "episode_id,media,close_reason",
            "type": "string"
          },
          "style": "form"
        },
        {
          "name": "sort",
          "description": "Composite sort direction.\nDefault sort order is `opened_at`.\n",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "example": "opened_at,-closed_at",
            "type": "string"
          },
          "style": "form"
        },
        {
          "name": "limit",
          "description": "Limit select count in collection to N elements.",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "integer",
            "example": 100
          },
          "style": "form"
        },
        {
          "name": "cursor",
          "description": "Properly encoded analog of offset, allowing to read next bunch of items. \nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
          "in": "query",
          "required": false,
          "schema": {
            "type": "string",
            "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
          }
        },
        {
          "name": "media",
          "description": "Filter the collection by media name on which the episode is registered",
          "explode": false,
          "in": "query",
          "required": false,
          "schema": {
            "type": "string",
            "example": "cam-045"
          },
          "style": "form"
        }
      ],
      "get": {
        "operationId": "dvr_episodes_list",
        "summary": "Recorded episodes list",
        "description": "This method allows you to fetch registered episodes with dvr recording status\n",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/episodes_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "episode"
        ]
      }
    },
    "/cluster/peers": {
      "get": {
        "description": "Fetch all peers",
        "operationId": "peers_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "hostname",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List peers",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/peers_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "cluster"
        ]
      }
    },
    "/cluster/peers/{hostname}": {
      "get": {
        "description": "Method allows to fetch single peer",
        "operationId": "peer_get",
        "summary": "Get the peer",
        "parameters": [
          {
            "description": "peer name",
            "in": "path",
            "name": "hostname",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/peer_config"
                }
              }
            },
            "description": "Whole peer"
          }
        },
        "tags": [
          "cluster"
        ]
      },
      "put": {
        "description": "Create or update peer",
        "operationId": "peer_save",
        "summary": "Save the peer",
        "parameters": [
          {
            "description": "peer name",
            "in": "path",
            "name": "hostname",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/peer_config"
              }
            }
          },
          "description": "Partial peer configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/peer_config"
                }
              }
            },
            "description": "Updated peer"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "cluster"
        ]
      },
      "delete": {
        "description": "Delete the peer by its name",
        "operationId": "peer_delete",
        "summary": "Delete the peer",
        "parameters": [
          {
            "description": "peer name",
            "in": "path",
            "name": "hostname",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "cluster"
        ]
      }
    },
    "/cluster/sources": {
      "get": {
        "description": "Fetch all sources",
        "operationId": "sources_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "url",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List sources",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/sources_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "cluster"
        ]
      }
    },
    "/cluster/sources/{url}": {
      "get": {
        "description": "Method allows to fetch single source",
        "operationId": "source_get",
        "summary": "Get the source",
        "parameters": [
          {
            "description": "source name",
            "in": "path",
            "name": "url",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/source_config"
                }
              }
            },
            "description": "Whole source"
          }
        },
        "tags": [
          "cluster"
        ]
      },
      "put": {
        "description": "Create or update source",
        "operationId": "source_save",
        "summary": "Save the source",
        "parameters": [
          {
            "description": "source name",
            "in": "path",
            "name": "url",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/source_config"
              }
            }
          },
          "description": "Partial source configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/source_config"
                }
              }
            },
            "description": "Updated source"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "cluster"
        ]
      },
      "delete": {
        "description": "Delete the source by its name",
        "operationId": "source_delete",
        "summary": "Delete the source",
        "parameters": [
          {
            "description": "source name",
            "in": "path",
            "name": "url",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "cluster"
        ]
      }
    },
    "/logos": {
      "get": {
        "operationId": "logos_list",
        "summary": "List logos",
        "description": "List logo files",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/logos_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "logo"
        ]
      }
    },
    "/logos/{name}": {
      "parameters": [
        {
          "name": "name",
          "in": "path",
          "required": true,
          "description": "logo path name",
          "schema": {
            "example": "file.png",
            "type": "string"
          },
          "style": "simple"
        }
      ],
      "get": {
        "operationId": "logo_get",
        "summary": "Get the logo",
        "description": "Method allows to fetch single logo file",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/logo_file"
                }
              }
            },
            "description": "Whole logo"
          }
        },
        "tags": [
          "logo"
        ]
      },
      "put": {
        "operationId": "logo_save",
        "summary": "Upload the logo",
        "description": "Upload logo file",
        "requestBody": {
          "description": "Uploaded logo",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/logo_file"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/logo_file"
                }
              }
            },
            "description": "Uploaded logo file"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "logo"
        ]
      },
      "delete": {
        "operationId": "logo_delete",
        "summary": "Delete the logo file",
        "description": "Delete the logo by its path",
        "responses": {
          "204": {
            "description": "Deleted"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "logo"
        ]
      }
    },
    "/vods": {
      "get": {
        "operationId": "vods_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "prefix",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List VOD locations",
        "description": "This method allows to get the list of all VOD locations configured in Flussonic.\nVOD location is a virtual filepath used to place files for VOD (Video on Demand) broadcasting.\n",
        "externalDocs": {
          "description": "Find more information here",
          "url": "https://flussonic.com/doc/launch-online-vod-theatre/"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vods_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "vod"
        ]
      }
    },
    "/vods/opened_files": {
      "get": {
        "operationId": "opened_files_list",
        "summary": "List files in VOD locations which are played by the clients",
        "description": "This method allows to get the list of files in VOD locations which are played by the clients.",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/disk_files_list"
                }
              }
            },
            "description": "List of files in the VOD storage"
          }
        },
        "parameters": [
          {
            "name": "prefix",
            "in": "query",
            "required": false,
            "description": "The unique name of VOD location. \nIt is used as a prefix for displaying opened VOD files in this location.\n",
            "schema": {
              "example": "vod",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "storage_index",
            "in": "query",
            "required": false,
            "description": "Index of the storage in the VOD location.\nIt is used as a storage_index for displaying opened VOD files in this storage.\n",
            "schema": {
              "example": 0,
              "type": "integer"
            },
            "style": "form"
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `name`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "-stats.bytes_out",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements.  Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "A properly encoded equivalent of offset allowing you to read the next bunch of items. \nWe do not offer common `offset` fields, so please use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "tags": [
          "vod"
        ]
      }
    },
    "/vods/{prefix}": {
      "get": {
        "operationId": "vod_get",
        "summary": "Get VOD location",
        "description": "This method allows to get a single VOD location.",
        "parameters": [
          {
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "name": "prefix",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vod_config"
                }
              }
            },
            "description": "Whole VOD location configuration"
          }
        },
        "tags": [
          "vod"
        ]
      },
      "put": {
        "operationId": "vod_save",
        "summary": "Save VOD location",
        "description": "Create or update a single VOD location.\nIf you pass only a partial VOD location configuration, only the passed fields will be updated, not the whole configuration.\n",
        "parameters": [
          {
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "name": "prefix",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/vod_config"
              }
            }
          },
          "description": "Partial VOD location configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vod_config"
                }
              }
            },
            "description": "Updated VOD location configuration"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vod"
        ]
      },
      "delete": {
        "operationId": "vod_delete",
        "summary": "Delete VOD location",
        "description": "Delete a single VOD location by its prefix",
        "parameters": [
          {
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "name": "prefix",
            "required": true,
            "schema": {
              "example": "abc",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "vod"
        ]
      }
    },
    "/vods/{prefix}/storages/{storage_index}/files": {
      "get": {
        "operationId": "disk_files_list",
        "summary": "List files in a VOD location",
        "description": "This method allows to get the list of all files and folders for a specific storage subpath in a VOD location.",
        "parameters": [
          {
            "name": "prefix",
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "required": true,
            "schema": {
              "example": "vod",
              "type": "string"
            }
          },
          {
            "name": "storage_index",
            "in": "path",
            "description": "The index of the storage in the VOD location.",
            "required": true,
            "schema": {
              "example": 0,
              "type": "integer"
            }
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `name`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          },
          {
            "name": "folder",
            "in": "query",
            "description": "The folder in the storage to filter the results by.",
            "required": false,
            "schema": {
              "example": "abc",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/disk_files_list"
                }
              }
            },
            "description": "List of files in the VOD storage"
          }
        },
        "tags": [
          "vod"
        ]
      }
    },
    "/vods/{prefix}/storages/{storage_index}/files/{subpath}": {
      "get": {
        "operationId": "disk_file_get",
        "summary": "Get a single VOD file",
        "description": "This method allows to get a single VOD file.",
        "parameters": [
          {
            "name": "prefix",
            "in": "path",
            "required": true,
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "schema": {
              "example": "vod",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "storage_index",
            "in": "path",
            "required": true,
            "description": "Index of the storage in the VOD location.",
            "schema": {
              "example": 0,
              "type": "integer"
            },
            "style": "simple"
          },
          {
            "name": "subpath",
            "in": "path",
            "description": "Subpath to the file in the storage including filename.",
            "required": true,
            "schema": {
              "example": "bunny.mp4",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/disk_file"
                }
              }
            },
            "description": "Whole VOD file configuration."
          }
        },
        "tags": [
          "vod"
        ]
      },
      "put": {
        "operationId": "disk_file_save",
        "summary": "Save a VOD file",
        "description": "Upload a file to the VOD location.",
        "parameters": [
          {
            "name": "prefix",
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "required": true,
            "schema": {
              "example": "vod",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "storage_index",
            "description": "Index of the storage in the VOD location.",
            "in": "path",
            "required": true,
            "schema": {
              "example": 0,
              "type": "integer"
            },
            "style": "simple",
            "explode": false
          },
          {
            "name": "subpath",
            "description": "Subpath to the file in the storage including filename.",
            "in": "path",
            "required": true,
            "schema": {
              "example": "bunny.mp4",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "description": "Streaming VOD file payload.",
          "content": {
            "*/*": {
              "schema": {
                "type": "string",
                "format": "binary",
                "x-format-description": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/disk_file"
                }
              }
            },
            "description": "Uploaded VOD file."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vod"
        ]
      },
      "delete": {
        "operationId": "disk_file_delete",
        "summary": "Delete a VOD file",
        "description": "Delete a VOD file by its name.",
        "parameters": [
          {
            "name": "prefix",
            "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n",
            "in": "path",
            "required": true,
            "schema": {
              "example": "vod",
              "type": "string"
            },
            "style": "simple"
          },
          {
            "name": "storage_index",
            "description": "Index of the storage in the VOD location.",
            "in": "path",
            "required": true,
            "schema": {
              "example": 0,
              "type": "integer"
            },
            "explode": false,
            "style": "simple"
          },
          {
            "name": "subpath",
            "description": "Subpath to the file in the storage including filename.",
            "in": "path",
            "required": true,
            "schema": {
              "example": "bunny.mp4",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "vod"
        ]
      }
    },
    "/config": {
      "get": {
        "operationId": "config_get",
        "summary": "Get server config",
        "description": "Method allows to fetch global server configuration and current runtime status.\n",
        "parameters": [
          {
            "name": "Accept",
            "description": "Ask for `text/plain` or 'application/openmetrics-text' to get response with appropriate format.\nBy default it will be `application/json`.\n",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "full",
            "description": "Whether to return full configuration.",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "format",
            "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "openmetrics",
              "enum": [
                "openmetrics"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "server config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_config"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/openmetrics-text": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n",
                  "examples": {
                    "default": {
                      "summary": "General example",
                      "description": "The example describes the rule how the response string forms.",
                      "value": "metric{label=\"value\"} VALUE"
                    },
                    "online streams": {
                      "value": "server_online_streams{server_id=\"123e4567-e89b-12d3-a456-426614174000\"} 420"
                    },
                    "usage": {
                      "value": "partition_usage{server_id=\"123e4567-e89b-12d3-a456-426614174000\",disk=\"some_disk_path\"} 10"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/config_error_status"
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      },
      "put": {
        "operationId": "config_save",
        "summary": "Save server config",
        "description": "Create or update global server configuration.\n",
        "requestBody": {
          "description": "Partial or full server configuration",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/server_config"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_config"
                }
              }
            }
          },
          "400": {
            "description": "Invalid config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/config_error_status"
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      },
      "post": {
        "operationId": "config_validate",
        "summary": "Validate config",
        "description": "Just parse and validate config, nothing is saved.\n\nProvide JSON structure or plain text.\n\nTake a look at this example:\n```\ncurl -d 'http 80; stream mystream { input \"\"; }' \\\n  -H 'Content-Type: text/plain' \\\n  -sS http://login:pass@localhost:8080/streamer/api/v3/config | jq\n{\n  \"col\": 34,\n  \"config\": {\n    \"http\": [\n      \"80\"\n    ],\n    \"streams\": [\n      {\n        \"inputs\": [\n          {\n            \"url\": \"\"\n          }\n        ],\n        \"name\": \"mystream\"\n      }\n    ]\n  },\n  \"detail\": \"\",\n  \"error\": \"bad_url\",\n  \"line\": 1,\n  \"path\": [\n    \"streams\",\n    0,\n    \"inputs\",\n    0,\n    \"url\",\n    \"input_url\"\n  ]\n}\n```\n\nYou can see that it is possible to fix error on column 34 where bad, empty url was saved.\n",
        "requestBody": {
          "description": "Partial or full server configuration",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/server_config"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              },
              "example": "http 80;\n\nstream mystream {\n  input udp://239.0.0.1:1234;\n  transcoder vb=2048k ab=64k;\n}\n"
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_config"
                }
              }
            }
          },
          "400": {
            "description": "Invalid config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/config_error_status"
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      }
    },
    "/config/stats": {
      "get": {
        "operationId": "config_stats_get",
        "summary": "Get server stats",
        "description": "Method allows to fetch current runtime status.\n",
        "responses": {
          "200": {
            "description": "server stats",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_stats"
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      }
    },
    "/api_tokens": {
      "get": {
        "operationId": "api_tokens_list",
        "summary": "List API tokens",
        "description": "Method allows to fetch configured API tokens\n",
        "responses": {
          "200": {
            "description": "API tokens",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/api_tokens_list"
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      }
    },
    "/monitoring/liveness": {
      "get": {
        "operationId": "liveness_probe",
        "summary": "Liveness probe",
        "description": "K8s liveness probe.\n",
        "responses": {
          "200": {
            "description": "Means that server process has started, but doesn't know anything about\nits readiness. Check readiness to validate that server can accept requests.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_stats_whoami"
                }
              }
            }
          }
        },
        "tags": [
          "monitoring"
        ]
      }
    },
    "/monitoring/readiness": {
      "get": {
        "operationId": "readiness_probe",
        "summary": "Readiness probe",
        "description": "K8s readiness probe.\n",
        "responses": {
          "200": {
            "description": "Means that server process is ready to work. All disks are mounted,\nDVR storages opened, etc.\n\nReady for work.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/server_stats_whoami"
                }
              }
            }
          }
        },
        "tags": [
          "monitoring"
        ]
      }
    },
    "/iptv": {
      "get": {
        "operationId": "iptv_get",
        "summary": "IPTV status",
        "description": "Get current status of the trivial IPTV subscriber management system.\n",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/iptv_config"
                }
              }
            },
            "description": "Returns iptv config"
          },
          "404": {
            "description": "IPTV plugin is not configured",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "put": {
        "operationId": "iptv_save",
        "summary": "Save IPTV",
        "description": "Enable or reload IPTV plugin configuration and disk state\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/iptv_config"
              }
            }
          },
          "description": "iptv configuration"
        },
        "responses": {
          "200": {
            "description": "Updated iptv config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/iptv_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "delete": {
        "operationId": "iptv_delete",
        "summary": "Disable IPTV",
        "description": "Disable trivial IPTV plugin, remove it from the config and stop runtime status.\n",
        "responses": {
          "204": {
            "description": "Deleted iptv config"
          }
        },
        "tags": [
          "iptv"
        ]
      }
    },
    "/iptv/packages": {
      "get": {
        "operationId": "packages_list",
        "summary": "List all packages",
        "description": "List existing packages. Take a look at operation `package_get` for detailed description\nof package concept.\n",
        "parameters": [
          {
            "description": "Comma-separated list of fields (including nested) that will be returned",
            "explode": false,
            "in": "query",
            "name": "select",
            "required": false,
            "schema": {
              "example": "name,inputs,stats",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Composite sort direction",
            "explode": false,
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "example": "-stats.bitrate,name,position",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Limit select count in collection to N elements",
            "explode": false,
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "style": "form"
          },
          {
            "description": "Properly encoded analog of offset, allowing to read next bunch of items",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/packages_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "iptv"
        ]
      }
    },
    "/iptv/packages/{name}": {
      "get": {
        "operationId": "package_get",
        "summary": "Get the package",
        "description": "Package is a group of streams (channels), that are provided together\nto customer as a single billing item.\n",
        "parameters": [
          {
            "name": "name",
            "description": "package name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "sports",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/package_config"
                }
              }
            },
            "description": "Whole package"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "put": {
        "operationId": "package_save",
        "summary": "Save the package",
        "description": "Create or update the package.\n\nPartial configuration can be provided.\n",
        "parameters": [
          {
            "name": "name",
            "description": "package name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "sports",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/package_config"
              }
            }
          },
          "description": "Partial package configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/package_config"
                }
              }
            },
            "description": "Updated package"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "delete": {
        "operationId": "package_delete",
        "summary": "Delete the package",
        "description": "Delete this package with all links to streams and all links to subscribers.\n",
        "parameters": [
          {
            "name": "name",
            "description": "package name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "sports",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "iptv"
        ]
      }
    },
    "/iptv/subscribers": {
      "get": {
        "operationId": "subscribers_list",
        "summary": "List all subscribers",
        "description": "List existing subscribers from database",
        "parameters": [
          {
            "description": "Comma-separated list of fields (including nested) that will be returned",
            "explode": false,
            "in": "query",
            "name": "select",
            "required": false,
            "schema": {
              "example": "name,inputs,stats",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Composite sort direction",
            "explode": false,
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "example": "-stats.bitrate,name,position",
              "type": "string"
            },
            "style": "form"
          },
          {
            "description": "Limit select count in collection to N elements",
            "explode": false,
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "style": "form"
          },
          {
            "description": "Properly encoded analog of offset, allowing to read next bunch of items",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/subscribers_list"
                }
              }
            },
            "description": "Response"
          }
        },
        "tags": [
          "iptv"
        ]
      }
    },
    "/iptv/subscribers/{name}": {
      "get": {
        "operationId": "subscriber_get",
        "summary": "Get one subscriber",
        "description": "Get the subscriber status.\n",
        "parameters": [
          {
            "name": "name",
            "description": "subscriber name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "client01",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/subscriber_config"
                }
              }
            },
            "description": "Whole subscriber"
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "put": {
        "operationId": "subscriber_save",
        "summary": "Save the subscriber",
        "description": "Create or update the subscriber, identified by his unique name.\nPartial configuration is ok.\n",
        "parameters": [
          {
            "name": "name",
            "description": "subscriber name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "client01",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/subscriber_config"
              }
            }
          },
          "description": "Partial subscriber configuration"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/subscriber_config"
                }
              }
            },
            "description": "Updated subscriber"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "iptv"
        ]
      },
      "delete": {
        "operationId": "subscriber_delete",
        "summary": "Delete the subscriber",
        "description": "Delete the subscriber from database.\nIf he is watching video, all his sessions will be terminated soon.\n",
        "parameters": [
          {
            "name": "name",
            "description": "subscriber name",
            "in": "path",
            "required": true,
            "schema": {
              "example": "client01",
              "type": "string"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted"
          }
        },
        "tags": [
          "iptv"
        ]
      }
    },
    "/http_proxies/{prefix}": {
      "parameters": [
        {
          "name": "prefix",
          "in": "path",
          "required": true,
          "description": "HTTP proxy prefix",
          "schema": {
            "example": "abc",
            "type": "string",
            "format": "media_name",
            "x-format-description": "media_name"
          },
          "style": "simple"
        }
      ],
      "get": {
        "operationId": "http_proxy_get",
        "description": "Get http_proxy configuration.",
        "summary": "Get http_proxy",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/http_proxy_config"
                }
              }
            },
            "description": "Returns http_proxy config"
          }
        },
        "tags": [
          "config"
        ]
      },
      "put": {
        "operationId": "http_proxy_save",
        "description": "Update http_proxy configuration.",
        "summary": "Save http_proxy",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/http_proxy_config"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated http_proxy config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/http_proxy_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "config"
        ]
      },
      "delete": {
        "operationId": "http_proxy_delete",
        "description": "Delete http_proxy configuration.",
        "summary": "Delete http_proxy",
        "responses": {
          "204": {
            "description": "Deleted http_proxy config"
          }
        },
        "tags": [
          "config"
        ]
      }
    },
    "/http_proxies": {
      "get": {
        "operationId": "http_proxies_list",
        "summary": "List http proxy configuration",
        "description": "This method allows to get the whole list of http proxy congifurations.",
        "parameters": [
          {
            "name": "Accept",
            "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "openmetrics",
              "enum": [
                "openmetrics"
              ]
            }
          },
          {
            "name": "sort",
            "description": "Composite sort direction.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "prefix",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/http_proxies_list"
                }
              },
              "application/openmetrics-text": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n"
                },
                "examples": {
                  "default": {
                    "summary": "General example",
                    "description": "The example describes the rule how the response string forms.",
                    "value": "metric{label=\"value\"} VALUE"
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "Responses content format used for receiving openmetrics for Prometheus application as a text."
                }
              }
            }
          }
        },
        "tags": [
          "config"
        ]
      }
    },
    "/vsaas": {
      "get": {
        "operationId": "vsaas_get",
        "description": "Get Watcher configuration.",
        "summary": "Get vsaas",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vsaas_config"
                }
              }
            },
            "description": "Returns vsaas config"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "put": {
        "operationId": "vsaas_save",
        "description": "Update Watcher configuration.",
        "summary": "Save vsaas",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/vsaas_config"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated vsaas config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vsaas_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "delete": {
        "operationId": "vsaas_delete",
        "description": "Delete Watcher configuration.",
        "summary": "Delete vsaas",
        "responses": {
          "204": {
            "description": "Deleted vsaas config"
          }
        },
        "tags": [
          "vsaas"
        ]
      }
    },
    "/rproxy": {
      "get": {
        "operationId": "rproxy_get",
        "description": "Get rproxy configuration.",
        "summary": "Get rproxy",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rproxy_config"
                }
              }
            },
            "description": "Returns rproxy config"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "put": {
        "operationId": "rproxy_save",
        "description": "Update rproxy configuration.",
        "summary": "Save rproxy",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/rproxy_config"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated rproxy config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rproxy_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "delete": {
        "operationId": "rproxy_delete",
        "description": "Delete rproxy configuration.",
        "summary": "Delete rproxy",
        "responses": {
          "204": {
            "description": "Deleted rproxy config"
          }
        },
        "tags": [
          "vsaas"
        ]
      }
    },
    "/rproxy/agents": {
      "get": {
        "operationId": "rproxy_agents_list",
        "parameters": [
          {
            "name": "sort",
            "description": "Composite sort direction.\nDefault sort order is `name`.\n",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "example": "name",
              "type": "string"
            },
            "style": "form"
          },
          {
            "name": "limit",
            "description": "Limit select count in collection to N elements. Default value is 100.",
            "explode": false,
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "example": 100
            },
            "style": "form"
          },
          {
            "name": "cursor",
            "description": "Properly encoded analog of offset, allowing to read next bunch of items.\nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "JTI0cG9zaXRpb25fZ3Q9MQ=="
            }
          }
        ],
        "summary": "List connected streampoint agents",
        "description": "Return a list of agents currently connected to the streampoint\n",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/watcher_agents_list"
                }
              }
            },
            "description": "A list of agents currently connected to the streampoint"
          }
        },
        "tags": [
          "vsaas"
        ]
      }
    },
    "/camera_alarm": {
      "get": {
        "operationId": "camera_alarm_get",
        "description": "Get the configuration of the `camera_alarm` plugin.",
        "summary": "Get camera alarm",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/camera_alarm_config"
                }
              }
            },
            "description": "Returns camera_alarm config"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "put": {
        "operationId": "camera_alarm_save",
        "description": "Update the configuration of the `camera_alarm` plugin.",
        "summary": "Save camera alarm",
        "responses": {
          "200": {
            "description": "Updated camera_alarm config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/camera_alarm_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "delete": {
        "operationId": "camera_alarm_delete",
        "description": "Delete the configuration of the `camera_alarm` plugin.",
        "summary": "Delete camera alarm",
        "responses": {
          "204": {
            "description": "Deleted camera_alarm config"
          }
        },
        "tags": [
          "vsaas"
        ]
      }
    },
    "/vision": {
      "get": {
        "operationId": "vision_get",
        "description": "Get the video analytics configuration.",
        "summary": "Get vision",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vision_config"
                }
              }
            },
            "description": "Returns vision config"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "put": {
        "operationId": "vision_save",
        "description": "Save the video analytics configuration.",
        "summary": "Save vision",
        "responses": {
          "200": {
            "description": "Updated vision config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/vision_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "vsaas"
        ]
      },
      "delete": {
        "operationId": "vision_delete",
        "description": "Delete the video analytics configuration.",
        "summary": "Delete vision",
        "responses": {
          "204": {
            "description": "Deleted vision config"
          }
        },
        "tags": [
          "vsaas"
        ]
      }
    },
    "/file_processor": {
      "get": {
        "operationId": "file_processor_get",
        "description": "Get the file processor config",
        "summary": "Get the file processor config",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/file_processor_config"
                }
              }
            },
            "description": "Returns file_processor config"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "File processor is not configured"
          }
        },
        "tags": [
          "file_processor"
        ]
      },
      "put": {
        "operationId": "file_processor_save",
        "description": "Update the file processor config",
        "summary": "Save the file processor",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/file_processor_config"
              }
            }
          },
          "description": "file_processor config"
        },
        "responses": {
          "200": {
            "description": "Updated file_processor config",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/file_processor_config"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            },
            "description": "Couldn't save"
          }
        },
        "tags": [
          "file_processor"
        ]
      },
      "delete": {
        "operationId": "file_processor_delete",
        "description": "Delete the file processor config",
        "summary": "Delete the file processor",
        "responses": {
          "204": {
            "description": "Deleted file_processor config"
          }
        },
        "tags": [
          "file_processor"
        ]
      }
    },
    "/file_processor/jobs": {
      "post": {
        "operationId": "file_processor_job_start",
        "description": "Start the file processor job.",
        "summary": "Start file_processor job",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "An idempotency key is a unique value generated by the client which\nthe server uses to recognize subsequent retries of the same request.\n",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "x-format-description": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/file_processor_job"
              }
            }
          },
          "description": "Job request: input files, output file, filters\n"
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/file_processor_job"
                }
              }
            },
            "description": "Response containing job's Id"
          },
          "400": {
            "description": "Cannot start requested job",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "file_processor"
        ]
      }
    },
    "/file_processor/jobs/{id}": {
      "parameters": [
        {
          "name": "id",
          "description": "The job ID.",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "operationId": "file_processor_job_check",
        "description": "Get the status of the file processor job.",
        "summary": "Get the job status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/file_processor_job"
                }
              }
            },
            "description": "Job status"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "file_processor"
        ]
      },
      "delete": {
        "operationId": "file_processor_job_delete",
        "description": "Cancel the file processor job.",
        "summary": "Cancel the job",
        "responses": {
          "204": {
            "description": "Deleted"
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/error_response"
                }
              }
            }
          }
        },
        "tags": [
          "file_processor"
        ]
      }
    }
  },
  "security": [
    {
      "basicAuth": []
    },
    {
      "bearerAuth": []
    }
  ],
  "servers": [
    {
      "description": "your local installation",
      "url": "http://localhost:8080/streamer/api/v3"
    }
  ],
  "tags": [
    {
      "name": "stream",
      "description": "Managing streams in Flussonic."
    },
    {
      "name": "stream-dvr",
      "description": "Managing DVR archives for streams."
    },
    {
      "name": "stream-ops",
      "description": "Stream operations in runtime"
    },
    {
      "name": "episode"
    },
    {
      "name": "template",
      "description": "Managing templates in Flussonic. A template defines a set of settings to be applied to several streams to provide a more organized and manageable way of configuring streams."
    },
    {
      "name": "dvr",
      "description": "Managing global DVR configurations in Flussonic."
    },
    {
      "name": "auth",
      "description": "Managing authorization backends."
    },
    {
      "name": "session",
      "description": "Managing play sessions in Flussonic."
    },
    {
      "name": "events",
      "description": "Managing event sinks and events in Flussonic."
    },
    {
      "name": "monitoring",
      "description": "Probes for cluster monitoring"
    },
    {
      "name": "cache"
    },
    {
      "name": "cluster",
      "description": "Managing cluster and peers in Flussonic."
    },
    {
      "name": "vod"
    },
    {
      "name": "logo",
      "description": "Managing logos in Flussonic."
    },
    {
      "name": "multiplexer"
    },
    {
      "name": "dvb",
      "description": "Managing DVB cards in Flussonic."
    },
    {
      "name": "vsaas"
    },
    {
      "name": "config"
    },
    {
      "name": "iptv",
      "description": "Manage trivial middleware with user management and channel permissions.\nUse players like Kodi to get access to per-user playlists.\n\nIt is very trivial, just for very trivial operations like giving someone a static\ntoken for accessing content.\n\nDatabase is a static JSON file on disk that is overwritten on each update.\n"
    },
    {
      "name": "file_processor"
    }
  ]
}