{
  "files": [
    {
      "name": "keyapis/banner/v1/keyapis_banner_banner_v1.proto",
      "description": "Сервис реализует функционал управления баннерами.\nИспользуются как источник Критичнх уведомления, White label компаний и объявления рекламных акций",
      "package": "keyapis.banner.v1",
      "hasEnums": false,
      "hasExtensions": false,
      "hasMessages": true,
      "hasServices": true,
      "enums": [
        {
          "name": "Type",
          "longName": "Banner.Image.Type",
          "fullName": "keyapis.banner.v1.Banner.Image.Type",
          "description": "Справочник типов картинок.\n# Тип: byte",
          "values": [
            {
              "name": "TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "PORTRAIT",
              "number": "1",
              "description": "Пререндеренный баннер в портретном режиме.\nВ портретном режиме ширина меньше или равна высоте.\nПредставление характерно для телефонов.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента.\nЕсли ссылки нет то нужно использовать ссылку из ландшафтного режима"
            },
            {
              "name": "LANDSCAPE",
              "number": "2",
              "description": "Пререндеренный баннер в ландшафтном режиме.\nВ ландшафтном режиме ширина больше высоты.\nПредставление характерно для планшетов и декстопа.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента.\nЕсли ссылки нет то нужно использовать ссылку из портретного режима"
            },
            {
              "name": "ICON",
              "number": "3",
              "description": "Иконка.\nМожет содержать дополнительные параметры запроса в ссылке(https://docs.imgproxy.net/generating_the_url?id=processing-options).\nПосле загрузки изображения отрисовывается поверх цвета и градиента"
            }
          ]
        },
        {
          "name": "Type",
          "longName": "Banner.Link.Type",
          "fullName": "keyapis.banner.v1.Banner.Link.Type",
          "description": "Справочник типов ссылок.\n# Тип: byte",
          "values": [
            {
              "name": "TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "INTERNAL_APP",
              "number": "1",
              "description": "Ссылка для перехода на раздел текущего приложения"
            },
            {
              "name": "EXTERNAL_APP",
              "number": "2",
              "description": "Ссылка для перехода на стороннее приложение"
            },
            {
              "name": "WEB_VIEW",
              "number": "3",
              "description": "Ссылка для перехода на веб-вью внутренних (своих) приложений.\nВ окне отсутствует адресаная строка.\nДля iOS используется WKWebView, для Android используется WebView"
            },
            {
              "name": "WEB_BROWSER",
              "number": "4",
              "description": "Ссылка для перехода на веб-браузер"
            },
            {
              "name": "EXTERNAL_WEB_VIEW",
              "number": "5",
              "description": "Ссылка для перехода на веб-вью внешних (партнёрских) приложений.\nВ окне присутствует адресаная строка.\nДля iOS используется SFSafariViewController, для Android используется ChromeCustomTabs"
            }
          ]
        },
        {
          "name": "PlatformType",
          "longName": "Banner.PlatformType",
          "fullName": "keyapis.banner.v1.Banner.PlatformType",
          "description": "Справочник платформ.\n# Тип: byte",
          "values": [
            {
              "name": "PLATFORM_TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "IOS",
              "number": "1",
              "description": "Платформа iOS.\nПриложение размещается в App Store"
            },
            {
              "name": "ANDROID",
              "number": "2",
              "description": "Платформа Android.\nПриложение размещается в Google Play, App Gallery или прочих сторах"
            },
            {
              "name": "WEB",
              "number": "3",
              "description": "Платформа Web.\nПриложение размещается по интернет адресу"
            }
          ]
        },
        {
          "name": "PriorityType",
          "longName": "Banner.PriorityType",
          "fullName": "keyapis.banner.v1.Banner.PriorityType",
          "description": "Справочник типов приоритетов.\n# Тип: byte",
          "values": [
            {
              "name": "PRIORITY_TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "NORMAL",
              "number": "1",
              "description": "Обычный.\nПриоритет 31.\nВычисляется в логике приложения как priority меньше 64.\nИзвлекаются из базы по фильтру end_priority = 64"
            },
            {
              "name": "WHITE_LABEL",
              "number": "2",
              "description": "Вайт-лейбл.\nПриоритет 127.\nВычисляется в логике приложения как priority больше или равно 64 и priority меньше 160.\nИзвлекаются из базы по фильтру begin_priority = 64 и end_priority = 160"
            },
            {
              "name": "CRITICAL",
              "number": "3",
              "description": "Критикл.\nПриоритет 191.\nВычисляется в логике приложения как priority больше или равно 160.\nИзвлекаются из базы по фильтру begin_priority = 160"
            }
          ]
        },
        {
          "name": "StatusType",
          "longName": "Banner.StatusType",
          "fullName": "keyapis.banner.v1.Banner.StatusType",
          "description": "Справочник статусов баннеров.\n# Тип: byte",
          "values": [
            {
              "name": "STATUS_TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "DEFERRED",
              "number": "1",
              "description": "Отложен.\nВычисляется в логике приложения как сurr_date меньше show_start_at.\nИзвлекаются из базы по фильтру end_show_start_at = сurr_date"
            },
            {
              "name": "ACTIVE",
              "number": "2",
              "description": "Активен.\nВычисляется в логике приложения как сurr_date больше или равно show_start_at и сurr_date меньше show_ended_at.\nИзвлекаются из базы по фильтру begin_show_start_at = сurr_date и end_show_ended_at = сurr_date"
            },
            {
              "name": "EXPIRED",
              "number": "3",
              "description": "Истёк.\nВычисляется в логике приложения как сurr_date больше или равно show_ended_at.\nИзвлекаются из базы по фильтру begin_show_ended_at = сurr_date"
            }
          ]
        },
        {
          "name": "Type",
          "longName": "Banner.Type",
          "fullName": "keyapis.banner.v1.Banner.Type",
          "description": "Справочник типов баннеров.\n# Тип: byte",
          "values": [
            {
              "name": "TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "STANDARD",
              "number": "1",
              "description": "Стандартный баннер"
            }
          ]
        },
        {
          "name": "DirectionType",
          "longName": "BannerPaging.DirectionType",
          "fullName": "keyapis.banner.v1.BannerPaging.DirectionType",
          "description": "Справочник типов направлений сортировки.\n# Тип: byte",
          "values": [
            {
              "name": "DIRECTION_TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "DESC",
              "number": "1",
              "description": "От большего к меньшему"
            },
            {
              "name": "ASC",
              "number": "2",
              "description": "От меньшего к большему"
            }
          ]
        },
        {
          "name": "OrderByType",
          "longName": "BannerPaging.OrderByType",
          "fullName": "keyapis.banner.v1.BannerPaging.OrderByType",
          "description": "Справочник типов значений сортировки.\n# Тип: byte",
          "values": [
            {
              "name": "ORDER_BY_TYPE_UNKNOWN",
              "number": "0",
              "description": "Значение не указано"
            },
            {
              "name": "CHANGED_AT",
              "number": "1",
              "description": "Дата последнего изменения"
            },
            {
              "name": "PRIORITY_THEN_SHOW_START_AT",
              "number": "2",
              "description": "По приоритету, затем по дате начала показа"
            },
            {
              "name": "CREATED_AT",
              "number": "3",
              "description": "Дата создания"
            },
            {
              "name": "SHOW_START_AT",
              "number": "4",
              "description": "Дата начала показа"
            },
            {
              "name": "SHOW_ENDED_AT",
              "number": "5",
              "description": "Дата конца показа"
            },
            {
              "name": "RANK",
              "number": "6",
              "description": "По рангу для поиска по тексту.\nПрименяется когда передано поле для поиска по тексту.\nВ случае если текстовое поле не передано, применяется значение по умолчанию"
            }
          ]
        }
      ],
      "extensions": [],
      "messages": [
        {
          "name": "Banner",
          "longName": "Banner",
          "fullName": "keyapis.banner.v1.Banner",
          "description": "Баннер.\n# Описание модели",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "id",
              "description": "Идентификатор.\nЕсли не передан создаётся сервером.\n# Тип: Guid",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "type",
              "description": "Тип баннера.\nОбязательное",
              "label": "",
              "type": "Type",
              "longType": "Banner.Type",
              "fullType": "keyapis.banner.v1.Banner.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            },
            {
              "name": "priority",
              "description": "Приоритет.\nОбязательное.\n# Диапазон: 1..255",
              "label": "",
              "type": "int32",
              "longType": "int32",
              "fullType": "int32",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 3
            },
            {
              "name": "priority_type",
              "description": "Тип приоритета.\n# Поле вычисляется в коде приложения",
              "label": "",
              "type": "PriorityType",
              "longType": "Banner.PriorityType",
              "fullType": "keyapis.banner.v1.Banner.PriorityType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "OUTPUT_ONLY"
                  ]
                }
              },
              "number": 4
            },
            {
              "name": "title",
              "description": "Название.\nОбязательное.\nОбычно это название рекламной компании.\nНе отображается пользователям.\n# Диапазон: 3..256",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 5
            },
            {
              "name": "header",
              "description": "Заголовок.\n# Диапазон: 3..64",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 6
            },
            {
              "name": "header_color",
              "description": "Цвет текста заголовка.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 7
            },
            {
              "name": "subtitle",
              "description": "Подзаголовок.\n# Диапазон: 3..256",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 8
            },
            {
              "name": "subtitle_color",
              "description": "Цвет текста подзаголовка.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 9
            },
            {
              "name": "background_color",
              "description": "Цвет заднего плана(подложки).\nОтрисовывается до загрузки картинки и градиента.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 10
            },
            {
              "name": "background_gradient",
              "description": "Градиент",
              "label": "",
              "type": "Gradient",
              "longType": "Banner.Gradient",
              "fullType": "keyapis.banner.v1.Banner.Gradient",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 11
            },
            {
              "name": "repeat_after_days",
              "description": "Количество дней через которое можно повторно показать баннер.\nЕсли null, то закрыть нельзя, баннер повторно выводится каждый раз.\n# Диапазон: 0..366",
              "label": "",
              "type": "Int32Value",
              "longType": "google.protobuf.Int32Value",
              "fullType": "google.protobuf.Int32Value",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 12
            },
            {
              "name": "show_start_at",
              "description": "Дата начала показа.\nОбязательное.\nБессрочно если значение 2000-01-01.\n# Тип: DateOnly.\n# Диапазон: 730119..1095362",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 13
            },
            {
              "name": "show_ended_at",
              "description": "Дата конца показа.\nОбязательное.\nБессрочно если значение 3000-01-01.\n# Тип: DateOnly.\n# Диапазон: 730119..1095362",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 14
            },
            {
              "name": "status_type",
              "description": "Статус баннера.\n# Поле вычисляется в коде приложения",
              "label": "",
              "type": "StatusType",
              "longType": "Banner.StatusType",
              "fullType": "keyapis.banner.v1.Banner.StatusType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "OUTPUT_ONLY"
                  ]
                }
              },
              "number": 15
            },
            {
              "name": "images",
              "description": "Картинки.\n# Диапазон: 0..20",
              "label": "repeated",
              "type": "Image",
              "longType": "Banner.Image",
              "fullType": "keyapis.banner.v1.Banner.Image",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 16
            },
            {
              "name": "links",
              "description": "Ссылки для переходов.\n# Диапазон: 0..100",
              "label": "repeated",
              "type": "Link",
              "longType": "Banner.Link",
              "fullType": "keyapis.banner.v1.Banner.Link",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 17
            },
            {
              "name": "user_tags",
              "description": "Список тегов пользователей.\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}$/",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 18
            },
            {
              "name": "app_tags",
              "description": "Список тегов приложений.\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}$/",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 19
            },
            {
              "name": "created_at",
              "description": "Дата создания.\n# Тип: DateTime",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "OUTPUT_ONLY"
                  ]
                }
              },
              "number": 20
            },
            {
              "name": "changed_at",
              "description": "Дата последнего изменения.\nЗаполняется и обновляется сервером.\nЗаполняется при создании и изменении.\nЯвляется версией объекта.\n# Тип: DateTime",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "OUTPUT_ONLY"
                  ]
                }
              },
              "number": 21
            }
          ]
        },
        {
          "name": "Gradient",
          "longName": "Banner.Gradient",
          "fullName": "keyapis.banner.v1.Banner.Gradient",
          "description": "Градиент",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "linear",
              "description": "Линейный градиент",
              "label": "",
              "type": "Linear",
              "longType": "Banner.Gradient.Linear",
              "fullType": "keyapis.banner.v1.Banner.Gradient.Linear",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "Linear",
          "longName": "Banner.Gradient.Linear",
          "fullName": "keyapis.banner.v1.Banner.Gradient.Linear",
          "description": "Линейный градиент",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "angle",
              "description": "Угол направления линейного градиента в градусах.\n# Диапазон: 0..360",
              "label": "",
              "type": "float",
              "longType": "float",
              "fullType": "float",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "points",
              "description": "Точки градиента.\nОбязательное.\n# Диапазон: 2..20",
              "label": "repeated",
              "type": "Point",
              "longType": "Banner.Gradient.Linear.Point",
              "fullType": "keyapis.banner.v1.Banner.Gradient.Linear.Point",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            }
          ]
        },
        {
          "name": "Point",
          "longName": "Banner.Gradient.Linear.Point",
          "fullName": "keyapis.banner.v1.Banner.Gradient.Linear.Point",
          "description": "Точка",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "color",
              "description": "Цвет линейного градиента.\nОбязательное.\nОтрисовывается до загрузки картинки и градиента.\nВсе цвета должны быть в формате hex #RRGGBBAA.\nПример: #7e00c380.\n# Диапазон: 9..9.\n# Паттерн: /^#[0-9a-fA-F]{8}$/",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "stop",
              "description": "Стоп линейного градиента.\nЗаписывается в процентах.\n# Диапазон: 0..100",
              "label": "",
              "type": "float",
              "longType": "float",
              "fullType": "float",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Image",
          "longName": "Banner.Image",
          "fullName": "keyapis.banner.v1.Banner.Image",
          "description": "Объект картинки",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "type",
              "description": "Тип картинки.\nОбязательное",
              "label": "",
              "type": "Type",
              "longType": "Banner.Image.Type",
              "fullType": "keyapis.banner.v1.Banner.Image.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "url",
              "description": "Значение ссылки на картинку.\nОбязательное.\n# Диапазон: 12..512",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            }
          ]
        },
        {
          "name": "Link",
          "longName": "Banner.Link",
          "fullName": "keyapis.banner.v1.Banner.Link",
          "description": "Ссылка",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "platform_type",
              "description": "Тип платформы.\nОбязательное",
              "label": "",
              "type": "PlatformType",
              "longType": "Banner.PlatformType",
              "fullType": "keyapis.banner.v1.Banner.PlatformType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "type",
              "description": "Тип ссылки.\nОбязательное",
              "label": "",
              "type": "Type",
              "longType": "Banner.Link.Type",
              "fullType": "keyapis.banner.v1.Banner.Link.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            },
            {
              "name": "url",
              "description": "Значение ссылки для перехода.\nОбязательное.\n# Диапазон: 12..512",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 3
            },
            {
              "name": "packages",
              "description": "Список пакетов.\nЕсли пусто попытка перехода осуществляется безусловно.\nЕсли заполнено, то переход осуществляется только в случае если хоть один пакет есть на устройстве, иначе обработка переходит к следующей ссылке.\n# Диапазон: 0..20",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 4
            }
          ]
        },
        {
          "name": "SavingError",
          "longName": "Banner.SavingError",
          "fullName": "keyapis.banner.v1.Banner.SavingError",
          "description": "Ошибка сохранения.\nЭти проверки выполняются при работе с базой данных и сторонними сервисами",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "conflict",
              "description": "Конфликт версий",
              "label": "",
              "type": "Conflict",
              "longType": "Banner.SavingError.Conflict",
              "fullType": "keyapis.banner.v1.Banner.SavingError.Conflict",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "Conflict",
          "longName": "Banner.SavingError.Conflict",
          "fullName": "keyapis.banner.v1.Banner.SavingError.Conflict",
          "description": "Конфликт версий.\nПричины:\n- В базе хранится другая версия строки, значения changed_at отличаются",
          "hasExtensions": false,
          "hasFields": false,
          "hasOneofs": false,
          "extensions": [],
          "fields": []
        },
        {
          "name": "BannerFilter",
          "longName": "BannerFilter",
          "fullName": "keyapis.banner.v1.BannerFilter",
          "description": "Фильтр баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "text",
              "description": "По тексту.\nЕсли значение не передано то поиск по нему не производится.\n# Диапазон: 3..64.\n# Поиск производится по полям:\n# - Название;\n# - Заголовок;\n# - Подзаголовок;\n# - Список тегов пользователей;\n# - Список тегов приложений",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "types",
              "description": "По типам баннеров",
              "label": "repeated",
              "type": "Type",
              "longType": "Banner.Type",
              "fullType": "keyapis.banner.v1.Banner.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            },
            {
              "name": "begin_priority",
              "description": "От приоритета включительно (больше или равно)",
              "label": "",
              "type": "Int32Value",
              "longType": "google.protobuf.Int32Value",
              "fullType": "google.protobuf.Int32Value",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 3
            },
            {
              "name": "end_priority",
              "description": "До приоритета (меньше)",
              "label": "",
              "type": "Int32Value",
              "longType": "google.protobuf.Int32Value",
              "fullType": "google.protobuf.Int32Value",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 4
            },
            {
              "name": "priority_types",
              "description": "По типам приоритетов.\nПереписывает значения фильтров по приоритету.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)",
              "label": "repeated",
              "type": "PriorityType",
              "longType": "Banner.PriorityType",
              "fullType": "keyapis.banner.v1.Banner.PriorityType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 5
            },
            {
              "name": "begin_show_start_at",
              "description": "От даты начала показа включительно (больше или равно)",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 6
            },
            {
              "name": "end_show_start_at",
              "description": "До даты начала показа (меньше)",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 7
            },
            {
              "name": "begin_show_ended_at",
              "description": "От даты конца показа включительно (больше или равно)",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 8
            },
            {
              "name": "end_show_ended_at",
              "description": "До даты конца показа (меньше)",
              "label": "",
              "type": "Timestamp",
              "longType": "google.protobuf.Timestamp",
              "fullType": "google.protobuf.Timestamp",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 9
            },
            {
              "name": "status_types",
              "description": "По статусам баннеров.\nПереписывает значения фильтров по датам.\nЕсли переданы все типы, то фильтр игнорируется(так как нужно вернуть всё)",
              "label": "repeated",
              "type": "StatusType",
              "longType": "Banner.StatusType",
              "fullType": "keyapis.banner.v1.Banner.StatusType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 10
            },
            {
              "name": "user_tags",
              "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}$/",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 11
            },
            {
              "name": "app_tags",
              "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}$/",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 12
            }
          ]
        },
        {
          "name": "BannerLite",
          "longName": "BannerLite",
          "fullName": "keyapis.banner.v1.BannerLite",
          "description": "Облегчённый баннер",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "id",
              "description": "Идентификатор.\n# Тип: Guid",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "repeat_after_days",
              "description": "Количество дней через которое можно повторно показать баннер.\nЕсли Значение не указано то повторного показа баннера не будет",
              "label": "",
              "type": "Int32Value",
              "longType": "google.protobuf.Int32Value",
              "fullType": "google.protobuf.Int32Value",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            },
            {
              "name": "images",
              "description": "Картинки",
              "label": "repeated",
              "type": "ImageLite",
              "longType": "BannerLite.ImageLite",
              "fullType": "keyapis.banner.v1.BannerLite.ImageLite",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 3
            },
            {
              "name": "links",
              "description": "Ссылки для переходов.\nВозвращаются отфильтрованные по платформе",
              "label": "repeated",
              "type": "LinkLite",
              "longType": "BannerLite.LinkLite",
              "fullType": "keyapis.banner.v1.BannerLite.LinkLite",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 4
            }
          ]
        },
        {
          "name": "ImageLite",
          "longName": "BannerLite.ImageLite",
          "fullName": "keyapis.banner.v1.BannerLite.ImageLite",
          "description": "Упрощённый объект картинки",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "type",
              "description": "Тип картинки.\nОбязательное",
              "label": "",
              "type": "Type",
              "longType": "Banner.Image.Type",
              "fullType": "keyapis.banner.v1.Banner.Image.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "url",
              "description": "Значение ссылки на картинку.\nОбязательное",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            }
          ]
        },
        {
          "name": "LinkLite",
          "longName": "BannerLite.LinkLite",
          "fullName": "keyapis.banner.v1.BannerLite.LinkLite",
          "description": "Упрощённая ссылка",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "type",
              "description": "Тип ссылки.\nОбязательное",
              "label": "",
              "type": "Type",
              "longType": "Banner.Link.Type",
              "fullType": "keyapis.banner.v1.Banner.Link.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "url",
              "description": "Значение ссылки.\nОбязательное",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            },
            {
              "name": "packages",
              "description": "Список пакетов.\nЕсли пусто попытка перехода осуществляется безусловно.\nЕсли заполнено, то переход осуществляется только в случае если хоть один пакет есть на устройстве иначе обработка переходит к следующей ссылке",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 3
            },
            {
              "name": "platform_type",
              "description": "Тип платформы.\nОбязательное",
              "label": "",
              "type": "PlatformType",
              "longType": "Banner.PlatformType",
              "fullType": "keyapis.banner.v1.Banner.PlatformType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 4
            }
          ]
        },
        {
          "name": "BannerLiteFilter",
          "longName": "BannerLiteFilter",
          "fullName": "keyapis.banner.v1.BannerLiteFilter",
          "description": "Упрощённый фильтр по баннерам",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "types",
              "description": "По типам баннеров",
              "label": "repeated",
              "type": "Type",
              "longType": "Banner.Type",
              "fullType": "keyapis.banner.v1.Banner.Type",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "app_name",
              "description": "Название приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            },
            {
              "name": "platform_type",
              "description": "Тип платформы",
              "label": "",
              "type": "PlatformType",
              "longType": "Banner.PlatformType",
              "fullType": "keyapis.banner.v1.Banner.PlatformType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 3
            },
            {
              "name": "version",
              "description": "Версия приложения.\n# Диапазон: 1..19.\n# Паттерн: /^[0-9A-Z-]{1,19}$/",
              "label": "",
              "type": "StringValue",
              "longType": "google.protobuf.StringValue",
              "fullType": "google.protobuf.StringValue",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 4
            },
            {
              "name": "user_tags",
              "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}$/",
              "label": "repeated",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 5
            }
          ]
        },
        {
          "name": "BannerPaging",
          "longName": "BannerPaging",
          "fullName": "keyapis.banner.v1.BannerPaging",
          "description": "Пагинация баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "order_by_type",
              "description": "Тип значения сортировки.\nЕсли значение не передано, то будет взято значение по умолчанию.\n# По умолчанию: CHANGED_AT",
              "label": "",
              "type": "OrderByType",
              "longType": "BannerPaging.OrderByType",
              "fullType": "keyapis.banner.v1.BannerPaging.OrderByType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "direction_type",
              "description": "Тип направления сортировки.\n# По умолчанию: DESC",
              "label": "",
              "type": "DirectionType",
              "longType": "BannerPaging.DirectionType",
              "fullType": "keyapis.banner.v1.BannerPaging.DirectionType",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            },
            {
              "name": "limit",
              "description": "Количество записей на страницу.\nЕсли значение 0 (не передано), то будет взято значение по умолчанию.\n# Диапазон: 0..100.\n# По умолчанию: 20",
              "label": "",
              "type": "int32",
              "longType": "int32",
              "fullType": "int32",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 3
            },
            {
              "name": "offset",
              "description": "Сдвиг.\n# Диапазон: 0..2147483647",
              "label": "",
              "type": "int32",
              "longType": "int32",
              "fullType": "int32",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 4
            }
          ]
        },
        {
          "name": "GetBannerCountRequest",
          "longName": "GetBannerCountRequest",
          "fullName": "keyapis.banner.v1.GetBannerCountRequest",
          "description": "Запрос получения количества баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "filter",
              "description": "Фильтр",
              "label": "",
              "type": "BannerFilter",
              "longType": "BannerFilter",
              "fullType": "keyapis.banner.v1.BannerFilter",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerCountResponse",
          "longName": "GetBannerCountResponse",
          "fullName": "keyapis.banner.v1.GetBannerCountResponse",
          "description": "Ответ на запрос получения количества баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Всего баннеров",
              "label": "",
              "type": "int32",
              "longType": "int32",
              "fullType": "int32",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "GetBannerCountResponse.Error",
              "fullType": "keyapis.banner.v1.GetBannerCountResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "GetBannerCountResponse.Error",
          "fullName": "keyapis.banner.v1.GetBannerCountResponse.Error",
          "description": "Ошибка запроса получения количества баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerListRequest",
          "longName": "GetBannerListRequest",
          "fullName": "keyapis.banner.v1.GetBannerListRequest",
          "description": "Запрос получения списка баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "filter",
              "description": "Фильтр",
              "label": "",
              "type": "BannerFilter",
              "longType": "BannerFilter",
              "fullType": "keyapis.banner.v1.BannerFilter",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "paging",
              "description": "Пагинация",
              "label": "",
              "type": "BannerPaging",
              "longType": "BannerPaging",
              "fullType": "keyapis.banner.v1.BannerPaging",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "pagination",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "GetBannerListResponse",
          "longName": "GetBannerListResponse",
          "fullName": "keyapis.banner.v1.GetBannerListResponse",
          "description": "Ответ на запрос получения списка баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Баннер",
              "label": "",
              "type": "Banner",
              "longType": "Banner",
              "fullType": "keyapis.banner.v1.Banner",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "GetBannerListResponse.Error",
              "fullType": "keyapis.banner.v1.GetBannerListResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "GetBannerListResponse.Error",
          "fullName": "keyapis.banner.v1.GetBannerListResponse.Error",
          "description": "Ошибка запроса получения списка баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerLiteListRequest",
          "longName": "GetBannerLiteListRequest",
          "fullName": "keyapis.banner.v1.GetBannerLiteListRequest",
          "description": "Запрос получения списка упрощённого баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "filter",
              "description": "Упрощённый фильтр",
              "label": "",
              "type": "BannerLiteFilter",
              "longType": "BannerLiteFilter",
              "fullType": "keyapis.banner.v1.BannerLiteFilter",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "is_link_filter_disabled",
              "description": "Признак отключения фильтрации по типу платформы",
              "label": "",
              "type": "bool",
              "longType": "bool",
              "fullType": "bool",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "GetBannerLiteListResponse",
          "longName": "GetBannerLiteListResponse",
          "fullName": "keyapis.banner.v1.GetBannerLiteListResponse",
          "description": "Ответ на запрос получения списка упрощённых баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Упрощённый баннер",
              "label": "",
              "type": "BannerLite",
              "longType": "BannerLite",
              "fullType": "keyapis.banner.v1.BannerLite",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "GetBannerLiteListResponse.Error",
              "fullType": "keyapis.banner.v1.GetBannerLiteListResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "GetBannerLiteListResponse.Error",
          "fullName": "keyapis.banner.v1.GetBannerLiteListResponse.Error",
          "description": "Ошибка запроса получения списка баннеров",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerLiteRequest",
          "longName": "GetBannerLiteRequest",
          "fullName": "keyapis.banner.v1.GetBannerLiteRequest",
          "description": "Запрос получения упрощённого баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "id",
              "description": "Идентификатор баннера.\n# Тип: Guid",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerLiteResponse",
          "longName": "GetBannerLiteResponse",
          "fullName": "keyapis.banner.v1.GetBannerLiteResponse",
          "description": "Ответ на запрос получения упрощённого баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Упрощённый баннер",
              "label": "",
              "type": "BannerLite",
              "longType": "BannerLite",
              "fullType": "keyapis.banner.v1.BannerLite",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "GetBannerLiteResponse.Error",
              "fullType": "keyapis.banner.v1.GetBannerLiteResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "GetBannerLiteResponse.Error",
          "fullName": "keyapis.banner.v1.GetBannerLiteResponse.Error",
          "description": "Ошибка запроса получения упрощённого баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerRequest",
          "longName": "GetBannerRequest",
          "fullName": "keyapis.banner.v1.GetBannerRequest",
          "description": "Запрос получения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "id",
              "description": "Идентификатор баннера.\n# Тип: Guid",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            }
          ]
        },
        {
          "name": "GetBannerResponse",
          "longName": "GetBannerResponse",
          "fullName": "keyapis.banner.v1.GetBannerResponse",
          "description": "Ответ на запрос получения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Баннер",
              "label": "",
              "type": "Banner",
              "longType": "Banner",
              "fullType": "keyapis.banner.v1.Banner",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "GetBannerResponse.Error",
              "fullType": "keyapis.banner.v1.GetBannerResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "GetBannerResponse.Error",
          "fullName": "keyapis.banner.v1.GetBannerResponse.Error",
          "description": "Ошибка запроса получения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "PostBannerRequest",
          "longName": "PostBannerRequest",
          "fullName": "keyapis.banner.v1.PostBannerRequest",
          "description": "Запрос сохранения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Баннер",
              "label": "",
              "type": "Banner",
              "longType": "Banner",
              "fullType": "keyapis.banner.v1.Banner",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            }
          ]
        },
        {
          "name": "PostBannerResponse",
          "longName": "PostBannerResponse",
          "fullName": "keyapis.banner.v1.PostBannerResponse",
          "description": "Ответ на запрос сохранения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Баннер",
              "label": "",
              "type": "Banner",
              "longType": "Banner",
              "fullType": "keyapis.banner.v1.Banner",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "PostBannerResponse.Error",
              "fullType": "keyapis.banner.v1.PostBannerResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "PostBannerResponse.Error",
          "fullName": "keyapis.banner.v1.PostBannerResponse.Error",
          "description": "Ошибка запроса сохранения баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "saving",
              "description": "Ошибка сохранения",
              "label": "",
              "type": "SavingError",
              "longType": "Banner.SavingError",
              "fullType": "keyapis.banner.v1.Banner.SavingError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "PostBannerUploadImageRequest",
          "longName": "PostBannerUploadImageRequest",
          "fullName": "keyapis.banner.v1.PostBannerUploadImageRequest",
          "description": "Запрос загрузки картинки баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "banner_id",
              "description": "Идентификатор баннера.\nИспользуется для складывания картинок баннера в папку баннера в бакете.\nНазвание картинки в папке создаётся из случайного Guid.\n# Тип: Guid",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "upload_image",
              "description": "Загружаемая картинка",
              "label": "",
              "type": "UploadImage",
              "longType": "UploadImage",
              "fullType": "keyapis.banner.v1.UploadImage",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            }
          ]
        },
        {
          "name": "PostBannerUploadImageResponse",
          "longName": "PostBannerUploadImageResponse",
          "fullName": "keyapis.banner.v1.PostBannerUploadImageResponse",
          "description": "Ответ на запрос загрузки картинки баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "data",
              "description": "Ссылка на баннер на imageproxy cdn сервер.\nОбщедоступна в интернете",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 1
            },
            {
              "name": "error",
              "description": "Ошибка",
              "label": "",
              "type": "Error",
              "longType": "PostBannerUploadImageResponse.Error",
              "fullType": "keyapis.banner.v1.PostBannerUploadImageResponse.Error",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "type",
              "defaultValue": "",
              "number": 2
            }
          ]
        },
        {
          "name": "Error",
          "longName": "PostBannerUploadImageResponse.Error",
          "fullName": "keyapis.banner.v1.PostBannerUploadImageResponse.Error",
          "description": "Ошибка запроса загрузки картинки баннера",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": true,
          "extensions": [],
          "fields": [
            {
              "name": "validation",
              "description": "Ошибка валидации",
              "label": "",
              "type": "ValidationError",
              "longType": "ValidationError",
              "fullType": "keyapis.banner.v1.ValidationError",
              "ismap": false,
              "isoneof": true,
              "oneofdecl": "reason",
              "defaultValue": "",
              "number": 1
            }
          ]
        },
        {
          "name": "UploadImage",
          "longName": "UploadImage",
          "fullName": "keyapis.banner.v1.UploadImage",
          "description": "Объект загружаемой картинки",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "base64",
              "description": "Картинка в формате инлайн base64.\nОбязательное.\nПример: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...\".\n# Паттерн: /^data:\\s*image\\/(png|jpeg|jpg);\\s*base64/",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            }
          ]
        },
        {
          "name": "ValidationError",
          "longName": "ValidationError",
          "fullName": "keyapis.banner.v1.ValidationError",
          "description": "Ошибки валидации.\nЭти проверки выполняются до обращения в базу данных",
          "hasExtensions": false,
          "hasFields": true,
          "hasOneofs": false,
          "extensions": [],
          "fields": [
            {
              "name": "path",
              "description": "Путь к полю в формате наименования прото",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 1
            },
            {
              "name": "message",
              "description": "Валидационное сообщение",
              "label": "",
              "type": "string",
              "longType": "string",
              "fullType": "string",
              "ismap": false,
              "isoneof": false,
              "oneofdecl": "",
              "defaultValue": "",
              "options": {
                "google.api.field_behavior": {
                  "options": [
                    "REQUIRED"
                  ]
                }
              },
              "number": 2
            }
          ]
        }
      ],
      "services": [
        {
          "name": "BannerService",
          "longName": "BannerService",
          "fullName": "keyapis.banner.v1.BannerService",
          "description": "Сервис управления баннерами",
          "methods": [
            {
              "name": "PostBanner",
              "description": "Метод сохранения баннера.\nПоддерживает создание и обновление.\nМетод доступен для: admin, manager, service",
              "requestType": "PostBannerRequest",
              "requestLongType": "PostBannerRequest",
              "requestFullType": "keyapis.banner.v1.PostBannerRequest",
              "requestStreaming": false,
              "responseType": "PostBannerResponse",
              "responseLongType": "PostBannerResponse",
              "responseFullType": "keyapis.banner.v1.PostBannerResponse",
              "responseStreaming": false,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "POST",
                      "pattern": "/banner/api/v1/banner",
                      "body": "*"
                    }
                  ]
                }
              }
            },
            {
              "name": "GetBanner",
              "description": "Метод получения баннера.\nМетод доступен для: admin, manager, service",
              "requestType": "GetBannerRequest",
              "requestLongType": "GetBannerRequest",
              "requestFullType": "keyapis.banner.v1.GetBannerRequest",
              "requestStreaming": false,
              "responseType": "GetBannerResponse",
              "responseLongType": "GetBannerResponse",
              "responseFullType": "keyapis.banner.v1.GetBannerResponse",
              "responseStreaming": false,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "GET",
                      "pattern": "/banner/api/v1/banner/{id}"
                    }
                  ]
                }
              }
            },
            {
              "name": "GetBannerLite",
              "description": "Метод получения упрощённого баннера.\nНе требует авторизации",
              "requestType": "GetBannerLiteRequest",
              "requestLongType": "GetBannerLiteRequest",
              "requestFullType": "keyapis.banner.v1.GetBannerLiteRequest",
              "requestStreaming": false,
              "responseType": "GetBannerLiteResponse",
              "responseLongType": "GetBannerLiteResponse",
              "responseFullType": "keyapis.banner.v1.GetBannerLiteResponse",
              "responseStreaming": false,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "GET",
                      "pattern": "/banner/api/v1/banner_lite/{id}"
                    }
                  ]
                }
              }
            },
            {
              "name": "GetBannerList",
              "description": "Метод получения списка баннеров.\nМетод доступен для: admin, manager, service",
              "requestType": "GetBannerListRequest",
              "requestLongType": "GetBannerListRequest",
              "requestFullType": "keyapis.banner.v1.GetBannerListRequest",
              "requestStreaming": false,
              "responseType": "GetBannerListResponse",
              "responseLongType": "GetBannerListResponse",
              "responseFullType": "keyapis.banner.v1.GetBannerListResponse",
              "responseStreaming": true,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "GET",
                      "pattern": "/banner/api/v1/banner/list"
                    }
                  ]
                }
              }
            },
            {
              "name": "GetBannerLiteList",
              "description": "Метод получения списка упрощённых баннеров.\nВозвращает всегда активные баннеры.\nПо умолчанию возвращает первые 20 баннеров осортированных по приоритету, затем по дате начала акции(от самых важных к не важным, затем от самых новых акций к самым старым).\nЕсли запрос выполнен хотя бы без одного изпризнака приложения возвращает пустой список.\nЕсли запрос выполнен без признаков пользователя метод возвращает пустой список.\nНе требует авторизации",
              "requestType": "GetBannerLiteListRequest",
              "requestLongType": "GetBannerLiteListRequest",
              "requestFullType": "keyapis.banner.v1.GetBannerLiteListRequest",
              "requestStreaming": false,
              "responseType": "GetBannerLiteListResponse",
              "responseLongType": "GetBannerLiteListResponse",
              "responseFullType": "keyapis.banner.v1.GetBannerLiteListResponse",
              "responseStreaming": true,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "GET",
                      "pattern": "/banner/api/v1/banner_lite/list"
                    }
                  ]
                }
              }
            },
            {
              "name": "GetBannerCount",
              "description": "Метод получения количества баннеров.\nМетод доступен для: admin, manager, service",
              "requestType": "GetBannerCountRequest",
              "requestLongType": "GetBannerCountRequest",
              "requestFullType": "keyapis.banner.v1.GetBannerCountRequest",
              "requestStreaming": false,
              "responseType": "GetBannerCountResponse",
              "responseLongType": "GetBannerCountResponse",
              "responseFullType": "keyapis.banner.v1.GetBannerCountResponse",
              "responseStreaming": false,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "GET",
                      "pattern": "/banner/api/v1/banner/count"
                    }
                  ]
                }
              }
            },
            {
              "name": "PostBannerUploadImage",
              "description": "Метод загрузки картинки баннера.\nМетод доступен для: admin, manager, service",
              "requestType": "PostBannerUploadImageRequest",
              "requestLongType": "PostBannerUploadImageRequest",
              "requestFullType": "keyapis.banner.v1.PostBannerUploadImageRequest",
              "requestStreaming": false,
              "responseType": "PostBannerUploadImageResponse",
              "responseLongType": "PostBannerUploadImageResponse",
              "responseFullType": "keyapis.banner.v1.PostBannerUploadImageResponse",
              "responseStreaming": false,
              "options": {
                "google.api.http": {
                  "rules": [
                    {
                      "method": "POST",
                      "pattern": "/banner/api/v1/banner/{banner_id}/upload_image",
                      "body": "upload_image"
                    }
                  ]
                }
              }
            }
          ]
        }
      ],
      "syntax": "proto3"
    }
  ],
  "scalarValueTypes": [
    {
      "protoType": "double",
      "notes": "",
      "cppType": "double",
      "csType": "double",
      "goType": "float64",
      "javaType": "double",
      "phpType": "float",
      "pythonType": "float",
      "rubyType": "Float"
    },
    {
      "protoType": "float",
      "notes": "",
      "cppType": "float",
      "csType": "float",
      "goType": "float32",
      "javaType": "float",
      "phpType": "float",
      "pythonType": "float",
      "rubyType": "Float"
    },
    {
      "protoType": "int32",
      "notes": "Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.",
      "cppType": "int32",
      "csType": "int",
      "goType": "int32",
      "javaType": "int",
      "phpType": "integer",
      "pythonType": "int",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "int64",
      "notes": "Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.",
      "cppType": "int64",
      "csType": "long",
      "goType": "int64",
      "javaType": "long",
      "phpType": "integer/string",
      "pythonType": "int/long",
      "rubyType": "Bignum"
    },
    {
      "protoType": "uint32",
      "notes": "Uses variable-length encoding.",
      "cppType": "uint32",
      "csType": "uint",
      "goType": "uint32",
      "javaType": "int",
      "phpType": "integer",
      "pythonType": "int/long",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "uint64",
      "notes": "Uses variable-length encoding.",
      "cppType": "uint64",
      "csType": "ulong",
      "goType": "uint64",
      "javaType": "long",
      "phpType": "integer/string",
      "pythonType": "int/long",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "sint32",
      "notes": "Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.",
      "cppType": "int32",
      "csType": "int",
      "goType": "int32",
      "javaType": "int",
      "phpType": "integer",
      "pythonType": "int",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "sint64",
      "notes": "Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.",
      "cppType": "int64",
      "csType": "long",
      "goType": "int64",
      "javaType": "long",
      "phpType": "integer/string",
      "pythonType": "int/long",
      "rubyType": "Bignum"
    },
    {
      "protoType": "fixed32",
      "notes": "Always four bytes. More efficient than uint32 if values are often greater than 2^28.",
      "cppType": "uint32",
      "csType": "uint",
      "goType": "uint32",
      "javaType": "int",
      "phpType": "integer",
      "pythonType": "int",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "fixed64",
      "notes": "Always eight bytes. More efficient than uint64 if values are often greater than 2^56.",
      "cppType": "uint64",
      "csType": "ulong",
      "goType": "uint64",
      "javaType": "long",
      "phpType": "integer/string",
      "pythonType": "int/long",
      "rubyType": "Bignum"
    },
    {
      "protoType": "sfixed32",
      "notes": "Always four bytes.",
      "cppType": "int32",
      "csType": "int",
      "goType": "int32",
      "javaType": "int",
      "phpType": "integer",
      "pythonType": "int",
      "rubyType": "Bignum or Fixnum (as required)"
    },
    {
      "protoType": "sfixed64",
      "notes": "Always eight bytes.",
      "cppType": "int64",
      "csType": "long",
      "goType": "int64",
      "javaType": "long",
      "phpType": "integer/string",
      "pythonType": "int/long",
      "rubyType": "Bignum"
    },
    {
      "protoType": "bool",
      "notes": "",
      "cppType": "bool",
      "csType": "bool",
      "goType": "bool",
      "javaType": "boolean",
      "phpType": "boolean",
      "pythonType": "boolean",
      "rubyType": "TrueClass/FalseClass"
    },
    {
      "protoType": "string",
      "notes": "A string must always contain UTF-8 encoded or 7-bit ASCII text.",
      "cppType": "string",
      "csType": "string",
      "goType": "string",
      "javaType": "String",
      "phpType": "string",
      "pythonType": "str/unicode",
      "rubyType": "String (UTF-8)"
    },
    {
      "protoType": "bytes",
      "notes": "May contain any arbitrary sequence of bytes.",
      "cppType": "string",
      "csType": "ByteString",
      "goType": "[]byte",
      "javaType": "ByteString",
      "phpType": "string",
      "pythonType": "str",
      "rubyType": "String (ASCII-8BIT)"
    }
  ]
}