OpenApi

View spec in html.

openapi: 3.0.0
info:
  version: 'v.0.6.13'
  title: 'LUNA Streams API'
  description: |
     VisionLabs LUNA Streams API. The API version is 1.

     Service is intended for creation and management streams. "Stream" is an user logical entity.

     Default port: 5160.

     OpenAPI specification is the only valid document providing up-to-date information about the service LUNA Streams.

     The specification can be used:

     - By documentation generation tools to visualize the API.
     - By code generation tools.

     All the documents and code generated using this specification can include inaccuracies and should be carefully checked.

     OpenAPI specification can be received using the [/docs/spec](#operation/getSpec) resource. The "Accept" header should be set to "application/x-yaml".

components:
  headers:
    application_json:
      schema:
        type: string
        enum:
        - application/json
      required: true
      description: Content type of the response body.

    text_plain:
      schema:
        type: string
        enum:
        - text/plain
      required: true
      description: Content type of the response body.

    luna_request_id:
      schema:
        type: string
        format: timestamp,uuid
        example: 1536751345,8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a
        pattern: ^[0-9]{10},[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$
      description: |
        Request ID. Helps to uniquely identify messages in system logs that correspond to particular requests.
        If it was not set, the system will set it to the default format ("timestamp, UUID"). It will be returned with the response.
      required: true

    docs_content_type:
      schema:
        type: string
        enum:
          - application/x-yaml
          - text/html
      required: true
      description: Content type of the response body.

    config_accept_content_type:
      schema:
        type: string
        enum:
          - application/json
          - text/plain
      required: false
      description: Content type of the response body.

    text_html:
      schema:
        type: string
        enum:
          - text/html
      required: true
      description: Content type of the response body.
  parameters:
    page:
      in: query
      name: page
      schema:
        type: integer
        minimum: 1
        default: 1
      description: Page number.

    page_size:
      in: query
      name: page_size
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 10
      description: Number of items on page.

    luna_request_id:
      in: header
      schema:
        type: string
        format: timestamp,uuid
        example: 1536751345,8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a
        pattern: ^[0-9]{10},[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$
      description: |
        External request ID. Helps to uniquely identify messages in system logs that correspond to particular requests.
        If it was not set, the system will set it to the default format ("timestamp, UUID"). It will be returned with the response.
      name: Luna-Request-Id

    accept_docs_handler:
      in: header
      name: Accept
      schema:
        $ref: '#/components/schemas/accept_docs_handler'
      required: true
      description: Acceptable type of receiving data.

    accept_config_handler:
      in: header
      name: Accept
      schema:
        type: string
        enum:
          - application/json
          - text/plain
        description: One of application/json, text/plain
      required: false
      description: Acceptable type of receiving data.

    accept_content_type:
      in: header
      name: Accept
      schema:
        type: string
        enum:
          - application/json
          - application/msgpack
      description: Which content-type is requested. `application/json` by default

    applicationJsonContent:
      in: header
      name: Content-Type
      schema:
        type: string
        enum:
        - application/json
      description: Content type is `application/json`.

    Accept:
      in: header
      name: Accept
      schema:
        type: string
        enum:
          - application/json
          - application/msgpack
      description: Preferred response content type.

    limit:
      in: query
      name: limit
      schema:
        type: integer
        minimum: 1
      description: Maximum number of the objects in the response.
      required: true

    stream_ids:
      in: query
      name: stream_ids
      schema:
        type: array
        items:
          $ref: '#/components/schemas/stream_id'
      explode: false
      description: Stream ID filter. Only streams with the specified ids will be returned in the response.
      example: 'ae09126e-70a6-49c7-923f-df2320f08639,68b363eb-600a-4e72-afb3-8c4196e385ce'

    stream_names:
      in: query
      name: names
      schema:
        type: array
        items:
          $ref: '#/components/schemas/stream_name'
      explode: false
      description: Stream name filter. Only streams with the specified names will be returned in the response.
      example: 'name1,name2'

    stream_reference:
      in: query
      name: reference
      schema:
        $ref: '#/components/schemas/stream_reference'
      description: Stream reference filter. Only streams with the specified reference will be returned in the response.

    stream_statuses:
      in: query
      name: statuses
      schema:
        type: array
        items:
          $ref: '#/components/schemas/stream_status'
      explode: false
      description: Stream status filter - comma-separated list of status values. Only streams with the specified statuses will be returned in the response.
      example: 'pending,pause'

    stream_create_time__lt:
      in: query
      name: create_time__lt
      schema:
        $ref: '#/components/schemas/time'
      description: Stream create time upper excluding bound filter in RFC 3339 format. Only streams with the creation time lower than the specified boundary will be returned in the response.
      example: "2021-09-21T19:11:41.674Z"

    stream_create_time__gte:
      in: query
      name: create_time__gte
      schema:
        $ref: '#/components/schemas/time'
      description: Stream create time lower including bound filter in RFC 3339 format. Only streams with the creation time greater than or equal to the specified boundary will be returned in the response.
      example: "2021-09-21T11:11:41.674Z"

    log_time__lt:
      in: query
      name: log_time__lt
      schema:
        $ref: '#/components/schemas/time'
      description: Stream log record time upper excluding bound filter in RFC 3339 format. Only stream logs with the record time lower than the specified boundary will be returned in the response.
      example: "2021-09-21T19:11:41.674Z"

    log_time__lt_deleting:
      in: query
      name: log_time__lt
      schema:
        $ref: '#/components/schemas/time'
      description: Stream log record time upper excluding bound filter in RFC 3339 format. Only stream logs with the record time lower than the specified boundary will be deleted.
      example: "2021-09-21T19:11:41.674Z"

    log_time__gte:
      in: query
      name: log_time__gte
      schema:
        $ref: '#/components/schemas/time'
      description: Stream log record time lower including bound filter in RFC 3339 format. Only stream log with the record time greater than or equal to the specified boundary will be returned in the response.
      example: "2021-09-21T11:11:41.674Z"

    log_targets:
      in: query
      name: targets
      schema:
        type: array
        items:
          type: string
          enum: [ stream_id, status, error, video_info, log_time, version, preview ]
          description: Stream log target.
        example: [ status ]
        default: [ stream_id, status, error, video_info, log_time, version, preview ]
      description: List of comma-separated stream logs targets.

    account_id:
      in: query
      name: account_id
      schema:
        $ref: '#/components/schemas/account_id'
      description: Account ID.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'

    account_id_required:
      required: true
      in: query
      name: account_id
      schema:
        $ref: '#/components/schemas/account_id'
      description: Account ID.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'

    group_names:
      in: query
      name: group_names
      schema:
        type: array
        items:
          $ref: '#/components/schemas/group_name'
      description: Group names.
      example: "group1,group2"

    group_name:
      in: query
      name: group_name
      schema:
        $ref: '#/components/schemas/group_name'
      description: Group name filter. Only groups with the specified names will be returned in the response.
      example: "group1"

    group_ids:
      in: query
      name: group_ids
      schema:
        type: array
        items:
          $ref: '#/components/schemas/group_id'
      explode: false
      description: Group IDs.
      example: 'ae09126e-70a6-49c7-923f-df2320f08639,68b363eb-600a-4e72-afb3-8c4196e385ce'

    stream_id_path:
      in: path
      name: stream_id
      schema:
        $ref: '#/components/schemas/uuid'
      required: true
      description: Stream ID.

    include_luna_services:
      in: query
      name: include_luna_services
      schema:
        type: integer
        enum: [0, 1]
        default: 0
      description: Whether to perform healthchecks for dependent LUNA services.
  schemas:
    error:
      type: object
      properties:
        error_code:
          type: integer
          description: Error code.
        desc:
          type: string
          description: Short error description.
        detail:
          type: string
          description: Error details.
        link:
          type: string
          description: Link to the documentation website with the error description.
      required: [error_code, detail, desc, link]
      example:
        error_code: 1
        detail: internal server error
        desc: internal server error
        link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-1

    int_version:
      type: integer
      minimum: 0

    accept_docs_handler:
      type: string
      enum:
        - application/x-yaml
        - text/html
      description: One of application/x-yaml, text/html

    version:
      type: object
      properties:
        Version:
          type: object
          properties:
            api:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: API version of service.
            major:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: Major version of service.
            minor:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: Minor version of service.
            patch:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: Patch version of service.
          required: [ api, major, minor, patch ]
      required: [ Version ]

      example:
        Version:
          api: 1
          major: 0
          minor: 0
          patch: 0

    health_ok:
      description: Successful healthcheck execution info.
      type: object
      properties:
        execution_time:
          type: number
          format: float
          example: 0.123
          description: Request execution time in seconds.
      required: [ execution_time ]

    health_errors:
      type: object
      properties:
        errors:
          description: Failed healthcheck execution info.
          type: array
          items:
            type: object
            properties:
              component:
                description: Component name.
                type: string
              error:
                allOf:
                  - description: Healthcheck error.
                  - $ref: '#/components/schemas/error'
              status:
                description: Component health status.
                type: integer
                enum: [ 0, 1 ]
            required: [ component, error, status ]
      required: [ errors ]
      example:
        errors:
          - component: db
            error:
              error_code: 10017
              desc: Database error
              detail: Database connection timeout error
              link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-10017
            status: 0
          - component: db_migration
            error:
              error_code: 10017
              desc: Database error
              detail: Database connection timeout error
              link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-10017
            status: 0

    count:
      type: integer
      minimum: 0
      example: 146

    string36_nullable:
      type: string
      maxLength: 36
      nullable: true

    string128_default:
      type: string
      maxLength: 128
      default: ""

    string512_default:
      type: string
      maxLength: 512
      default: ""

    file_mask:
      type: string
      minLength: 0
      maxLength: 128
      example: "example1_%04d.jpg"
      description: File mask.

    time:
      type: string
      format: date-time
      example: "2018-08-11T09:11:41.674Z"
      description: Time in format RFC 3339.

    uuid:
      type: string
      format: uuid
      pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$'
      example: "557d54ec-29ad-4f3c-93b4-c9092ef12515"

    stream_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
        - example: 426542d6-5509-4e5b-8a01-e2abd5c0a8c6
      description: Stream ID.

    group_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
        - example: 426542d6-5509-4e5b-8a01-e2abd5c0a8c6
      description: Stream group ID.

    account_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: Account ID for authentication in the LUNA PLATFORM.

    stream_reference:
      type: string
      maxLength: 512
      description: |
        Stream reference: 
        - for `tcp`, `udp` stream types: path to the source, USB-number
        - for `videofile` stream type: path to video file
        - for `images` stream type: path to folder with images
      example: https://upload.wikimedia.org/wikipedia/commons/2xQ2gprbMUePw1s9gw9fvA==

    roi_integer:
      type: integer
      minimum: 0
      maximum: 65536

    roi_float_percent:
      type: number
      format: float
      minimum: 0.0
      maximum: 100.0

    roi_float_percent_size:
      type: number
      format: float
      minimum: 0.00001
      maximum: 100.0

    rect:
      type: array
      items:
        type: integer
        minimum: 0
        maximum: 65536
      minItems: 4
      maxItems: 4
      deprecated: true
      default: [ 0, 0, 0, 0 ]

    rect_abs:
      type: object
      properties:
        x:
          allOf:
          - $ref: '#/components/schemas/roi_integer'
          description: Region of interest *x* coordinate
        y:
          allOf:
            - $ref: '#/components/schemas/roi_integer'
          description: Region of interest *y* coordinate
        width:
          allOf:
            - $ref: '#/components/schemas/roi_integer'
          description: Region of interest width
        height:
          allOf:
            - $ref: '#/components/schemas/roi_integer'
          description: Region of interest height
        mode:
          type: string
          enum: [abs]
          description: |
            Region of interest coordinates mode.

            - `abs`: absolute coordinates and size in pixels
            - `percents`: coordinates and size are set by percents of stream image size
      required: [x, y, width, height]

    rect_percent:
      type: object
      properties:
        x:
          allOf:
            - $ref: '#/components/schemas/roi_float_percent'
          description: Region of interest *x* coordinate in percents
        y:
          allOf:
            - $ref: '#/components/schemas/roi_float_percent'
          description: Region of interest *y* coordinate in percents
        width:
          allOf:
            - $ref: '#/components/schemas/roi_float_percent_size'
          description: Region of interest width in percents
        height:
          allOf:
            - $ref: '#/components/schemas/roi_float_percent_size'
          description: Region of interest height in percents
        mode:
          type: string
          enum: [percent]
          description: |
            Region of interest coordinates mode.

            - `abs`: absolute coordinates and size in pixels
            - `percents`: coordinates and size are set by percents of stream image size
      required: [x, y, width, height]

    roi:
      oneOf:
        - $ref: '#/components/schemas/rect_abs'
        - $ref: '#/components/schemas/rect_percent'
        - $ref: '#/components/schemas/rect'
      description: |
        Region of interest of camera frame (x, y, width, height). Can be specified either as a json object or as an array. The array format is deprecated.

        If array format is used, the elements represent the values of `x`, `y`, `width` and `height` according to their order

        If the value is omitted, the default will be: `{"x": 0, "y": 0, "width": 0, "height": 0, "mode": "abs"}`

        This means that the whole frame is the region of interest

        **Only for processing faces.**

    droi:
      oneOf:
        - $ref: '#/components/schemas/rect_abs'
        - $ref: '#/components/schemas/rect_percent'
        - $ref: '#/components/schemas/rect'
      description: |
        Region of interest within the ROI zone. Can be specified either as a json object or as an array. The array format is deprecated.

        Face detection is performed in ROI, but the best shot is selected only in the DROI area.
        Face detection must be completely within the DROI zone for the frame to be considered as a best shot.

        If array format is used, the elements represent the values of `x`, `y`, `width` and `height` according to their order

        If the value is omitted, the default will be: `{"x": 0, "y": 0, "width": 0, "height": 0, "mode": "abs"}`

        This means that the whole frame is the region of interest

        **Only for processing faces.**

    rotation:
      type: integer
      enum: [ 0, 90, 180, 270 ]
      default: 0
      description: Angle of camera frame rotation.

    preferred_program_stream_frame_width:
      type: integer
      minimum: 0
      default: 800
      description: |
        Frame width of the preferred program stream. 
        
        The parameter is intended to work with protocols that imply the presence of several channels with different 
        bitrates and resolutions (for example, HLS).
        If the stream has several such channels, then this parameter will enable you to select from all the channels
        of the whole stream the channel whose frame width is closer to the value specified in this parameter.

        **Intended for use with "tcp" and "udp" stream types.**

    stream_data_common:
      type: object
      properties:
        type:
          type: string
          description: |
            Stream type.
            - `images` - set of frames as separate image files
            - `videofile` - video file
            - `tcp` - transport layer network protocol
            - `udp` - transport layer network protocol

            Only transport layer protocols (TCP or UDP) are specified. It is necessary
            to understand on which transport layer protocol the application layer protocol 
            (HTTP, RTSP, HLS, etc.) is based.
        reference:
          $ref: '#/components/schemas/stream_reference'
        roi:
          $ref: '#/components/schemas/roi'
        droi:
          $ref: '#/components/schemas/droi'
        rotation:
          $ref: '#/components/schemas/rotation'
        preferred_program_stream_frame_width:
          $ref: '#/components/schemas/preferred_program_stream_frame_width'
      required: [ type, reference ]

    stream_data_common_required:
      allOf:
        - $ref: '#/components/schemas/stream_data_common'
        - required: [type, reference, roi, droi, rotation, preferred_program_stream_frame_width]

    stream_data_udp:
      allOf:
        - $ref: '#/components/schemas/stream_data_common'
        - properties:
            type:
              enum: [ udp ]
            endless:
              $ref: '#/components/schemas/stream_endless'

    stream_data_udp_required:
      allOf:
        - $ref: '#/components/schemas/stream_data_common_required'
        - properties:
            type:
              enum: [udp]
            endless:
              $ref: '#/components/schemas/stream_endless'
        - required: [endless]

    stream_data_tcp:
      allOf:
        - $ref: '#/components/schemas/stream_data_common'
        - properties:
            type:
              enum: [ tcp ]
            endless:
              $ref: '#/components/schemas/stream_endless'

    stream_data_tcp_required:
      allOf:
        - $ref: '#/components/schemas/stream_data_common_required'
        - properties:
            type:
              enum: [tcp]
            endless:
              $ref: '#/components/schemas/stream_endless'
        - required: [endless]

    stream_data_videofile:
      allOf:
        - $ref: '#/components/schemas/stream_data_common'
        - properties:
            type:
              enum: [ videofile ]

    stream_data_videofile_required:
      allOf:
        - $ref: '#/components/schemas/stream_data_common_required'
        - properties:
            type:
              enum: [videofile]

    stream_data_images:
      allOf:
        - $ref: '#/components/schemas/stream_data_common'
        - properties:
            type:
              enum: [ images ]
            mask:
              $ref: '#/components/schemas/file_mask'
          required: [ type, mask ]

    stream_data_images_required:
      allOf:
        - $ref: '#/components/schemas/stream_data_common_required'
        - properties:
            type:
              enum: [ images ]
            mask:
              $ref: '#/components/schemas/file_mask'
          required: [type, mask]

    stream_data:
      oneOf:
        - $ref: '#/components/schemas/stream_data_udp'
        - $ref: '#/components/schemas/stream_data_tcp'
        - $ref: '#/components/schemas/stream_data_videofile'
        - $ref: '#/components/schemas/stream_data_images'
      discriminator:
        propertyName: type
        mapping:
          udp: '#/components/schemas/stream_data_udp'
          tcp: '#/components/schemas/stream_data_tcp'
          videofile: '#/components/schemas/stream_data_videofile'
          images: '#/components/schemas/stream_data_images'
      description: Stream setting parameters.

    stream_data_required:
      oneOf:
        - $ref: '#/components/schemas/stream_data_udp_required'
        - $ref: '#/components/schemas/stream_data_tcp_required'
        - $ref: '#/components/schemas/stream_data_videofile_required'
        - $ref: '#/components/schemas/stream_data_images_required'
      discriminator:
        propertyName: type
        mapping:
          udp: '#/components/schemas/stream_data_udp_required'
          tcp: '#/components/schemas/stream_data_tcp_required'
          videofile: '#/components/schemas/stream_data_videofile_required'
          images: '#/components/schemas/stream_data_images_required'
      description: Stream setting parameters.

    stream_endless:
      type: boolean
      default: true
      description: |
        Determines if stream is endless. 
        
        `True` value means that the stream is endless and EOF value will be treated as error (stream processing will be restarted).
        Use `False` value if files are being transferred in the stream because it's not possible to determine whether file transfer ended or connection error occurred.

    handler:
      type: object
      properties:
        handler_id:
          allOf:
          - $ref: '#/components/schemas/uuid'
          description: Handler ID created in the LUNA PLATFORM.
      required: [ handler_id ]

    jwt_token:
      type: string
      example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k
      description: JWT token. It containts `token_id`, `expiration_time`, `account_id` and `visibility_area`.

    token_authorization:
      type: object
      properties:
        token:
          $ref: "#/components/schemas/jwt_token"
      required: [token]

    account_authorization:
      type: object
      properties:
        account_id:
          allOf:
            - $ref: "#/components/schemas/account_id"
            - deprecated: true
      required: [account_id]

    stream_event_handler:
      type: object
      properties:
        origin:
          type: string
          example: http://127.0.0.1:5000
          description: API service origin of the deployed LUNA PLATFORM.
        api_version:
          type: integer
          example: 6
          description: API version of API service of the deployed LUNA PLATFORM.
        bestshot_handler:
          allOf:
            - $ref: '#/components/schemas/handler'
          description: Sets the static `handler_id` pre-created in LUNA PLATFORM to generate events based on the best shots of faces and/or bodies.
        detection_handler:
          allOf:
            - $ref: '#/components/schemas/handler'
            - nullable: true
          description: |
            Sets the dynamic `handler_id` pre-created in LUNA PLATFORM to generate events containing the coordinates of the human body (x, y, width and height). These events are associated by `track_id` with events created using `bestshot_handler`.

            **Only for processing bodies.**
        frame_store:
          type: string
          example: http://127.0.0.1:5020/1/buckets/frames/images
          nullable: true
          description: URL for saving the faces or bodies source frames in the LUNA PLATFORM. You can specify the address to the bucket of the LUNA Image Store service, or the address to the "/images" resource of the LUNA API service.
        authorization:
          description: |
            Authorization for requests to the LUNA API service of the LUNA PLATFORM. 
            If authorization not specified, the `account_id` from stream will be used.
          oneOf:
            - $ref: "#/components/schemas/token_authorization"
            - $ref: "#/components/schemas/account_authorization"
      required: [ origin, api_version, bestshot_handler ]
      example:
        origin: http://127.0.0.1:5000
        api_version: 6
        bestshot_handler:
          handler_id: ee4c42b6-23ae-410e-a2aa-a4220e64ba4b
        detection_handler:
          handler_id: 426542d6-5509-4e5b-8a01-e2abd5c0a8c6
        frame_store: http://127.0.0.1:5020/1/buckets/frames/images
        authorization:
          token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
      description: Parameters related to sending the best shots to LUNA PLATFORM and processing them using handlers.

    stream_event_handler_response:
      allOf:
        - $ref: '#/components/schemas/stream_event_handler'
      required: [ origin, api_version, bestshot_handler, detection_handler, authorization ]

    stream_policies:
      type: object
      properties:
        sending:
          type: object
          properties:
            time_period_of_searching:
              type: integer
              default: -1
              minimum: -1
              description: |
                Interval in track after the end of which a best shot is sent to the server.

                The measurement type is set in the `type` parameter. If the value is `-1` (by default), then frame analysis is performed on all frames until the end of the track. At the end of the track (when the object leaves the frame), the best frame will be sent to LUNA PLATFORM.
            silent_period:
              type: integer
              default: 0
              minimum: -1
              description: |
                Interval between period. Once the analysis period is over, the system holds this silent period before starting next period of frame analysis.

                The measurement type is set in the `type` parameter. If the value is `-1`, then the silent period will last indefinitely.
            type:
              type: string
              enum: [sec, frames]
              default: sec
              description: Measurement type for `time_period_of_searching` and `silent_period` parameters (per frames or per seconds).
            number_of_bestshots_to_send:
              type: integer
              default: 1
              description: Number of best shots that the user sets to receive from the track or certain periods of this track.
            send_only_full_set:
              type: boolean
              default: true
              description: |
                  Send data only if the required number of best shots (`number_of_bestshots_to_send` parameter of `FACE_STREAM_CONFIG` settings) and detections with human body coordinates  `minimal_body_track_length_to_send` parameter of `FACE_STREAM_CONFIG` settings) have been collected.

                  **Only for processing bodies.**
            delete_track_after_sending:
              type: boolean
              default: false
              description: |
                  Whether to delete the best shots and detections with human body coordinates after sending the data.

                  **Only for processing bodies.**
          description: Stream sending parameters.
        primary_track_policy:
          type: object
          properties:
            use_primary_track_policy:
              type: boolean
              default: false
              description: Whether to use primary track policy.
            best_shot_min_size:
              type: integer
              default: 70
              description: Minimal height of detections in pixels for primary track policy at which frame analysis begins and the best shot is determined.
            best_shot_proper_size:
              type: integer
              default: 140
              description: Height of detections in pixels for primary track policy. When detection reaches the defined value, track immediately sends all its best shots to LUNA PLATFORM.
          description: |
            Stream primary track policy parameters. 
            
            These parameters is used to work with Access Control Systems (ACS, turnstiles at the entrances to banks/office buildings) to simplify the control and the introduction of facial recognition technology at the entrance to a protected area.

            **Only for processing faces. Not intended for use with "images" stream type.**
        liveness:
          type: object
          properties:
            use_shoulders_liveness_filtration:
              type: boolean
              default: False
              deprecated: true
              description: |
                Whether to check the presence of a real person in the frame based on the head and shoulder areas.

                The parameter is deprecated and will not affect any results.
            use_mask_liveness_filtration:
              type: boolean
              default: False
              description: Whether to check the presence of a real person in the frame based on backgrounds.
            use_flying_faces_liveness_filtration:
              type: boolean
              default: False
              description: Whether to check the presence of a real person in the frame based on the facial surrounding.
            liveness_mode:
              type: integer
              enum: [0, 1, 2]
              default: 0
              description: |
                Which frames from track will undergo Liveness check.
                There are three options for selecting a frame:
                  - 0 - first N frames
                  - 1 - last N frames before the best shot sending (recommended value)
                  - 2 - all frames in a track
            number_of_liveness_checks:
              type: integer
              default: 0
              example: 10
              description: Number of frames to check for Liveness. The specified value is used in the `liveness_mode` parameter.
            liveness_threshold:
              type: number
              format: float
              default: 0
              example: 0.6
              description: Threshold for defining the presence of a real person in a frame. The system confirms that it is a real person in the frame, and not a photo, only if Liveness returned a value higher than the one specified in the parameter.
            livenesses_weights:
              type: array
              items:
                type: number
                format: float
              minItems: 3
              maxItems: 3
              default: [0.0, 0.0, 0.0]
              example: [0.0, 0.45, 0.5]
              description: |
                Determines the involvement of each Liveness check type (mask, and flying_faces) in the resulting estimation of the presence of a human face in the frame.
                
                The liveness shoulders (first value) parameter will be 0.0 regardless to anything.
            mask_backgrounds_count:
              type: integer
              default: 0
              example: 300
              description: Number of background frames that are used for the corresponding checks.
          description: |
            Stream Liveness check parameters.

            **Only for processing faces.**
        filtering:
          type: object
          properties:
            min_score:
              type: number
              default: 0.5187
              description: Score that defines detection quality. Threshold for filtering detections sent to LUNA PLATFORM.
            detection_yaw_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 40.0
              description: |
                Maximum value of head yaw angle in relation to camera.

                **Only for processing faces.**
            detection_pitch_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 40.0
              description: |
                Maximum value of head pitch angle in relation to camera.

                **Only for processing faces.**
            detection_roll_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 30.0
              description: |
                Maximum value of head roll angle in relation to camera.

                **Only for processing faces.**
            yaw_number:
              type: integer
              default: 1
              description: |
                Number of frames for image filtration based on head yaw angle.

                The algorithm analyzes head yaw angles on each of those frames. If on one of them the angle is significantly different from the average 
                value of angles, the frame will not be considered as a candidate for best shot.

                By default, the parameter is disabled, the value is `1`.

                **Only for processing faces.**
            yaw_collection_mode:
              type: boolean
              default: false
              description: |
                Whether to collect a certain number of frames set in `yaw_number` to analyze head yaw angle.

                If `yaw_collection_mode` is disabled, then the system will analyze incoming frames sequentially, 
                i.e., first two frames are analyzed, then three, etc. The maximum number of frames in this sequence is set in `yaw_number` parameter.

                **Only for processing faces.**
            mouth_occlusion_threshold:
              type: number
              format: float
              default: 0.0
              example: 0.1
              description: | 
                Maximum degree of overlap of the face mouth in the frame. I.e. when the value is equal to "0.5", 50% of the mouth can be occluded.

                **Only for processing faces.**
            min_body_size_threshold:
              type: number
              format: float
              minimum: 0
              default: 0.0
              example: 0.1
              description: |
                Body detection size, less than which it will not be sent for processing. 
              
                It is calculated as the square root of the product of the body detection height (in pixels) by its width (in pixels). 
                
                If the value is `0`, then filtering of body detection by size will not be performed.

                **Only for processing bodies.**
          description: Stream filtering parameters.
        frame_processing_mode:
          type: string
          enum: [auto, full, scale]
          default: auto
          description: |
            Whether full or scaled frame will be processed (`auto` - depends on `convert_full_frame` parameter from `FACE_STREAM_CONFIG` settings).

            **Not intended for use with "images" stream type.**
        real_time_mode_fps:
          type: integer
          default: 0
          description: | 
            Number of FPS with which the video file will be processed.

            **Intended for use with "videofile" stream type.**
        ffmpeg_threads_number:
          type: integer
          default: 0
          description: Number of threads for video decoding (`0` - chosen by decoder library).
        healthcheck:
          type: object
          properties:
            max_error_count:
              type: integer
              default: 10
              description: |
                Error count limit in period to consider stream to be alive.

                The parameter works in conjunction with the `period` and `retry_delay` parameters. After receiving the first error, the wait specified in the `retry_delay` parameter is performed, and then the connection to the stream is retried. If during the time specified in the `period` parameter, the number of errors greater than or equal to the number specified in `max_error_count` was accumulated, then the processing of the stream will be terminated and its status will change to `failure`.
            period:
              type: integer
              default: 3600
              description: |
                Period (in seconds) during which the number of errors is calculated.

                The parameter works in conjunction with the `retry_delay` and `max_error_count` parameters. See the description of working with this parameter in the `max_error_count` parameter.
            retry_delay:
              type: integer
              default: 5
              description: |
                Period after which the reconnection attempt is performed.

                The parameter works in conjunction with the `period` and `max_error_count` parameters. See the description of working with this parameter in the `max_error_count` parameter.
          description: Stream health check parameters. This section is used for reconnecting to the stream when errors occur while the video is streamed.

      description: Stream processing parameters.

    stream_policies_with_defaults:
      allOf:
        - $ref: '#/components/schemas/stream_policies'
        - properties:
            sending:
              required: [ time_period_of_searching, silent_period, type, number_of_bestshots_to_send, send_only_full_set, delete_track_after_sending ]
            primary_track_policy:
              required: [ use_primary_track_policy, best_shot_min_size, best_shot_proper_size ]
            liveness:
              required: [ use_shoulders_liveness_filtration, use_mask_liveness_filtration, use_flying_faces_liveness_filtration, liveness_mode, number_of_liveness_checks, liveness_threshold, livenesses_weights, mask_backgrounds_count ]
            filtering:
              required: [ min_score, detection_yaw_threshold, detection_pitch_threshold, detection_roll_threshold, yaw_number, yaw_collection_mode, mouth_occlusion_threshold ]
            healthcheck:
              required: [ max_error_count, period, retry_delay ]
          required: [ sending, primary_track_policy, liveness, filtering, frame_processing_mode, real_time_mode_fps, ffmpeg_threads_number, healthcheck ]

    longitude:
      type: number
      minimum: -180
      maximum: 180
      example: 36.616

    latitude:
      type: number
      minimum: -90
      maximum: 90
      example: 55.752

    geo_position:
      type: object
      nullable: true
      description: Geo position specified by geographic coordinates - longitude and latitude.
      properties:
        longitude:
          allOf:
            - $ref: '#/components/schemas/longitude'
            - description: Longitude in degrees.
        latitude:
          allOf:
            - $ref: '#/components/schemas/latitude'
            - description: Latitude in degrees.
      required: [longitude, latitude]
      example:
        longitude: 36.616
        latitude: 55.752

    location_to_be_created:
      type: object
      properties:
        city:
          allOf:
            - $ref: '#/components/schemas/string36_nullable'
          example: Moscow
          description: City that stream belongs.
        area:
          allOf:
            - $ref: '#/components/schemas/string36_nullable'
          example: Central
          description: Area that stream belongs.
        district:
          allOf:
            - $ref: '#/components/schemas/string36_nullable'
          example: Basmanny
          description: District that stream belongs.
        street:
          allOf:
            - $ref: '#/components/schemas/string36_nullable'
          example: Podsosensky lane
          description: Street that stream belongs.
        house_number:
          allOf:
            - $ref: '#/components/schemas/string36_nullable'
          example: 23 bldg.3
          description: Street that stream belongs.
        geo_position:
          $ref: '#/components/schemas/geo_position'
      description: Stream location parameters.

    location:
      allOf:
        - $ref: '#/components/schemas/location_to_be_created'
      required: [city, area, district, street, house_number, geo_position]

    stream_autorestart:
      type: object
      properties:
        restart:
          type: integer
          enum: [ 0, 1 ]
          default: 0
          description: Whether to allow autorestart.
        attempt_count:
          type: integer
          minimum: 1
          default: 10
          description: Stream autorestart attempt count.
        delay:
          type: integer
          minimum: 1
          default: 60
          description: Stream autorestart delay, in seconds.
      description: Stream autorestart parameters.

    stream_autorestart_response:
      allOf:
        - $ref: '#/components/schemas/stream_autorestart'
        - properties:
            current_attempt:
              type: integer
              minimum: 0
              nullable: true
              description: Stream autorestart current attempt number | zero means no attempt was made
            last_attempt_time:
              allOf:
                - $ref: '#/components/schemas/time'
              nullable: true
              description: Last autorestart attempt time | null means no attempt was made.
            status:
              type: string
              nullable: false
              enum: [ disabled, enabled, in_progress, failed, denied ]
              description: |
                Stream autorestart status.
                
                | status   | description |
                |-------------|------------------------------------------|
                | disabled    | stream autorestart is disabled by user   |
                | enabled     | stream autorestart is enabled            |
                | in_progress | autorestart in progress                  |
                | failed      | autorestart failed                       |
                | denied      | autorestart is denied due to fatal error |

                > **WARNING**: Stream autorestart status list may be expanded in the future.

      required: [ restart, attempt_count, delay, current_attempt, last_attempt_time, status ]
      description: Stream autorestart parameters and status.

    stream_version:
      type: integer
      minimum: 1
      description: Stream version. Increased when stream data is updated via PUT /streams/{stream_id} method.

    stream_status:
      type: string
      enum: [ pending, in_progress, done, pause, restart, cancel, failure, handler_lost, not_found ]
      description: |
        Stream processing status.

        | Status   | Value |
        |-----------------|--------------------------------------------------------------------------|
        | pending         | Stream is waiting for handler.                                            |
        | in_progress     | Stream processing is in progress.                                         |
        | done            | Stream processing is completed.                                           |
        | pause           | Stream processing is paused by user.                                      |
        | restart         | Stream processing is restarted by server.                                 |
        | cancel          | Stream processing is cancelled by user.                                   |
        | failure         | Stream processing is failed by handler.                                   |
        | handler_lost    | Stream processing handler is lost, needs to be passed to another handler. |
        | not_found       | Stream was removed during the processing.                                 |
        | deleted         | Stream was removed intentionally.                                         |

        > **WARNING**: Stream status list may be expanded in the future.

    stream_to_be_created_base:
      type: object
      properties:
        account_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: Stream account ID for authentication in LUNA PLATFORM.
        name:
          allOf:
            - $ref: '#/components/schemas/string128_default'
          description: Stream name.
          default: ""
        description:
          allOf:
            - $ref: '#/components/schemas/string512_default'
          description: Stream description.
          default: ""
        data:
          $ref: '#/components/schemas/stream_data'
        event_handler:
          $ref: '#/components/schemas/stream_event_handler'
        policies:
          $ref: '#/components/schemas/stream_policies'
        location:
          $ref: '#/components/schemas/location_to_be_created'
        autorestart:
          $ref: '#/components/schemas/stream_autorestart'
        status:
          type: string
          enum: [ pending, pause ]
          default: pending
          description: Stream processing initial status.
      required: [ account_id, data, event_handler]

    stream_with_group_name:
      allOf:
        - $ref: '#/components/schemas/stream_to_be_created_base'
        - properties:
            group_name:
              $ref: '#/components/schemas/group_name'

    stream_with_group_id:
      allOf:
        - $ref: '#/components/schemas/stream_to_be_created_base'
        - properties:
            group_id:
              $ref: '#/components/schemas/group_id'

    stream_to_be_created:
      oneOf:
        - $ref: '#/components/schemas/stream_with_group_name'
        - $ref: '#/components/schemas/stream_with_group_id'

    stream_name:
      allOf:
        - $ref: '#/components/schemas/string128_default'
      description: Stream name.
      example: some name

    stream_error:
      type: string
      nullable: True
      description: |
        Stream processing error description.
        
        > **WARNING**: Fatal error prevent stream autorestart. Currently, fatal error is considered "Failed to authorize in Luna Platform".

        See [developer manual](#operation/getDevManual) for more information.
      example: null

    video_info:
      type: object
      properties:
        width:
          type: integer
          description: Stream source video width.
          example: 1920
        height:
          type: integer
          description: Stream source video height.
          example: 1080
        frame_rate:
          type: integer
          description: Stream source video frame rate.
          example: 25
        bit_rate:
          type: integer
          description: Stream source video bit rate.
          example: 25
        gop_size:
          type: integer
          description: Stream source video gop (group of frames) size.
          example: 25
        start_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: Start time of stream processing.
        duration:
          type: number
          minimum: 0
          description: Duration of the video in seconds.
        progress:
          type: number
          minimum: 0
          maximum: 1
          description: Video processing progress.
      required: [ width, height, frame_rate, bit_rate, gop_size, start_time]
      nullable: True
      description: Stream source video info.

    stream_response:
      type: object
      properties:
        stream_id:
          $ref: '#/components/schemas/stream_id'
        account_id:
          allOf:
            - $ref: '#/components/schemas/uuid'
          description: Stream account ID.
        name:
          $ref: '#/components/schemas/stream_name'
        description:
          allOf:
            - $ref: '#/components/schemas/string128_default'
          description: Stream description.
          example: some description
        data:
          $ref: '#/components/schemas/stream_data_required'
        event_handler:
          $ref: '#/components/schemas/stream_event_handler_response'
        policies:
          $ref: '#/components/schemas/stream_policies_with_defaults'
        location:
          $ref: '#/components/schemas/location'
        autorestart:
          $ref: '#/components/schemas/stream_autorestart_response'
        version:
          $ref: '#/components/schemas/stream_version'
        create_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: Stream create time.
        status:
          allOf:
            - $ref: '#/components/schemas/stream_status'
          enum: [ pending,in_progress,done,pause,cancel,failure]
          example: pending
        last_error:
          $ref: '#/components/schemas/stream_error'
        video_info:
          $ref: '#/components/schemas/video_info'
        groups:
          type: array
          items:
            $ref: '#/components/schemas/group_name'
          description: List of groups the stream belongs to.
        preview:
          $ref: '#/components/schemas/preview_nullable'
      required: [ stream_id, account_id, name, description, data, event_handler, policies, location, autorestart, version, create_time, status, last_error, video_info, groups, preview ]

    stream_to_be_patched:
      type: object
      properties:
        description:
          allOf:
            - $ref: '#/components/schemas/string128_default'
          description: New stream description.
        status:
          type: string
          enum: [ pending, pause, cancel ]
          description: New stream processing status.
      minProperties: 1
      example:
        description: Cancelled stream description.
        status: cancel

    queue_streams_response_pending:
      description: Streams from the Stream Processing Queue.
      type: object
      properties:
        streams:
          description: Array of the streams. Ordered by status last update time (old first).
          type: array
          items:
            allOf:
             - $ref: '#/components/schemas/stream_response'
            properties:
              status:
                allOf:
                  - $ref: '#/components/schemas/stream_status'
                enum: [ pending ]
      required: [streams]

    queue_streams_response_in_progress:
      description: Streams from the Stream Processing Queue.
      type: object
      properties:
        streams:
          description: Array of the streams. Ordered by status last update time (old first).
          type: array
          items:
            allOf:
            - $ref: '#/components/schemas/stream_response'
            properties:
              data:
                $ref: '#/components/schemas/stream_data'
              status:
                allOf:
                  - $ref: '#/components/schemas/stream_status'
                enum: [in_progress]
                example: in_progress
            required: [ stream_id, name, description, data, event_handler, policies, location, autorestart, version, create_time, status, last_error, video_info, groups]
      required: [streams]

    post_streams_processing_queue_request_filters:
      properties:
        stream_ids:
          description: Stream ID filter. Only streams with the specified ids will be returned in the response.
          type: array
          items:
            $ref: '#/components/schemas/stream_id'
          maxItems: 1000
        names:
          description: Stream name filter. Only streams with the specified names will be returned in the response.
          type: array
          items:
            $ref: '#/components/schemas/stream_name'
          maxItems: 1000
        group_ids:
          description: Group ID filter. Only streams with the specified ids will be returned in the response.
          type: array
          items:
            $ref: '#/components/schemas/group_id'
          maxItems: 1000
        group_names:
          description: Group name filter. Only streams with the specified names will be returned in the request.
          type: array
          items:
            $ref: '#/components/schemas/group_name'
          maxItems: 1000

    post_streams_processing_queue_request:
      description: Request data. Query for the streams queue.
      type: object
      properties:
        filters:
          $ref: '#/components/schemas/post_streams_processing_queue_request_filters'
        limit:
          type: integer
          minimum: 1
          description: Maximum number of the streams to return.
      required: [filters, limit]

    preview_url:
      type: string
      format: uri-reference
      maxLength: 256

    live_preview:
      type: object
      properties:
        url:
          allOf:
          - $ref: '#/components/schemas/preview_url'
          description: Live preview URL.
      description: Live preview data.

    last_frame_preview:
      type: object
      properties:
        url:
          allOf:
          - $ref: '#/components/schemas/preview_url'
          description: Last frame preview URL.
      description: Last frame preview data.

    preview:
      type: object
      properties:
        live:
          $ref: '#/components/schemas/live_preview'
        last_frame:
          $ref: '#/components/schemas/last_frame_preview'
      description: Preview data.

    preview_nullable:
      allOf:
      - $ref: '#/components/schemas/preview'
      nullable: true

    post_streams_processing_feedback_request:
      description: Streams info object.
      type: object
      properties:
        streams:
          description: Array of stream info.
          type: array
          items:
            description: Stream info from the processor.
            type: object
            properties:
              error:
                $ref: '#/components/schemas/stream_error'
              video_info:
                $ref: '#/components/schemas/video_info'
              stream_id:
                $ref: '#/components/schemas/stream_id'
              status:
                allOf:
                  - $ref: '#/components/schemas/stream_status'
                enum: [in_progress, done, failure]
                example: in_progress
              version:
                $ref: '#/components/schemas/stream_version'
              preview:
                $ref: '#/components/schemas/preview'
            required: [ error, video_info, stream_id, status, version ]
      required: [streams]

    feedback_response_modified_stream:
      description: Current stream info as is in the database (differs from the info in the request).
      type: object
      properties:
        stream_id:
          $ref: '#/components/schemas/stream_id'
        status:
          allOf:
            - $ref: '#/components/schemas/stream_status'
          enum: [ pending,in_progress,done,pause,cancel,failure,not_found ]
          example: in_progress
        version:
          allOf:
            - $ref: '#/components/schemas/stream_version'
          minimum: 0  # if stream was not found
      required: [ stream_id, status, version ]

    feedback_response_unmodified_stream:
      description: Current stream info as is in the database (same as in the request).
      type: object
      properties:
        stream_id:
          $ref: '#/components/schemas/stream_id'
        status:
          allOf:
            - $ref: '#/components/schemas/stream_status'
          enum: [ in_progress, done, failure ]
          example: in_progress
        version:
          $ref: '#/components/schemas/stream_version'
      required: [ stream_id, status, version ]

    feedback_response:
      description: Streams info object.
      type: object
      properties:
        streams:
          description: Stream info objects.
          type: object
          properties:
            modified:
              description: Streams that need reload.
              type: array
              items:
                $ref: '#/components/schemas/feedback_response_modified_stream'
            unmodified:
              description: Streams that do not need reload.
              type: array
              items:
                $ref: '#/components/schemas/feedback_response_unmodified_stream'
          required: [modified, unmodified]
      required: [streams]

    log_time:
      allOf:
      - $ref: '#/components/schemas/time'
      - description: Log record time.

    streams_logs:
      type: object
      properties:
        logs:
          type: array
          description: Streams logs.
          items:
            type: object
            properties:
              stream_id:
                $ref: '#/components/schemas/stream_id'
              log_time:
                $ref: '#/components/schemas/log_time'
              error:
                $ref: '#/components/schemas/stream_error'
              status:
                allOf:
                  - $ref: '#/components/schemas/stream_status'
                enum: [ pending, in_progress, done, pause, restart, cancel, failure, handler_lost, deleted ]
                example: in_progress
              video_info:
                $ref: '#/components/schemas/video_info'
              version:
                $ref: '#/components/schemas/stream_version'
              preview:
                $ref: '#/components/schemas/preview_nullable'
            minProperties: 1
          minItems: 0
      required: [logs]

    streams_logs_deleted_count:
      type: object
      properties:
        deleted_count:
          type: integer
          description: Deleted logs count.
          example: 1000
      required: [ deleted_count ]

    streams_to_be_deleted:
      type: object
      properties:
        stream_ids:
          description: Stream ID filter.
          type: array
          items:
            $ref: '#/components/schemas/stream_id'
          maxItems: 1000
        names:
          description: Stream name filter.
          type: array
          items:
            $ref: '#/components/schemas/stream_name'
          maxItems: 1000

    group_name:
      type: string
      pattern: '^[a-zA-Z0-9_\-]{1,128}$'
      description: Stream group name.
      example: "hd_stream_2"

    group_description:
      type: string
      description: Stream group description.
      maxLength: 256

    create_group:
      type: object
      properties:
        account_id:
          $ref: '#/components/schemas/account_id'
        group_name:
          $ref: '#/components/schemas/group_name'
        description:
          allOf:
            - $ref: '#/components/schemas/group_description'
          default: ""
      required: [ account_id, group_name ]
      example:
        account_id: ee4c42b6-23ae-410e-a2aa-a4220e64ba4b
        group_name: "stream_group-1"
        description: "default stream group"

    create_group_response:
      type: object
      properties:
        group_id:
          $ref: '#/components/schemas/group_id'
        group_name:
          $ref: '#/components/schemas/group_name'
      required: [ group_id, group_name ]
      example:
        group_id: "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
        group_name: "stream_group-1"

    groups_count:
      type: object
      properties:
        groups_count:
          type: integer
          description: Count of groups.
      required: [ groups_count ]
      example:
        groups_count: 7

    update_group:
      type: object
      properties:
        description:
          allOf:
            - $ref: '#/components/schemas/group_description'
      required: [ description ]
      example:
        description: "old stream group"

    group_response:
      type: object
      properties:
        group_name:
          $ref: '#/components/schemas/group_name'
        group_id:
          $ref: '#/components/schemas/group_id'
        account_id:
          $ref: '#/components/schemas/account_id'
        description:
          $ref: '#/components/schemas/group_description'
        create_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: Group create time.
      required: [ account_id, group_name, group_id, description, create_time ]
      example:
        account_id: ee4c42b6-23ae-410e-a2aa-a4220e64ba4b
        group_name: "stream_group-1"
        group_id: "b5d6fd45-fcca-453d-ac05-3e594054b813"
        description: "default stream group"
        create_time: "2018-08-11T09:11:41.674Z"

    linker:
      type: object
      properties:
        action:
          description: "Action to perform: attach or detach streams to group."
          type: string
          enum: [attach, detach]
        stream_ids:
          description: Stream IDs.
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/uuid'
        group_id:
          $ref: '#/components/schemas/group_id'
      required: [action, stream_ids, group_id]
  responses:
    internal_server_error:
      description: Internal server error.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'

    license_problem:
      description: License problem.
      headers:
        Content-Type:
          $ref: '#/components/headers/application_json'
        Luna-Request-Id:
          $ref: '#/components/headers/luna_request_id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          examples:
            no_license_info:
              value:
                error_code: 11055
                desc: Forbidden
                detail: "License problem: Cannot get license information"
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11055
            license_expired:
              value:
                error_code: 11055
                desc: Forbidden
                detail: "License problem: License expired"
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11055
            license_limit_exceeded:
              value:
                error_code: 11055
                desc: Forbidden
                detail: "License problem: Streams license limit exceeded. Please contact VisionLabs for license upgrade or delete redundant streams"
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11055
paths:
  /version:
    get:
      tags:
      - version

      summary: get version
      description: Get service version.
      operationId: getVersion

      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/version'
            application/msgpack:
              schema:
                $ref: '#/components/schemas/version'
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'

    post:
      tags:
        - streams
      summary: create stream
      description: Create stream.
      operationId: createStream
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      x-codeSamples:
        - lang: bash
          source: |
            curl --location --request POST 'http://127.0.0.1:5160/1/streams' \
            --header 'Luna-Request-Id: 1536751345,8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a' \
            --header 'Content-Type: application/json' \
            --data '{
                    "account_id": "557d54ec-29ad-4f3c-93b4-c9092ef12515",
                    "name": "Stream 1",
                    "description": "Stream with tcp stream type",
                    "data": {
                      "type": "tcp",
                      "reference": "rtsp://some_stream_address",
                      "roi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "droi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "rotation": 0,
                      "preferred_program_stream_frame_width": 800,
                      "endless": true
                    },
                    "event_handler": {
                      "origin": "http://127.0.0.1:5000",
                      "api_version": 6,
                      "bestshot_handler": {
                        "handler_id": "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
                      },
                      "detection_handler": {
                        "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
                      },
                      "frame_store": "http://127.0.0.1:5020/1/buckets/frames/images",
                      "authorization": {
                        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
                      }
                    },
                    "policies": {
                      "sending": {
                        "time_period_of_searching": -1,
                        "silent_period": 0,
                        "type": "sec",
                        "number_of_bestshots_to_send": 1,
                        "send_only_full_set": true,
                        "delete_track_after_sending": false
                      },
                      "primary_track_policy": {
                        "use_primary_track_policy": false,
                        "best_shot_min_size": 70,
                        "best_shot_proper_size": 140
                      },
                      "liveness": {
                        "use_shoulders_liveness_filtration": false,
                        "use_mask_liveness_filtration": false,
                        "use_flying_faces_liveness_filtration": false,
                        "liveness_mode": 0,
                        "number_of_liveness_checks": 10,
                        "liveness_threshold": 0.6,
                        "livenesses_weights": [
                          0.05,
                          0.45,
                          0.5
                        ],
                        "mask_backgrounds_count": 300
                      },
                      "filtering": {
                        "min_score": 0.5187,
                        "detection_yaw_threshold": 40,
                        "detection_pitch_threshold": 40,
                        "detection_roll_threshold": 30,
                        "yaw_number": 1,
                        "yaw_collection_mode": false,
                        "mouth_occlusion_threshold": 0.1,
                        "min_body_size_threshold": 0.1
                      },
                      "frame_processing_mode": "auto",
                      "real_time_mode_fps": 0,
                      "ffmpeg_threads_number": 0,
                      "healthcheck": {
                        "max_error_count": 10,
                        "period": 3600,
                        "retry_delay": 5
                      }
                    },
                    "location": {
                      "city": "Moscow",
                      "area": "Central",
                      "district": "Basmanny",
                      "street": "Podsosensky lane",
                      "house_number": "23 bldg.3",
                      "geo_position": {
                        "longitude": 36.616,
                        "latitude": 55.752
                      }
                    },
                    "autorestart": {
                      "restart": 0,
                      "attempt_count": 10,
                      "delay": 60
                    },
                    "status": "pending",
                    "group_name": "hd_stream_2"
                  }'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/stream_to_be_created'
            examples:
              type_tcp_udp:
                summary: stream type is tcp or udp
                value:
                  {
                    "account_id": "557d54ec-29ad-4f3c-93b4-c9092ef12515",
                    "name": "Stream 1",
                    "description": "Stream with tcp stream type",
                    "data": {
                      "type": "tcp",
                      "reference": "rtsp://some_stream_address",
                      "roi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "droi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "rotation": 0,
                      "preferred_program_stream_frame_width": 800,
                      "endless": true
                    },
                    "event_handler": {
                      "origin": "http://127.0.0.1:5000",
                      "api_version": 6,
                      "bestshot_handler": {
                        "handler_id": "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
                      },
                      "detection_handler": {
                        "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
                      },
                      "frame_store": "http://127.0.0.1:5020/1/buckets/frames/images",
                      "authorization": {
                        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
                      }
                    },
                    "policies": {
                      "sending": {
                        "time_period_of_searching": -1,
                        "silent_period": 0,
                        "type": "sec",
                        "number_of_bestshots_to_send": 1,
                        "send_only_full_set": true,
                        "delete_track_after_sending": false
                      },
                      "primary_track_policy": {
                        "use_primary_track_policy": false,
                        "best_shot_min_size": 70,
                        "best_shot_proper_size": 140
                      },
                      "liveness": {
                        "use_shoulders_liveness_filtration": false,
                        "use_mask_liveness_filtration": false,
                        "use_flying_faces_liveness_filtration": false,
                        "liveness_mode": 0,
                        "number_of_liveness_checks": 10,
                        "liveness_threshold": 0.6,
                        "livenesses_weights": [
                          0.05,
                          0.45,
                          0.5
                        ],
                        "mask_backgrounds_count": 300
                      },
                      "filtering": {
                        "min_score": 0.5187,
                        "detection_yaw_threshold": 40,
                        "detection_pitch_threshold": 40,
                        "detection_roll_threshold": 30,
                        "yaw_number": 1,
                        "yaw_collection_mode": false,
                        "mouth_occlusion_threshold": 0.1,
                        "min_body_size_threshold": 0.1
                      },
                      "frame_processing_mode": "auto",
                      "real_time_mode_fps": 0,
                      "ffmpeg_threads_number": 0,
                      "healthcheck": {
                        "max_error_count": 10,
                        "period": 3600,
                        "retry_delay": 5
                      }
                    },
                    "location": {
                      "city": "Moscow",
                      "area": "Central",
                      "district": "Basmanny",
                      "street": "Podsosensky lane",
                      "house_number": "23 bldg.3",
                      "geo_position": {
                        "longitude": 36.616,
                        "latitude": 55.752
                      }
                    },
                    "autorestart": {
                      "restart": 0,
                      "attempt_count": 10,
                      "delay": 60
                    },
                    "status": "pending",
                    "group_name": "hd_stream_2"
                  }
              type_tcp_udp_usb:
                summary: stream type is tcp or udp with usb device
                value:
                  {
                    "account_id": "557d54ec-29ad-4f3c-93b4-c9092ef12515",
                    "name": "Stream 1",
                    "description": "Stream with tcp stream type with usb device",
                    "data": {
                      "type": "tcp",
                      "reference": "/dev/video0",
                      "roi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "droi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "rotation": 0,
                      "preferred_program_stream_frame_width": 800,
                      "endless": true
                    },
                    "event_handler": {
                      "origin": "http://127.0.0.1:5000",
                      "api_version": 6,
                      "bestshot_handler": {
                        "handler_id": "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
                      },
                      "detection_handler": {
                        "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
                      },
                      "frame_store": "http://127.0.0.1:5020/1/buckets/frames/images",
                      "authorization": {
                        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
                      }
                    },
                    "policies": {
                      "sending": {
                        "time_period_of_searching": -1,
                        "silent_period": 0,
                        "type": "sec",
                        "number_of_bestshots_to_send": 1,
                        "send_only_full_set": true,
                        "delete_track_after_sending": false
                      },
                      "primary_track_policy": {
                        "use_primary_track_policy": false,
                        "best_shot_min_size": 70,
                        "best_shot_proper_size": 140
                      },
                      "liveness": {
                        "use_shoulders_liveness_filtration": false,
                        "use_mask_liveness_filtration": false,
                        "use_flying_faces_liveness_filtration": false,
                        "liveness_mode": 0,
                        "number_of_liveness_checks": 10,
                        "liveness_threshold": 0.6,
                        "livenesses_weights": [
                          0.05,
                          0.45,
                          0.5
                        ],
                        "mask_backgrounds_count": 300
                      },
                      "filtering": {
                        "min_score": 0.5187,
                        "detection_yaw_threshold": 40,
                        "detection_pitch_threshold": 40,
                        "detection_roll_threshold": 30,
                        "yaw_number": 1,
                        "yaw_collection_mode": false,
                        "mouth_occlusion_threshold": 0.1,
                        "min_body_size_threshold": 0.1
                      },
                      "frame_processing_mode": "auto",
                      "real_time_mode_fps": 0,
                      "ffmpeg_threads_number": 0,
                      "healthcheck": {
                        "max_error_count": 10,
                        "period": 3600,
                        "retry_delay": 5
                      }
                    },
                    "location": {
                      "city": "Moscow",
                      "area": "Central",
                      "district": "Basmanny",
                      "street": "Podsosensky lane",
                      "house_number": "23 bldg.3",
                      "geo_position": {
                        "longitude": 36.616,
                        "latitude": 55.752
                      }
                    },
                    "autorestart": {
                      "restart": 0,
                      "attempt_count": 10,
                      "delay": 60
                    },
                    "status": "pending",
                    "group_name": "hd_stream_2"
                  }
              type_videofile:
                summary: stream type is videofile
                value:
                  {
                    "account_id": "557d54ec-29ad-4f3c-93b4-c9092ef12515",
                    "name": "Stream 1",
                    "description": "Stream with videofile stream type",
                    "data": {
                      "type": "videofile",
                      "reference": "/example/path/to/video/video.mp4",
                      "roi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "droi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "rotation": 0,
                      "preferred_program_stream_frame_width": 800
                    },
                    "event_handler": {
                      "origin": "http://127.0.0.1:5000",
                      "api_version": 6,
                      "bestshot_handler": {
                        "handler_id": "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
                      },
                      "detection_handler": {
                        "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
                      },
                      "frame_store": "http://127.0.0.1:5020/1/buckets/frames/images",
                      "authorization": {
                        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
                      }
                    },
                    "policies": {
                      "sending": {
                        "time_period_of_searching": -1,
                        "silent_period": 0,
                        "type": "sec",
                        "number_of_bestshots_to_send": 1,
                        "send_only_full_set": true,
                        "delete_track_after_sending": false
                      },
                      "primary_track_policy": {
                        "use_primary_track_policy": false,
                        "best_shot_min_size": 70,
                        "best_shot_proper_size": 140
                      },
                      "liveness": {
                        "use_shoulders_liveness_filtration": false,
                        "use_mask_liveness_filtration": false,
                        "use_flying_faces_liveness_filtration": false,
                        "liveness_mode": 0,
                        "number_of_liveness_checks": 10,
                        "liveness_threshold": 0.6,
                        "livenesses_weights": [
                          0.05,
                          0.45,
                          0.5
                        ],
                        "mask_backgrounds_count": 300
                      },
                      "filtering": {
                        "min_score": 0.5187,
                        "detection_yaw_threshold": 40,
                        "detection_pitch_threshold": 40,
                        "detection_roll_threshold": 30,
                        "yaw_number": 1,
                        "yaw_collection_mode": false,
                        "mouth_occlusion_threshold": 0.1,
                        "min_body_size_threshold": 0.1
                      },
                      "frame_processing_mode": "auto",
                      "real_time_mode_fps": 0,
                      "ffmpeg_threads_number": 0,
                      "healthcheck": {
                        "max_error_count": 10,
                        "period": 3600,
                        "retry_delay": 5
                      }
                    },
                    "location": {
                      "city": "Moscow",
                      "area": "Central",
                      "district": "Basmanny",
                      "street": "Podsosensky lane",
                      "house_number": "23 bldg.3",
                      "geo_position": {
                        "longitude": 36.616,
                        "latitude": 55.752
                      }
                    },
                    "autorestart": {
                      "restart": 0,
                      "attempt_count": 10,
                      "delay": 60
                    },
                    "status": "pending",
                    "group_name": "hd_stream_2"
                  }
              type_images:
                summary: stream type is images
                value:
                  {
                    "account_id": "557d54ec-29ad-4f3c-93b4-c9092ef12515",
                    "name": "Stream 1",
                    "description": "Stream with images stream type",
                    "data": {
                      "type": "images",
                      "reference": "/example/path/to/images/",
                      "roi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "droi": {
                        "x": 0,
                        "y": 0,
                        "width": 0,
                        "height": 0,
                        "mode": "abs",
                      },
                      "rotation": 0,
                      "preferred_program_stream_frame_width": 800,
                      "mask": "example1_%04d.jpg"
                    },
                    "event_handler": {
                      "origin": "http://127.0.0.1:5000",
                      "api_version": 6,
                      "bestshot_handler": {
                        "handler_id": "ee4c42b6-23ae-410e-a2aa-a4220e64ba4b"
                      },
                      "detection_handler": {
                        "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
                      },
                      "frame_store": "http://127.0.0.1:5020/1/buckets/frames/images",
                      "authorization": {
                        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbklkIjoiN2Q0MjYwNmEtZmM3NS00NDU4LWE3OGUtOWYzNGM2MjIyZWQyIiwiZXhwaXJhdGlvblRpbWUiOm51bGwsImFjY291bnRJZCI6IjdkYjUzNThiLWZjMzMtNDIwZC1hYTgzLTk5YTRkOWY0MGM0MSJ9.kDL5oLTJaxKyYbwmKV1lejxrzsFoFzx5VOzvTR-i90k"
                      }
                    },
                    "policies": {
                      "sending": {
                        "time_period_of_searching": -1,
                        "silent_period": 0,
                        "type": "sec",
                        "number_of_bestshots_to_send": 1,
                        "send_only_full_set": true,
                        "delete_track_after_sending": false
                      },
                      "primary_track_policy": {
                        "use_primary_track_policy": false,
                        "best_shot_min_size": 70,
                        "best_shot_proper_size": 140
                      },
                      "liveness": {
                        "use_shoulders_liveness_filtration": false,
                        "use_mask_liveness_filtration": false,
                        "use_flying_faces_liveness_filtration": false,
                        "liveness_mode": 0,
                        "number_of_liveness_checks": 10,
                        "liveness_threshold": 0.6,
                        "livenesses_weights": [
                          0.05,
                          0.45,
                          0.5
                        ],
                        "mask_backgrounds_count": 300
                      },
                      "filtering": {
                        "min_score": 0.5187,
                        "detection_yaw_threshold": 40,
                        "detection_pitch_threshold": 40,
                        "detection_roll_threshold": 30,
                        "yaw_number": 1,
                        "yaw_collection_mode": false,
                        "mouth_occlusion_threshold": 0.1,
                        "min_body_size_threshold": 0.1
                      },
                      "frame_processing_mode": "auto",
                      "real_time_mode_fps": 0,
                      "ffmpeg_threads_number": 0,
                      "healthcheck": {
                        "max_error_count": 10,
                        "period": 3600,
                        "retry_delay": 5
                      }
                    },
                    "location": {
                      "city": "Moscow",
                      "area": "Central",
                      "district": "Basmanny",
                      "street": "Podsosensky lane",
                      "house_number": "23 bldg.3",
                      "geo_position": {
                        "longitude": 36.616,
                        "latitude": 55.752
                      }
                    },
                    "autorestart": {
                      "restart": 0,
                      "attempt_count": 10,
                      "delay": 60
                    },
                    "status": "pending",
                    "group_name": "hd_stream_2"
                  }
        required: true
      responses:
        201:
          description: Create success.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  stream_id:
                    allOf:
                      - $ref: '#/components/schemas/stream_id'
                    description: |
                      ID of the created stream.
                      The ID can be used as the `stream_id` parameter in [GET](#operation/getStream) `/streams/{stream_id}`.
                  version:
                    type: integer
                    enum: [1]
                    description: Stream initial version.
                required: [ stream_id, version ]
                example:
                  stream_id: b5d6fd45-fcca-453d-ac05-3e594054b813
                  version: 1
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: |
                        Failed to validate input json.
                        Path: 'status',  message: unexpected value; permitted: 'pending', 'pause'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        403:
          $ref: '#/components/responses/license_problem'
        500:
          $ref: '#/components/responses/internal_server_error'

    get:
      tags:
        - streams
      summary: get streams
      description: Get streams according to filters. The results are sorted by stream creation order, the oldest streams shown first.
      operationId: getStreams
      parameters:
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/stream_ids'
        - $ref: '#/components/parameters/stream_names'
        - $ref: '#/components/parameters/stream_reference'
        - $ref: '#/components/parameters/stream_statuses'
        - $ref: '#/components/parameters/stream_create_time__gte'
        - $ref: '#/components/parameters/stream_create_time__lt'
        - $ref: '#/components/parameters/group_name'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/page_size'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  streams:
                    type: array
                    items:
                      $ref: '#/components/schemas/stream_response'
                    minItems: 0
                required: [ streams ]
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'stream_ids'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012

        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
        - streams
      summary: delete streams
      description: Delete streams matching specified filters (OR).
      operationId: deleteStreams
      parameters:
        - $ref: '#/components/parameters/account_id'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/streams_to_be_deleted'
        required: true
      responses:
        204:
          description: Delete success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: '''',  message: ''Additional properties are not
                                 allowed (''faces'' was unexpected)'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022

        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams/count:
    get:
      tags:
        - streams
      summary: count streams
      description: |
        Count streams according to the filters.

      operationId: countStreams
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/stream_ids'
        - $ref: '#/components/parameters/stream_names'
        - $ref: '#/components/parameters/stream_reference'
        - $ref: '#/components/parameters/stream_statuses'
        - $ref: '#/components/parameters/stream_create_time__gte'
        - $ref: '#/components/parameters/stream_create_time__lt'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  streams_count:
                    allOf:
                      - $ref: '#/components/schemas/count'
                    description: Streams count.
                description: Stream count.
                required: [ streams_count ]
        400:
          description: Bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'stream_ids'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams/{stream_id}:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - in: path
        name: stream_id
        schema:
          $ref: '#/components/schemas/uuid'
        required: true
        description: ID of the stream (`stream_id` received in the ["create stream"](#operation/createStream) request request).

    get:
      tags:
      - streams
      summary: get stream
      description: Get the stream by ID.
      operationId: getStream
      parameters:
        - $ref: '#/components/parameters/account_id'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/stream_response'
        404:
          description: Stream not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39001
                desc: Object not found
                detail: Stream with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
        500:
          $ref: '#/components/responses/internal_server_error'

    patch:
      tags:
        - streams
      summary: update stream
      description: |
        Update stream fields: *description*, *status*.
      operationId: patchStream
      parameters:
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/stream_to_be_patched'
        required: true
      responses:
        204:
          description: Update success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                nothing_to_update:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: '''',  message: ''at least one field must have a value'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                invalid_status:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''status'',  message: ''unexpected value; permitted: ''pending'', ''pause'', ''cancel'''''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                extra_fields:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: 'Failed to validate input json. Path: ''user_data'',  message: ''extra fields not permitted'''
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
                unable_to_pause:
                  value:
                    error_code: 39003
                    desc: Unable to stop processing
                    detail: 'Processing of stream with id ''557d54ec-29ad-4f3c-93b4-c9092ef12515'' is already in progress and cannot be stopped.'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39003
                unable_to_cancel:
                  value:
                    error_code: 39005
                    desc: Unable to cancel processing
                    detail: 'Processing of streams with id ''557d54ec-29ad-4f3c-93b4-c9092ef12515'' is finished and cannot be cancelled'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39005
        403:
          $ref: '#/components/responses/license_problem'
        404:
          description: Stream not found.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39001
                desc: Object not found
                detail: Stream with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
        500:
          $ref: '#/components/responses/internal_server_error'

    put:
      tags:
        - streams
      summary: put stream
      description: Update existing stream. You should specify all the fields required for the stream in the request.
      operationId: putStream
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/stream_to_be_created'
        required: true
      responses:
        200:
          description: Put success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  stream_id:
                    allOf:
                      - $ref: '#/components/schemas/stream_id'
                    description: |
                      ID of the stream that was put.
                      The ID can be used as the `stream_id` parameter in [GET](#operation/getStream) `/streams/{stream_id}`.
                  version:
                    allOf:
                      - $ref: '#/components/schemas/stream_version'
                    description: Stream current version (incremented on every change).
                required: [ stream_id, version ]
                example:
                  stream_id: b5d6fd45-fcca-453d-ac05-3e594054b813
                  version: 10
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: |
                      Failed to validate input json.
                      Path: 'status',  message: unexpected value; permitted: 'pending', 'pause'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        403:
          $ref: '#/components/responses/license_problem'
        404:
          description: Stream not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39001
                desc: Object not found
                detail: Stream with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
        - streams
      summary: remove stream
      description: Remove the stream by ID.
      operationId: removeStream
      parameters:
        - $ref: '#/components/parameters/account_id'
      responses:
        204:
          description: Delete success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        404:
          description: Stream not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39001
                desc: Object not found
                detail: Stream with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams/processing/queue:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
    get:
      tags:
      - queue
      summary: check the streams processing queue
      description: See the streams in the queue.
      operationId: getStreamsQueue
      parameters:
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/stream_ids'
        - $ref: '#/components/parameters/stream_names'
        - $ref: '#/components/parameters/group_ids'
        - $ref: '#/components/parameters/group_names'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/queue_streams_response_pending'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'limit'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'

    post:
      tags:
      - queue
      summary: get some streams from the queue
      description: | 

        Receive streams from the queue. The streams are received according to the specified filters.  

        The following actions are performed upon the request:

        - The streams are marked as "in progress".
        - The streams are deleted from the Streams Processing Queue.
        
        The information about the streams is returned in the response.

      operationId: getStreamsFromQueue
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/post_streams_processing_queue_request'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/queue_streams_response_in_progress'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: |
                      Failed to validate input json. Path: 'filters',  message: 'field required'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams/processing/feedback:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
    post:
      tags:
      - queue
      summary: post feedback on streams
      description: |

        Post information about streams processing. 

      operationId: postStreamsFeedback
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/post_streams_processing_feedback_request'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/feedback_response'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: |
                      Failed to validate input json. Path: 'streams',  message: 'field required'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/streams/{stream_id}/preview/handler/frame:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/stream_id_path'
    get:
      tags:
      - preview
      summary: get last frame preview
      description: |
        
        Get stream last frame preview.
        
        To add preview for stream, use ["post feedback on streams"](#operation/postStreamsFeedback) request to create last frame preview.
      operationId: previewFrameProxy
      responses:
        200:
          description: OK.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        404:
          description: Not found.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                stream_not_found:
                  value:
                    error_code: 39001
                    desc: Object not found
                    detail: Stream with id 00000000-0000-4000-a000-000000642312 not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
                preview_not_found:
                  value:
                    error_code: 39009
                    desc: Forbidden
                    detail: Not found `live` preview url for stream with id '00000000-0000-4000-a000-000000642312'.
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39009
        500:
          description: Internal server error.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                internal_server_error:
                  value:
                    error_code: 1
                    desc: internal server error
                    detail: internal server error
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-1
                stream_not_found:
                  value:
                    error_code: 39010
                    desc: Preview processing error
                    detail: Connection refused
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39010
  /1/streams/{stream_id}/preview/handler/live:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/stream_id_path'
    get:
      tags:
      - preview
      summary: get live preview
      description: |
        
        Get stream live preview.
        
        To add preview for stream, use ["post feedback on streams"](#operation/postStreamsFeedback) request to create live preview.
      operationId: previewLiveProxy
      responses:
        200:
          description: OK.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        404:
          description: Not found.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                stream_not_found:
                  value:
                    error_code: 39001
                    desc: Object not found
                    detail: Stream with id 00000000-0000-4000-a000-000000642312 not found
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39001
                preview_not_found:
                  value:
                    error_code: 39009
                    desc: Forbidden
                    detail: Not found `live` preview url for stream with id '00000000-0000-4000-a000-000000642312'.
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39009
        500:
          description: Internal server error.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                internal_server_error:
                  value:
                    error_code: 1
                    desc: internal server error
                    detail: internal server error
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-1
                stream_not_found:
                  value:
                    error_code: 39010
                    desc: Preview processing error
                    detail: Connection refused
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39010
  /1/streams/logs:
    get:
      tags:
        - streams logs
      summary: get streams logs
      description: Get streams logs according to filters. The results are sorted by log creation order, 
        the new streams logs shown first.
      operationId: getStreamsLogs
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/stream_ids'
        - $ref: '#/components/parameters/stream_statuses'
        - $ref: '#/components/parameters/log_targets'
        - $ref: '#/components/parameters/log_time__lt'
        - $ref: '#/components/parameters/log_time__gte'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/page_size'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/streams_logs'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'log_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
        - streams logs
      summary: delete stream logs
      description: Delete streams logs older than specified date excluding last log entry.
      operationId: deleteStreamsLogs
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/log_time__lt_deleting'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/streams_logs_deleted_count'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'log_time__lt'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/groups:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'

    post:
      tags:
        - groups
      summary: create group
      description: Create group.
      operationId: createGroup
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/create_group'
        required: true
      responses:
        201:
          description: Create success.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Location:
              schema:
                type: string
                format: url
                example: /1/groups/group-1
              description: Location of new group.
              required: true
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/create_group_response'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: |
                        Failed to validate input json.
                        Path: 'account_id',  message: 'field required'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022
        409:
          description: Conflict
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39006
                desc: Unique constraint error
                detail: Group named 'group1' already exists
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39006
        500:
          $ref: '#/components/responses/internal_server_error'

    get:
      tags:
        - groups
      summary: get groups
      description: Get groups according to filters. The results are sorted by group creation order, the oldest group shown first.
      operationId: getGroups
      parameters:
        - $ref: '#/components/parameters/group_ids'
        - $ref: '#/components/parameters/group_names'
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/page_size'
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  groups:
                    type: array
                    items:
                      $ref: '#/components/schemas/group_response'
                    minItems: 0
                required: [ groups ]
              example:
                - account_id: ee4c42b6-23ae-410e-a2aa-a4220e64ba4b
                  group_name: "stream_group-1"
                  group_id: "b5d6fd45-fcca-453d-ac05-3e594054b813"
                  description: "default stream group"
                  create_time: "2018-08-11T09:11:41.674Z"
                - account_id: 2d6cbe1f-cbbe-485a-ab37-b968cc5e8764
                  group_name: "stream_group-2"
                  group_id: "a7d8fd45-fgga-453d-ac05-3e594054b813"
                  description: "stream group 2"
                  create_time: "2019-10-11T10:11:41.674Z"
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/groups/count:
    get:
      tags:
        - groups
      summary: get group count
      description: |
        Count of groups according to the filters.
      operationId: countGroups
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/group_ids'
        - $ref: '#/components/parameters/group_names'
        - $ref: '#/components/parameters/account_id'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/groups_count'
        400:
          description: Bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/groups/{group_id}:
    parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'
      - in: path
        name: group_id
        schema:
          $ref: '#/components/schemas/uuid'
        required: true
        description: ID of the group (`group_id` received in the ["create group"](#operation/createGroup) request).

    get:
      tags:
        - groups
      summary: get group
      description: Get the group by name.
      operationId: getGroup
      responses:
        200:
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/group_response'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: Group not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39008
                desc: Object not found
                detail: Group with id ee4c42b6-23ae-410e-a2aa-a4220e64ba4b not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39008
        500:
          $ref: '#/components/responses/internal_server_error'

    patch:
      tags:
        - groups
      summary: update group
      description: |
        Update group fields: *description*
      parameters:
        - $ref: '#/components/parameters/applicationJsonContent'
      operationId: patchGroup
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/update_group'
        required: true
      responses:
        204:
          description: Update success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: Group not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39008
                desc: Object not found
                detail: Group with id ee4c42b6-23ae-410e-a2aa-a4220e64ba4b not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39008
        500:
          $ref: '#/components/responses/internal_server_error'

    delete:
      tags:
        - groups
      summary: remove group
      description: Remove the group by name.
      operationId: deleteGroup
      responses:
        204:
          description: Delete success.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: Bad request.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        404:
          description: Group not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              example:
                error_code: 39008
                desc: Object not found
                detail: Group with id ee4c42b6-23ae-410e-a2aa-a4220e64ba4b not found
                link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-39008
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/linker:
    patch:
      tags:
        - linker
      summary: attach (or detach) streams to a group
      description: Attach (or detach) streams to a group.
      operationId: linker
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/account_id'
        - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/linker'
      responses:
        204:
          description: Operation succeeded
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        400:
          description: Bad request.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                bad_query_param:
                  value:
                    error_code: 12012
                    desc: Bad/incomplete input data
                    detail: Bad query parameters 'account_id'
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/docs/spec:
    get:
      tags:
        - documents
      summary: get openapi documentation
      description: |
        Get service OpenApi documentation. If *Accept* request header is of type `application/x-yaml`,
        returns documentation in `yaml` format or returns `html` documentation, if *Accept-Type* is `text/html`
      operationId: getSpec

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/accept_docs_handler'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/docs_content_type'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/x-yaml:
              schema:
                type: string
                description: YAML format documentation.
            text/html:
              schema:
                type: string
                description: HTML format documentation.
        415:
          description: Unsupported Media Type
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                unsupported_media_type:
                  value:
                    error_code: 12024
                    detail: Bad/incomplete input data
                    desc: Unsupported media type
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12024
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/docs/dev:
    parameters:
      - $ref: '#/components/parameters/Accept'
    get:
      tags:
        - documents
      summary: get development manual
      description: |
        Get sphinx documentation - *Development Manual*. After the request you will be redirected to the page `/docs/dev/index.html`
      operationId: getDevManual

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/text_html'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            text/html:
              schema:
                type: string
                description: HTML format documentation.
        500:
          $ref: '#/components/responses/internal_server_error'
  /1/config:
    get:
      tags:
        - config
      summary: get service configuration
      description: Get service configuration. Passwords and tokens will be hidden in the response.
      operationId: getConfig

      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/accept_config_handler'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/config_accept_content_type'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                description: JSON format configuration.
              example:
                INFLUX_MONITORING:
                  SEND_DATA_FOR_MONITORING: 0
                  VERSION: 2
                  ORGANIZATION: ORGANIZATION_NAME
                  TOKEN: '********'
                  BUCKET: luna_monitoring
                  HOST: 127.0.0.1
                  PORT: 8086
                  USE_SSL: 0
                  FLUSHING_PERIOD: 1.0
            text/plain:
              schema:
                type: string
                description: Text format configuration.
              example: |
                [INFLUX_MONITORING]
                SEND_DATA_FOR_MONITORING = 0
                VERSION = 2
                ORGANIZATION = ORGANIZATION_NAME
                TOKEN = ********
                BUCKET = luna_monitoring
                HOST = 127.0.0.1
                PORT = 8086
                USE_SSL = 0
                FLUSHING_PERIOD = 1.0
        415:
          description: Unsupported media type.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
              examples:
                unsupported_media_type:
                  value:
                    error_code: 12024
                    detail: Bad/incomplete input data
                    desc: Unsupported media type
                    link: https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12024
        500:
          $ref: '#/components/responses/internal_server_error'
  /healthcheck:
    get:
      tags:
      - health
      summary: get health
      description: Get health of service.
      operationId: healthcheck
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/include_luna_services'
      responses:
        200:
          description: OK
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/health_ok'
        500:
          $ref: '#/components/responses/internal_server_error'
        502:
          description: Unhealthy.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/health_errors'