diff --git a/buf.gen.yaml b/buf.gen.yaml
index 8c67b7a64529a0b53062b32721af4b379332ce64..4f985288dc5bda94bba8d53aaee7773350c88616 100644
--- a/buf.gen.yaml
+++ b/buf.gen.yaml
@@ -11,4 +11,6 @@ plugins:
     opt:
       - paths=source_relative
       - generate_unbound_methods=true
+  - local: protoc-gen-openapiv2
+    out: proto
 
diff --git a/buf.lock b/buf.lock
index 5eefbd0be84d6bec9deb632106f94de4e7e9c35c..95ba90ab3d1cb2efc6b72ee2076d6e4edcd10691 100644
--- a/buf.lock
+++ b/buf.lock
@@ -4,3 +4,6 @@ deps:
   - name: buf.build/googleapis/googleapis
     commit: 546238c53f7340c6a2a6099fb863bc1b
     digest: b5:e017bbf31a3f912e2b969c03c3aa711f466cfe104f510865d1a8ede1be490240aabd4cca5865459a0f15222747284395f98afc094b0fd086e8917a5a7bdd9db0
+  - name: buf.build/grpc-ecosystem/grpc-gateway
+    commit: 4c5ba75caaf84e928b7137ae5c18c26a
+    digest: b5:c113e62fb3b29289af785866cae062b55ec8ae19ab3f08f3004098928fbca657730a06810b2012951294326b95669547194fa84476b9e9b688d4f8bf77a0691d
diff --git a/buf.yaml b/buf.yaml
index 8d99738de745c7c2481b963c122522030f4e23ac..a8b337ec0a0d91e4c4e7c91b7be08a6b29748253 100644
--- a/buf.yaml
+++ b/buf.yaml
@@ -11,3 +11,4 @@ breaking:
     - FILE
 deps:
   - buf.build/googleapis/googleapis
+  - buf.build/grpc-ecosystem/grpc-gateway
diff --git a/proto/logs/log.swagger.json b/proto/logs/log.swagger.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e2224ff100925661d008ceeebefcc9c22f0dee5
--- /dev/null
+++ b/proto/logs/log.swagger.json
@@ -0,0 +1,46 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "logs/log.proto",
+    "version": "version not set"
+  },
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {},
+  "definitions": {
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "@type": {
+          "type": "string",
+          "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n  URL, or have them precompiled into a binary to avoid any\n  lookup. Therefore, binary compatibility needs to be preserved\n  on changes to types. (Use versioned type names to manage\n  breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
+        }
+      },
+      "additionalProperties": {},
+      "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n    Foo foo = ...;\n    Any any;\n    any.PackFrom(foo);\n    ...\n    if (any.UnpackTo(\u0026foo)) {\n      ...\n    }\n\nExample 2: Pack and unpack a message in Java.\n\n    Foo foo = ...;\n    Any any = Any.pack(foo);\n    ...\n    if (any.is(Foo.class)) {\n      foo = any.unpack(Foo.class);\n    }\n    // or ...\n    if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n      foo = any.unpack(Foo.getDefaultInstance());\n    }\n\n Example 3: Pack and unpack a message in Python.\n\n    foo = Foo(...)\n    any = Any()\n    any.Pack(foo)\n    ...\n    if any.Is(Foo.DESCRIPTOR):\n      any.Unpack(foo)\n      ...\n\n Example 4: Pack and unpack a message in Go\n\n     foo := \u0026pb.Foo{...}\n     any, err := anypb.New(foo)\n     if err != nil {\n       ...\n     }\n     ...\n     foo := \u0026pb.Foo{}\n     if err := any.UnmarshalTo(foo); err != nil {\n       ...\n     }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n    package google.profile;\n    message Person {\n      string first_name = 1;\n      string last_name = 2;\n    }\n\n    {\n      \"@type\": \"type.googleapis.com/google.profile.Person\",\n      \"firstName\": \u003cstring\u003e,\n      \"lastName\": \u003cstring\u003e\n    }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n    {\n      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n      \"value\": \"1.212s\"\n    }"
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/proto/logs/log_service.swagger.json b/proto/logs/log_service.swagger.json
new file mode 100644
index 0000000000000000000000000000000000000000..f503ce08ee9c65698d42da7e2583a1981d976256
--- /dev/null
+++ b/proto/logs/log_service.swagger.json
@@ -0,0 +1,530 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "logs/log_service.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "LogsService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/v1/logs": {
+      "get": {
+        "summary": "Метод для поиска логов по заданным параметрам",
+        "operationId": "LogsService_Find",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/logsFindResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "filter.q",
+            "description": "Запрос на поиск логов\nПримеры:\n1. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02'`\n2. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02' AND level = 'error'`\n3. `component = 'api' AND object_id = '123' AND object_type = 'item' AND space = 'spc1'`\n4. `id in ['1', '2', '3']`\n\nСписок выражений для фильтрации",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "options.sort",
+            "description": "Сортировка результатов",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "options.limit",
+            "description": "Ограничение количества результатов",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "options.after",
+            "description": "Ограничение результатов по времени начиная с этим временем (pagination)",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "name": "options.before",
+            "description": "Ограничение результатов по времени заканчивая этим временем (pagination)",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "date-time"
+          }
+        ],
+        "tags": [
+          "LogsService"
+        ]
+      },
+      "delete": {
+        "summary": "Метод для удаления логов по заданным параметрам",
+        "operationId": "LogsService_Delete",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/logsDeleteResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "filter.q",
+            "description": "Запрос на поиск логов\nПримеры:\n1. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02'`\n2. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02' AND level = 'error'`\n3. `component = 'api' AND object_id = '123' AND object_type = 'item' AND space = 'spc1'`\n4. `id in ['1', '2', '3']`\n\nСписок выражений для фильтрации",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          }
+        ],
+        "tags": [
+          "LogsService"
+        ]
+      },
+      "post": {
+        "summary": "Метод для записи логов",
+        "operationId": "LogsService_Log",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/logsLogResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/logsLogRequest"
+            }
+          }
+        ],
+        "tags": [
+          "LogsService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "BadRequestFieldViolation": {
+      "type": "object",
+      "properties": {
+        "field": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        }
+      }
+    },
+    "ErrorBadRequest": {
+      "type": "object",
+      "properties": {
+        "errors": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/BadRequestFieldViolation"
+          }
+        }
+      }
+    },
+    "ErrorDebugInfo": {
+      "type": "object",
+      "properties": {
+        "stackTrace": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "detail": {
+          "type": "string"
+        }
+      }
+    },
+    "ErrorHelp": {
+      "type": "object",
+      "properties": {
+        "links": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/HelpLink"
+          }
+        }
+      }
+    },
+    "ErrorLocalizedMessage": {
+      "type": "object",
+      "properties": {
+        "locale": {
+          "type": "string"
+        },
+        "message": {
+          "type": "string"
+        }
+      }
+    },
+    "HelpLink": {
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "commonError": {
+      "type": "object",
+      "properties": {
+        "errorCode": {
+          "type": "string",
+          "format": "uint64",
+          "title": "Код ошибки"
+        },
+        "errorId": {
+          "type": "string",
+          "description": "ID конкретного инцидента, ID уникальна для каждого случая."
+        },
+        "reason": {
+          "type": "string",
+          "title": "???"
+        },
+        "domain": {
+          "type": "string",
+          "title": "Сервис, пакет к которому относится ошибка"
+        },
+        "message": {
+          "type": "string",
+          "title": "Текст ошибки"
+        },
+        "details": {
+          "type": "string",
+          "title": "Дополнительные детали об ошибке"
+        },
+        "metadata": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "title": "Мета-информация"
+        },
+        "badRequest": {
+          "$ref": "#/definitions/ErrorBadRequest",
+          "title": "Ошибка запроса"
+        },
+        "debugInfo": {
+          "$ref": "#/definitions/ErrorDebugInfo",
+          "title": "Отладочная информация"
+        },
+        "help": {
+          "$ref": "#/definitions/ErrorHelp",
+          "title": "Пользовательская информации и инструкции"
+        },
+        "localizedMessages": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/ErrorLocalizedMessage"
+          },
+          "title": "Перевод сообщения об ошибке"
+        },
+        "errors": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/commonError"
+          },
+          "title": "Вложенные ошибки"
+        }
+      }
+    },
+    "logsDeleteResponse": {
+      "type": "object",
+      "properties": {
+        "error": {
+          "$ref": "#/definitions/commonError",
+          "title": "Информация об ошибке, если таковая имеется"
+        }
+      },
+      "title": "Ответ сервера на запрос удаления"
+    },
+    "logsFilter": {
+      "type": "object",
+      "properties": {
+        "q": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Список выражений для фильтрации",
+          "title": "Запрос на поиск логов\nПримеры:\n1. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02'`\n2. `timestamp \u003e '2019-01-01' AND timestamp \u003c '2019-01-02' AND level = 'error'`\n3. `component = 'api' AND object_id = '123' AND object_type = 'item' AND space = 'spc1'`\n4. `id in ['1', '2', '3']`"
+        }
+      }
+    },
+    "logsFindOptions": {
+      "type": "object",
+      "properties": {
+        "sort": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "title": "Сортировка результатов"
+        },
+        "limit": {
+          "type": "integer",
+          "format": "int32",
+          "title": "Ограничение количества результатов"
+        },
+        "after": {
+          "type": "string",
+          "format": "date-time",
+          "title": "Ограничение результатов по времени начиная с этим временем (pagination)"
+        },
+        "before": {
+          "type": "string",
+          "format": "date-time",
+          "title": "Ограничение результатов по времени заканчивая этим временем (pagination)"
+        }
+      },
+      "title": "Опции поиска по логам"
+    },
+    "logsFindRequest": {
+      "type": "object",
+      "properties": {
+        "filter": {
+          "$ref": "#/definitions/logsFilter",
+          "title": "Фильтр для поиска"
+        },
+        "options": {
+          "$ref": "#/definitions/logsFindOptions",
+          "title": "Опции поиска"
+        }
+      },
+      "title": "Запрос на поиск логов"
+    },
+    "logsFindResponse": {
+      "type": "object",
+      "properties": {
+        "result": {
+          "$ref": "#/definitions/logsFindResult",
+          "title": "Результаты поиска"
+        },
+        "error": {
+          "$ref": "#/definitions/commonError",
+          "title": "Информация об ошибке, если таковая имеется"
+        }
+      },
+      "title": "Ответ сервера на запрос поиска"
+    },
+    "logsFindResult": {
+      "type": "object",
+      "properties": {
+        "entries": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/logsLogEntry"
+          },
+          "title": "Найденные записи лога"
+        },
+        "filter": {
+          "$ref": "#/definitions/logsFilter",
+          "title": "Использовавшийся для поиска фильтр"
+        },
+        "options": {
+          "$ref": "#/definitions/logsFindOptions",
+          "title": "Использовавшиеся для поиска опции"
+        },
+        "total": {
+          "type": "integer",
+          "format": "int64",
+          "description": "DEPRECATED",
+          "title": "Общее количество найденных записей"
+        },
+        "next": {
+          "$ref": "#/definitions/logsFindRequest",
+          "title": "Запрос для получения следующей страницы"
+        },
+        "prev": {
+          "$ref": "#/definitions/logsFindRequest",
+          "title": "Запрос для получения предыдущей страницы"
+        }
+      },
+      "title": "Результат поиска"
+    },
+    "logsLogEntry": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string",
+          "description": "id является уникальным идентификатором каждой записи в журнале."
+        },
+        "timestamp": {
+          "type": "string",
+          "format": "date-time",
+          "description": "timestamp указывает на временную метку, указывающую когда было создано данное сообщение."
+        },
+        "level": {
+          "$ref": "#/definitions/logsLogLevel",
+          "description": "message это основное сообщение, которое требуется записать в лог."
+        },
+        "message": {
+          "type": "string"
+        },
+        "category": {
+          "type": "string",
+          "description": "component обозначает компонент системы, где произошло данное событие.\n Примеры:\n - Items.Service\n - Items.API\n - Users.Service\n - Users.API\n - Janitor.Service\n - Tasks.Worker",
+          "title": "category указывает на категорию события.\nПримеры:\n-"
+        },
+        "component": {
+          "type": "string"
+        },
+        "event": {
+          "type": "string",
+          "title": "action описывает действие, которое было произведено. Это поле может принимать разные значения в зависимости от сервиса.\nПримеры:\n- item.create\n- item.update\n- organization.create\n- action.run\n- reference.create"
+        },
+        "objectId": {
+          "type": "string",
+          "description": "Примеры:\n/spaces/\u003cspace_id\u003e - пространство\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e - окружение\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e/cols/\u003ccollection_id\u003e - коллекция\n/spaces/\u003cspace_id\u003e/cols/\u003ccollection_id\u003e - коллекция в окружении \"master\"\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e/schema/\u003ccollection_id\u003e - схема коллекции\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e/cols/\u003ccollection_id\u003e/items/\u003citem_id\u003e - элемент коллекции\n/spaces/\u003cspace_id\u003e/cols/\u003ccollection_id\u003e/items/\u003citem_id\u003e - элемент коллекции в окружении \"master\"\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e/cols/\u003ccollection_id\u003e/items/\u003citem_id\u003e/fields/\u003cfield_name\u003e - поле элемента коллекции\n/spaces/\u003cspace_id\u003e/envs/\u003cenv_id\u003e/cols/\u003ccollection_id\u003e/items/\u003citem_id\u003e/revs/\u003crev_id\u003e - ревизия элемента коллекции\n/spaces/\u003cspace_id\u003e/clients/\u003cclient_id\u003e - клиент\n/spaces/\u003cspace_id\u003e/roles/\u003crole_id\u003e - роль\n/orgs/\u003corg_id\u003e - организация\n/users/\u003cuser_id\u003e - пользователь\n/services/\u003cservice_id\u003e - сервис",
+          "title": "object это идентификатор объекта связанного с событием\nИдентификатор объекта должен быть в формате GlobalID:\n\u003cконтекст\u003e/\u003cтип объекта\u003e/\u003cидентификатор объекта\u003e\nгде:\n- \u003cконтекст\u003e - представляет собой иднетификатор родительского объекта, если таковой имеется\n- \u003cтип объекта\u003e - представляет собой тип объекта, например:\n  spaces, envs, cols, items, revs, fields, clients, roles, orgs, users\n- \u003cидентификатор объекта\u003e - представляет собой идентификатор объекта"
+        },
+        "callerId": {
+          "type": "string",
+          "description": "Примеры:\n/users/\u003cuser_id\u003e - пользователь\n/spaces/\u003cspace_id\u003e/clients/\u003cclient_id\u003e - клиент\n/services/\u003cservice_id\u003e - сервис",
+          "title": "caller содержит идентификатор сущности вызвавшей событиe, аналогично полю object"
+        },
+        "attr": {
+          "$ref": "#/definitions/protobufAny",
+          "title": "attr содержит дополнительные связанные с событием атрибуты в формате Any\nпозволяет добавить дополнительные данные в событие"
+        },
+        "tags": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "title": "tags содержит теги связанные с событием, на усмотрение сервиса"
+        }
+      },
+      "description": "LogEntry представляет собой структуру данных для хранения информации о журнале."
+    },
+    "logsLogLevel": {
+      "type": "string",
+      "enum": [
+        "INFO",
+        "WARNING",
+        "ERROR",
+        "CRITICAL",
+        "FATAL"
+      ],
+      "default": "INFO",
+      "description": "LogLevel задает уровень журналирования.\n\n - INFO: INFO - обозначает сообщения с нормальным, операционным уровнем журналирования.\n - WARNING: WARNING - обозначает сообщения, которые содержат потенциально вредные ситуации.\n - ERROR: ERROR - обозначает другие ошибки в работе.\n - CRITICAL: CRITICAL - обозначает серьезные ошибки, из-за которых программа может не выполнять некоторые функции.\n - FATAL: FATAL - обозначает очень серьезные ошибки, которые могут привести к остановке приложения."
+    },
+    "logsLogRequest": {
+      "type": "object",
+      "properties": {
+        "entries": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/logsLogEntry"
+          },
+          "title": "Запись лога"
+        }
+      },
+      "title": "Запрос для лога"
+    },
+    "logsLogResponse": {
+      "type": "object",
+      "properties": {
+        "error": {
+          "$ref": "#/definitions/commonError",
+          "title": "Содержит информацию об ошибке, если таковая имеется"
+        }
+      },
+      "title": "Ответ сервера на запрос лога"
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "@type": {
+          "type": "string",
+          "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n  URL, or have them precompiled into a binary to avoid any\n  lookup. Therefore, binary compatibility needs to be preserved\n  on changes to types. (Use versioned type names to manage\n  breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
+        }
+      },
+      "additionalProperties": {},
+      "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n    Foo foo = ...;\n    Any any;\n    any.PackFrom(foo);\n    ...\n    if (any.UnpackTo(\u0026foo)) {\n      ...\n    }\n\nExample 2: Pack and unpack a message in Java.\n\n    Foo foo = ...;\n    Any any = Any.pack(foo);\n    ...\n    if (any.is(Foo.class)) {\n      foo = any.unpack(Foo.class);\n    }\n    // or ...\n    if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n      foo = any.unpack(Foo.getDefaultInstance());\n    }\n\n Example 3: Pack and unpack a message in Python.\n\n    foo = Foo(...)\n    any = Any()\n    any.Pack(foo)\n    ...\n    if any.Is(Foo.DESCRIPTOR):\n      any.Unpack(foo)\n      ...\n\n Example 4: Pack and unpack a message in Go\n\n     foo := \u0026pb.Foo{...}\n     any, err := anypb.New(foo)\n     if err != nil {\n       ...\n     }\n     ...\n     foo := \u0026pb.Foo{}\n     if err := any.UnmarshalTo(foo); err != nil {\n       ...\n     }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n    package google.profile;\n    message Person {\n      string first_name = 1;\n      string last_name = 2;\n    }\n\n    {\n      \"@type\": \"type.googleapis.com/google.profile.Person\",\n      \"firstName\": \u003cstring\u003e,\n      \"lastName\": \u003cstring\u003e\n    }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n    {\n      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n      \"value\": \"1.212s\"\n    }"
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "type": "object",
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    }
+  }
+}