OpenApi

You can find spec for the Events service in the html document.

openapi: 3.0.0
info:
  version: 'v.4.8.2'
  title: 'Luna events API'
  description: |
    VisionLabs Luna Events API.

    Introduction

    This service is intended for searching events according to the specified filters and getting some statistics parameters of events. You can receive the following parameters:

    1) event count,
    2) average, max, min value numeric parameters.

    Events can be grouped by the creation time. Grouping is possible in two ways: grouping by time intervals and the frequency grouping (by day of month).

    The service store some fields in compressed state for query optimization and database size decrease.

      Mapping ethnicities to ID:

      | Group name | Group ID |
      | ---------- | -------- |
      | african_american  | 1 |
      | indian            | 2 |
      | asian             | 3 |
      | caucasian         | 4 |

      Mapping emotions to ID:

      | Group name | Group ID |
      | ---------- | -------- |
      | anger             | 1 |
      | disgust           | 2 |
      | fear              | 3 |
      | happiness         | 4 |
      | neutral           | 5 |
      | sadness           | 6 |
      | surprise          | 7 |

      Mapping masks to ID:

      | Group name | Group ID |
      | ---------- | -------- |
      | missing           | 1 |
      | medical_mask      | 2 |
      | occluded          | 3 |

      Mapping liveness to ID:

      | liveness | value |
      |--------------|---|
      | spoof        | 0 |
      | real         | 1 |
      | unknown      | 2 |


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

    The specification can be used:

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

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

    OpenAPI specification can be received using the "/docs/spec" resource. The "Accept" header should be set to "application/x-yaml".

components:
  headers:
    application_json:
      schema:
        type: string
        enum:
        - application/json
      required: true
      description: Content type is application/json.

    application_json_or_xbinary:
      schema:
        type: string
        enum:
          - application/json
          - application/x-sdk-descriptor
      required: true
      description: Content type is application/json or application/x-sdk-descriptor.

    text_plain:
      schema:
        type: string
        enum:
        - text/plain
      required: true
      description: Content type is text/plain.

    image_jpeg:
      schema:
        type: string
        enum:
        - image/jpeg
      description: Content type is image/jpeg.
      required: true

    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

    application_zip:
      schema:
        type: string
        enum:
        - application/zip
      required: true
      description: Content type is application/zip.

    content_disposition:
      schema:
        type: string
      example: 'attachment; filename=task_146.zip'
      required: true
      description: Content disposition with filename.

    docs_content_type:
      schema:
        type: string
        enum:
          - application/x-yaml
          - text/html
      required: true
      description: Type of receiving data.

    text_html:
      schema:
        type: string
        enum:
          - text/html
      required: true
      description: Content type is text/html.

    config_accept_content_type:
      schema:
        type: string
        enum:
          - application/json
          - text/plain
      required: false
      description: The content type of the response body.
  parameters:
    page:
      in: query
      name: page
      schema:
        type: integer
        minimum: 1
        default: 1
      description: Page number.

    accept:
      in: header
      schema:
        type: string
        example: "application/x-sdk-descriptor"
      description: Content type which is acceptable for the response. If 'application/x-sdk-descriptor' is specified, the binary descriptor will be returned in the response body, otherwise 'application/json' content type will be applied.
      required: false
      name: Accept

    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

    wait_events_saving:
      in: query
      name: wait_events_saving
      schema:
        $ref: '#/components/schemas/int01'
      description: |
        Whether to wait for events saving.

        If "0" is specified, the 202 status code will be expected in response to a successful request. This status code is returned after events are validated and added to the buffer. The system does not wait until the events are saved to the database. The events will be stored in the database after the response is sent.

        If "1" is specified, the 204 status code will be expected in response to a successful request. This status code is returned only after events are stored in the database.

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

    limit:
      in: query
      name: limit
      schema:
        type: integer
        minimum: 1
        maximum: 1000000
        default: 5
      description: Event limit in a match response.

    threshold:
      in: query
      name: threshold
      schema:
        type: number
        minimum: 0.0
        maximum: 1.0
        default: 0.0
      description: Event similarity threshold in a match response - events with a similarity lower than this parameter will not be returned.

    search_order:
      in: query
      name: order
      schema:
        type: string
        enum: ["asc", "desc"]
      description: |
        The sort order.

        By default, the results will be sorted by event creation time.
        If "desc" is set, the newest events will be shown first. If "asc" is set, the oldest events will be shown first.

        But if some event ID range filters specified (`event_id__gte` or `event_id__lt`), the results will be sorted by event ID.

    match_order:
      in: query
      name: order
      schema:
        type: string
        enum: [ "asc", "desc" ]
      description: |
        The sort order.
        If "desc" is set, the most similar events will be shown first. If "asc" is set, the least similar events will be shown first.

    gender:
      in: query
      name: gender
      schema:
        oneOf:
          - type: integer
            enum: [0, 1]
          - $ref: '#/components/schemas/null_filter'
      description: Gender. 1 - male, 0 - female, "null" - null value .
      example: 1

    emotions:
      in: query
      name: emotions
      schema:
        type: string
        format: list of integer and null (1, 2, 3, 4, 5, 6, 7, null)
      description: |
        Comma-separated list of predominant emotions or null. Each event from result will contain one of the given emotions.

        | emotions    | value |
        |-----------------|---|
        | anger           | 1 |
        | disgust         | 2 |
        | fear            | 3 |
        | happiness       | 4 |
        | neutral         | 5 |
        | sadness         | 6 |
        | surprise        | 7 |
      example: "1,2,3,null"

    masks:
      in: query
      name: masks
      schema:
        type: string
        format: list of integer and null (1, 2, 3, null)
      description: |
        Comma-separated list of predominant masks or null. Each event from result will contain one of the given mask state.

        | mask        | value |
        |-----------------|---|
        | missing         | 1 |
        | medical_mask    | 2 |
        | occluded        | 3 |
      example: "1,2,3,null"

    ethnic_groups:
      in: query
      name: ethnic_groups
      schema:
        type: string
        format: list of integer and null (1, 2, 3, 4, null)
      description: |
        Comma-separated list of dominant ethnic group or null. Each event from result will contain one of the given ethnic groups.

        | ethnicity    | value |
        |------------------|---|
        | African american | 1 |
        | Indian           | 2 |
        | Asian            | 3 |
        | Caucasian        | 4 |

      example: "1,2,null"

    liveness:
      in: query
      name: liveness
      schema:
        type: string
        format: list of integer and null (0, 1 ,2, null)
      description: |
        Comma-separated list of dominant liveness or null. Each event from result will contain one of the given liveness.

        | liveness | value |
        |--------------|---|
        | spoof        | 0 |
        | real         | 1 |
        | unknown      | 2 |

      example: "1,2,null"

    tags:
      in: query
      name: tags
      schema:
        type: array
        items:
          $ref: '#/components/schemas/tag'
        minItems: 0
      explode: false
      description: Comma-separated list of tags. Each event from result will contain all of the given tags.
      example:
        - tag_1
        - tag_2

    age__lt:
      in: query
      name: age__lt
      schema:
        type: integer
        minimum: 0
        maximum: 100
      description: Age upper excluded bound.
      example: 50

    age__gte:
      in: query
      name: age__gte
      schema:
        type: integer
        minimum: 0
        maximum: 100
      description: Age lower included bound.
      example: 50

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

    face_ids:
      in: query
      name: face_ids
      schema:
        type: string
        format: list of uuid
      description: List of comma-separated face IDs.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb,346a5645-ec89-4806-820a-dbcb6e0dc38'

    event_ids:
      in: query
      name: event_ids
      schema:
        type: string
        format: list of uuid.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb,346a5645-ec89-4806-820a-dbcb6e0dc38'
      description: List of comma-separated event IDs.

    event_id__gte:
      in: query
      name: event_id__gte
      schema:
        type: string
        format: uuid.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'
      description: Lower including event ID boundary.

    event_id__gte_sorting:
      in: query
      name: event_id__gte
      schema:
        type: string
        format: uuid.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'
      description: Lower including event ID boundary. Events in response will be sorted by their ids. If neither *event_id__lt* or *event_id__gte* is specified, the faces will be sorted by creation time.

    event_id__lt:
      in: query
      name: event_id__lt
      schema:
        type: string
        format: uuid.
      example: '346a5645-ec89-4806-820a-dbcb6e0dc38'
      description: Upper excluding event ID boundary.

    event_id__lt_sorting:
      in: query
      name: event_id__lt
      schema:
        type: string
        format: uuid.
      example: '346a5645-ec89-4806-820a-dbcb6e0dc38'
      description: Upper excluding event ID boundary. Events in response will be sorted by their ids. If neither *event_id__lt* or *event_id__gte* is specified, the faces will be sorted by creation time.

    handler_id:
      in: query
      name: handler_id
      schema:
        type: string
        format: uuid.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb'
      description: Handler ID.

    handler_ids:
      in: query
      name: handler_ids
      schema:
        type: string
        format: list of uuid.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb,346a5645-ec89-4806-820a-dbcb6e0dc38'
      description: List of comma-separated handler IDs.

    external_id:
      in: query
      name: external_id
      schema:
        type: string
        maxLength: 36
      description: External ID.

    external_ids:
      in: query
      name: external_ids
      schema:
        type: string
        format: list of strings.
      example: '8950722f-3fd4-4223-b48f-03f95f0e8dfb,346a5645-ec89-4806-820a-dbcb6e0dc38'
      description: List of comma-separated external IDs.

    user_data:
      in: query
      name: user_data
      schema:
        type: string
      description: Find all objects with user_data that is similar to this parameter.
      example: "user_data"

    sources:
      in: query
      name: sources
      schema:
        type: string
      description: Comma-separated list of sources or null. Each event from result will contain one of the given sources.
      example: "cam1,cam2,null"

    cities:
      in: query
      name: cities
      schema:
        type: string
      description: Comma-separated list of cities or null. Each event from result will contain one of the given cities in location.
      example: "moscow,New-York,null"

    areas:
      in: query
      name: areas
      schema:
        type: string
      description: Comma-separated list of areas or null. Each event from result will contain one of the given areas in location.
      example: "CAO,central park,null"

    districts:
      in: query
      name: districts
      schema:
        type: string
      description: Comma-separated list of districts or null. Each event from result will contain one of the given districts in location.
      example: "mitino,central park,null"

    streets:
      in: query
      name: streets
      schema:
        type: string
      description: |
        Comma-separated list of streets or null. Each event from result will contain one of the given streets  in location.
      example: "arbat,schepkina,null"

    house_numbers:
      in: query
      name: house_numbers
      schema:
        type: string
      description: |
        Comma-separated list of house numbers or null. Each event from result will contain one of the given house numbers
        in location.
      example: "1,1/2str3,null"

    origin_longitude:
      in: query
      name: origin_longitude
      schema:
        oneOf:
          - $ref: '#/components/schemas/longitude'
          - $ref: '#/components/schemas/null_filter'
      description: |
        Longitude origin in degrees, a part of composite geo position filter or null for undefined geo position.
                Geo position filter is a bounding box specified by coordinates of its center (origin) and some delta.
                Geo position filter is considered as properly specified if both *origin_longitude* and
                *origin_latitude* are set, and considered as properly empty if neither of *origin_longitude*,
                *origin_latitude*, *longitude_delta*, *latitude_delta* is set.
                Null filter applied only if *origin_longitude* or *origin_latitude* is set to 'null', and
                *longitude_delta* and *latitude_delta* is not set.
      example: "36.616"

    origin_latitude:
      in: query
      name: origin_latitude
      schema:
        oneOf:
          - $ref: '#/components/schemas/latitude'
          - $ref: '#/components/schemas/null_filter'
      description: |
        Latitude origin in degrees, a part of composite geo position filter or null for undefined geo position.
                Geo position filter is a bounding box specified by coordinates of its center (origin) and some delta.
                Geo position filter is considered as properly specified if both *origin_longitude* and
                *origin_latitude* are set, and considered as properly empty if neither of *origin_longitude*,
                *origin_latitude*, *longitude_delta*, *latitude_delta* is set.
                Null filter applied only if *origin_longitude* or *origin_latitude* is set to 'null', and
                *longitude_delta* and *latitude_delta* is not set.
      example: "55.752"

    longitude_delta:
      in: query
      name: longitude_delta
      schema:
        type: number
        minimum: 0
        maximum: 90
        default: 0.01
      description: |
        Longitude delta in degrees, a part of composite geo position filter.
                Geo position filter is a bounding box specified by coordinates of its center (origin) and some delta.
                Geo position filter is considered as properly specified if both *origin_longitude* and
                *origin_latitude* are set, and considered as properly empty if neither of *origin_longitude*,
                *origin_latitude*, *longitude_delta*, *latitude_delta* is set. If both *origin_longitude* and
                *origin_latitude* are set and *longitude_delta* is not set - default is applied.
                WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole
                are not fully supported due to features of database spatial index - filter result may be unexpected.
                Box edges more than 180 degrees long are not allowed. Boundaries of valid range are **exclusive**.
                NOTE: highly recommended for citywide use only.
      example: "0.01"

    latitude_delta:
      in: query
      name: latitude_delta
      schema:
        type: number
        minimum: 0
        maximum: 90
        default: 0.01
      description: |
        Latitude delta in degrees, a part of composite geo position filter.
                Geo position filter is a bounding box specified by coordinates of its center (origin) and some delta.
                Geo position filter is considered as properly specified if both *origin_longitude* and
                *origin_latitude* are set, and considered as properly empty if neither of *origin_longitude*,
                *origin_latitude*, *longitude_delta*, *latitude_delta* is set. If both *origin_longitude* and
                *origin_latitude* are set and *latitude_delta* is not set - default is applied.
                WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole
                are not fully supported due to features of database spatial index - filter result may be unexpected.
                Box edges more than 180 degrees long are not allowed. Boundaries of valid range are **exclusive**.
                NOTE: highly recommended for citywide use only.
      example: "0.01"

    top_matching_candidates_label:
      in: query
      name: top_matching_candidates_label
      schema:
        type: string
      description: Top matching candidates label. Each event from result will contain the given label.
      example: "matching_label"

    top_similar_object_ids:
      in: query
      name: top_similar_object_ids
      schema:
        type: array
        items:
          $ref: '#/components/schemas/uuid'
      description: Comma-separated list of top similar object IDs. Each event from result will contain one of the given top similar object IDs.

    top_similar_external_ids:
      in: query
      name: top_similar_external_ids
      schema:
        type: array
        items:
          $ref: '#/components/schemas/external_id'
      description: Comma-separated list of top similar external IDs. Each event from result will contain one of the given top similar external IDs.

    top_similar_object_similarity__gte:
      in: query
      name: top_similar_object_similarity__gte
      schema:
        type: number
      description: Top similar object similarity lower included bound.
      example: 0.5

    top_similar_object_similarity__lt:
      in: query
      name: top_similar_object_similarity__lt
      schema:
        type: number
      description: Top similar object similarity upper excluded bound.
      example: 0.5

    get_event_target:
      in: query
      name: target
      schema:
        type: string
        enum: ["account_id", "create_time", "end_time", "event_id", "handler_id", "external_id", "source", "top_match",
               "match_result", "face_detections", "face_id", "attach_result", "gender", "age", "emotion",
               "ethnic_group", "liveness", "body_detections", "body_basic_attributes", "upper_body", "lower_body", "accessories",
               "tags", "user_data", "location", "mask", "track_id", "meta",
        ]
      description: |
        Comma-separated list of event fields.
        If set, each event from result will contain only specified fields, otherwise, events with all fields will be returned.
      example: "extract_result"

    post_event_match_target:
      in: query
      name: target
      schema:
        type: string
        enum: ["account_id", "create_time", "end_time", "event_id", "handler_id", "external_id", "source", "top_match",
               "match_result", "face_detections", "face_id", "attach_result", "gender", "age", "emotion",
               "ethnic_group", "liveness", "body_detections", "body_basic_attributes", "upper_body", "lower_body", "accessories",
               "tags", "user_data", "location", "mask", "track_id",
               "similarity", "meta",
        ]
      description: |
        Comma-separated list of event fields.
        If set, each event from result will contain only specified fields, otherwise, events with the "event_id" and "similarity" fields will be returned.
      example: "extract_result,similarity"

    list_id:
      in: query
      name: list_id
      schema:
        $ref: '#/components/schemas/uuid'
      description: ID of a list that contains faces.

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

    insert_time__lt:
      in: query
      name: insert_time__lt
      schema:
        type: string
        format: date-time
      description: The upper insert time excluding boundary.
      example: "2018-08-11T09:11:41.674Z"

    insert_time__gte:
      in: query
      name: insert_time__gte
      schema:
        type: string
        format: date-time
      description: The lower insert time including boundary.
      example: "2018-08-11T09:11:41.674Z"

    create_time__lt:
      in: query
      name: create_time__lt
      schema:
        type: string
        format: date-time
      description: Upper bound for object create_time.
      example: "2018-08-11T09:11:41.674Z"

    create_time__gte:
      in: query
      name: create_time__gte
      schema:
        type: string
        format: date-time
      description: The lower create time including boundary.
      example: "2018-08-11T09:11:41.674Z"

    end_time__lt:
      in: query
      name: end_time__lt
      schema:
        type: string
        format: date-time
      description: Upper bound for object end_time.
      example: "2018-08-11T09:11:41.674Z"

    end_time__gte:
      in: query
      name: end_time__gte
      schema:
        type: string
        format: date-time
      description: The lower end time including boundary.
      example: "2018-08-11T09:11:41.674Z"

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

    descriptor_version:
      in: query
      name: descriptor_version
      schema:
        type: integer
        minimum: 0
        maximum: 110
        # Fake boundaries, used to prevent schematesis from sending huge integers.
      description: Event descriptor version. By default used the platform default descriptor version.
      example: 56

    descriptor_version_required:
      in: query
      name: version
      schema:
        type: integer
        minimum: 0
        maximum: 1000
        # Fake boundaries, used to prevent schematesis from sending huge integers.
      description: Event descriptor version.
      required: true
      example: 56

    event_id:
      in: path
      name: event_id
      schema:
        $ref: '#/components/schemas/uuid'
      required: true
      description: Event ID.

    descriptor_type:
      in: query
      name: descriptor_type
      schema:
        type: string
        enum: [face, body]
      description: The type of the event's descriptor.
      example: face

    descriptor_type_required:
      in: query
      name: descriptor_type
      schema:
        type: string
        enum: [face, body]
      description: The type of the event's descriptor.
      required: true
      example: face

    track_ids:
      in: query
      name: track_ids
      schema:
        oneOf:
          - type: string
            format: list of track ids
          - $ref: '#/components/schemas/null_filter'
      example: 'track_id1,track_id_2, null'
      description: List of comma-separated track IDs.

    kind:
      in: query
      name: kind
      schema:
        type: string
        enum: [basic_attributes, face_descriptor, body_descriptor]
      description: |
          Kind of missing attributes to look for.

          Only 1 value at time is supported because the response doesn't
          contain information required to distinguish kinds of the events.
      required: true
      example: basic_attributes

    missing_version:
      in: query
      name: missing_version
      schema:
        type: integer
      description: Event descriptor version. By default used the platform default descriptor version.
      example: 56

    application_json_or_msgpack_content:
      in: header
      name: Content-Type
      schema:
        type: string
        enum:
          - application/json
          - application/msgpack
      description: The response content type header.

    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

    delete_event_target:
      in: query
      name: target
      schema:
        type: array
        items:
          type: string
          enum: [ face_samples, body_samples, image_origins ]
        default: [ face_samples, body_samples, image_origins ]
      explode: false
      description: |
        Comma-separated list of event deletion info attributes.
        If set, each item from the result will contain only specified attributes in addition to the event ID, otherwise, all the deletion info attributes will be returned.
        If empty value set, each item from the result will contain only event ID.
      example: image_origins

    apparent_gender:
      in: query
      name: apparent_gender
      schema:
        type: array
        items:
          oneOf:
            - type: integer
              enum: [ 0, 1, 2 ]
            - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of apparent gender: 0 - female, 1 - male, 2 - undefined, "null" - null value. Each event from result will contain one of the given states.
      example: 1

    apparent_age__lt:
      in: query
      name: apparent_age__lt
      schema:
        type: integer
        minimum: 0
        maximum: 100
      description: Apparent age upper excluded bound.
      example: 50

    apparent_age__gte:
      in: query
      name: apparent_age__gte
      schema:
        type: integer
        minimum: 0
        maximum: 100
      description: Apparent age lower included bound.
      example: 50

    headwear_states:
      in: query
      name: headwear_states
      schema:
        type: array
        items:
          oneOf:
            - type: integer
              enum: [ 0, 1, 2 ]
            - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of headwear states: 0 - absent, 1 - present, 2 - undefined, "null" - null value. Each event from result will contain one of the given states.
      example: 1

    headwear_colors:
      in: query
      name: headwear_apparent_colors
      schema:
        type: array
        items:
          oneOf:
            - $ref: '#/components/schemas/headwear_color'
            - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of headwear apparent colors or null value. Each event from result will contain one of the given states.
      example: white,undefined,null

    sleeve_lengths:
      in: query
      name: sleeve_lengths
      schema:
        type: array
        items:
          type: string
          enum: [ short, long, undefined, null]
      explode: false
      description: |
        Comma-separated list of sleeve length states or null value. Each event from result will contain one of the given states.
      example: short,null

    upper_clothing_colors:
      in: query
      name: upper_clothing_colors
      schema:
        oneOf:
          - type: array
            items:
              $ref: '#/components/schemas/clothing_color'
          - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of upper clothing colors or null for not specified colors. Each event from result will contain at least one of the given clothing colors.
      example: black,white

    lower_garment_types:
      in: query
      name: lower_garment_types
      schema:
        type: array
        items:
          type: string
          enum: [ undefined, trousers, shorts, skirt, null ]
      explode: false
      description: |
        Comma-separated list of lower garment types or null value. Each event from result will contain one of the given types.
      example: trousers,undefined,null

    lower_garment_colors:
      in: query
      name: lower_garment_colors
      schema:
        oneOf:
          - type: array
            items:
              $ref: '#/components/schemas/clothing_color'
          - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of lower garment colors. Each event from result will contain at least one of the given clothing colors.
      example: black,white

    shoes_colors:
      in: query
      name: shoes_apparent_colors
      schema:
        type: array
        items:
          oneOf:
            - $ref: '#/components/schemas/shoes_color'
            - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of shoes apparent colors or null value. Each event from result will contain one of the given states.
      example: white,undefined,null

    backpack_states:
      in: query
      name: backpack_states
      schema:
        type: array
        items:
          oneOf:
          - type: integer
            enum: [ 0, 1, 2 ]
          - $ref: '#/components/schemas/null_filter'
      explode: false
      description: |
        Comma-separated list of backpack states: 0 - absent, 1 - present, 2 - undefined, "null" - not specified. Each event from result will contain one of the given states.
      example: 1

    luna_account_id_required:
      name: Luna-Account-Id
      in: header
      schema:
        type: string
        format: uuid
        example: 8b8b5937-2e9c-4e8b-a7a7-5caf86621b5a
        pattern: ^[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}$
      description: Luna account Id. Designed to identify the created object.
      required: true

    meta:
      in: query
      name: '* (meta.path.to.field__operator:type)'
      schema:
        oneOf:
          - type: string
          - $ref: '#/components/schemas/null_filter'
      description: |
        User-defined event meta's filters.
        
        Parameter name pattern: `meta.<path.to.field>__<operator>:<type>`
        
        Path to field is an event meta's json field path. To navigate through nested objects the dot (.) is used.
        
        Field comparison **operator** is optional one of `eq` (default), `neq`, `like`, `nlike`, `in`, `nin`, `gt`, `gte`, `lt`, `lte`.
        
        Field data **type** is optional one of `string` (default), `integer`, `numeric`.
        
        Allowed usage of filters is:

        |  operator  | type |        |         |         |
        |------------|------|--------|---------|---------|
        |            | none | string | integer | numeric |
        | eq         | +    | +      | +       | +       |
        | neq        | +    | +      | +       | +       |
        | like       | -    | +      | -       | -       |
        | nlike      | -    | +      | -       | -       |
        | in         | +    | +      | +       | +       |
        | nin        | +    | +      | +       | +       |
        | gt         | -    | +      | +       | +       |
        | gte        | -    | +      | +       | +       |
        | lt         | -    | +      | +       | +       |
        | lte        | -    | +      | +       | +       |

      example:
        meta.field_1__gt:numeric: 36.6
        meta.field_2.field_3__in: value,none
        meta.field_4:integer: 5
        meta: null
  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"

    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"

    account_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: account id.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    sample_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: Sample ID.
      nullable: true
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    external_id:
      description: user-defined external id for face
      type: string
      pattern: "^[^\\x00]*$"
      example: "external id"
      maxLength: 36

    track_id:
      description: Event track ID.
      type: string
      pattern: '^[a-zA-Z0-9_\-]{1,36}$'
      example: "useful_track_id_number_1"

    face_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: Face ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    list_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: List ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    event_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: Event ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    handler_id:
      allOf:
        - $ref: '#/components/schemas/uuid'
      description: Handler ID.
      example: "b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    count:
      type: integer
      minimum: 0
      description: object count.
      example: 100

    int01:
      type: integer
      default: 0
      enum:
      - 0
      - 1

    int0100:
      type: integer
      minimum: 0
      maximum: 100

    int0180:
      type: integer
      default: 180
      minimum: 0
      maximum: 180

    number01:
      type: number
      minimum: 0
      maximum: 1

    estimation_not_nullable:
      type: number
      format: double
      maximum: 1
      minimum: 0
      nullable: false

    null_filter:
      type: string
      enum: [null]

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

    detect_time:
      allOf:
        - $ref: "#/components/schemas/time"
        - description: Detection time.
      example: "2018-08-11T09:11:41.674Z"

    detect_ts:
      type: number
      minimum: 0.0
      maximum: 158731466399.999
      description: User-defined timestamp relative to something, such as the start of a video.
      example: 123.456
      nullable: true

    image_origin:
      type: string
      maxLength: 256
      description: Image URL - source of the detection.
      nullable: true
      example: "/6/images/b668c4a5-2191-476e-a261-3b4f9ce2e25e"

    column:
      type: string
      enum: [event_id, external_id, handler_id, source, top_similar_object_id, top_similar_external_id, create_time,
             end_time, liveness, top_matching_candidates_label, top_similar_object_similarity, face_id, gender, age,
             emotion, ethnic_group, user_data, tags, city, area, district, street, house_number, geo_position, mask,
             track_id, apparent_age, apparent_gender, sleeve_length, headwear_state, upper_clothing_colors,
             backpack_state, lower_garment_colors, headwear_apparent_color lower_garment_type, shoes_apparent_color, 'meta.*']
      description: Fields to aggregate.
      example: "meta.profile.age"

    gender:
      allOf:
        - $ref: '#/components/schemas/int01'
        - description: Gender. 0 - female, 1 - male.

    age:
      allOf:
        - $ref: '#/components/schemas/int0100'
        - description: Age.

    aggregator:
      type: string
      enum: [count, max, min, avg, group_by]
      example: "count"
      description: Aggregation function for column.
      default: count

    operator_filter:
      type: string
      enum: [eq, neq, in, nin, like, nlike, gt, gte, lt, lte, covered]
      description: |
        Filter operator. For tags it is required to be like/nlike only.
        For geo position filter it is required to be covered only.
      example: "gt"

    operator_period:
      type: string
      enum: [gt, gte, lt, lte]
      description: Filter operator for event creation time.
      example: "gt"

    value_period:
      type: string
      format: date-time
      example: "2018-01-01T00:00:00Z"
      pattern: (^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$|^now-\d+(y|M|w|d|h|m|s)$)
      description: Filter value for event creation time. In ISO or now-time format.

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

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

    geo_position:
      type: object
      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]

    geo_position_bbox:
      description: |
          Geo position filter is a bounding box specified by coordinates of its center (origin) and some delta.
          WARNING: boxes with a vertex or border on the International Date Line (IDL) or the North or South pole are
          not fully supported due to features of database spatial index - filter result may be unexpected.
      properties:
        origin_longitude:
          allOf:
            - $ref: '#/components/schemas/longitude'
            - description: Origin longitude in degrees.
        origin_latitude:
          allOf:
            - $ref: '#/components/schemas/latitude'
            - description: Origin latitude in degrees.
        longitude_delta:
          description: |
              Longitude delta in degrees. Box edges more than 180 degrees long are not allowed.
              Boundaries of valid range are **exclusive**. NOTE: highly recommended for citywide use only.
          type: number
          minimum: 0
          maximum: 90
          default: 0.01
          example: 0.01
        latitude_delta:
          description: |
              Latitude delta in degrees. Box edges more than 180 degrees long are not allowed.
              Boundaries of valid range are **exclusive**. NOTE: highly recommended for citywide use only.
          type: number
          minimum: 0
          maximum: 90
          default: 0.01
          example: 0.01
      required: [origin_longitude, origin_latitude]

    value_filter:
      oneOf:
        - type: string
        - type: number
        - type: array
          items:
            oneOf:
              - type: string
              - type: number
        - $ref: '#/components/schemas/geo_position_bbox'
      description: |
        Filter value. It is required to be string, integer, float or its array
        or object with specific properties in case of geo position filter -
        geo position filter is bounding box specified by coordinates of its center (origin) and some delta.
      example: "London"

    user_data:
      description: user data.
      type: string
      pattern: "^[^\\x00]*$"
      maxLength: 128
      default: ""

    face_user_data:
      allOf:
        - $ref: '#/components/schemas/user_data'
      description: User data associated with face.
      example: "face of person"

    location_str:
      type: string
      pattern: "^[^\\x00]*$"
      maxLength: 36
      nullable: true

    location:
      type: object
      description: Information about a place where event is incidented.
      properties:
        city:
          allOf:
            - $ref: '#/components/schemas/location_str'
            - description: City where event is incidented.
        area:
          allOf:
            - $ref: '#/components/schemas/location_str'
            - description: Area where event is incidented.
        district:
          allOf:
            - $ref: '#/components/schemas/location_str'
            - description: District where event is incidented.
        street:
          allOf:
            - $ref: '#/components/schemas/location_str'
            - description: Street where event is incidented.
        house_number:
          allOf:
            - $ref: '#/components/schemas/location_str'
            - description: House number where event is incidented.
        geo_position:
          allOf:
            - $ref: '#/components/schemas/geo_position'
            - nullable: true
      required: [city, area, district, street, house_number, geo_position]

      example:
        city: "Moscow"
        area: "CAO"
        district: "Arbat"
        street: "Arbat"
        house_number: "3"
        geo_position:
          longitude: 36.616
          latitude: 55.752

    target:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/column'
        aggregator:
          $ref: '#/components/schemas/aggregator'
      required: [column , aggregator]

    targets:
      type: array
      description: |
        Fields and functions to aggregate.

        Allowed usage of aggregators is:

        | Column                        | Aggregator |     |     |     |          |
        |-------------------------------|------------|-----|-----|-----|----------|
        |                               | count      | max | min | avg | group_by |
        | event_id                      | +          | -   | -   | -   | +        |
        | external_id                   | +          | -   | -   | -   | +        |
        | handler_id                    | +          | -   | -   | -   | +        |
        | source                        | +          | -   | -   | -   | +        |
        | top_similar_object_id         | +          | -   | -   | -   | +        |
        | top_similar_external_id       | +          | -   | -   | -   | +        |
        | top_matching_candidates_label | +          | -   | -   | -   | +        |
        | create_time                   | +          | +   | +   | -   | -        |
        | end_time                      | +          | +   | +   | -   | -        |
        | top_similar_object_similarity | +          | +   | +   | +   | -        |
        | face_id                       | +          | -   | -   | -   | +        |
        | gender                        | +          | +   | +   | +   | +        |
        | age                           | +          | +   | +   | +   | +        |
        | emotion                       | +          | +   | +   | +   | +        |
        | mask                          | +          | +   | +   | +   | +        |
        | ethnic_group                  | +          | +   | +   | +   | +        |
        | liveness                      | +          | +   | +   | +   | +        |
        | user_data                     | +          | -   | -   | -   | +        |
        | tags                          | +          | +   | +   | -   | -        |
        | city                          | +          | -   | -   | -   | +        |
        | area                          | +          | -   | -   | -   | +        |
        | district                      | +          | -   | -   | -   | +        |
        | street                        | +          | -   | -   | -   | +        |
        | house_number                  | +          | -   | -   | -   | +        |
        | geo_position                  | +          | -   | -   | -   | -        |
        | track_id                      | +          | -   | -   | -   | +        |
        | apparent_age                  | +          | +   | +   | +   | +        |
        | apparent_gender               | +          | +   | +   | +   | +        |
        | sleeve_length                 | +          | -   | -   | -   | +        |
        | headwear_state                | +          | +   | +   | +   | +        |
        | upper_clothing_colors         | +          | -   | -   | -   | -        |
        | backpack_state                | +          | +   | +   | +   | +        |
        | lower_garment_colors          | +          | -   | -   | -   | -        |
        | headwear_apparent_color       | +          | -   | -   | -   | +        |
        | lower_garment_type            | +          | -   | -   | -   | +        |
        | shoes_apparent_color          | +          | -   | -   | -   | +        |
        | meta.*                        | +          | +   | +   | +   | -        |
      items:
        $ref: '#/components/schemas/target'
      minItems: 1
      default:
        - {'column': 'event_id', 'aggregator': 'count'}

    filter:
      type: object
      description: Filter for sample restriction.
      properties:
        column:
          $ref: '#/components/schemas/column'
        operator:
          $ref: '#/components/schemas/operator_filter'
        value:
          $ref: '#/components/schemas/value_filter'
      required: [column , operator, value]

    filters:
      type: array
      description: |
        Set of filters for sample restriction.

        Allowed usage of filters is:

        | Filter                        | Operator    |         |         |                  |         |         |
        |-------------------------------|-------------|---------|---------|------------------|---------|---------|
        |                               | like, nlike | in, nin | eq, neq | gt, gte, lt, lte | covered | eq null |
        | tags                          | +           | -       | -       | -                | -       | -       |
        | source                        | -           | +       | +       | -                | -       | +       |
        | user_data                     | -           | +       | +       | -                | -       | -       |
        | account_id                    | -           | +       | +       | +                | -       | -       |
        | event_id                      | -           | +       | +       | +                | -       | -       |
        | external_id                   | -           | +       | +       | +                | -       | -       |
        | handler_id                    | -           | +       | +       | +                | -       | -       |
        | top_similar_object_id         | -           | +       | +       | +                | -       | -       |
        | top_similar_external_id       | -           | +       | +       | +                | -       | -       |
        | top_matching_candidates_label | -           | +       | +       | -                | -       | -       |
        | top_similar_object_similarity | -           | -       | -       | +                | -       | -       |
        | face_id                       | -           | +       | +       | +                | -       | -       |
        | gender                        | -           | +       | +       | +                | -       | +       |
        | age                           | -           | +       | +       | +                | -       | +       |
        | emotion                       | -           | +       | +       | +                | -       | +       |
        | mask                          | -           | +       | +       | +                | -       | +       |
        | ethnic_group                  | -           | +       | +       | +                | -       | +       |
        | liveness                      | -           | +       | +       | +                | -       | +       |
        | city                          | -           | +       | +       | -                | -       | +       |
        | area                          | -           | +       | +       | -                | -       | +       |
        | district                      | -           | +       | +       | -                | -       | +       |
        | street                        | -           | +       | +       | -                | -       | +       |
        | house_number                  | -           | +       | +       | -                | -       | +       |
        | geo_position                  | -           | -       | -       | -                | +       | +       |
        | track_id                      | -           | +       | +       | -                | -       | +       |
        | apparent_age                  | -           | +       | +       | +                | -       | +       |
        | apparent_gender               | -           | +       | +       | +                | -       | +       |
        | sleeve_length                 | -           | +       | +       | -                | -       | +       |
        | headwear_state                | -           | +       | +       | +                | -       | +       |
        | upper_clothing_colors         | -           | +       | -       | -                | -       | +       |
        | backpack_state                | -           | +       | +       | +                | -       | +       |
        | lower_garment_colors          | -           | +       | -       | -                | -       | +       |
        | headwear_apparent_color       | -           | +       | +       | -                | -       | +       |
        | lower_garment_type            | -           | +       | +       | -                | -       | +       |
        | shoes_apparent_color          | -           | +       | +       | -                | -       | +       |
        | meta.*                        | +           | +       | +       | +                | -       | +       |

        Warning: must be at least one aggregator different with 'group_by' in request

      items:
        $ref: '#/components/schemas/filter'
      minItems: 0

    period:
      description: Min and max of event creation time for sample restriction.
      type: object
      properties:
        operator:
          $ref: '#/components/schemas/operator_period'
        value:
          $ref: '#/components/schemas/value_period'
      required: [operator, value]

    periods:
      type: array
      description: It is possible to set start and end of period.
      items:
        $ref: '#/components/schemas/period'
      minItems: 0

    group_by:
      type: string
      description: |
        Event for grouping by creation time.

        Grouping is possible in two ways

        1) Grouping by time intervals - number and dimension

        | The parameter value | Description  |
        |---------------------|--------------|
        | `1m`                | one minute   |
        | `2h`                | two hours    |
        | `7d`                | seven days   |
        | `5w`                | five weeks   |
        | `3M`                | three months |
        | `10y`               | ten years    |

        2) The frequency grouping - one of the following

        | The parameter value | Description        |
        |---------------------|--------------------|
        | `monthOfYear`       | by month of year   |
        | `weekOfYear`        | by week of year    |
        | `dayOfYear`         | by day of year     |
        | `dayOfMonth`        | by day of month    |
        | `dayOfWeek`         | by day of week     |
        | `hourOfDay`         | by hours of day    |
        | `minuteOfHour`      | by minutes of hour |

      example: "dayOfWeek"

    ethnicities_enum:
      type: integer
      enum: [1, 2, 3, 4]
      description: |
        Reference ethnicity

        | ethnicity    | value |
        |------------------|---|
        | African american | 1 |
        | Indian           | 2 |
        | Asian            | 3 |
        | Caucasian        | 4 |

    predominant_ethnicity:
      type: string
      description: Most likely ethnicity of a human from the event.
      enum: ["african_american", "indian", "caucasian", "asian"]

    emotion_enum:
      description: |
        predominant emotion.

        | emotions    | value |
        |-----------------|---|
        | anger           | 1 |
        | disgust         | 2 |
        | fear            | 3 |
        | happiness       | 4 |
        | neutral         | 5 |
        | sadness         | 6 |
        | surprise        | 7 |

      type: integer
      enum: [1, 2, 3, 4, 5, 6, 7]

    mask_enum:
      description: |
        Predominant mask.

        | masks      | value |
        |----------------|---|
        | missing        | 1 |
        | medical_mask   | 2 |
        | occluded       | 3 |

      type: integer
      enum: [1, 2, 3]

    liveness_enum:
      description: |
        Predominant liveness.

        | liveness | value |
        |--------------|---|
        | spoof        | 0 |
        | real         | 1 |
        | unknown      | 2 |

      type: integer
      enum: [0, 1, 2]

    int_version:
      type: integer
      minimum: 0

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

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

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

    avatar:
      type: string
      format: uri-reference
      default: ""
      nullable: true
      description: Avatar for the face, references to a sample or a user-defined reference.

    lists:
      type: array
      items:
        $ref: '#/components/schemas/list_id'
      minItems: 0
      description: List of luna lists, which contain the face.

    url:
      type: string
      description: Face URL.
      nullable: true

    face:
      type: object
      properties:
        face_id:
          $ref: '#/components/schemas/face_id'
        lists:
          type: array
          items:
            $ref: '#/components/schemas/list_id'
          minItems: 0
          description: List of luna lists, which contain the face.
      required: [face_id, lists]
      example:
        face_id: "426542d6-5509-4e5b-8a01-e2abd5c0a8c6"
        lists: ["429b0e78-4616-426a-b57f-02baa72d638d", "6d037c33-31ec-4d73-b3b3-ec80b09446c2"]

    face_candidate:
      type: object
      properties:
        face_id:
          $ref: '#/components/schemas/face_id'
        external_id:
          $ref: '#/components/schemas/external_id'
        user_data:
          $ref: '#/components/schemas/face_user_data'
        create_time:
          allOf:
            - $ref: "#/components/schemas/time"
            - description: Time of the face creation.

    face_candidate_reply:
      type: object
      properties:
        face_id:
          allOf:
          - $ref: '#/components/schemas/face_id'
          nullable: true
        external_id:
          allOf:
          - $ref: '#/components/schemas/external_id'
          nullable: true
        user_data:
          allOf:
          - $ref: '#/components/schemas/face_user_data'
          nullable: true
        create_time:
          allOf:
          - $ref: "#/components/schemas/time"
          - description: Time of the face creation.
          nullable: true
      required: [face_id, external_id, user_data, create_time]

    event_candidate:
      type: object
      properties:
        event_id:
          $ref: '#/components/schemas/event_id'
        external_id:
          $ref: '#/components/schemas/external_id'
        handler_id:
          $ref: '#/components/schemas/handler_id'
        source:
          allOf:
          - $ref: '#/components/schemas/source'
          nullable: true
        user_data:
          $ref: '#/components/schemas/face_user_data'
        create_time:
          allOf:
            - $ref: "#/components/schemas/time"
            - description: Time of the event creation.

    event_candidate_reply:
      type: object
      properties:
        event_id:
          allOf:
          - $ref: '#/components/schemas/event_id'
          nullable: true
        external_id:
          allOf:
          - $ref: '#/components/schemas/external_id'
          nullable: true
        handler_id:
          allOf:
          - $ref: '#/components/schemas/handler_id'
          nullable: true
        source:
          allOf:
          - $ref: '#/components/schemas/source'
          nullable: true
        user_data:
          allOf:
          - $ref: '#/components/schemas/face_user_data'
          nullable: true
        create_time:
          allOf:
          - $ref: "#/components/schemas/time"
          - description: Time of the event creation.
          nullable: true
      required: [event_id, external_id, handler_id, source, user_data, create_time]

    source:
      description: Additional information that user provides with event.
      type: string
      pattern: "^[^\\x00]*$"
      example: "3rd Avenue"

    tag:
      description: Tag. All characters allowed except *NUL*.
      type: string
      pattern: "^[^\\x00]+$"
      example: "good"
      maxLength: 36

    Tags:
      description: Tag array.
      type: array
      items:
        $ref: '#/components/schemas/tag'
      example: ["tag1", "tag2"]

    top_matching_candidates_label:
      description: Top matching candidates label.
      type: string
      pattern: "^[^\\x00]*$"
      maxLength: 36
      example: "good guys"

    top_match_face:
      type: object
      description: The most similar object is face.
      properties:
        face_id:
          allOf:
          - $ref: '#/components/schemas/face_id'
          nullable: true
        similarity:
          $ref: '#/components/schemas/face_similarity'
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
        external_id:
          allOf:
          - $ref: '#/components/schemas/external_id'
          nullable: true
      required: [face_id, similarity, label, external_id]

    top_match_event:
      type: object
      description: The most similar object is event.
      properties:
        event_id:
          allOf:
          - $ref: '#/components/schemas/event_id'
          nullable: true
        similarity:
          $ref: '#/components/schemas/event_similarity'
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
        external_id:
          allOf:
          - $ref: '#/components/schemas/external_id'
          nullable: true
      required: [event_id, similarity, label, external_id]

    Event:
      type: object
      description: Event.
      properties:
        create_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: Event creation time.
        end_time:
          allOf:
            - $ref: '#/components/schemas/time'
          description: Event end time.
        event_id:
          $ref: '#/components/schemas/event_id'
        handler_id:
          allOf:
            - $ref: '#/components/schemas/handler_id'
          description: ID of the handler, which gave birth to the event.
        account_id:
          $ref: '#/components/schemas/account_id'
        external_id:
          $ref: '#/components/schemas/external_id'
        source:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/source'
        top_match:
          nullable: true
          oneOf:
            - $ref: '#/components/schemas/top_match_face'
            - $ref: '#/components/schemas/top_match_event'
        match_result:
          description: Object that contains match result.
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/match_candidates_reply'
          example:
            [{
               "label": "good guys",
               "candidates": [{
                              "face":{
                                "face_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6",
                                "external_id": "2xQ2gprbMUePw1s9gw9fvA==",
                                "user_data": "fox1991",
                                "create_time": "2018-08-11T09:11:41.674Z"
                              },
                              "similarity": 0.5
                            }]},
             {
               "label": "bad guys",
               "candidates": [{
                              "event":{
                                "event_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7",
                                "external_id": "2xQ2gprbMUePw1s9gw9fvA==",
                                "user_data": "fox1991",
                                "create_time": "2018-08-11T09:11:41.674Z",
                                "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7",
                                "source": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7"
                              },
                              "similarity": 0.3
                            }]}]
        face_detections:
          description: List of all face detection and corresponding sample IDs.
          type: array
          nullable: true
          items:
            type: object
            properties:
              sample_id:
                $ref: '#/components/schemas/sample_id'
              detection:
                type: object
                description: Detection.
                properties:
                  rect:
                    $ref: '#/components/schemas/rect'
                required: [rect]
              detect_time:
                $ref: '#/components/schemas/detect_time'
              detect_ts:
                $ref: '#/components/schemas/detect_ts'
              image_origin:
                $ref: '#/components/schemas/image_origin'
            required: [sample_id, detect_time, image_origin, detect_ts]
        body_detections:
          description: List of all body detection and corresponding sample IDs.
          type: array
          nullable: true
          items:
            type: object
            properties:
              sample_id:
                $ref: '#/components/schemas/sample_id'
              detection:
                type: object
                description: Detection.
                properties:
                  rect:
                    $ref: '#/components/schemas/rect'
              detect_time:
                $ref: '#/components/schemas/detect_time'
              detect_ts:
                $ref: '#/components/schemas/detect_ts'
              image_origin:
                $ref: '#/components/schemas/image_origin'
            required: [sample_id, detect_time, image_origin, detect_ts]

        body_basic_attributes:
          $ref: '#/components/schemas/body_basic_attributes'
        upper_body:
          allOf:
            - $ref: '#/components/schemas/upper_body_attributes'
            - properties:
                headwear:
                  properties:
                    apparent_color:
                      nullable: true
                  required: [ state, apparent_color ]
        lower_body:
          $ref: '#/components/schemas/lower_body_attributes'
        accessories:
          $ref: '#/components/schemas/body_accessories'
        face_id:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/face_id'
        attach_result:
          description: Contains attached lists IDs.
          type: array
          items:
            $ref: '#/components/schemas/list_id'
          minItems: 0
        gender:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/gender'
        age:
          description: Age.
          type: integer
          nullable: true
          maximum: 100
          minimum: 0
        emotion:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/emotion_enum'
        mask:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/mask_enum'
        ethnic_group:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/ethnicities_enum'
        liveness:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/liveness_enum'
        tags:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/Tags'
        user_data:
          $ref: '#/components/schemas/user_data'
        location:
          $ref: '#/components/schemas/location'
        track_id:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/track_id'
        meta:
          type: object
          nullable: true
          additionalProperties: true
          description: User defined metadata (json object). Size shouldn't exceed 2MB

    Events:
      type: array
      items:
        $ref: '#/components/schemas/Event'

    EventsWithoutCount:
      type: object
      properties:
        events:
          $ref: '#/components/schemas/Events'

    face_similarity:
      allOf:
        - $ref: '#/components/schemas/number01'
      description: Face similarity.

    event_similarity:
      allOf:
        - $ref: '#/components/schemas/number01'
      description: Event similarity.

    face_match_candidate:
      type: object
      properties:
        face:
          $ref: '#/components/schemas/face_candidate'
        similarity:
          $ref: '#/components/schemas/face_similarity'
      required: [face, similarity]

    face_match_candidate_reply:
      type: object
      properties:
        face:
          $ref: '#/components/schemas/face_candidate_reply'
        similarity:
          $ref: '#/components/schemas/face_similarity'
      required: [face, similarity]

    event_match_candidate:
      type: object
      properties:
        event:
          $ref: '#/components/schemas/event_candidate'
        similarity:
          $ref: '#/components/schemas/event_similarity'
      required: [event, similarity]

    event_match_candidate_reply:
      type: object
      properties:
        event:
          $ref: '#/components/schemas/event_candidate_reply'
        similarity:
          $ref: '#/components/schemas/event_similarity'
      required: [event, similarity]

    match_candidates_faces:
      type: array
      description: List of faces candidates.
      items:
        $ref: '#/components/schemas/face_match_candidate'

    match_candidates_faces_reply:
      type: object
      properties:
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
        candidates:
          type: array
          description: List of faces candidates.
          items:
            $ref: '#/components/schemas/face_match_candidate_reply'
      required: [label, candidates]

    match_candidates_events:
      type: array
      description: List of events candidates.
      items:
        $ref: '#/components/schemas/event_match_candidate'

    match_candidates_events_reply:
      type: object
      properties:
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
        candidates:
          type: array
          description: List of events candidates.
          items:
            $ref: '#/components/schemas/event_match_candidate_reply'
      required: [label, candidates]

    match_candidates_reply:
      anyOf:
        - $ref: '#/components/schemas/match_candidates_faces_reply'
        - $ref: '#/components/schemas/match_candidates_events_reply'

    match_candidates_new_event_faces:
      type: object
      minItems: 1
      properties:
        candidates:
          $ref: '#/components/schemas/match_candidates_faces'
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
      required: [candidates, label]

    match_candidates_new_event_events:
      type: object
      minItems: 1
      properties:
        candidates:
          $ref: '#/components/schemas/match_candidates_events'
        label:
          $ref: '#/components/schemas/top_matching_candidates_label'
      required: [candidates, label]

    match_candidates_new_event:
      oneOf:
        - $ref: '#/components/schemas/match_candidates_new_event_faces'
        - $ref: '#/components/schemas/match_candidates_new_event_events'

    rect:
      type: object
      description: Detection rectangle.
      properties:
        x:
          type: integer
          description: Detection rectangle x coordinate.
          maximum: 32767
          minimum: -32768
        y:
          type: integer
          description: Detection rectangle y coordinate.
          maximum: 32767
          minimum: -32768
        width:
          type: integer
          description: Detection rectangle width.
          maximum: 32767
          minimum: 0
        height:
          type: integer
          description: Detection rectangle height.
          maximum: 32767
          minimum: 0
      required: [x, y, width, height]

    basic_attributes:
      type: object
      description: Basic attributes.
      properties:
        age:
          $ref: '#/components/schemas/age'
        gender:
          $ref: '#/components/schemas/gender'
        ethnicities:
          $ref: '#/components/schemas/ethnic_estimations'

    face_attributes_json:
      type: object
      description: Face attributes.
      properties:
        basic_attributes:
          $ref: '#/components/schemas/basic_attributes'
        descriptor_data:
          $ref: '#/components/schemas/descriptor_base64_with_version'

    face_attributes_msgpack:
      type: object
      description: Face attributes.
      properties:
        basic_attributes:
          $ref: '#/components/schemas/basic_attributes'
        descriptor_data:
          $ref: '#/components/schemas/descriptor_binary_with_version'

    body_attributes_json:
      type: object
      description: Body attributes.
      properties:
        descriptor_data:
          $ref: '#/components/schemas/descriptor_base64_with_version'

    body_attributes_msgpack:
      type: object
      description: Body attributes.
      properties:
        descriptor_data:
          $ref: '#/components/schemas/descriptor_binary_with_version'

    body_basic_attributes:
      type: object
      description: Body basic attributes.
      nullable: true
      properties:
        apparent_age:
          type: integer
          maximum: 100
          minimum: 0
          description: Apparent age.
        apparent_gender:
          type: integer
          enum: [ 0, 1, 2 ]
          description: Apparent gender (0 - female, 1 - male, 2 - undefined).
      required: [ apparent_age, apparent_gender ]

    headwear_color:
      type: string
      enum: [ undefined, black, white, other ]
      description: Headwear apparent color.

    clothing_color:
      type: string
      enum: [ undefined, black, blue, green, gray, orange, purple, red, white, yellow, pink, brown, beige, khaki, multicolored ]
      description: Clothing color.

    shoes_color:
      type: string
      enum: [ undefined, black, white, other ]
      description: Shoes apparent color.

    upper_body_attributes:
      type: object
      description: Upper body attributes.
      nullable: true
      properties:
        headwear:
          type: object
          properties:
            state:
              type: integer
              enum: [ 0, 1, 2 ]
              description: Headwear state (0 - absent, 1 - present, 2 - undefined).
            apparent_color:
              $ref: '#/components/schemas/headwear_color'
          required: [ state ]
          description: Headwear attributes.
        sleeve:
          type: object
          properties:
            length:
              type: string
              enum: [ short, long, undefined ]
              description: Sleeve length.
          required: [ length ]
          description: Sleeve attributes.
        upper_clothing:
          type: object
          properties:
            colors:
              type: array
              items:
                $ref: '#/components/schemas/clothing_color'
              description: Upper clothing color set.
          required: [ colors ]
          description: Upper clothing attibutes.
      required: [ headwear, sleeve, upper_clothing ]

    lower_body_attributes:
      type: object
      description: Lower body attributes.
      nullable: true
      properties:
        lower_garment:
          type: object
          properties:
            type:
              type: string
              enum: [ undefined, trousers, shorts, skirt ]
            colors:
              type: array
              items:
                $ref: '#/components/schemas/clothing_color'
              description: Lower clothing color set.
          required: [ type, colors ]
          description: Lower clothing attibutes.
        shoes:
          type: object
          properties:
            apparent_color:
              $ref: '#/components/schemas/shoes_color'
          required: [ apparent_color ]
          description: Shoes attributes.
      required: [ lower_garment, shoes ]

    body_accessories:
      type: object
      description: Body accessories.
      nullable: true
      properties:
        backpack:
          type: object
          properties:
            state:
              type: integer
              enum: [ 0, 1, 2 ]
              description: Backpack state (0 - absent, 1 - present, 2 - undefined).
          description: Backpack attributes.
          required: [ state ]
      required: [ backpack ]

    base_new_event:
      type: object
      description: Event.
      properties:
        create_time:
          allOf:
            - type: string
              description: Event creation time.
            - $ref: '#/components/schemas/time'
        end_time:
          allOf:
            - type: string
              description: Event end time, if it was not set, the system will set it by the time of creation.
            - $ref: '#/components/schemas/time'
        event_id:
          allOf:
            - type: string
              description: Event ID.
            - $ref: '#/components/schemas/event_id'
        handler_id:
          allOf:
            - type: string
              description: ID of the handler, which gave birth to the event.
            - $ref: '#/components/schemas/handler_id'
        external_id:
          allOf:
          - $ref: '#/components/schemas/external_id'
          nullable: true
          default: ""
        user_data:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/user_data'
        meta:
          type: object
          nullable: true
          additionalProperties: true
          description: User defined metadata (json object). Size shouldn't exceed 2MB.
          example:
            {
               "key": "value"
            }
        source:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/source'
        track_id:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/track_id'
        tags:
          allOf:
            - nullable: true
            - $ref: '#/components/schemas/Tags'
        face:
          allOf:
            - $ref: '#/components/schemas/face'
            - description: Face object.
            - nullable: true
        matches:
          type: array
          description: Matches list.
          nullable: true
          items:
            $ref: '#/components/schemas/match_candidates_new_event'
          example:
            [{
               "label": "good guys",
               "candidates": [{
                              "face": {
                                "face_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c6",
                                "external_id": "2xQ2gprbMUePw1s9gw9fvA==",
                                "user_data": "fox1991",
                                "create_time": "2018-08-11T09:11:41.674Z"
                              },
                            similarity: 0.5
                            }]},
             {
               "label": "bad guys",
               "candidates": [{
                              "event": {
                                "event_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7",
                                "external_id": "2xQ2gprbMUePw1s9gw9fvA==",
                                "user_data": "fox1991",
                                "create_time": "2018-08-11T09:11:41.674Z",
                                "handler_id": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7",
                                "source": "426542d6-5509-4e5b-8a01-e2abd5c0a8c7"
                              },
                            "similarity": 0.3
                            }]}]
        detections:
          type: array
          description: Detection list.
          items:
            type: object
            properties:
              filename:
                type: string
                description: samples filename
              samples:
                description: a couple of face and body samples - both refer to the same person
                type: object
                properties:
                  face:
                    description: Face detection.
                    type: object
                    nullable: true
                    properties:
                      sample_id:
                        $ref: '#/components/schemas/sample_id'
                      detection:
                        type: object
                        description: Detection.
                        properties:
                          rect:
                            $ref: '#/components/schemas/rect'
                    required: [sample_id]
                  body:
                    description: Body detection.
                    type: object
                    nullable: true
                    properties:
                      sample_id:
                        $ref: '#/components/schemas/sample_id'
                      detection:
                        type: object
                        description: Detection.
                        properties:
                          rect:
                            $ref: '#/components/schemas/rect'
                    required: [sample_id]
                required: [face, body]
              detect_time:
                $ref: '#/components/schemas/detect_time'
              detect_ts:
                $ref: '#/components/schemas/detect_ts'
              image_origin:
                $ref: '#/components/schemas/image_origin'
            required: [samples, filename, detect_time]
        location:
          $ref: '#/components/schemas/location'
        aggregate_estimations:
          type: object
          description: Aggregated estimations.
          properties:
            face:
              type: object
              nullable: true
              description: Aggregated face estimations.
              properties:
                attributes:
                  type: object
                  nullable: false
                  description: Aggregated face attributes.
                  properties:
                    liveness:
                      allOf:
                        - description: Aggregated liveness result.
                        - $ref: '#/components/schemas/liveness_result'
                    emotions:
                      allOf:
                        - description: Aggregated emotions result.
                        - $ref: '#/components/schemas/emotions'
                    mask:
                      allOf:
                        - description: Aggregated mask result.
                        - $ref: '#/components/schemas/mask'
              required: [attributes]
            body:
              type: object
              nullable: true
              description: Aggregated body estimations.
              properties:
                attributes:
                  type: object
                  description: Body extra attributes.
                  properties:
                    basic_attributes:
                      $ref: '#/components/schemas/body_basic_attributes'
                    upper_body:
                      $ref: '#/components/schemas/upper_body_attributes'
                    lower_body:
                      $ref: '#/components/schemas/lower_body_attributes'
                    accessories:
                      $ref: '#/components/schemas/body_accessories'
              required: [ attributes ]
      required: [create_time, event_id, handler_id]

    new_event_json:
      allOf:
        - $ref: '#/components/schemas/base_new_event'
        - properties:
            face_attributes:
              $ref: '#/components/schemas/face_attributes_json'
            body_attributes:
              $ref: '#/components/schemas/body_attributes_json'

    new_event_msgpack:
      allOf:
        - $ref: '#/components/schemas/base_new_event'
        - properties:
            face_attributes:
              $ref: '#/components/schemas/face_attributes_msgpack'
            body_attributes:
              $ref: '#/components/schemas/body_attributes_msgpack'

    event_for_update_json:
      type: object
      description: Event for update.
      properties:
        face_attributes:
          $ref: '#/components/schemas/face_attributes_json'
        body_attributes:
          $ref: '#/components/schemas/body_attributes_json'

    event_for_update_msgpack:
      type: object
      description: Event for update.
      properties:
        face_attributes:
          $ref: '#/components/schemas/face_attributes_msgpack'
        body_attributes:
          $ref: '#/components/schemas/body_attributes_msgpack'

    ethnicities_estimations:
      type: object
      description: Ethnicity classifier response.
      properties:
        asian:
          type: number
          format: double
          maximum: 1
          minimum: 0
          description: Asian ethnicity probability.
        indian:
          type: number
          format: double
          maximum: 1
          minimum: 0
          description: Indian ethnicity probability.
        caucasian:
          type: number
          format: double
          maximum: 1
          minimum: 0
          description: Caucasian ethnicity probability.
        african_american:
          type: number
          format: double
          maximum: 1
          minimum: 0
          description: African American ethnicity probability.

    ethnic_estimations:
      type: object
      description: Ethnicities estimations.
      properties:
        estimations:
          $ref: '#/components/schemas/ethnicities_estimations'
        predominant_ethnicity:
          $ref: '#/components/schemas/predominant_ethnicity'

    getEventStats:
      type: object
      properties:
        targets:
          $ref: '#/components/schemas/targets'
        filters:
          $ref: '#/components/schemas/filters'
        period:
          $ref: '#/components/schemas/periods'
        group_by:
          $ref: '#/components/schemas/group_by'

    emotions_estimations:
      type: object
      properties:
        anger:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Anger probability.
        disgust:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Disgust probability.
        fear:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Fear probability.
        happiness:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Happiness probability.
        neutral:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Neutral face probability.
        sadness:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Sadness probability.
        surprise:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          - description: Surprise probability.
      required: [surprise, sadness, neutral, happiness, fear, disgust, anger]
      description: emotion classifier response.
      example: {anger: 0.1, disgust: 0.2, fear: 0.3, happiness: 0.4, neutral: 0.5, sadness: 0.6, surprise: 0.7}

    predominant_emotion:
      type: string
      description: Name of predominant emotion.
      enum: [surprise, sadness, neutral, happiness, fear, disgust, anger]

    emotions:
      type: object
      description: emotion
      properties:
        estimations:
          allOf:
            - $ref: '#/components/schemas/emotions_estimations'
            - description: Emotion classifier response.
        predominant_emotion:
          $ref: '#/components/schemas/predominant_emotion'
      required: [predominant_emotion, estimations]

    liveness_score:
      allOf:
        - $ref: '#/components/schemas/number01'
      description: |
        The parameter shows the probability of a live person being present in the
        image, i.e. it is not a presentation attack.

        In general, the estimated probability must exceed the theoretical
        threshold of 50%. The value may be increased according to your business rules.
      example: 0.99

    liveness_quality:
      allOf:
        - $ref: '#/components/schemas/number01'
      description: |
        Quality value is a probability of "appropriate image".
        The parameter describes the integral value of image, facial and environmental characteristics.
      example: 1.0

    liveness_prediction:
      type: string
      enum: ["spoof", "real", "unknown"]
      description: Prediction that a person in the image is real (not a fake).
      example: "real"

    liveness_result:
      type: object
      description: liveness prediction result.
      properties:
        prediction:
          $ref: '#/components/schemas/liveness_prediction'
        estimations:
          type: object
          description: Liveness estimations result.
          properties:
            score:
              $ref: '#/components/schemas/liveness_score'
            quality:
              $ref: '#/components/schemas/liveness_quality'
          required: [score, quality]
      required: [prediction, estimations]

    mask_estimations:
      type: object
      description: Raw mask estimations.
      properties:
        medical_mask:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          description: The probability that the `medical mask` exists on the face and is worn properly.
        missing:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          description: The probability that the `medical mask` doesn't exist on the face.
        occluded:
          allOf:
          - $ref: '#/components/schemas/estimation_not_nullable'
          description: The probability that the face is occluded by other object (not by `medical mask`).
      required: [medical_mask, missing, occluded]
      example: {medical_mask: 0.1, missing: 0.2, occluded: 0.3}

    mask_predominant:
      type: string
      enum: [medical_mask, missing, occluded]
      description: Most likely mask state.

    mask:
      type: object
      description: Estimated face mask state.
      properties:
        estimations:
          $ref: '#/components/schemas/mask_estimations'
        predominant_mask:
          $ref: '#/components/schemas/mask_predominant'
      required: [estimations, predominant_mask]

    descriptor_base64_with_version:
      description: Descriptor with descriptor version in the json format.
      type: object
      properties:
        descriptor:
          description: Raw descriptor bytes encoded in base64.
          type: string
          format: base64
        descriptor_version:
          description: Descriptor version.
          type: integer
          example: 52
      required: [descriptor, descriptor_version]

    descriptor_binary_with_version:
      description: Raw descriptor with version.
      type: object
      properties:
        descriptor:
          description: Raw descriptor bytes.
          type: string
          format: binary
        descriptor_version:
          description: Descriptor version.
          type: integer
          example: 52
      required: [descriptor, descriptor_version]

    empty_string:
      type: string
      enum: [""]
      description: No descriptor found.

    event_deletion_info:
      type: array
      items:
        type: object
        properties:
          event_id:
            $ref: '#/components/schemas/event_id'
          face_samples:
            description: Array of face sample IDs.
            type: array
            items:
              $ref: '#/components/schemas/sample_id'
            minItems: 0
            uniqueItems: true
          body_samples:
            description: Array of body sample IDs.
            type: array
            items:
              $ref: '#/components/schemas/sample_id'
            minItems: 0
            uniqueItems: true
          image_origins:
            description: Array of image origins.
            type: array
            items:
              $ref: '#/components/schemas/image_origin'
            minItems: 0
            uniqueItems: true
        required: [ event_id ]
      minItems: 0
      maxItems: 10000

    removed_descriptors_event_list:
      type: object
      properties:
        event_ids:
          type: array
          description: Event IDs which descriptors were removed.
          items:
            $ref: '#/components/schemas/event_id'
          maxItems: 10000
      required: [event_ids]

    EventsWithMissingAttributes:
      type: object
      properties:
        events:
          type: array
          items:
            type: object
            properties:
              event_id:
                $ref: '#/components/schemas/event_id'
              samples:
                description: |
                    Either face sample IDs (for `basic_attributes` or `face_descriptor` kinds) or body sample IDs (for
                    `body_descriptor` kind).
                type: array
                items:
                  $ref: '#/components/schemas/sample_id'
            required: [event_id]
          minItems: 0
          maxItems: 1000
      required: [events]

    EventsWithMissingAttributesCount:
      type: object
      properties:
        events_count:
          type: integer
          description: Count of events.
          example: 55
      required: [events_count]

    health_ok:
      description: Successful healthcheck execution info.
      type: object
      properties:
        execution_time:
          type: number
          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: events_db
            error:
              error_code: 0
              desc: Success
              detail: Success
              link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-0"
            status: 1
          - component: events_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
  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'
paths:
  /version:
    get:
      tags:
      - version

      summary: get version
      description: Get version of service.
      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'
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/{event_id}:
    parameters:
      - $ref: '#/components/parameters/event_id'

    head:
      tags:
      - events
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/account_id'
      summary: check event
      description: Check event existence by ID.
      operationId: checkEvent
      responses:
        '200':
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        '404':
          description: Event not found.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
            Content-Type:
              $ref: '#/components/headers/application_json'
        '500':
          $ref: '#/components/responses/internal_server_error'

    get:
      tags:
      - events
      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/get_event_target'
      - $ref: '#/components/parameters/account_id'

      summary: get event
      description: |
        Get event by ID.
        If target is not set, reply will contain all event fields.
      operationId: getEvent
      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/Event'
        '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 'target'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '404':
          description: Event 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: 23001
                desc: Object not found
                detail: Event with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23001"
        '500':
          $ref: '#/components/responses/internal_server_error'

    patch:
      tags:
        - events
      parameters:
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/application_json_or_msgpack_content'
        - $ref: '#/components/parameters/account_id'

      summary: patch event
      description: Update event by ID.
      operationId: patchEvent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/event_for_update_json'
          application/msgpack:
            schema:
              $ref: '#/components/schemas/event_for_update_msgpack'
        required: true
      responses:
        '204':
          description: Update success.
          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_json:
                  value:
                    error_code: 12022
                    desc: Bad/incomplete input data
                    detail: "Failed to validate input json. Path: 'face_attributes',  message: face_attributes must be object"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022"
                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"
        '404':
          description: Event 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: 23001
                desc: Object not found
                detail: Event with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23001"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events:
    get:
      tags:
      - events
      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/get_event_target'
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/create_time__gte'
      - $ref: '#/components/parameters/create_time__lt'
      - $ref: '#/components/parameters/end_time__gte'
      - $ref: '#/components/parameters/end_time__lt'
      - $ref: '#/components/parameters/sources'
      - $ref: '#/components/parameters/top_matching_candidates_label'
      - $ref: '#/components/parameters/top_similar_object_ids'
      - $ref: '#/components/parameters/top_similar_external_ids'
      - $ref: '#/components/parameters/top_similar_object_similarity__gte'
      - $ref: '#/components/parameters/top_similar_object_similarity__lt'
      - $ref: '#/components/parameters/age__lt'
      - $ref: '#/components/parameters/age__gte'
      - $ref: '#/components/parameters/gender'
      - $ref: '#/components/parameters/emotions'
      - $ref: '#/components/parameters/masks'
      - $ref: '#/components/parameters/ethnic_groups'
      - $ref: '#/components/parameters/liveness'
      - $ref: '#/components/parameters/apparent_gender'
      - $ref: '#/components/parameters/apparent_age__gte'
      - $ref: '#/components/parameters/apparent_age__lt'
      - $ref: '#/components/parameters/headwear_states'
      - $ref: '#/components/parameters/headwear_colors'
      - $ref: '#/components/parameters/sleeve_lengths'
      - $ref: '#/components/parameters/upper_clothing_colors'
      - $ref: '#/components/parameters/lower_garment_types'
      - $ref: '#/components/parameters/lower_garment_colors'
      - $ref: '#/components/parameters/shoes_colors'
      - $ref: '#/components/parameters/backpack_states'
      - $ref: '#/components/parameters/face_ids'
      - $ref: '#/components/parameters/event_ids'
      - $ref: '#/components/parameters/event_id__gte_sorting'
      - $ref: '#/components/parameters/event_id__lt_sorting'
      - $ref: '#/components/parameters/handler_ids'
      - $ref: '#/components/parameters/external_ids'
      - $ref: '#/components/parameters/user_data'
      - $ref: '#/components/parameters/tags'
      - $ref: '#/components/parameters/cities'
      - $ref: '#/components/parameters/areas'
      - $ref: '#/components/parameters/districts'
      - $ref: '#/components/parameters/streets'
      - $ref: '#/components/parameters/house_numbers'
      - $ref: '#/components/parameters/origin_longitude'
      - $ref: '#/components/parameters/origin_latitude'
      - $ref: '#/components/parameters/longitude_delta'
      - $ref: '#/components/parameters/latitude_delta'
      - $ref: '#/components/parameters/track_ids'
      - $ref: '#/components/parameters/meta'
      - $ref: '#/components/parameters/search_order'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'

      summary: get events
      description: |
        Get events that satisfy filters.

        Default filters for events:

          - `create_time__lt` - current datetime
          - `create_time__gte` - current datetime minus month

          > **Default filters are not used if any of the following parameters are defined**:

            - list of event IDs (`event_ids`)
            - lower event ID boundary (`event_id__gte`)
            - upper event ID boundary (`event_id__lt`)
            - lower create time boundary (`create_time__gte`)
            - upper create time boundary (`create_time__lt`)

        The `target` parameter determines field that will be shown for each event.
        If target is not set, the response will contain all the fields, except the descriptor data.

        To count events, use <a href="#tag/events-stats">"get statistics on events"</a> request.
      operationId: getEvents
      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/EventsWithoutCount'
        '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 'create_time__lt'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '422':
          description: Unprocessable.
          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:
                cannot_cast_jsonb:
                  value:
                    error_code: 10020
                    desc: Database error
                    detail: |
                      SQL request execution failed due to incompatible user-defined filters: cannot cast jsonb string to type integer
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-10020"
        '500':
          $ref: '#/components/responses/internal_server_error'

    post:
      tags:
      - events
      summary: create new events
      description: Creates new events.
      operationId: createEvents
      parameters:
        - $ref: '#/components/parameters/luna_account_id_required'
        - $ref: '#/components/parameters/luna_request_id'
        - $ref: '#/components/parameters/application_json_or_msgpack_content'
        - $ref: '#/components/parameters/wait_events_saving'
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/new_event_json'
              minItems: 1
          application/msgpack:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/new_event_msgpack'
              minItems: 1
        required: true
      responses:
        '202':
          description: Events data is received. Events will be saved to the database soon.
          headers:
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
        '204':
          description: Events were created and stored in the database.
          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: '[0].create_time,  message: ''incorrect time format'''
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022"
                account_id_not_found:
                  value:
                    error_code: 11066
                    desc: Bad/incomplete input data
                    detail: Luna-Account-Id header not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11066"
                bad_account_id:
                  value:
                    error_code: 11037
                    desc: Bad/incomplete input data
                    detail: "Luna-Account-Id header is not UUID, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-11037"
        '409':
          description: Event already exists.
          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:
                duplicated_id:
                  value:
                    error_code: 23003
                    desc: Unique constraint error
                    detail: "One or more event id from '1231531' already exist"
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23003"
        '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:
                events_saving_error:
                  value:
                    error_code: 23010
                    desc: internal server error
                    detail: Unknown error
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23010"
                save_events_timeout:
                  value:
                    error_code: 23007
                    desc: Internal server error
                    detail: Timeout (5 seconds) for save events into history database has been expired
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23007"
                common_error:
                  value:
                    error_code: 1
                    detail: internal server error
                    desc: internal server error
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-1"

    delete:
      tags:
      - events
      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/delete_event_target'
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/handler_id'
      - $ref: '#/components/parameters/create_time__gte'
      - $ref: '#/components/parameters/create_time__lt'
      - $ref: '#/components/parameters/insert_time__gte'
      - $ref: '#/components/parameters/insert_time__lt'

      summary: delete events
      description: Delete oldest 10000 events that satisfy filters.
      operationId: deleteEvents
      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/event_deletion_info'
        '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 'handler_id'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/attributes/missing:
    get:
      tags:
      - administration
      parameters:
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/kind'
      - $ref: '#/components/parameters/insert_time__gte'
      - $ref: '#/components/parameters/insert_time__lt'
      - $ref: '#/components/parameters/event_id__gte'
      - $ref: '#/components/parameters/event_id__lt'
      - $ref: '#/components/parameters/handler_id'
      - $ref: '#/components/parameters/missing_version'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'

      summary: get events with missing attributes
      description: |
        Get events with samples and with missing attributes that satisfy filters.

      operationId: getEventsMissing
      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/EventsWithMissingAttributes'
        '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 'insert_time__lt'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/attributes/missing/count:
    get:
      tags:
      - administration
      parameters:
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/kind'
      - $ref: '#/components/parameters/insert_time__gte'
      - $ref: '#/components/parameters/insert_time__lt'
      - $ref: '#/components/parameters/event_id__gte'
      - $ref: '#/components/parameters/event_id__lt'
      - $ref: '#/components/parameters/handler_id'
      - $ref: '#/components/parameters/missing_version'

      summary: get count of events with missing attributes
      description: |
        Get count of events with samples and with missing attributes that satisfy filters.

      operationId: getEventsMissingCount
      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/EventsWithMissingAttributesCount'
        '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 'insert_time__lt'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/descriptors:
    delete:
      tags:
      - administration
      parameters:
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/event_id__gte'
      - $ref: '#/components/parameters/event_id__lt'
      - $ref: '#/components/parameters/descriptor_version_required'
      - $ref: '#/components/parameters/descriptor_type_required'

      summary: delete events descriptors
      description: Delete 10000 event descriptors that satisfy filters.

      operationId: deleteDescriptors
      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/removed_descriptors_event_list'
        '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 'event_id__lt'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/{event_id}/descriptor:
    parameters:
      - $ref: '#/components/parameters/event_id'

    get:
      tags:
      - event descriptor
      parameters:
      - $ref: '#/components/parameters/accept'
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/descriptor_version'
      - $ref: '#/components/parameters/descriptor_type'

      summary: get event descriptor
      description: Get event descriptor that corresponds to the specified parameters.
      operationId: getEventDescriptor
      responses:
        '200':
          description: OK.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json_or_xbinary'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/descriptor_base64_with_version'
            application/x-sdk-descriptor:
              schema:
                type: string
                format: binary
                description: Content type is application/x-sdk-descriptor, a binary descriptor is returned in the response body.
              example: "<a binary descriptor in the SDK format>"
        '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 'descriptor_version'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12012"
        '404':
          description: Object 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'
              examples:
                event_not_found:
                  value:
                    error_code: 23001
                    desc: Object not found
                    detail: Event with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37' not found
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23001"
                face_descriptor_not_found:
                  value:
                    error_code: 22018
                    desc: Object not found
                    detail: Face descriptor of version 7 is not found for object with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-22018"
                human_descriptor_not_found:
                  value:
                    error_code: 23007
                    desc: Object not found
                    detail: Human descriptor of version 7 is not found for object with id '7acc35cf-a3b2-4f87-8d8b-5496a2782d37'
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-23007"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/events/stats:
    post:
      tags:
      - events stats
      summary: get statistics on events
      description: |
        Get event statistics by target(s) with applied filters.

        Event fields and/or functions (count, min, etc.) can be set as targets for aggregation of events.

        Grouping by frequency or grouping by time intervals is available.
      operationId: getEventStats
      parameters:
      - $ref: '#/components/parameters/luna_request_id'
      - $ref: '#/components/parameters/applicationJsonContent'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/getEventStats'
            example:
              targets:
                - column: event_id
                  aggregator: count
                - column: age
                  aggregator: group_by
                - column: gender
                  aggregator: group_by
              filters:
                - column: source
                  operator: eq
                  value: Main_hall_camera
                - column: geo_position
                  operator: covered
                  value:
                    origin_longitude: 37
                    origin_latitude: 55
                    longitude_delta: 0.04
                    latitude_delta: 0.04

              period:
                - operator: gt
                  value: 2020-02-04T00:00:00Z
                - operator: lt
                  value: 2020-02-06T00:00:00Z
              group_by: dayOfWeek
        required: true
      responses:
        '200':
          description: Created.
          headers:
            Content-Type:
              $ref: '#/components/headers/application_json'
            Luna-Request-Id:
              $ref: '#/components/headers/luna_request_id'
          content:
            application/json:
              schema:
                type: object
                properties:
                  fields:
                    type: array
                    items:
                      type: string
                    description: |
                      Reply structure description includes is as follows:
                      - First element of a list is 'Group by time' section if request includes time or frequency grouping.
                      - Other elements are pairs of columns and aggregators for the columns.

                      List of columns and aggregators presents in the same order as in stats.
                  stats:
                    type: array
                    description: grouped values array.
                    items:
                      type: array
                      items:
                        description: |
                          grouped values. Value order is corresponding to order of request targets order.
                        nullable: true
                        anyOf:
                          - type: integer
                          - type: number
                          - type: string
                      minItems: 1
              examples:
                count_dayOfWeek:
                  value:
                    fields:
                      - "Group by time: dayOfWeek"
                      - "gender, aggregator 'group_by'"
                      - "age, aggregator 'group_by'"
                      - "event_id, aggregator 'count'"
                    stats:
                    - - Tuesday
                      - 0
                      - 22
                      - 45
                    - - Tuesday
                      - 0
                      - 27
                      - 23
                    - - Tuesday
                      - 1
                      - 27
                      - 45
                    - - Wednesday
                      - 0
                      - 25
                      - 34
                    - - Wednesday
                      - 1
                      - 33
                      - 345

        '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 (''userdata'' was unexpected)'''
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-12022"
        '422':
          description: Unprocessable.
          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:
                cannot_cast_jsonb:
                  value:
                    error_code: 10020
                    desc: Database error
                    detail: |
                      SQL request execution failed due to incompatible user-defined filters: cannot cast jsonb string to type integer
                    link: "https://docs.visionlabs.ai/info/luna/troubleshooting/errors-description/code-10020"
        '500':
          $ref: '#/components/responses/internal_server_error'
  /2/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'
  /2/docs/dev:
    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'
  /2/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'
      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'