{
  "openapi": "3.0.3",
  "info": {
    "title": "banner",
    "version": "1.0.1775813760260",
    "description": "Сервис banner",
    "license": {
      "name": "CC BY-NC-ND 4.0",
      "url": "https://gitlab.infra.rtkit.dev/openapi/key/raw/main/LICENCE.md"
    }
  },
  "tags": [
    {
      "name": "banner_lite(public)",
      "description": "Методы banner_lite. Не требуют авторизацию. Доступны из интернета"
    },
    {
      "name": "banner(auth)",
      "description": "Методы banner. Требуют авторизацию. Доступны из интернета"
    },
    {
      "name": "system(public)",
      "description": "Методы system. Не требуют авторизацию. Доступны из интернета"
    }
  ],
  "paths": {
    "/banner/api/v1/banner": {
      "post": {
        "summary": "Метод сохранения баннера.\nПоддерживает создание и обновление.\nМетод доступен для: admin, manager, service",
        "operationId": "BannerService_PostBanner",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerResponse"
                }
              }
            }
          },
          "401": {
            "description": "Запрос не авторизован"
          },
          "403": {
            "description": "В доступе отказано"
          },
          "409": {
            "description": "В базе данных хранится более новая версия объекта"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerResponse"
                }
              }
            }
          },
          "default": {
            "description": "Ошибки транспортного слоя",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/v1PostBannerRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "banner(auth)"
        ],
        "security": [
          {
            "oauth2": [
              "banner:edit"
            ],
            "bearerHttp": []
          }
        ],
        "parameters": [
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ]
      }
    },
    "/banner/api/v1/banner/count": {
      "get": {
        "summary": "Метод получения количества баннеров.\nМетод доступен для: admin, manager, service",
        "operationId": "BannerService_GetBannerCount",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerCountResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerCountResponse"
                }
              }
            }
          },
          "401": {
            "description": "Запрос не авторизован"
          },
          "403": {
            "description": "В доступе отказано"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerCountResponse"
                }
              }
            }
          },
          "default": {
            "description": "Ошибки транспортного слоя",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter.text",
            "description": "По тексту.\nЕсли значение не передано то поиск по нему не производится.\n# Диапазон: 3..64.\n# Поиск производится по полям:\n# - Название;\n# - Заголовок;\n# - Подзаголовок;\n# - Список тегов пользователей;\n# - Список тегов приложений",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter.types",
            "description": "По типам баннеров\n\n - TYPE_UNKNOWN: Значение не указано\n - STANDARD: Стандартный баннер",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "STANDARD"
                ]
              }
            }
          },
          {
            "name": "filter.beginPriority",
            "description": "От приоритета включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "filter.endPriority",
            "description": "До приоритета (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "filter.priorityTypes",
            "description": "По типам приоритетов.\nПереписывает значения фильтров по приоритету.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)\n\n - PRIORITY_TYPE_UNKNOWN: Значение не указано\n - NORMAL: Обычный.\nПриоритет 31.\nВычисляется в логике приложения как priority меньше 64.\nИзвлекаются из базы по фильтру end_priority = 64\n - WHITE_LABEL: Вайт-лейбл.\nПриоритет 127.\nВычисляется в логике приложения как priority больше или равно 64 и priority меньше 160.\nИзвлекаются из базы по фильтру begin_priority = 64 и end_priority = 160\n - CRITICAL: Критикл.\nПриоритет 191.\nВычисляется в логике приложения как priority больше или равно 160.\nИзвлекаются из базы по фильтру begin_priority = 160",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NORMAL",
                  "WHITE_LABEL",
                  "CRITICAL"
                ]
              }
            }
          },
          {
            "name": "filter.beginShowStartAt",
            "description": "От даты начала показа включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.endShowStartAt",
            "description": "До даты начала показа (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.beginShowEndedAt",
            "description": "От даты конца показа включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.endShowEndedAt",
            "description": "До даты конца показа (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.statusTypes",
            "description": "По статусам баннеров.\nПереписывает значения фильтров по датам.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)\n\n - STATUS_TYPE_UNKNOWN: Значение не указано\n - DEFERRED: Отложен.\nВычисляется в логике приложения как сurr_date меньше show_start_at.\nИзвлекаются из базы по фильтру end_show_start_at = сurr_date\n - ACTIVE: Активен.\nВычисляется в логике приложения как сurr_date больше или равно show_start_at и сurr_date меньше show_ended_at.\nИзвлекаются из базы по фильтру begin_show_start_at = сurr_date и end_show_ended_at = сurr_date\n - EXPIRED: Истёк.\nВычисляется в логике приложения как сurr_date больше или равно show_ended_at.\nИзвлекаются из базы по фильтру begin_show_ended_at = сurr_date",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "DEFERRED",
                  "ACTIVE",
                  "EXPIRED"
                ]
              }
            }
          },
          {
            "name": "filter.userTags",
            "description": "По пользовательским тегам.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "filter.appTags",
            "description": "По тегам приложений.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "tags": [
          "banner(auth)"
        ],
        "security": [
          {
            "oauth2": [
              "banner:read",
              "banner:edit"
            ],
            "bearerHttp": []
          }
        ]
      }
    },
    "/banner/api/v1/banner/list": {
      "get": {
        "summary": "Метод получения списка баннеров.\nМетод доступен для: admin, manager, service",
        "operationId": "BannerService_GetBannerList",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "$ref": "#/components/schemas/v1GetBannerListResponse"
                    },
                    "error": {
                      "$ref": "#/components/schemas/rpcStatus"
                    }
                  },
                  "title": "Поток объектов v1GetBannerListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка"
          },
          "401": {
            "description": "Запрос не авторизован"
          },
          "403": {
            "description": "В доступе отказано"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter.text",
            "description": "По тексту.\nЕсли значение не передано то поиск по нему не производится.\n# Диапазон: 3..64.\n# Поиск производится по полям:\n# - Название;\n# - Заголовок;\n# - Подзаголовок;\n# - Список тегов пользователей;\n# - Список тегов приложений",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter.types",
            "description": "По типам баннеров\n\n - TYPE_UNKNOWN: Значение не указано\n - STANDARD: Стандартный баннер",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "STANDARD"
                ]
              }
            }
          },
          {
            "name": "filter.beginPriority",
            "description": "От приоритета включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "filter.endPriority",
            "description": "До приоритета (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "filter.priorityTypes",
            "description": "По типам приоритетов.\nПереписывает значения фильтров по приоритету.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)\n\n - PRIORITY_TYPE_UNKNOWN: Значение не указано\n - NORMAL: Обычный.\nПриоритет 31.\nВычисляется в логике приложения как priority меньше 64.\nИзвлекаются из базы по фильтру end_priority = 64\n - WHITE_LABEL: Вайт-лейбл.\nПриоритет 127.\nВычисляется в логике приложения как priority больше или равно 64 и priority меньше 160.\nИзвлекаются из базы по фильтру begin_priority = 64 и end_priority = 160\n - CRITICAL: Критикл.\nПриоритет 191.\nВычисляется в логике приложения как priority больше или равно 160.\nИзвлекаются из базы по фильтру begin_priority = 160",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NORMAL",
                  "WHITE_LABEL",
                  "CRITICAL"
                ]
              }
            }
          },
          {
            "name": "filter.beginShowStartAt",
            "description": "От даты начала показа включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.endShowStartAt",
            "description": "До даты начала показа (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.beginShowEndedAt",
            "description": "От даты конца показа включительно (больше или равно)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.endShowEndedAt",
            "description": "До даты конца показа (меньше)",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "filter.statusTypes",
            "description": "По статусам баннеров.\nПереписывает значения фильтров по датам.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)\n\n - STATUS_TYPE_UNKNOWN: Значение не указано\n - DEFERRED: Отложен.\nВычисляется в логике приложения как сurr_date меньше show_start_at.\nИзвлекаются из базы по фильтру end_show_start_at = сurr_date\n - ACTIVE: Активен.\nВычисляется в логике приложения как сurr_date больше или равно show_start_at и сurr_date меньше show_ended_at.\nИзвлекаются из базы по фильтру begin_show_start_at = сurr_date и end_show_ended_at = сurr_date\n - EXPIRED: Истёк.\nВычисляется в логике приложения как сurr_date больше или равно show_ended_at.\nИзвлекаются из базы по фильтру begin_show_ended_at = сurr_date",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "DEFERRED",
                  "ACTIVE",
                  "EXPIRED"
                ]
              }
            }
          },
          {
            "name": "filter.userTags",
            "description": "По пользовательским тегам.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "filter.appTags",
            "description": "По тегам приложений.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "paging.orderByType",
            "description": "Тип значения сортировки.\nЕсли значение не передано, то будет взято значение по умолчанию.\n# По умолчанию: CHANGED_AT\n\n - ORDER_BY_TYPE_UNKNOWN: Значение не указано\n - CHANGED_AT: Дата последнего изменения\n - PRIORITY_THEN_SHOW_START_AT: По приоритету, затем по дате начала показа\n - CREATED_AT: Дата создания\n - SHOW_START_AT: Дата начала показа\n - SHOW_ENDED_AT: Дата конца показа\n - RANK: По рангу для поиска по тексту.\nПрименяется когда передано поле для поиска по тексту.\nВ случае если текстовое поле не передано, применяется значение по умолчанию",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "CHANGED_AT",
                "PRIORITY_THEN_SHOW_START_AT",
                "CREATED_AT",
                "SHOW_START_AT",
                "SHOW_ENDED_AT",
                "RANK"
              ]
            }
          },
          {
            "name": "paging.directionType",
            "description": "Тип направления сортировки.\n# По умолчанию: DESC\n\n - DIRECTION_TYPE_UNKNOWN: Значение не указано\n - DESC: От большего к меньшему\n - ASC: От меньшего к большему",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "DESC",
                "ASC"
              ]
            }
          },
          {
            "name": "paging.limit",
            "description": "Количество записей на страницу.\nЕсли значение 0 (не передано), то будет взято значение по умолчанию.\n# Диапазон: 0..100.\n# По умолчанию: 20",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "paging.offset",
            "description": "Сдвиг.\n# Диапазон: 0..2147483647",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "tags": [
          "banner(auth)"
        ],
        "security": [
          {
            "oauth2": [
              "banner:read",
              "banner:edit"
            ],
            "bearerHttp": []
          }
        ]
      }
    },
    "/banner/api/v1/banner/{bannerId}/upload_image": {
      "post": {
        "summary": "Метод загрузки картинки баннера.\nМетод доступен для: admin, manager, service",
        "operationId": "BannerService_PostBannerUploadImage",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerUploadImageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerUploadImageResponse"
                }
              }
            }
          },
          "401": {
            "description": "Запрос не авторизован"
          },
          "403": {
            "description": "В доступе отказано"
          },
          "409": {
            "description": "В базе данных хранится более новая версия объекта"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1PostBannerUploadImageResponse"
                }
              }
            }
          },
          "default": {
            "description": "Ошибки транспортного слоя",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "bannerId",
            "description": "Идентификатор баннера.\nИспользуется для складывания картинок баннера в папку баннера в бакете.\nНазвание картинки в папке создаётся из случайного Guid.\n# Тип: Guid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/v1UploadImage"
              }
            }
          },
          "description": "Загружаемая картинка",
          "required": true
        },
        "tags": [
          "banner(auth)"
        ],
        "security": [
          {
            "oauth2": [
              "banner:edit"
            ],
            "bearerHttp": []
          }
        ]
      }
    },
    "/banner/api/v1/banner/{id}": {
      "get": {
        "summary": "Метод получения баннера.\nМетод доступен для: admin, manager, service",
        "operationId": "BannerService_GetBanner",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerResponse"
                }
              }
            }
          },
          "401": {
            "description": "Запрос не авторизован"
          },
          "403": {
            "description": "В доступе отказано"
          },
          "404": {
            "description": "Объект не найден"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerResponse"
                }
              }
            }
          },
          "default": {
            "description": "Ошибки транспортного слоя",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "description": "Идентификатор баннера.\n# Тип: Guid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "tags": [
          "banner(auth)"
        ],
        "security": [
          {
            "oauth2": [
              "banner:read",
              "banner:edit"
            ],
            "bearerHttp": []
          }
        ]
      }
    },
    "/banner/api/v1/banner_lite/list": {
      "get": {
        "summary": "Метод получения списка упрощённых баннеров.\nВозвращает всегда активные баннеры.\nПо умолчанию возвращает первые 20 баннеров осортированных по приоритету, затем по дате начала акции(от самых важных к не важным, затем от самых новых акций к самым старым).\nЕсли запрос выполнен хотя бы без одного изпризнака приложения возвращает пустой список.\nЕсли запрос выполнен без признаков пользователя метод возвращает пустой список.\nНе требует авторизации",
        "operationId": "BannerService_GetBannerLiteList",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "$ref": "#/components/schemas/v1GetBannerLiteListResponse"
                    },
                    "error": {
                      "$ref": "#/components/schemas/rpcStatus"
                    }
                  },
                  "title": "Поток объектов v1GetBannerLiteListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter.types",
            "description": "По типам баннеров\n\n - TYPE_UNKNOWN: Значение не указано\n - STANDARD: Стандартный баннер",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "STANDARD"
                ]
              }
            }
          },
          {
            "name": "filter.appName",
            "description": "Название приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter.platformType",
            "description": "Тип платформы\n\n - PLATFORM_TYPE_UNKNOWN: Значение не указано\n - IOS: Платформа iOS.\nПриложение размещается в App Store\n - ANDROID: Платформа Android.\nПриложение размещается в Google Play, App Gallery или прочих сторах\n - WEB: Платформа Web.\nПриложение размещается по интернет адресу",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "IOS",
                "ANDROID",
                "WEB"
              ]
            }
          },
          {
            "name": "filter.version",
            "description": "Версия приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter.userTags",
            "description": "По тегам пользователя.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 1..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/",
            "in": "query",
            "required": false,
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "isLinkFilterDisabled",
            "description": "Признак отключения фильтрации по типу платформы",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "tags": [
          "banner_lite(public)"
        ]
      }
    },
    "/banner/api/v1/banner_lite/{id}": {
      "get": {
        "summary": "Метод получения упрощённого баннера.\nНе требует авторизации",
        "operationId": "BannerService_GetBannerLite",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerLiteResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerLiteResponse"
                }
              }
            }
          },
          "404": {
            "description": "Объект не найден"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetBannerLiteResponse"
                }
              }
            }
          },
          "default": {
            "description": "Ошибки транспортного слоя",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "description": "Идентификатор баннера.\n# Тип: Guid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ],
        "tags": [
          "banner_lite(public)"
        ]
      }
    },
    "/banner/api/v1/system/status": {
      "get": {
        "summary": "Метод получения статуса сервиса.\nНе требует авторизации",
        "operationId": "SystemService_GetSystemStatus",
        "responses": {
          "200": {
            "description": "Успешный ответ",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1GetSystemStatusResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ошибка"
          },
          "500": {
            "description": "Внутренняя ошибка сервиса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rpcStatus"
                }
              }
            }
          }
        },
        "tags": [
          "system(public)"
        ],
        "parameters": [
          {
            "in": "header",
            "name": "X-Request-Id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос"
          },
          {
            "in": "header",
            "name": "X-Device-Id",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный идентификатор устройства. Создаётся клиентом при первом запуске приложения. Если есть способ однозначно узнать идентификатор устройства, то создаётся на основе него и остаётся неизменным после переустановки приложения"
          },
          {
            "in": "header",
            "name": "X-Api-Key",
            "schema": {
              "type": "string"
            },
            "description": "Уникальный ключ для партнера. Создается администратором и передается партнерам."
          },
          {
            "in": "header",
            "name": "Canary",
            "schema": {
              "type": "string"
            },
            "description": "Параметр балансировки запроса. Если для заголовка запроса установлено значение always, он будет перенаправлен на канареечный деплой. Если для заголовка установлено значение never, он никогда не будет перенаправлен на канареечный деплой"
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "BannerGradient": {
        "type": "object",
        "properties": {
          "linear": {
            "title": "Линейный градиент",
            "allOf": [
              {
                "$ref": "#/components/schemas/GradientLinear"
              }
            ]
          }
        },
        "title": "Градиент"
      },
      "BannerImage": {
        "type": "object",
        "properties": {
          "type": {
            "title": "Тип картинки.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerImageType"
              }
            ]
          },
          "url": {
            "type": "string",
            "title": "Значение ссылки на картинку.\nОбязательное.\n# Диапазон: 12..512"
          }
        },
        "title": "Объект картинки",
        "required": [
          "type",
          "url"
        ]
      },
      "BannerImageType": {
        "type": "string",
        "enum": [
          "PORTRAIT",
          "LANDSCAPE",
          "ICON"
        ],
        "description": "- TYPE_UNKNOWN: Значение не указано\n - PORTRAIT: Пререндеренный баннер в портретном режиме.\nВ портретном режиме ширина меньше или равна высоте.\nПредставление характерно для телефонов.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента.\nЕсли ссылки нет то нужно использовать ссылку из ландшафтного режима\n - LANDSCAPE: Пререндеренный баннер в ландшафтном режиме.\nВ ландшафтном режиме ширина больше высоты.\nПредставление характерно для планшетов и декстопа.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента.\nЕсли ссылки нет то нужно использовать ссылку из портретного режима\n - ICON: Иконка.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента",
        "title": "Справочник типов картинок.\n# Тип: byte"
      },
      "BannerLink": {
        "type": "object",
        "properties": {
          "platformType": {
            "title": "Тип платформы.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPlatformType"
              }
            ]
          },
          "type": {
            "title": "Тип ссылки.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerLinkType"
              }
            ]
          },
          "url": {
            "type": "string",
            "title": "Значение ссылки для перехода.\nОбязательное.\n# Диапазон: 12..512"
          },
          "packages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Список пакетов.\nЕсли пусто попытка перехода осуществляется безусловно.\nЕсли заполнено, то переход осуществляется только в случае если хоть один пакет есть на устройстве, иначе обработка переходит к следующей ссылке.\n# Диапазон: 0..20"
          }
        },
        "title": "Ссылка",
        "required": [
          "platformType",
          "type",
          "url"
        ]
      },
      "BannerLinkType": {
        "type": "string",
        "enum": [
          "INTERNAL_APP",
          "EXTERNAL_APP",
          "WEB_VIEW",
          "WEB_BROWSER",
          "EXTERNAL_WEB_VIEW"
        ],
        "description": "- TYPE_UNKNOWN: Значение не указано\n - INTERNAL_APP: Ссылка для перехода на раздел текущего приложения\n - EXTERNAL_APP: Ссылка для перехода на стороннее приложение\n - WEB_VIEW: Ссылка для перехода на веб-вью внутренних (своих) приложений.\nВ окне отсутствует адресаная строка.\nДля iOS используется WKWebView, для Android используется WebView\n - WEB_BROWSER: Ссылка для перехода на веб-браузер\n - EXTERNAL_WEB_VIEW: Ссылка для перехода на веб-вью внешних (партнёрских) приложений.\nВ окне присутствует адресаная строка.\nДля iOS используется SFSafariViewController, для Android используется ChromeCustomTabs",
        "title": "Справочник типов ссылок.\n# Тип: byte"
      },
      "BannerLiteImageLite": {
        "type": "object",
        "properties": {
          "type": {
            "title": "Тип картинки.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerImageType"
              }
            ]
          },
          "url": {
            "type": "string",
            "title": "Значение ссылки на картинку.\nОбязательное"
          }
        },
        "title": "Упрощённый объект картинки",
        "required": [
          "type",
          "url"
        ]
      },
      "BannerLiteLinkLite": {
        "type": "object",
        "properties": {
          "type": {
            "title": "Тип ссылки.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerLinkType"
              }
            ]
          },
          "url": {
            "type": "string",
            "title": "Значение ссылки.\nОбязательное"
          },
          "packages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Список пакетов.\nЕсли пусто попытка перехода осуществляется безусловно.\nЕсли заполнено, то переход осуществляется только в случае если хоть один пакет есть на устройстве иначе обработка переходит к следующей ссылке"
          },
          "platformType": {
            "title": "Тип платформы.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPlatformType"
              }
            ]
          }
        },
        "title": "Упрощённая ссылка",
        "required": [
          "type",
          "url",
          "platformType"
        ]
      },
      "BannerPagingDirectionType": {
        "type": "string",
        "enum": [
          "DESC",
          "ASC"
        ],
        "description": "- DIRECTION_TYPE_UNKNOWN: Значение не указано\n - DESC: От большего к меньшему\n - ASC: От меньшего к большему",
        "title": "Справочник типов направлений сортировки.\n# Тип: byte"
      },
      "BannerPagingOrderByType": {
        "type": "string",
        "enum": [
          "CHANGED_AT",
          "PRIORITY_THEN_SHOW_START_AT",
          "CREATED_AT",
          "SHOW_START_AT",
          "SHOW_ENDED_AT",
          "RANK"
        ],
        "description": "- ORDER_BY_TYPE_UNKNOWN: Значение не указано\n - CHANGED_AT: Дата последнего изменения\n - PRIORITY_THEN_SHOW_START_AT: По приоритету, затем по дате начала показа\n - CREATED_AT: Дата создания\n - SHOW_START_AT: Дата начала показа\n - SHOW_ENDED_AT: Дата конца показа\n - RANK: По рангу для поиска по тексту.\nПрименяется когда передано поле для поиска по тексту.\nВ случае если текстовое поле не передано, применяется значение по умолчанию",
        "title": "Справочник типов значений сортировки.\n# Тип: byte"
      },
      "BannerPlatformType": {
        "type": "string",
        "enum": [
          "IOS",
          "ANDROID",
          "WEB"
        ],
        "description": "- PLATFORM_TYPE_UNKNOWN: Значение не указано\n - IOS: Платформа iOS.\nПриложение размещается в App Store\n - ANDROID: Платформа Android.\nПриложение размещается в Google Play, App Gallery или прочих сторах\n - WEB: Платформа Web.\nПриложение размещается по интернет адресу",
        "title": "Справочник платформ.\n# Тип: byte"
      },
      "BannerPriorityType": {
        "type": "string",
        "enum": [
          "NORMAL",
          "WHITE_LABEL",
          "CRITICAL"
        ],
        "description": "- PRIORITY_TYPE_UNKNOWN: Значение не указано\n - NORMAL: Обычный.\nПриоритет 31.\nВычисляется в логике приложения как priority меньше 64.\nИзвлекаются из базы по фильтру end_priority = 64\n - WHITE_LABEL: Вайт-лейбл.\nПриоритет 127.\nВычисляется в логике приложения как priority больше или равно 64 и priority меньше 160.\nИзвлекаются из базы по фильтру begin_priority = 64 и end_priority = 160\n - CRITICAL: Критикл.\nПриоритет 191.\nВычисляется в логике приложения как priority больше или равно 160.\nИзвлекаются из базы по фильтру begin_priority = 160",
        "title": "Справочник типов приоритетов.\n# Тип: byte"
      },
      "BannerSavingError": {
        "type": "object",
        "properties": {
          "conflict": {
            "title": "Конфликт версий",
            "allOf": [
              {
                "$ref": "#/components/schemas/SavingErrorConflict"
              }
            ]
          }
        },
        "title": "Ошибка сохранения.\nЭти проверки выполняются при работе с базой данных и сторонними сервисами"
      },
      "BannerStatusType": {
        "type": "string",
        "enum": [
          "DEFERRED",
          "ACTIVE",
          "EXPIRED"
        ],
        "description": "- STATUS_TYPE_UNKNOWN: Значение не указано\n - DEFERRED: Отложен.\nВычисляется в логике приложения как сurr_date меньше show_start_at.\nИзвлекаются из базы по фильтру end_show_start_at = сurr_date\n - ACTIVE: Активен.\nВычисляется в логике приложения как сurr_date больше или равно show_start_at и сurr_date меньше show_ended_at.\nИзвлекаются из базы по фильтру begin_show_start_at = сurr_date и end_show_ended_at = сurr_date\n - EXPIRED: Истёк.\nВычисляется в логике приложения как сurr_date больше или равно show_ended_at.\nИзвлекаются из базы по фильтру begin_show_ended_at = сurr_date",
        "title": "Справочник статусов баннеров.\n# Тип: byte"
      },
      "GradientLinear": {
        "type": "object",
        "properties": {
          "angle": {
            "type": "number",
            "format": "float",
            "title": "Угол направления линейного градиента в градусах.\n# Диапазон: 0..360"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinearPoint"
            },
            "title": "Точки градиента.\nОбязательное.\n# Диапазон: 2..20"
          }
        },
        "title": "Линейный градиент",
        "required": [
          "points"
        ]
      },
      "LinearPoint": {
        "type": "object",
        "properties": {
          "color": {
            "type": "string",
            "title": "Цвет линейного градиента.\nОбязательное.\nОтрисовывается до загрузки картинки и градиента.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/"
          },
          "stop": {
            "type": "number",
            "format": "float",
            "title": "Стоп линейного градиента.\nЗаписывается в процентах.\n# Диапазон: 0..100"
          }
        },
        "title": "Точка",
        "required": [
          "color"
        ]
      },
      "SavingErrorConflict": {
        "type": "object",
        "title": "Конфликт версий.\nПричины:\n- В базе хранится другая версия строки, значения changed_at отличаются"
      },
      "protobufAny": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string"
          }
        },
        "additionalProperties": {},
        "title": "Произвольный JSON"
      },
      "rpcStatus": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "format": "int32"
          },
          "message": {
            "type": "string"
          },
          "details": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/protobufAny"
            }
          }
        },
        "title": "Ошибка транспортного слоя"
      },
      "v1Banner": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "Идентификатор.\nЕсли не передан создаётся сервером.\n# Тип: Guid"
          },
          "type": {
            "title": "Тип баннера.\nОбязательное",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1BannerType"
              }
            ]
          },
          "priority": {
            "type": "integer",
            "format": "int32",
            "title": "Приоритет.\nОбязательное.\n# Диапазон: 1..255"
          },
          "priorityType": {
            "title": "Тип приоритета.\n# Поле вычисляется в коде приложения",
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPriorityType"
              }
            ]
          },
          "title": {
            "type": "string",
            "title": "Название.\nОбязательное.\nОбычно это название рекламной компании.\nНе отображается пользователям.\n# Диапазон: 3..256"
          },
          "header": {
            "type": "string",
            "title": "Заголовок.\n# Диапазон: 3..64"
          },
          "headerColor": {
            "type": "string",
            "title": "Цвет текста заголовка.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/"
          },
          "subtitle": {
            "type": "string",
            "title": "Подзаголовок.\n# Диапазон: 3..256"
          },
          "subtitleColor": {
            "type": "string",
            "title": "Цвет текста подзаголовка.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/"
          },
          "backgroundColor": {
            "type": "string",
            "title": "Цвет заднего плана(подложки).\nОтрисовывается до загрузки картинки и градиента.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/"
          },
          "backgroundGradient": {
            "title": "Градиент",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerGradient"
              }
            ]
          },
          "repeatAfterDays": {
            "type": "integer",
            "format": "int32",
            "title": "Количество дней через которое можно повторно показать баннер.\nЕсли null, то закрыть нельзя, баннер повторно выводится каждый раз.\n# Диапазон: 0..366"
          },
          "showStartAt": {
            "type": "string",
            "format": "date-time",
            "title": "Дата начала показа.\nОбязательное.\nБессрочно если значение 2000-01-01.\n# Тип: DateOnly.\n# Диапазон: 730119..1095362"
          },
          "showEndedAt": {
            "type": "string",
            "format": "date-time",
            "title": "Дата конца показа.\nОбязательное.\nБессрочно если значение 3000-01-01.\n# Тип: DateOnly.\n# Диапазон: 730119..1095362"
          },
          "statusType": {
            "title": "Статус баннера.\n# Поле вычисляется в коде приложения",
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerStatusType"
              }
            ]
          },
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerImage"
            },
            "title": "Картинки.\n# Диапазон: 0..20"
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerLink"
            },
            "title": "Ссылки для переходов.\n# Диапазон: 0..100"
          },
          "userTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Список тегов пользователей.\nОбязательное.\nОписывает кто может видеть баннер.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 1..100.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/"
          },
          "appTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Список тегов приложений.\nОбязательное.\nОписывает какие клиенты могут видеть баннер.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 1..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "title": "Дата создания.\n# Тип: DateTime",
            "readOnly": true
          },
          "changedAt": {
            "type": "string",
            "format": "date-time",
            "title": "Дата последнего изменения.\nЗаполняется и обновляется сервером.\nЗаполняется при создании и изменении.\nЯвляется версией объекта.\n# Тип: DateTime",
            "readOnly": true
          }
        },
        "title": "Баннер.\n# Описание модели",
        "required": [
          "type",
          "priority",
          "title",
          "showStartAt",
          "showEndedAt",
          "userTags",
          "appTags"
        ]
      },
      "v1BannerFilter": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "title": "По тексту.\nЕсли значение не передано то поиск по нему не производится.\n# Диапазон: 3..64.\n# Поиск производится по полям:\n# - Название;\n# - Заголовок;\n# - Подзаголовок;\n# - Список тегов пользователей;\n# - Список тегов приложений"
          },
          "types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1BannerType"
            },
            "title": "По типам баннеров"
          },
          "beginPriority": {
            "type": "integer",
            "format": "int32",
            "title": "От приоритета включительно (больше или равно)"
          },
          "endPriority": {
            "type": "integer",
            "format": "int32",
            "title": "До приоритета (меньше)"
          },
          "priorityTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerPriorityType"
            },
            "title": "По типам приоритетов.\nПереписывает значения фильтров по приоритету.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)"
          },
          "beginShowStartAt": {
            "type": "string",
            "format": "date-time",
            "title": "От даты начала показа включительно (больше или равно)"
          },
          "endShowStartAt": {
            "type": "string",
            "format": "date-time",
            "title": "До даты начала показа (меньше)"
          },
          "beginShowEndedAt": {
            "type": "string",
            "format": "date-time",
            "title": "От даты конца показа включительно (больше или равно)"
          },
          "endShowEndedAt": {
            "type": "string",
            "format": "date-time",
            "title": "До даты конца показа (меньше)"
          },
          "statusTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerStatusType"
            },
            "title": "По статусам баннеров.\nПереписывает значения фильтров по датам.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)"
          },
          "userTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "По пользовательским тегам.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/"
          },
          "appTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "По тегам приложений.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 0..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/"
          }
        },
        "title": "Фильтр баннеров"
      },
      "v1BannerLite": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "title": "Идентификатор.\n# Тип: Guid"
          },
          "repeatAfterDays": {
            "type": "integer",
            "format": "int32",
            "title": "Количество дней через которое можно повторно показать баннер.\nЕсли Значение не указано то повторного показа баннера не будет"
          },
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerLiteImageLite"
            },
            "title": "Картинки"
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BannerLiteLinkLite"
            },
            "title": "Ссылки для переходов.\nВозвращаются отфильтрованные по платформе"
          }
        },
        "title": "Облегчённый баннер"
      },
      "v1BannerLiteFilter": {
        "type": "object",
        "properties": {
          "types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1BannerType"
            },
            "title": "По типам баннеров"
          },
          "appName": {
            "type": "string",
            "title": "Название приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/"
          },
          "platformType": {
            "title": "Тип платформы",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPlatformType"
              }
            ]
          },
          "version": {
            "type": "string",
            "title": "Версия приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/"
          },
          "userTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "По тегам пользователя.\nТэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10.\n# Диапазон: 1..20.\n# Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/"
          }
        },
        "title": "Упрощённый фильтр по баннерам"
      },
      "v1BannerPaging": {
        "type": "object",
        "properties": {
          "orderByType": {
            "title": "Тип значения сортировки.\nЕсли значение не передано, то будет взято значение по умолчанию.\n# По умолчанию: CHANGED_AT",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPagingOrderByType"
              }
            ]
          },
          "directionType": {
            "title": "Тип направления сортировки.\n# По умолчанию: DESC",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerPagingDirectionType"
              }
            ]
          },
          "limit": {
            "type": "integer",
            "format": "int32",
            "title": "Количество записей на страницу.\nЕсли значение 0 (не передано), то будет взято значение по умолчанию.\n# Диапазон: 0..100.\n# По умолчанию: 20"
          },
          "offset": {
            "type": "integer",
            "format": "int32",
            "title": "Сдвиг.\n# Диапазон: 0..2147483647"
          }
        },
        "title": "Пагинация баннеров"
      },
      "v1BannerType": {
        "type": "string",
        "enum": [
          "STANDARD"
        ],
        "description": "- TYPE_UNKNOWN: Значение не указано\n - STANDARD: Стандартный баннер",
        "title": "Справочник типов баннеров.\n# Тип: byte"
      },
      "v1GetBannerCountResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "integer",
            "format": "int32",
            "title": "Всего баннеров"
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1GetBannerCountResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос получения количества баннеров"
      },
      "v1GetBannerCountResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса получения количества баннеров"
      },
      "v1GetBannerListResponse": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1Banner"
              }
            ]
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1GetBannerListResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос получения списка баннеров"
      },
      "v1GetBannerListResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса получения списка баннеров"
      },
      "v1GetBannerLiteListResponse": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Упрощённый баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1BannerLite"
              }
            ]
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1GetBannerLiteListResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос получения списка упрощённых баннеров"
      },
      "v1GetBannerLiteListResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса получения списка баннеров"
      },
      "v1GetBannerLiteResponse": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Упрощённый баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1BannerLite"
              }
            ]
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1GetBannerLiteResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос получения упрощённого баннера"
      },
      "v1GetBannerLiteResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса получения упрощённого баннера"
      },
      "v1GetBannerResponse": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1Banner"
              }
            ]
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1GetBannerResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос получения баннера"
      },
      "v1GetBannerResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса получения баннера"
      },
      "v1GetSystemStatusResponse": {
        "type": "object",
        "title": "Ответ на запрос проверки доступности сервиса"
      },
      "v1PostBannerRequest": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1Banner"
              }
            ]
          }
        },
        "title": "Запрос сохранения баннера",
        "required": [
          "data"
        ]
      },
      "v1PostBannerResponse": {
        "type": "object",
        "properties": {
          "data": {
            "title": "Баннер",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1Banner"
              }
            ]
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1PostBannerResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос сохранения баннера"
      },
      "v1PostBannerResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          },
          "saving": {
            "title": "Ошибка сохранения",
            "allOf": [
              {
                "$ref": "#/components/schemas/BannerSavingError"
              }
            ]
          }
        },
        "title": "Ошибка запроса сохранения баннера"
      },
      "v1PostBannerUploadImageResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "title": "Ссылка на баннер на imageproxy cdn сервер.\nОбщедоступна в интернете"
          },
          "error": {
            "title": "Ошибка",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1PostBannerUploadImageResponseError"
              }
            ]
          }
        },
        "title": "Ответ на запрос загрузки картинки баннера"
      },
      "v1PostBannerUploadImageResponseError": {
        "type": "object",
        "properties": {
          "validation": {
            "title": "Ошибка валидации",
            "allOf": [
              {
                "$ref": "#/components/schemas/v1ValidationError"
              }
            ]
          }
        },
        "title": "Ошибка запроса загрузки картинки баннера"
      },
      "v1UploadImage": {
        "type": "object",
        "properties": {
          "base64": {
            "type": "string",
            "title": "Картинка в формате инлайн base64.\nОбязательное.\nПример: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...\".\n# Паттерн: /^data:\\s*image\\/(png|jpeg|jpg);\\s*base64/"
          }
        },
        "title": "Объект загружаемой картинки",
        "required": [
          "base64"
        ]
      },
      "v1ValidationError": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "title": "Путь к полю в формате наименования прото"
          },
          "message": {
            "type": "string",
            "title": "Валидационное сообщение"
          }
        },
        "title": "Ошибки валидации.\nЭти проверки выполняются до обращения в базу данных",
        "required": [
          "path",
          "message"
        ]
      }
    },
    "securitySchemes": {
      "bearerHttp": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      },
      "oauth2": {
        "type": "oauth2",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://oauth2-staging.k8s.key.rt.ru/oauth2/token",
            "scopes": {
              "banner:edit": "Предоставляет полный доступ в сервис banner",
              "banner:read": "Предоставляет доступ на чтение данных из сервиса banner"
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://keyapis-staging.k8s.key.rt.ru",
      "description": "staging"
    },
    {
      "url": "https://{feature}.k8s.key.rt.ru/",
      "description": "https feature",
      "variables": {
        "feature": {
          "default": "",
          "description": "Feature name"
        }
      }
    },
    {
      "url": "http://{feature}.k8s.key.rt.ru/",
      "description": "http feature",
      "variables": {
        "feature": {
          "default": "",
          "description": "Feature name"
        }
      }
    },
    {
      "url": "https://localhost:3001",
      "description": "localhost"
    },
    {
      "url": "https://keyapis.key.rt.ru",
      "description": "production"
    }
  ]
}