openapi: 3.0.0
info:
  version: 'v.0.5.0'
  title: 'Luna-Streams API'
  description: |
     'VisionLabs Luna-Streams'

     Service is intended for creation and management streams. A Streams is an user logical entity.

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

    text_plain:
      schema:
        type: string
        enum:
        - text/plain
      required: true
      description: The 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 that correspond to particular requests, in system logs.
      required: true

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

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

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

    page_size:
      in: query
      name: page_size
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 10
      description: the 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 that correspond to particular requests, in system logs.
        If it was not set, system will set it in default format ("timestamp,UUID"). It will be returned with 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

    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 excliding 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 excliding 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 excliding 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: an api version of service.
            major:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: a major version of service.
            minor:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: a minor version of service.
            patch:
              allOf:
                - $ref: '#/components/schemas/int_version'
              description: a 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: ""

    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: group ID

    account_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: account ID for authentication in Luna Platform

    stream_reference:
      type: string
      maxLength: 512
      description: |
        stream reference: URL, path, etc.
      example: https://upload.wikimedia.org/wikipedia/commons/2xQ2gprbMUePw1s9gw9fvA==

    roi:
      type: array
      items:
        type: integer
        minimum: 0
        maximum: 65536
      minItems: 4
      maxItems: 4
      default: [ 0, 0, 0, 0 ]
      description: region of interest of camera frame (left, top, width, height), by default [0 0 0 0] - full frame

    droi:
      type: array
      items:
        type: integer
        minimum: 0
        maximum: 65536
      minItems: 4
      maxItems: 4
      default: [ 0, 0, 0, 0 ]
      description: |
        region of interest within the ROI zone (left, top, width, height).
        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.

    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

    stream_data_common:
      type: object
      properties:
        type:
          type: string
          description: stream type
        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 data

    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 data

    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 in 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: event handler service origin
        api_version:
          type: integer
          example: 6
          description: event handler service api version
        bestshot_handler:
          allOf:
            - $ref: '#/components/schemas/handler'
          description: event bestshot handler
        detection_handler:
          allOf:
            - $ref: '#/components/schemas/handler'
            - nullable: true
          description: event detection handler
        frame_store:
          type: string
          example: http://127.0.0.1:5020/1/buckets/frames/images
          nullable: true
          description: frame store URL
        authorization:
          description: |
            Authorization for requests to luna-api. 
            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: stream event handler data

    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
            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
            type:
              type: string
              enum: [sec, frames]
              default: sec
              description: sets the measurement metric for analysis periods and intervals between those (per frames or per seconds)
            number_of_bestshots_to_send:
              type: integer
              default: 1
              description: number of frames that the user sets to receive from the track or certain periods of this track
            send_only_full_set:
              type: boolean
              default: true
              description: enables to send data only if the required amount of data is available
            delete_track_after_sending:
              type: boolean
              default: false
              description: enables to delete track after sending
          description: stream sending parameters
        primary_track_policy:
          type: object
          properties:
            use_primary_track_policy:
              type: boolean
              default: false
              description: is used in cases of Access Control Systems (turnstiles/gates at the office/bank entrances) for easier control and face recognition implementation in a secured area
            best_shot_min_size:
              type: integer
              default: 70
              description: sets a minimal size for detections within Primary Track policy
            best_shot_proper_size:
              type: integer
              default: 140
              description: sets the size of detection for Primary Track policy. When a detection reaches the defined value, track immediately sends all its best shots to the server
          description: stream primary track policy parameters
        liveness:
          type: object
          properties:
            use_shoulders_liveness_filtration:
              type: boolean
              default: False
              description: enables checking the presence of a real person in the frame based on the head and shoulder areas
            use_mask_liveness_filtration:
              type: boolean
              default: False
              description: enables checking the presence of a real person in the frame based on backgrounds
            use_flying_faces_liveness_filtration:
              type: boolean
              default: False
              description: enables checking 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: |
                enables to specify which frames from a 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: enables to specify the 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: is used to define 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.05, 0.45, 0.5]
              description: determines the involvement of each liveness check type (shoulders, mask, and flying_faces) in the resulting estimation of the presence of a human face in the frame
            mask_backgrounds_count:
              type: integer
              default: 0
              example: 300
              description: the number of background frames that are used for the corresponding checks
          description: stream liveness parameters
        filtering:
          type: object
          properties:
            min_score:
              type: number
              default: 0.5187
              description: score that defines detection quality, threshold for filtering detections sent to the server
            detection_yaw_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 40.0
              description: sets the maximum value of head yaw angle in relation to camera
            detection_pitch_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 40.0
              description: sets the maximum value of head pitch angle in relation to camera
            detection_roll_threshold:
              type: number
              minimum: 0
              maximum: 180
              default: 30.0
              description: detection-roll-threshold
            yaw_number:
              type: integer
              default: 1
              description: defines the number of frames for image filtration based on head tilt angle
            yaw_collection_mode:
              type: boolean
              default: false
              description: sets the number of frames the system must collect to analyze head yaw angle
            mouth_occlusion_threshold:
              type: number
              format: float
              default: 0.0
              example: 0.1
              description: determines how much the mouth can be obscured in the frame
            min_body_size_threshold:
              type: number
              format: float
              minimum: 0
              default: 0.0
              example: 0.1
              description: sets the 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).
          description: stream filtering parameters
        frame_processing_mode:
          type: string
          enum: [auto, full, scale]
          default: auto
          description: determines whether full or scaled frame will be processed (`auto` - depends on **convertFullFrame** *fs3Config* param)
        real_time_mode_fps:
          type: integer
          default: 0
          description: the video is processed with the specified number of FPS. The video can’t be processed with FPS higher than the one specified in this parameter
        ffmpeg_threads_number:
          type: integer
          default: 0
          description: number of threads for video decoding (0 - choosen 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
            period:
              type: integer
              default: 3600
              description: see description of max_error_count, measured in seconds
            retry_delay:
              type: integer
              default: 5
              description: time gap between attempts to reopen not alive stream, in seconds
          description: stream health check parameters
      description: stream processing policies

    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 info

    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 policies

    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 policies 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: new stream account ID for authentication in Luna Platform
        name:
          allOf:
            - $ref: '#/components/schemas/string128_default'
          description: new stream name
          default: ""
        description:
          allOf:
            - $ref: '#/components/schemas/string128_default'
          description: new 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: 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 documentation 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 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: group name
      example: "hd_stream_2"

    group_description:
      type: string
      description: 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 streams to group or detach"
          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 a new stream.
      operationId: createStream
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/stream_to_be_created'
        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: stream 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" 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'
      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
      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
      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
      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` 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` 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 a new group.
      operationId: createGroup
      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" 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*
      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'
      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'
